※ GitHub と Slack を利用している人向けの記事になります
こんにちは。はてなでアプリケーションエンジニアをしている id:hatz48 です。 社内で使っているちょっとしたツールの紹介と、それを作るのに Google App Script を利用したら楽だったという話をしようと思います。
どんなツールですか
はてなでは現在、コードの管理に GitHub/GitHub Enterprise、コミュニケーションツールに Slack を利用しています。 GitHub と Slack を利用していれば、おそらくその二つの連携機能 も利用しているのではないかと思います。連携はとても便利ですが、現状すべての活動を Slack に流すことが出来るわけではありません。出来ないことのうちの一つが「ラベル変更」の通知です。
はてなではいくつかのチームで、ラベルによるレビューフローの管理をしています。
レビューしてもらいたい状態になったら レビュー依頼
、レビューしはじめたら レビュー中
といったラベルを付けて、レビューしてほしいものが放置されてしまったり、複数人で同じ P-R をレビューしていたりということがないようにしています(後者に関しては、別に複数人でレビューすること自体はよいので、目安程度なのですが)
レビュー依頼
ラベルをつけたら Slack に通知されてくると便利!なのですが上述の通り GitHub-Slack 連携ではラベルの変更を通知することができません。
これはさほど大きな問題ではなく、 GitHub の webhook と Slack API を使えばラベルの変更を通知することは出来ます。
ただ「その実装をどこに置くのか」がやや面倒ですよね。 本当に「ちょっとしたツール」という感じです。「この為にわざわざサーバーを立てるのか」「複数のチームで利用したいけれどどこがサーバーの管理をするの」という億劫さがあります。そこで元祖サーバーレスアーキテクチャであるところの Google App Script でお手軽 webhook サーバーを構築することにしました。
GitHub webhook --> Google Apps Script(web application として公開) --> Slack
Google Apps Script は書いたコードを「web application として公開」することが出来ます。「web application として公開」すると url が付与され、その url への GET アクセスは doGet メソッドで、POST メソッドは doPost メソッドでハンドルすることが出来ます。Github の webhook にこの url を指定しすれば、doGet メソッドでハンドルすることが出来ます。今回は webhook で飛んできた情報をもとに「どのチャンネルに」「何を」通知するかを計算して通知するようにしました。
使い方
簡単なスクリプトですが GitHub に公開してみたので紹介します。
構築編
- リポジトリ を clone
- コードをビルド
npm install
してnpm run build
- Gooleスプレッドシートの用意
- 「どのチャンネルに」「何を」通知するかの情報を格納するスプレッドシートを用意します
- これ をコピーする
- Google Apps Script にコードアップロード & プロパティ入力
- Google Apps Script を作成して、ビルドしたコード(reviewkun.js)をコピペする
- ファイル->プロジェクトのプロパティ->スクリプトのプロパティで
- SLACK_API_URL というキーで Slack API url を記入
- spreadsheet_id というキーで上記のスプレッドシートの ID を記入
- web application として公開する
- 公開->ウェブアプリケーションとして導入 からスクリプトを公開します
- 公開するときに、アクセス出来るユーザーの指定を「全員(匿名ユーザーを含む)」にするのを忘れないようにして下さい
- つまり、公開 url の取り扱いはお気をつけて
- ここで取得できる url をあとで webhook に指定します
実際に動かす
- スプレッドシートにリポジトリと通知先チャンネルを記入
- repository と channel の指定があれば動きます
- label condition で指定した正規表現にマッチしたラベルがついたときに通知されます。デフォルトは
レビュー
です
- Github/Github Enterprise の webhook の設定
- https://github.com/{your}/{repository}/settings/hooks/new
- 上で取得したスクリプトの url を記入します
- content type を application/json にするのをお忘れなく!
- イベントは issue と pull request のみあればよさそうです
一旦構築してしまえばリポジトリや通知先チャンネルの追加などが「Spreadsheet の行を増やして Github で webhook を設定」するだけで出来ます。 利用側のハードルの低さもあってか、社内では今は 30 近いリポジトリ、ほぼすべてのチームが reviewkun を利用しています。
まとめ
とくにすごいことをやっているわけではないですが、Google Apps Script をサーバーレスアーキテクチャとして用いることでちょっとしたツールを煩わしくなく使うことが出来ています。なんでもかんでもサーバーレスで、という訳ではないですが適材適所で使う技術を選択していけると良いですね。
はてなでは課題解決のために最適な技術選択できるエンジニアを募集しています。