GitHub ActionsからSlackへ通知したいとき、一番お手軽なのはSlack Incoming Webhookです。 直接curlで叩いてもいいですし、マーケットプレイスにも通知用のアクションがたくさんあります。
しかし、Incoming Webhookは一般公開してはいけないシークレットです。 迂闊にレポジトリにコミットしてはいけません。 GitHub Actions Secrets へ突っ込む等して、適切に管理する必要があります。 一個や二個ならまだしも、いくつもレポジトリがあると管理が大変です。
そういうわけで、OIDCを使ってSlackへの通知を行うアクションを書きました。
使い方
- gha-notify.shogo82148.com へアクセスします。
- 「Add to Slack」をクリックして、アプリをSlackにインストールします。
- @actions-notify-slack というボットが追加されるので、こいつを通知を流したいチャンネルに招待します。
- 投稿先のチャンネルで
/gha-notify allow ORG/REPO
スラッシュコマンドを実行します。これによりORG/REPO
からの投稿が許可されます。 - ワークフローにアクションを追加して完成!
- uses: shogo82148/actions-notify-slack@v0
with:
team-id: T3G1HAY66 # 自分のチームIDに置き換え
channel-id: C3GMGG162 # 自分のチャンネルIDに置き換え
payload: '{"text": "hello world"}'
仕組み
早い話が、過去 GitHub や AWS 向けに作ったアクションを Slack 向けに焼き直したものです。
GitHub Actions は直接 Slack とやり取りするかわりに、中継サーバーにリクエストを投げます。 中継サーバーは、OIDC ID Tokenを検証し、Slackへの投稿権限をチェックします。 権限を確認できたら、ボットユーザーとして投稿する、という流れです。
セキュリティーへの考慮
短命トークンの使用
Slack Incoming Webhook の有効期限は無期限です。 明示的に無効化しない限りいつまででも使えます。 万が一流出してしまった場合、期限がないので影響が大きいです。
一方 actions-notify-slack でやり取りするトークンには、 ほとんどのトークンに有効期限が設定されています。 GitHubの ID Token は 10 分で有効期限が切れますし、Slackへのアクセストークンは12時間で有効期限が切れます。 GitHub Actions の利用者が扱うトークンは短命なので、万が一流出してしまっても影響は小さくすみます。
Slack App の Client Secret
唯一 Slack App の Client Secret には有効期限がありません。 でも安心してください。僕がしっかり管理・・・しま・・・す。
GitHub Actionsの利用者はセキュリティーのプロではありません。 全員が全員シークレットを正しく扱えるとは限りません。 それよりは、キチンと管理できる誰かにお任せしたほうが安全だろう、という考えです。 (僕がキチンと管理できるのか?という問題はおいておく)
第三者のサーバーを経由する問題
中継サーバーへ通知メッセージを送信する仕組み上、僕が通知内容を見ようと思えば、通信をフックして見ることができます。 もちろんそんなことはしませんが、信用するかはあなた次第です。 中継サーバーの実装も公開しているので、第三者のサーバーを経由することが気になる人は、自前でサーバーを立ててください。
まとめ
OIDCを使ってSlackへの通知を行うアクションを書きました。
Slack App をインストールするだけで、Slackへの通知が簡単に行なえます。
そろそろ利用規約でも書いたほうがいいのでは?という気もしてきた。