👻

GitHub Actions - Worflowが開始・終了したらSlack通知してみる

2022/04/28に公開

特定のWorkflowが開始・終了したらSlack通知したい場面は多々あると思う
そんな時に、どのようはどうすればよいのか整理しておく

on:workflow_run

Workflowを起動できるEventの1つにworkflow_runがある。
これは、Workflowが開始・終了した時に発行されるものである。

対象のWorkflowや、開始・終了、ブランチなどを指定できる。

on:
  workflow_run:
    workflows: [workflow1, workflow2]
    types: [requested, completed]
    branches: [main]

Workflowが開始・終了したら処理する

types: [requested]とすると開始した時のEventを対象とできる。
types: [completed]とすると終了した時のEventを対象とできる。

開始したときは、github.event.workflow_run.conclusionnullが入っている。
終了したときは、github.event.workflow_run.conclusion"success"または"failure"が入っている。

なので、types: [requested, completed]とし、github.event.workflow_run.conclusionの値に応じてJobの処理条件を設定すれば、Workflowが開始・終了(成功・失敗)したら処理することができる。

workflow_run.yml
name: workflow_run
on:
  workflow_run:
    workflows: [helloworld]
    types: [requested, completed]
jobs:
  on-requested:
    runs-on: ubuntu-20.04
    if: ${{ github.event.workflow_run.conclusion == '' }}
    steps:
      - run: echo 'requested'
  on-success:
    runs-on: ubuntu-20.04
    if: ${{ github.event.workflow_run.conclusion == 'success' }}
    steps:
      - run: echo 'success'
  on-failure:
    runs-on: ubuntu-20.04
    if: ${{ github.event.workflow_run.conclusion == 'failure' }}
    steps:
      - run: echo 'failure'

Slack通知する

Slack Send GitHub Actionを使うと手軽にSlack通知できる。

https://github.com/slackapi/slack-github-action

Workflowが開始・終了したらSlack通知する

で、on:workflow_runで起動するWorkflowで、Slack通知を行ってみると、次のような感じになる。
後は、必要に応じて通知内容をカスタマイズすれば良いと思う。

workflow_run.yml
name: workflow_run
on:
  workflow_run:
    workflows: [helloworld]
    types: [requested, completed]
jobs:
  on-requested:
    runs-on: ubuntu-20.04
    if: ${{ github.event.workflow_run.conclusion == '' }}
    steps:
      - uses: slackapi/slack-github-action@v1.18.0
        with:
          payload: |
            {
              "text": "requested"
            }
        env:
          SLACK_WEBHOOK_URL: "https://hooks.slack.com/services/....."
  on-success:
    runs-on: ubuntu-20.04
    if: ${{ github.event.workflow_run.conclusion == 'success' }}
    steps:
      - uses: slackapi/slack-github-action@v1.18.0
        with:
          payload: |
            {
              "text": "success"
            }
        env:
          SLACK_WEBHOOK_URL: "https://hooks.slack.com/services/....."
  on-failure:
    runs-on: ubuntu-20.04
    if: ${{ github.event.workflow_run.conclusion == 'failure' }}
    steps:
      - uses: slackapi/slack-github-action@v1.18.0
        with:
          payload: |
            {
              "text": "failure"
            }
        env:
          SLACK_WEBHOOK_URL: "https://hooks.slack.com/services/....."

まとめ

このやり方の場合は、各Workflowで通知用のStepを記述する必要がなく、通知用のWorkflowを1つ用意すればOKとなる。

しかし、通知周りは設定で管理したい感じはある。

Discussion