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
If your
if
expression does not contain any of the status functions it will automatically result withsuccess()
.
という記述があったのだが、しばらくの間これを「if
がなければ〜」くらいにとらえていたもので「思ってたの結果が違う」と悩んだりしていた。