なまえは まだ ない

思いついたことをアウトプットします

GitHub Actions でSlackに通知する方法を調べてみた

業務でアプリと通信するAPI開発を担当しているのですが、アプリの開発担当から「API仕様に変更があった時、そのPull Requestの内容をSlackに通知したりできませんか?」という要望が来ました。共創スタジオのサーバーサイドはCIをGitHub Actionsに一本化しているので、GitHub ActionsでSlack通知する方法を考えてみました。

Slackに通知するActionsを登録するには

Incoming Webhook の追加

Slackに任意のメッセージをポストする方法としてよくあるのがIncoming Webhookの利用です。 ポストしたいチャンネルがあるワークスペースにIncoming Webhookを登録します。詳しい手順は公式ドキュメント等を参照してください。

api.slack.com

ポストしたいチャンネルに対して設定が終わると、Webhook URLが発行されます。

f:id:furusax0621:20200328111809p:plain

Webhook URL を GitHub Actions で参照できるようにする

さて、前述のWebhook URLですが、コレが流出してしまうと誰でもメッセージをポストすることができてしまいます。 うっかりPublicなリポジトリのActionsに記載してしまうと大変です。 こういう取り扱いがシビアな情報はGitHubのSecretsに格納しましょう。

対象のリポジトリのSettings > Secretsに登録します。今回は SLACK_WEBHOOK という名前にしました。

f:id:furusax0621:20200328112857p:plain

Slackに通知するActionsを構成する

下準備が終わったので、いよいよActionsを構成していきます。 誰かしらActions作ってるだろうと思ってググってみて、とりあえず一番上に出てきたActionsを使用してみることにしました。

github.com

今回実現したいことを改めてまとめると

  • 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に対応しています。他にも色んな情報が取れるので参考にしてください。

developer.github.com

実際に使ってみた結果

構成したActionsが実行されると、次のようなメッセージがSlackチャンネルにポストされます。

f:id:furusax0621:20200328114340p:plain

勝った!第三部完!と思いました。その時は。 残念ながらそう甘くは無いのです。。このActionsの実行ログを御覧ください。

f:id:furusax0621:20200328114736p:plain

Actionsをビルドするのに52秒もかかってる!!!!!! そうです、たまたま選択したActionsですが、ビルドにめっちゃ時間がかかってるのです。。 Publicなリポジトリならまぁ問題は無いのですが、弊社のリポジトリは基本的にすべてPrivate。Actionsを(無料で)使える時間は有限なのです。。

幸いこのActionsは頻繁に実行されるわけでもないですし、弊社の利用状況的にそこまで問題にならない誤差ではあります。が、実行時間は少ないに越したことはありません。 というわけで類似Actionsの性能比較をしてみました。続く。。