ブログ

GitHub ActionsでSlackに通知を飛ばそう

ソフトウェアエンジニアインターンのhiroです。
FLYWHEELのエンジニアリングプロセス・セットアップを規定しているflywheel-standardを自分でこまめにチェックしなくても「更新があったら自動的にSlackに通知が届けば便利だよなー」という話をSlackでしていたところ、「ちょっとhiroさんやってみたら?」という流れになったので、折角なので話題のツール、GitHub Actionsで試しに使ってみました。

やりたいこと

GitHub上で管理しているドキュメントに重要な変更があった際、定期的なチェックをしていないとうっかり見逃してしまうことも考えられます。そこでGitHub Actionsの出番です。リポジトリにpushやプルリクエストなどのイベントが発生した時に、定義したワークフローに従ってCI/CDなどが実行出来る優れ物です。今回はリポジトリの docsかbinディレクトリの中身が master ブランチで変更された時、 Slack の特定のチャンネルに通知されるワークフローを作ってみたいと思います。#engineering というチャンネルに対して配信する想定です。

リポジトリの構造

今回ワークフローを構成するリポジトリの構造は以下の通りです。ワークフローは.github/workflowsディレクトリでYAMLファイルを用いて定義できます。

flywheel_standard
├── docs
├── bin
└── .github
    └── workflows
        └── upload.yaml

GitHub MarketplaceとAction

次に、Slackと連携する為にGitHub Marketplaceから対応するActionを探します。ActionとはGitHubや外部ツールのAPIを活用するプラグインのようなものと捉えていただければいいと思います。GitHub Marketplaceではコードレビュー用のツールやクラウドサービスへのデプロイ、各種チャットサービスとの連携など、様々な種類のActionが用意されており、それらをワークフローを定義するYAMLファイルから簡単に参照することができます。今回は、Slackと連携をするためにpullreminders/slack-actionを使おうと思います。ここからはこのActionのセットアップ手順に沿って進めていきたいと思います。
GitHub Market Place Screen Shot

Slack側で行う事前準備

こちらのActionを使う為には、まずはSlackに投稿するためのbotユーザーを通知する対象のSlackで登録する必要があります。

  1. アプリの登録:Slack APIからCreate New Appで新しいアプリを登録します
  2. botの作成:サイドバーからBot Usersのページよりbotを登録します
  3. botのアイコンの指定:ボットの基本情報のページからアイコンを指定します
  4. アプリのインストール:サイドバーからBasic Informationのページより”Install your app to your workspace”でbotをインストールする
  5. アクセストークンの取得:サイドバーからOAuths&Permissionsのページより”Bot User OAuth Access Token”を取得します。(`xoxb-`で始まる文字列)

GitHub側で行う事前準備

Slackで取得したアクセストークンを暗号化されたシークレットとしてとしてGitHubのリポジトリに登録します。リポジトリのSettings→Secretsに行き、アクセストークンを登録してください。ここでは登録するシークレットの名前を`SLACK_BOT_TOKEN`とします。

YAMLを書く

準備が整ったところで、upload.yamlに以下のコードを書きます。

name: notify 
on: 
  push: 
    branches: 
      - master 
    paths: 
      - 'docs/**' 
      - 'bin/**' 
jobs: 
  notify: 
    runs-on: ubuntu-latest 
    steps: 
      - uses: actions/checkout@v1 
      - name: Send notification to Slack when master/docs has been updated 
        uses: pullreminders/slack-action@v1 
        with: 
          # "channel"にSlackチャンネルIDを代入 
          args: '{\"channel\":\"XXXXXXXX\", \"text\":\"flywheel_standardが変更されたよ\"}' 
        env: 
          SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}

スキーマを知らない方でも、なんとなくやっていることは分かるのではないでしょうか。基本的には`on:`でワークフローを走らせるためのトリガーを指定して、`jobs:`で実際のワークフローを構築する流れになります。ここで気をつけるべき点は以下の通りです。

  • `on`でトリガーとして使用できるイベントは様々です。例えば、`push`の他にも, `fork`, `pull_request`, `watch`など、リポジトリに起こり得るイベントであれば大抵ハンドルできます。使用できるイベントはこちらで定義されています。
  • `args`はSlackのAPIで指定されているJSONで、ここで自由にメッセージの中身を変更できます。例えば、`args`内の`channel`でチャンネル固有のIDを指定する必要があります。こちらのIDは`https://myworkspace.slack.com/messages/{ここにchannel ID}/`で取得できます。

細かい仕様はこちらのドキュメントを参照していただけると良いと思います。
それでは、実際に走らせてみましょう。完成したコードをpushします。ワークフローの状況はリポジトリのActionsタブで確認できます。
 
ドキドキ…ドキドキ…
わーい!

最後に

今回は簡単にGitHub ActionsでリポジトリとSlackを連携してみました。リポジトリ単位でワークフローを定義・実行できるのは非常に強力で、使い方次第では開発の心強い味方になりそうです。
FLYWHEELでは、最新のツールを導入することに積極的なインターンを募集中です!