🦁
GitHub Actionsで三項演算子っぽく書くときの注意点
結論
- なるべく1行で書く。
- 複数行で書きたい場合は
|-
を使う。
解説
こちらの記事にもあるとおり、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の書き方をして動作しなくなる例↓
ログを見ると、envの値が1行おきに出力されています。これはAWS_ACCESS_KEY, AWS_SECRET_ACCESS_KEYが改行されてしまっているためです。
なぜ改行が含まれるかというところはYAMLの仕様を見にいくと良いです。折り返しには |
|-
|+
が使え、それぞれ以下のように処理されます。
-
|
: 末尾の改行を含める -
|-
: 末尾の改行を含めない -
|+
: 末尾の改行と空行を含める
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