業務でアプリと通信するAPI開発を担当しているのですが、アプリの開発担当から「API仕様に変更があった時、そのPull Requestの内容をSlackに通知したりできませんか?」という要望が来ました。共創スタジオのサーバーサイドはCIをGitHub Actionsに一本化しているので、GitHub ActionsでSlack通知する方法を考えてみました。
Slackに通知するActionsを登録するには
Incoming Webhook の追加
Slackに任意のメッセージをポストする方法としてよくあるのがIncoming Webhookの利用です。 ポストしたいチャンネルがあるワークスペースにIncoming Webhookを登録します。詳しい手順は公式ドキュメント等を参照してください。
ポストしたいチャンネルに対して設定が終わると、Webhook URLが発行されます。
Webhook URL を GitHub Actions で参照できるようにする
さて、前述のWebhook URLですが、コレが流出してしまうと誰でもメッセージをポストすることができてしまいます。 うっかりPublicなリポジトリのActionsに記載してしまうと大変です。 こういう取り扱いがシビアな情報はGitHubのSecretsに格納しましょう。
対象のリポジトリのSettings > Secretsに登録します。今回は SLACK_WEBHOOK
という名前にしました。
Slackに通知するActionsを構成する
下準備が終わったので、いよいよActionsを構成していきます。 誰かしらActions作ってるだろうと思ってググってみて、とりあえず一番上に出てきたActionsを使用してみることにしました。
今回実現したいことを改めてまとめると
- Pull Requestが閉じるタイミングでSlackにポストしたい
- 全てのPRでポストするのでなく、
webapi/swagger/
配下のファイルに変更があった場合のみポストしたい - Slack のメッセージ内に、PRのタイトルとURLのリンクを含めたい
以上をまとめて、最終的に次のようなActionsを構成して、 .github/workflows/notify.yml
として登録します。
name: notify on: pull_request: types: ['closed'] paths: - 'webapi/swagger/**' jobs: notify: name: 'Notify to Slack' runs-on: ubuntu-latest steps: - uses: rtCamp/action-slack-notify@v2.0.0 env: SLACK_USERNAME: 'Swagger が更新されたよ!' SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} SLACK_TITLE: 'Pull Request URL' SLACK_MESSAGE: ':rocket: <${{ github.event.pull_request.html_url }}|${{ github.event.pull_request.title }}> :rocket:'
先程Secretsに登録した情報は ${{ secrets.SLACK_WEBHOOK }}
として参照することができます。
Pull Request のURLやタイトルはそれぞれ ${{ github.event.pull_request.html_url }}
、${{ github.event.pull_request.title }}
として参照することができます。
この github.event.pull_request.XXX
の部分はPull RequestのREST APIに対応しています。他にも色んな情報が取れるので参考にしてください。
実際に使ってみた結果
構成したActionsが実行されると、次のようなメッセージがSlackチャンネルにポストされます。
勝った!第三部完!と思いました。その時は。 残念ながらそう甘くは無いのです。。このActionsの実行ログを御覧ください。
Actionsをビルドするのに52秒もかかってる!!!!!! そうです、たまたま選択したActionsですが、ビルドにめっちゃ時間がかかってるのです。。 Publicなリポジトリならまぁ問題は無いのですが、弊社のリポジトリは基本的にすべてPrivate。Actionsを(無料で)使える時間は有限なのです。。
幸いこのActionsは頻繁に実行されるわけでもないですし、弊社の利用状況的にそこまで問題にならない誤差ではあります。が、実行時間は少ないに越したことはありません。 というわけで類似Actionsの性能比較をしてみました。続く。。