🦁

GitHub Actionsで三項演算子っぽく書くときの注意点

2023/05/12に公開

結論

  • なるべく1行で書く。
  • 複数行で書きたい場合は |- を使う。

解説

https://dev.classmethod.jp/articles/github-actions-get-only-necessary-secrets-according-to-branch-name-in-ternary-operator-like-description/

こちらの記事にもあるとおり、GitHub Actions では 特定の構文 ( ${{ expression }} ) を使うことで関数などを使うことができ、三項演算子っぽい書き方をすることができます。

good
env:
  sample1: ${{ github.event_name == 'push' && 'pushed' || 'not pushed' }}

# 以下のように展開される
# github.event_name == push -> sample1='pushed'
# github.event_name != push -> sample1='not pushed'
bad
env:
  sample1: |
    ${{
      github.event_name == 'push'
        && 'pushed'
        || 'not pushed'
    }}

そのまま使う分にはこの通りで大丈夫ですが、記事にもあるように大抵の場合は長文になってしまい、複数行に分けて書きたくなると思います。
しかし、runなどでよく見る | を使って記述すると正しく動作しなくなる場合があります。

badの書き方をして動作しなくなる例↓
https://github.com/sun-yryr/github-actions-playground/actions/runs/4958668014/jobs/8871824420

ログを見ると、envの値が1行おきに出力されています。これはAWS_ACCESS_KEY, AWS_SECRET_ACCESS_KEYが改行されてしまっているためです。

なぜ改行が含まれるかというところはYAMLの仕様を見にいくと良いです。折り返しには | |- |+ が使え、それぞれ以下のように処理されます。

  • | : 末尾の改行を含める
  • |- : 末尾の改行を含めない
  • |+ : 末尾の改行と空行を含める

https://yaml.org/spec/1.2.2/#8112-block-chomping-indicator

playground でも確認することができます。こっちの方がわかりやすいですね。

yaml
env:
  AWS_ACCESS_KEY_ID1: ${{ inputs.allow-aws && secrets.AWS_ACCESS_KEY_ID || '' }}
  AWS_ACCESS_KEY_ID2: |
    ${{ inputs.allow-aws && secrets.AWS_ACCESS_KEY_ID || '' }}
  AWS_ACCESS_KEY_ID3: |-
    ${{ inputs.allow-aws && secrets.AWS_ACCESS_KEY_ID || '' }}
  AWS_ACCESS_KEY_ID4: |+
    ${{ inputs.allow-aws && secrets.AWS_ACCESS_KEY_ID || '' }}

jobs: 
json
{
  "env": {
    "AWS_ACCESS_KEY_ID1": "${{ inputs.allow-aws && secrets.AWS_ACCESS_KEY_ID || '' }}",
    "AWS_ACCESS_KEY_ID2": "${{ inputs.allow-aws && secrets.AWS_ACCESS_KEY_ID || '' }}\n",
    "AWS_ACCESS_KEY_ID3": "${{ inputs.allow-aws && secrets.AWS_ACCESS_KEY_ID || '' }}",
    "AWS_ACCESS_KEY_ID4": "${{ inputs.allow-aws && secrets.AWS_ACCESS_KEY_ID || '' }}\n\n"
  },
  "jobs": null
}

まとめ

ということで、GitHub Actionsで三項演算子っぽく書くときはなるべく1行で書くか、複数行で書きたい場合は |- を使うようにしましょう。

ちなみに末尾以外の改行はActions側でいい感じに処理してくるようです。

株式会社ゆめみ

Discussion