GitHub ActionsでSlackに通知を送るならSlack Workflow Notificationsが良さそうですよという話
経緯はだらだら書いてしまったので忙しい方は試してみる
から読んでいただければと思います
経緯
Actionsを使って色々やっているworkflowが増えてきたのでそろそろ通知系は統一して簡単に設定できるようにしたいなと思い始めていた
slack通知のアクションはマーケットプレイスで探すと結構出てくるがattachementをふんだんに使ってその結果結構な長さになってしまい通知がちょっと来るだけでスクロールしないと追えないみたいな状況になりがちなイメージがある(実際に自分はなっていた)
CircleCIのSlack連携のように1行もしくは数行でコンパクトに必要な情報だけほしいと思っていたので自分で作れば良いかと思ってせっせとコードを書いてSlackのblock
構文と戯れていた
CircleCIの通知はこんな感じ
で、ある程度形になってきたところで気付いてしまった
Slack通知で検索すると出てくる記事はJob単位で成功・失敗を判断し通知するパターンが多く、workflow全体に対して結果を通知するみたいな話を探せなかった(その時の検索ワードが微妙だっただけかもしれないが)
すべてのJobに対して通知の処理を書いていくのは微妙なので方針を変えてworkflowに対して1つの通知設定を書くようにできないか調べた
すると次の記事を見つけた
GitHub Actionsの複数Jobで構成されるWorkflowの正しい結論を知る方法 - Qiita
workflow全体の結果を取得するにはAPIを駆使してゴニョゴニョする必要があり、自分でやるのはちょっと面倒だなと感じた
記事で取り上げられている次のアクションを使うことでenv.WORKFLOW_CONCLUSION
に最終的なworkflowの実行結果が入ってくるのでそれを使って通知するのが良さそう
technote-space/workflow-conclusion-action: GitHub action to get workflow conclusion.
↑で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-notify
Jobでは次の2点
if: always()
で前段のJobが途中で失敗しても処理が走るようにするneeds
で該当workflowが終了するためのJobを列挙する
がポイント
まぁただ使うだけです
- 失敗時
- 成功時
載っている項目
- 成功の場合は緑、失敗の場合は赤がattachementでつけられる
- workflowのJob名と成否、実行時間(リンク)
- event名とbranch名(リンク)
- workflowの実行時間(リンク)
よい
まとめ
初め通知周りはSlackのGitHub Integrationで良いじゃんと思っていたが、SlackのIntegrationだとPullRequestまで作らないと各種Jobの結果が分からない
スケジュール実行(schedule)や手動実行(workflow_dispatch)時にも通知が欲しいので合わなかった
とりあえずだいたいのworkflowに入れました
今のところ快適です