notebook

都内でWEB系エンジニアやってます。

GitHub Actionsでworkflow全体の結果をSlackに通知する

GitHub ActionsでSlackに通知を送るならSlack Workflow Notificationsが良さそうですよという話

経緯はだらだら書いてしまったので忙しい方は試してみるから読んでいただければと思います

経緯

Actionsを使って色々やっているworkflowが増えてきたのでそろそろ通知系は統一して簡単に設定できるようにしたいなと思い始めていた

slack通知のアクションはマーケットプレイスで探すと結構出てくるがattachementをふんだんに使ってその結果結構な長さになってしまい通知がちょっと来るだけでスクロールしないと追えないみたいな状況になりがちなイメージがある(実際に自分はなっていた)

CircleCIのSlack連携のように1行もしくは数行でコンパクトに必要な情報だけほしいと思っていたので自分で作れば良いかと思ってせっせとコードを書いてSlackのblock構文と戯れていた

CircleCIの通知はこんな感じ

f:id:swfz:20201021091432p:plain

で、ある程度形になってきたところで気付いてしまった

Slack通知で検索すると出てくる記事はJob単位で成功・失敗を判断し通知するパターンが多く、workflow全体に対して結果を通知するみたいな話を探せなかった(その時の検索ワードが微妙だっただけかもしれないが)

すべてのJobに対して通知の処理を書いていくのは微妙なので方針を変えてworkflowに対して1つの通知設定を書くようにできないか調べた

すると次の記事を見つけた

GitHub Actionsの複数Jobで構成されるWorkflowの正しい結論を知る方法 - Qiita

qiita.com

workflow全体の結果を取得するにはAPIを駆使してゴニョゴニョする必要があり、自分でやるのはちょっと面倒だなと感じた

記事で取り上げられている次のアクションを使うことでenv.WORKFLOW_CONCLUSIONに最終的なworkflowの実行結果が入ってくるのでそれを使って通知するのが良さそう

technote-space/workflow-conclusion-action: GitHub action to get workflow conclusion.

github.com

↑でworkflowの結果を取得して自前のslack通知用アクションで通知させればOKそう

その前に方針を変えたのでもう一度マーケットプレイスを調べてみようとしらみつぶしに見ていった

すると実現したいことにマッチしそうなアクションがあった

workflowの結果をAPIで集計してSlack通知まで行ってくれるアクション

Slack Workflow Notifications · Actions · GitHub Marketplace github.com

Gamesight/slack-workflow-status: Github action for sending workflow run results to Slack github.com

これならそんなに長さ取らないだろうし各Jobの実行時間なども載っていて良さそう

ということで使ってみる

試してみる

事前にsecretsへSlackのIncomingWebhookのURLを登録しておく

GITHUB_TOKENはActionsが用意してくれるものでOK

  • .github/workflows/sample.yml
name: workflow result notification

on: [push, workflow_dispatch]

jobs:
  job-a1:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        role:
          - name: matrix-a
          - name: matrix-b
    steps:
      - run: sleep 1
      - run: exit 0

  job-a2:
    runs-on: ubuntu-latest
    needs: [job-a1]
    steps:
      - run: sleep 2
      - run: exit 0
  job-b:
    runs-on: ubuntu-latest
    steps:
      - run: sleep 5
      - run: exit 0

  slack-notify:
    if: always()
    needs: [job-a2, job-b]
    name: workflow notification to slack
    runs-on: ubuntu-latest
    steps:
      - uses: Gamesight/slack-workflow-status@master
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          slack_webhook_url: ${{ secrets.SLACK_WEBHOOK_URL }}

適当に依存Jobの設定を入れたりbuild matrixの設定を入れたりしてみた

slack-notifyJobでは次の2点

  • if: always()で前段のJobが途中で失敗しても処理が走るようにする
  • needsで該当workflowが終了するためのJobを列挙する

がポイント

まぁただ使うだけです

  • 失敗時

f:id:swfz:20201021091438p:plain

  • 成功時

f:id:swfz:20201021091444p:plain

載っている項目

  • 成功の場合は緑、失敗の場合は赤がattachementでつけられる
  • workflowのJob名と成否、実行時間(リンク)
  • event名とbranch名(リンク)
  • workflowの実行時間(リンク)

よい

まとめ

初め通知周りはSlackのGitHub Integrationで良いじゃんと思っていたが、SlackのIntegrationだとPullRequestまで作らないと各種Jobの結果が分からない

スケジュール実行(schedule)や手動実行(workflow_dispatch)時にも通知が欲しいので合わなかった

とりあえずだいたいのworkflowに入れました

今のところ快適です

Slack Workflow Notifications