🐛

GitHub Actions で真偽値判定の注意点

2022/08/03に公開

はじめに

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' は真になる

確認

デバッグロギングの有効化 の設定をします。

https://docs.github.com/ja/actions/monitoring-and-troubleshooting-workflows/enabling-debug-logging

Settings → Secrets → Actions → New repository secret の Name に ACTIONS_STEP_DEBUG、Value に true を設定します。

Actions secrets New repository secret

この設定をすることによって、値がどのように変化・受け渡し・比較されているのか、などのより詳しい情報を確認することができます。

デモ

https://github.com/blendthink/github-actions-expression-demo/actions/runs/2783203755

このように詳細なログが表示されます。

おわりに

これはややこしすぎますよね。。
少しでもみなさんのお役に立てれば幸いです。

参考

https://docs.github.com/ja/actions/learn-github-actions/expressions

https://github.com/actions/runner/issues/1483#issuecomment-994986996

GitHubで編集を提案

Discussion