kdnakt blog

hello there.

GitHub Actionsのymlファイルでのエスケープあれこれ

GitHub Actionsシリーズ第二弾です。GitHub ActionsっていうかYAMLエスケープ豆知識みたいな感じだけど...。

前回はこちら。

kdnakt.hatenablog.com

[シングルクオート]

GitHub Actionsのジョブのステップの中で、echo: Hi, I'm Jackまたはecho: 'Hi, I'm Jack'のように、シングルクオートを含むメッセージを出力しようとすると、yamlの構文エラーとなる。
以下のように「unexpected EOF while looking for matching `''」という実行時エラーが出力される。

GitHubのドキュメントにあるように、こういう場合は外側をダブルクオートにして、以下のようにコードを修正すると、意図した結果を得られる。

jobs:
  say_hello:
    runs-on: ubuntu-latest
    steps:
      - name: say hello
        run: echo "Hi, I'm Jack."

docs.github.com

ドキュメントだとシングルクオートを二重にしてエスケープするのが推奨とも書かれているが、これだとシングルクオートが消えてしまい、意図した通りには動かなかった。

[コロン+スペース]

GitHub Actionsのジョブのステップの中で、echo 'Log level is: ${{ inputs.logLevel }}'のようにコロンとスペースを連続して含めたいケースがある。

しかし、run: に続けてこのechoコマンドを記載すると、incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty lineというエラーが表示される。

なんとかならないか...と思って検索するとこちらのissueに辿り着いた。

github.com

以下のように|記号を利用してリテラルをそのままブロックとして記述できるようにするのが一つの解法となる。

 - name: print log level
        run: |
          echo 'Log level is: ${{ inputs.logLevel }}'

あるいは、以下のようにrunで実行されるコマンド全体をシングルクオートで囲んでもよい。

- name: print log level again
    run: 'echo "Again, log level is: ${{ inputs.logLevel }}"'

と思ったら、約2年前に同じことで困っていた。まるで成長してない...。

kdnakt.hatenablog.com

[特殊文字]

これは試せていないがドキュメントを読んでいる中で見つけたもの。

docs.github.com

GitHub Actionsをトリガーするブランチ名などを指定する際に、リテラルとして*+!などの特殊文字を利用したい場合は\を利用して特殊記号をエスケープする必要があるとのこと。シングルクオートとかコロンもこれで同じように解決してほしい...。

[まとめ]

  • yamlでシングルクオートをリテラルとして利用する場合はダブルクオートで囲む
  • yamlでコロンをリテラルとして利用する場合は|記号を利用するか、コロンを含む文字列全体をシングルクオートで囲む
  • GitHub Actionsのトリガー*!リテラルとして利用する場合はこれらの特殊文字\で囲む
  • 実装したコードは以下のリポジトリに配置してある

github.com