GitHub Actionsのステップのフロー制御

GitHub Actionsのステップ間のフロー制御をどのように行えるか確認してみた。

name: Flow control

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:

  build:
    name: Build
    runs-on: ubuntu-latest

    steps:

    - name: step0 success
      run: |
        echo step0

    - name: step1 success and set env
      run: |
        echo step1
        echo "::set-env name=var1::1"

    - name: step2 skip
      run: |
        echo step2
      # `!always()`と書くとエラーになる
      if: 1 == 0

    - name: step3 fail
      run: |
        echo step3
        echo "::set-env name=var2::1"
        exit 1

    # 前のステップが失敗していたら実行する
    - name: step4 if failure
      run: |
        echo step4
      if: failure()

    # 前のステップは成功しているから実行されそうだが……
    - name: step5
      run: |
        echo step5

    # これまでのステップの成否に関係なく常に実行する
    - name: step6 always
      run: |
        echo step6
      if: always()

    # これまでのステップの成否に関係なく環境変数var1の値が1であれば実行する
    - name: step7 always and if var1
      run: |
        echo step7
      # step1で環境変数okを設定する前にコケたらこのステップは実行されない
      if: always() && env.var1 == 1

    # これまでのステップの成否に関係なく環境変数var2の値が1であれば実行する
    - name: step8 always and if var2
      run: |
        echo step8
      # step1で環境変数okを設定する前にコケたらこのステップは実行されない
      if: always() && env.var2 == 1

    # 環境変数var1の値が1なら実行されそうだが……
    - name: step9 if var1
      run: |
        echo step9
      if: env.var1 == 1

    - name: step10
      run: |
        echo step10

結果は以下の通り。

✓ Set up job
✓ step0 success
✓ step1 success and set env
⃠ step2 skip
✕ step3 fail
✓ step4 if failure
⃠ step5
✓ step6 always
✓ step7 always and if var1
✓ step8 always and if var2
⃠ step9 if var1
⃠ step10
✓ Complete job

Job status check functions

If your if expression does not contain any of the status functions it will automatically result with success().

という記述があったのだが、しばらくの間これを「ifがなければ〜」くらいにとらえていたもので「思ってたの結果が違う」と悩んだりしていた。