ステータスによるステップの制御

終了ステータスが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

alwaysfaiureと同じく、一度終了ステータスが0以外で終わったステップがある時点で、そのワークフローは失敗扱いになります。