GitHubのissueに特定のラベルが貼られたらSlackに投稿するBOTを作る

特定のリポジトリで、特定のラベルが貼られたらそれを検知してSlackに投稿するBOTをGASで書いた。

github.com

こんな感じにissueに特定のラベルが貼られたら通知を送る f:id:tic40:20181115204625p:plain

やりたかったこと

リポジトリを跨ったアプリケーション構成の場合、Aリポジトリの変更がBリポジトリのアプリケーションに影響を与えることがある。

Aリポジトリに特定のラベルが貼られたら、それをBリポジトリを管理しているチームのSlackチャンネルに通知する、ということをやりたかった。

どうやったか

  • GitHub webhookでラベル変更を検知
  • GASで変更された情報をSlackに投稿すべき内容かどうかチェック
  • GASからSlackにPOSTを投げる

実装手順

GASでスクリプトを書く

claspを使って typescript で記述した。 clasp を使えば、$ yarn clasp push でGASにコードをアップできたり便利。

github.com

  • doPost関数でGitHubのpostを受け取ることができる。
  • 受け取ったらpayloadをチェックする。
  • action プロパティが labeled の場合は新規ラベル追加アクション
  • label プロパティに追加されたラベル情報が入っているので、通知したいラベルかどうかチェック

ソースは以下を参照

https://github.com/tic40/gas-notify-labeled-issue/blob/master/src/index.ts

GASアプリケーションを公開する

GASプロジェクトページからWebアプリケーションとして公開をする。

f:id:tic40:20181115203753p:plain

ここで、現在のWebアプリケーションURLが発行されるのでコピーをしておく

GitHub webhooks を追加する

payload url に先程コピーしたGASアプリケーションのURLをペーストする。 f:id:tic40:20181115204015p:plain

今回hookするイベントは、issues だけで良いので issues のみにチェックを入れる f:id:tic40:20181115204051p:plain

Slack

Incoming WebHooks を通知したいチャンネルに追加する。

WebHook URL が発行されるのでこれもコピーをしておく

f:id:tic40:20181115204307p:plain

GASにスクリプトプロパティの追加

キーや設定情報は、コード内に直接記載せずにGASのスクリプトプロパティに定義している。 SLACK_WEBHOOK_URL などはここに入力している。

const properties = PropertiesService.getScriptProperties()
const SLACK_WEBHOOK_URL: string = properties.getProperty('SLACK_WEBHOOK_URL')
const SLACK_CHANNEL: string = properties.getProperty('SLACK_CHANNEL')
const LABEL_NAME: string = properties.getProperty('LABEL_NAME')
const ICON_EMOJI: string = properties.getProperty('ICON_EMOJI')
const USERNAME: string = properties.getProperty('USERNAME')

GASのプロジェクトページから以下のようにそれぞれ設定を行う

f:id:tic40:20181115204408p:plain

雑感

GAS便利ですね