重要なファイルの変更をSlackに通知したい

プロフィール画像

林田悠斗

2024年09月27日

リンクをコピーXでシェアするfacebookでシェアする

はじめに

はじめまして、林田と申します!現在は不動産会社のシステム開発の支援などをさせてもらっています!

私の参画しているプロジェクトでは、基幹系システムなどを管理するリポジトリは複数チームで編集しており、毎日変更が加えられています。

このようなプロジェクトでは、他チームによって設定ファイルや自チームがメインで管理しているファイルなど、開発に影響が大きいファイルが編集される可能性があります。
この時、チーム間の連携を怠れば、思いもよらぬバグなどが発生する可能性が高まってしまいます。

今回はその連携漏れを少なくするための、GitHub Actionsを使って重要なファイルの変更をSlack通知するワークフローを紹介したいと思います。

開発手順

Slack通知の下準備をする

まずは下準備として、SlackのWebhook のURLを取得してGitHubへ登録を行います。

1.  SlackからWebhook URLを取得する

[公式ドキュメント](https://api.slack.com/messaging/webhooks)を参考に、通知したいチャンネルのWebhook URLを取得します。

2.  Webhook URLをGithub リポジトリに登録する

  1. 通知を行いたいリポジトリの「Settings」を選択、メニューの「Secrets and variables」から「Actions」を選択
  2. 右上の「New repository secret」を選択
  3. Nameを設定する(後ほどワークフロー実装に使用します)
  4. Valueに取得したWebhook URLを設定する

GitHub Actionsの設定を行う

Slack通知を行うワークフローを記述していきます。
1.ワークフローの基本設定

name: Notify of changes

on:
 push:
   branches:
     - dev
   paths:
     - 'README.md'
     - 'src/setting.py'

ここでは設定したブランチで特定のパスにあるファイルがプッシュされた時にトリガーされるようになっています。
トリガーとなる条件を限定することで、不要な時はワークフローの実行を避けられて、リソースの節約につながります。
今回ですと、devブランチで’README.md’と’src/setting.py’が変更されたときにワークフローが動きます。

2.環境変数の設定

env:

   SLACK_USERNAMW: "ファイル変更通知"

   SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}

続いて環境変数を設定します。

「SLACK_USERNAME」は通知するユーザの名前を設定します。
「SLACK_WEBHOOK」には Webhook URLを割り当てるため、先ほどGitHubに登録したsecretを設定します。

3.ファイルの変更確認

jobs:
   changes:
     runs-on: ubuntu-latest
     outputs:
       readme: ${{ steps.filter.outputs.readme }}
       setting: ${{ steps.filter.outputs.setting }}
     steps:
     - uses: actions/checkout@v4
     - uses: dorny/paths-filter@v3
       id: filter
       with:
         base: 'dev'
         filters: |
           readme: 'README.md'
           setting: 'src/setting.py'

次はファイルの変更があったかどうかを確認しています。
このジョブでは二つのステップで処理が行われます。

A.actions/checkout@v4
リポジトリのコードをチェックアウトして、内容にアクセスできるようにします。

B.dorny/paths-filter@v3
「paths-filter」アクションを使用して、指定したファイルに変更があるかどうかを検出します。  `base: ‘dev’`はdevブランチのコードを基準に変更を検出することを意味します。
このステップで取得した値は「outputs」で出力し、以降のステップで利用します。

4.Slack通知の送信

change_file:
   runs-on: ubuntu-latest
   needs: changes
   steps:
     - name: readme
       if: ${{ needs.changes.outputs.readme == 'true' }}
       uses: rtCamp/action-slack-notify@v2
       env:
         SLACK_TITLE: 'READMEファイルが修正されました'
         SLACK_COLOR: good
         SLACK_MESSAGE: 'README.md が修正されました'
     - name: setting
       if: ${{ needs.changes.outputs.setting == 'true' }}
       uses: rtCamp/action-slack-notify@v2
       env:
         SLACK_TITLE: '設定ファイルが修正されました'
         SLACK_COLOR: good
         SLACK_MESSAGE: 'src/setting.py が修正されました'

最後にSlack通知を行うジョブを記述します。
先ほどのchangesジョブでの出力を利用するために、`needs: changes`でジョブの完了を待ちましょう。
その後、各ステップで通知を行うかの判定を行います。

if: ${{ needs.changes.outputs.readme == 'true' }}

`needs.changes.outputs.readme`は一つ前のジョブで出力された、変更があったかどうかの検出結果なので、これがtrueであれば通知アクションを実行します。

通知には「rtCamp/action-slack-notify@v2」アクションを使います。
SLACK_TITLEで通知のタイトル、SLACK_MESSAGEで通知メッセージを設定します。SLACK_COLORは通知する際の表示カラーを決めることができ、他にはsuccessやfailureを設定することができます。
その他の設定は以下より確認できます。
Slack Notify - GitHub Action

以上で実装は終了です。workflowファイルをリポジトリにpushすることでGitHub Actionsが動くようになると思います。

全体コード

name: Notify of changes

on:
 push:
   branches:
     - dev
   paths:
     - 'README.md'
     - 'src/setting.py'


 env:
   SLACK_USERNAMW: "ファイル変更通知"
   SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}


 jobs:
   changes:
     runs-on: ubuntu-latest
     outputs:
       readme: ${{ steps.filter.outputs.readme }}
       setting: ${{ steps.filter.outputs.setting }}
     steps:
     - uses: actions/checkout@v4
     - uses: dorny/paths-filter@v3
       id: filter
       with:
         base: 'dev'
         filters: |
           readme: 'README.md'
           setting: 'src/setting.py'


 change_file:
   runs-on: ubuntu-latest
   needs: changes
   steps:
     - name: readme
       if: ${{ needs.changes.outputs.readme == 'true' }}
       uses: rtCamp/action-slack-notify@v2
       env:
         SLACK_TITLE: 'READMEファイルが修正されました'
         SLACK_COLOR: good
         SLACK_MESSAGE: 'README.md が修正されました'
     - name: setting
       if: ${{ needs.changes.outputs.setting == 'true' }}
       uses: rtCamp/actions-slack-notify@v2
       env:
         SLACK_TITLE: '設定ファイルが修正されました'
         SLACK_COLOR: good
         SLACK_MESSAGE: 'src/setting.py が修正されました'

実際に動かしてみる

実際に対象ファイルを変更し、devブランチにpushしてみます。
するとGitHub Actions のワークフローが動き出します。

すると、設定された通り通知されました。

通知から変更したユーザー、コミット、修正されたファイルも追うことができますね。

まとめ

私たちのチームはこの通知の導入でバグの削減に繋がりました。
関わるチームが多くなるほど、その連携には労力が必要になります。
もしファイルの管理で困っている方は導入してみてはいかがでしょうか?

この記事を書いた人

林田悠斗
林田悠斗
2020年に新卒でメンバーズに入社。不動産会社のWebサービス開発を中心にサポート。Python/DjangoやFlutterなどフロント・バックエンド問わず開発を行っている。趣味は動画編集。
ページトップへ戻る