GitHub Actionsでエラーの時だけ特定の処理を実行する

GitHub Actionsでエラーハンドリングのやり方に苦戦したので、メモしておく。

目的

GitHub Actionsでは通常、エラーが発生するとワークフローの実行が中断されてしまう。
しかしワークフローの実行結果をチャットへ通知したい場合などは、エラーであっても後続処理を実行する必要がある。

このような想定ユースケースにおいて、エラーであっても後続処理を実行し、ワークフローとしては失敗扱いとしたい。

検証コード

最初に正常終了する処理を実行し、その際のoutcomeを確認している。
その次は確実にエラー終了する処理を記述しているが、後続処理を続行できるようになっている。
エラーハンドリングが完了したらoutcomeで終了ステータスを参照し、エラーの場合は終了させている。

    steps:
      - name: Normal
        id: normal_execution
        run: echo "Normal execution"
        
      - name: Show execution status
        run: echo ${{ steps.normal_execution.outcome }}
      
      - name: Error
        # エラーでも処理を継続する
        continue-on-error: true
        # あとで実行結果を参照するため、IDを振っておく
        id: error_execution
        # ディレクトリが存在することで、2回目は確実にエラーになる
        run: |
          mkdir hoge
          mkdir hoge
      - name: Error handling
        if: ${{ steps.error_execution.outcome == 'failure' }}
        run: |
          echo "Error handling"
          echo ${{ steps.error_execution.outcome }}
          exit 1

ファイル全体はこちら(GitHub)を参照。

検証コードの実行結果

通常であればErrorで発生したエラーによりワークフローが中断されるが後続処理を続行し、Error handlingを実行した後に終了している。

actions-log

検証コードでやっていること

エラーでも途中で終了せず、後続処理を続行する

continue-on-errortrueを指定することで、終了ステータスがエラーでもワークフローの実行が中断されなくなる。

サンプル:確実に失敗するコマンドを実行しても、ワークフローの途中で中断されない

- name: Error
  continue-on-error: true
  run: |
    mkdir hoge
    mkdir hoge

公式ドキュメント: https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idcontinue-on-error

コマンドの終了ステータスを後続処理で参照する

後から終了ステータスを参照したいコマンド実行時にidを指定しておくことで、後からstepsoutcomeとして実行ステータスを参照することができる。

サンプル:error_executionの実行ステータスを後続処理で参照し、エラーであれば終了させる

- name: Error
  id: error_execution
  continue-on-error: true
  run: |
    mkdir hoge
    mkdir hoge

- name: Error handling
  if: ${{ steps.error_execution.outcome == 'failure' }}
  run: |
    echo "Error handling"
    echo ${{ steps.error_execution.outcome }}
    exit 1

公式ドキュメント: https://docs.github.com/ja/actions/learn-github-actions/contexts#example-contents-of-the-github-context

関連記事


  1. 他の人には読めない形式でGitHubのSecretsの値を読み出す
  2. GitHub Actionsでプルリクのコメントに複数行テキストを投稿する
  3. 既存コードへのCheckstyle導入におけるルールの選定
  4. Checkstyleで汎用的に使えそうなルールをピックアップしてみた
  5. JaCoCoでJavaのテストカバレッジのレポートを出力する
  6. Tera Termのマクロで、パスワードを扱う操作を自動化する
  7. HugoテンプレートをOGPやTwitter Cardsに対応する

comments powered by Disqus