特定のリポジトリで、特定のラベルが貼られたらそれを検知してSlackに投稿するBOTをGASで書いた。
こんな感じにissueに特定のラベルが貼られたら通知を送る
やりたかったこと
リポジトリを跨ったアプリケーション構成の場合、Aリポジトリの変更がBリポジトリのアプリケーションに影響を与えることがある。
Aリポジトリに特定のラベルが貼られたら、それをBリポジトリを管理しているチームのSlackチャンネルに通知する、ということをやりたかった。
どうやったか
- GitHub webhookでラベル変更を検知
- GASで変更された情報をSlackに投稿すべき内容かどうかチェック
- GASからSlackにPOSTを投げる
実装手順
GASでスクリプトを書く
claspを使って typescript で記述した。
clasp を使えば、$ yarn clasp push
でGASにコードをアップできたり便利。
- doPost関数でGitHubのpostを受け取ることができる。
- 受け取ったらpayloadをチェックする。
action
プロパティがlabeled
の場合は新規ラベル追加アクションlabel
プロパティに追加されたラベル情報が入っているので、通知したいラベルかどうかチェック
ソースは以下を参照
https://github.com/tic40/gas-notify-labeled-issue/blob/master/src/index.ts
GASアプリケーションを公開する
GASプロジェクトページからWebアプリケーションとして公開をする。
ここで、現在のWebアプリケーションURLが発行されるのでコピーをしておく
GitHub webhooks を追加する
payload url に先程コピーしたGASアプリケーションのURLをペーストする。
今回hookするイベントは、issues
だけで良いので issues
のみにチェックを入れる
Slack
Incoming WebHooks
を通知したいチャンネルに追加する。
WebHook URL が発行されるのでこれもコピーをしておく
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のプロジェクトページから以下のようにそれぞれ設定を行う
雑感
GAS便利ですね