🚀

GitHub Actionsで1つ以上のジョブが失敗した場合にSlackに通知する

2022/01/24に公開

1つのワークフロー内で1つ以上のジョブが失敗した場合に、特定のSlack channelに通知する方法を記載する。

要約

  • ジョブの依存関係は needs で制御できる
  • ワークフローのURLは ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} にて構築できる
  • Slack通知は公式のActions slack-send · Actions · GitHub Marketplace を使用できる

サンプルコード

以下、Slackのワークフロービルダーを使用する場合のサンプル。 job1job2 を並列で実行し、その結果を notify ジョブで送信有無を処理する。

name: Sample workflow
on:
  push

jobs:
  job1:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2

  job2:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Exit code
        run: exit 1

  notify:
    runs-on: ubuntu-latest
    needs: [job1, job2]
    if: ${{ failure() }}
    steps:
      - name: Send GitHub Action trigger data to Slack workflow
        uses: slackapi/slack-github-action@v1.16.0
        with:
          payload: |
            {
              "url": "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
            }
        env:
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WORKFLOW_WEBHOOK_URL }}
  • needs を使用して、ジョブリストの結果を待つ
  • failure() により、needsで設定したジョブリストが失敗した場合に後続処理を実行する
    • ドキュメントでは以前のステップが対象と記載されているが、ジョブを跨いでも作用するExpressions - GitHub Docs
  • Slackへの通知は公式が提供しているActionsを使用する。通知方法は3つある。ワークフロービルダーは有料プランのみ使用できるが、Actionsではパラメータのみ送信し、メッセージはSlack内で書けるので柔軟に変えたい場合は便利。
  • ワークフローのURLは github のコンテキストが持つ要素から構築する

注意点

ジョブIDが取得できない

ジョブ単位のURL(URL形式 https://github.com/:org/:repo/runs/:id)を構築するために必要なIDは、Actionsではサポートされておらず取得できない。 コミュニティのIssueは get action job id - Code to Cloud / GitHub Actions - GitHub Community から参照できる。

参考

Discussion