🐛
GitHub Actions で真偽値判定の注意点
はじめに
GitHub Actions の真偽値判定がややこしかったため、備忘録として残しておきます。
実験
以下のワークフローを実行するとどうなるのでしょうか。
name: expression
on:
workflow_dispatch:
jobs:
expression:
runs-on: ubuntu-latest
strategy:
matrix:
enabled: [ true, false ]
steps:
- id: check
run: echo "::set-output name=enabled::${{ matrix.enabled }}"
- if: steps.check.outputs.enabled
name: executed 1
run: echo "executed 1"
# ${{ }} 内でなければ、YAML の仕様により `!` は否定演算子ではなく
# タグとして扱われるため、この記述は構文エラーになってしまう
# 参考: https://github.com/yaml/yaml-spec
#
# - if: !steps.check.outputs.enabled
# name: executed 2
# run: echo "executed 2"
- if: ${{ steps.check.outputs.enabled }}
name: executed 3
run: echo "executed 3"
- if: ${{ !steps.check.outputs.enabled }}
name: executed 4
run: echo "executed 4"
- if: steps.check.outputs.enabled == true
name: executed 5
run: echo "executed 5"
- if: steps.check.outputs.enabled != true
name: executed 6
run: echo "executed 6"
- if: steps.check.outputs.enabled == false
name: executed 7
run: echo "executed 7"
- if: steps.check.outputs.enabled != false
name: executed 8
run: echo "executed 8"
- if: steps.check.outputs.enabled == 'true'
name: executed 9
run: echo "executed 9"
- if: steps.check.outputs.enabled != 'true'
name: executed 10
run: echo "executed 10"
- if: steps.check.outputs.enabled == 'false'
name: executed 11
run: echo "executed 11"
- if: steps.check.outputs.enabled != 'false'
name: executed 12
run: echo "executed 12"
予想
私は以下のように予想していました。
enabled | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
true | ○ | - | ○ | × | ○ | × | × | ○ | ○ | × | × | ○ |
false | × | - | × | ○ | × | ○ | ○ | × | × | ○ | ○ | × |
結果
予想とは違って、以下のようになりました。
enabled | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
true | ○ | - | ○ | × | × | ○ | × | ○ | ○ | × | × | ○ |
false | ○ | - | ○ | × | × | ○ | × | ○ | × | ○ | ○ | × |
true | false |
---|---|
解説
どういうことなのか。原因は3つあります。
-
steps.xxx.outputs
に真偽値を入れても文字列として扱われる -
if: {文字列}
は{文字列}
の長さに関わらず、必ず真になる -
true == 'true'
は偽になり、true != 'true'
は真になる
確認
デバッグロギングの有効化 の設定をします。
Settings → Secrets → Actions → New repository secret の Name に ACTIONS_STEP_DEBUG
、Value に true
を設定します。
Actions secrets | New repository secret |
---|---|
この設定をすることによって、値がどのように変化・受け渡し・比較されているのか、などのより詳しい情報を確認することができます。
デモ
このように詳細なログが表示されます。
おわりに
これはややこしすぎますよね。。
少しでもみなさんのお役に立てれば幸いです。
参考
Discussion