ステータスによるステップの制御
終了ステータスが0
以外で終了した時デフォルトでは、そのステップのジョブはそこで終了されます。単にジョブの全ステップが正常に実行されて終了することを期待するのであれば、この仕様は直感的で扱いやすいものです。ですが時々、予期していない出来事で最後まで完了しなかった場合だけ後処理を実行したい場合があったりします。
GitHub Actions ではそのような「エラーの時の後処理」を記述できる仕組みが提供されてます。また同じように「正常終了時の後処理」というような仕組みも用意されてます。
関数
GitHub Actions には以下の終了ステータスに関する関数が使えます。
success
failure
cancelled
always
これらの関数は真偽値を返すので、主に<step>.if
に渡して使います。
success
success
は前回のステップの終了ステータスが0
の時true
になる関数です。以下のワークフローではecho success
も実行されます。
jobs:
build:
- run: echo foo
- if: success()
run: echo success
failure
今度は逆に以前のコマンドが0
以外の時だけtrue
になる関数です。以下のワークフローでは最初のステップを終了ステータス1
で終わってるので、echo failure
のステップも実行されます。
jobs:
build:
- run: exit 1
- if: failure()
run: echo failure
注意点として、一度終了ステータスが0
以外のもので終了したステップがある時点で、そのワークフローは失敗した扱いになるというのがあります。このワークフローはecho
で正常に終了してますが、これもワークフローは失敗という扱いになります。
使い所はワークフローが失敗したことに対する後処理を行う為に使うと良いと思います。
ちなみに失敗するかもしれないステップが成功しても失敗してもどちらでも良いような場合continue-on-error: true
を設定することで、終了ステータスが0
以外でも成功扱いにすることができます。以下のワークフローの場合、echo failure
は実行されません。
jobs:
build:
- continue-on-error: true
run: exit 1
- if: failure()
run: echo failure
cancelled
これはステップの終了ステータスではないですが、ワークフローがキャンセルされた以降にtrue
になる関数です。以下のワークフローは、sleep 60
で待っている間にキャンセルボタンをクリックしてキャンセルすることで、echo cancelled
のステップを実行できます。
jobs:
build:
steps:
- run: sleep 60
- if: cancelled()
run: echo cancelled
always
以前のステップが成功でも失敗でも、ワークフローがキャンセルされていたとしても、とにかく常にtrue
になる関数です。以下のワークフローは、最初のステップでわざと失敗させていますが、echo always
は実行されます。
jobs:
build:
steps:
- run: exit 1
- if: always()
run: echo always
- if: failure()
run: echo failure
always
もfaiure
と同じく、一度終了ステータスが0
以外で終わったステップがある時点で、そのワークフローは失敗扱いになります。