前回のフォローアップ的な内容です。
複数ジョブからなるワークフローの最後に Slack などに通知する時、ワークフロー全体の成功・失敗だけでなく、どのジョブで失敗したかを通知したくなります。通知のリンクからワークフローの実行結果を開けば分かりますが、通知時点で分かる方がよいでしょう。
ジョブ毎にステータスをワークフローレベルの変数に記録して最後に通知したいところですが、そのようなグローバル変数は提供されていません。そのかわり、job.outputs
を使えばジョブの出力を後続ジョブに伝搬できます。
https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idoutputs
各ジョブに必ず実行される最終スッテップを定義して、echo "::set-output name=<output_name>::<output of job>"
で job.status
を記録します。ジョブの outputs
に ${{ steps.<step_id>.outputs.<output_name> }}
の形式で output を定義します。以下の例では、ジョブ名とジョブステータスを message
という名前で記録して outputs/done
に保持するようにしています。
Build: runs-on: ubuntu-latest name: Build outputs: done: ${{ steps.check.outputs.message }} steps: - name: Build run: echo Build - id: check if: ${{ always() }} run: echo "::set-output name=message::Build ${{ job.status }}"
全ジョブの結果出力用ジョブを書いてみます。needs
で対象の全ジョブを指定します。${{ needs.<job_name>.outputs.<output_name> }}
で記録したジョブの出力が取れます。
Aggregate: if: ${{ always() }} runs-on: ubuntu-latest needs: [Build, TestA, TestB, Deploy] steps: - name: Aggregate run: | echo ${{ needs.Build.outputs.done }} echo ${{ needs.TestA.outputs.done }} echo ${{ needs.TestB.outputs.done }} echo ${{ needs.Deploy.outputs.done }}
出力結果。
文字だと地味なので Slack への通知は見やすいようにステータスを絵文字に変換してみます。
Build: runs-on: ubuntu-latest name: Build outputs: done: ${{ steps.check.outputs.message }} steps: - name: Build run: echo Build - id: check if: ${{ always() }} run: echo "::set-output name=message::Build ${{ (job.status == 'success' && '✅') || '❌' }}"
Slack 通知用のジョブ。
Notify_succeed: if: ${{ success() }} runs-on: ubuntu-latest needs: [Build, TestA, TestB, Deploy] steps: - name: Notify to Slack channel uses: rtCamp/action-slack-notify@v2 env: SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }} SLACK_USERNAME: GitHUb Actions SLACK_TITLE: 'Workflow #${{ github.run_number }} succeeded' SLACK_ICON: https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png SLACK_MESSAGE: '${{ needs.Build.outputs.done }} ${{ needs.TestA.outputs.done }} ${{ needs.TestB.outputs.done }} ${{ needs.Deploy.outputs.done }}'
実行結果。Deploy は Test B の失敗により実行されません。
Slack の通知です。Test B で失敗したことが分かります。
ワークフロー定義の全体を掲載しておきます。
name: Multi Stage Build on: push: jobs: Build: runs-on: ubuntu-latest name: Build outputs: done: ${{ steps.check.outputs.message }} steps: - name: Build run: echo Build - id: check if: ${{ always() }} run: echo "::set-output name=message::Build ${{ (job.status == 'success' && '✅') || '❌' }}" TestA: runs-on: ubuntu-latest needs: Build outputs: done: ${{ steps.check.outputs.message }} name: Run Test A steps: - name: Test A run: echo Test A - id: check if: ${{ always() }} run: echo "::set-output name=message::Test A ${{ (job.status == 'success' && '✅') || '❌' }}" TestB: runs-on: ubuntu-latest needs: Build outputs: done: ${{ steps.check.outputs.message }} name: Run Test B steps: - name: Test B run: | echo Test B - id: check if: ${{ always() }} run: echo "::set-output name=message::Test B ${{ (job.status == 'success' && '✅') || '❌' }}" Deploy: runs-on: ubuntu-latest needs: [TestA, TestB] outputs: done: ${{ steps.check.outputs.message }} steps: - name: Deploy run: echo Deploy - id: check if: ${{ always() }} run: echo "::set-output name=message::Deploy ${{ (job.status == 'success' && '✅') || '❌' }}" Notify_succeed: if: ${{ success() }} runs-on: ubuntu-latest needs: [Build, TestA, TestB, Deploy] steps: - name: Notify to Slack channel uses: rtCamp/action-slack-notify@v2 env: SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }} SLACK_USERNAME: GitHUb Actions SLACK_TITLE: 'Workflow #${{ github.run_number }} succeeded' SLACK_ICON: https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png SLACK_MESSAGE: '${{ needs.Build.outputs.done }} ${{ needs.TestA.outputs.done }} ${{ needs.TestB.outputs.done }} ${{ needs.Deploy.outputs.done }}' Notify_failure: if: ${{ failure() }} runs-on: ubuntu-latest needs: [Build, TestA, TestB, Deploy] steps: - name: Notify to Slack channel uses: rtCamp/action-slack-notify@v2 env: SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }} SLACK_USERNAME: GitHUb Actions SLACK_TITLE: 'Workflow #${{ github.run_number }} failed' SLACK_ICON: https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png SLACK_COLOR: danger SLACK_MESSAGE: '${{ needs.Build.outputs.done }} ${{ needs.TestA.outputs.done }} ${{ needs.TestB.outputs.done }} ${{ needs.Deploy.outputs.done }}'