なんとかしてgithubでレビュー依頼が来たらslackでmention付けてやる

githubとslackの連携は非常に簡単にできて良いのですが、いかんせんmentionが付かないんですよね。
「メンションが無いと気づかないよ！」なんていうコミュニケーションは無駄なので、自動化したので紹介します。
※人数規模が大きかったりレポジトリが無数にあるような状況には向いてない方法かもしれませんのであしからず

# 登場人物
* github
* Google SpreadSheet
* Slack
* <b>Zapier</b>

# 方針
問題はgithubアカウントとslackアカウントの紐付けです。
SpreadSheatを使って、githubアカウントidとslackのidを同じ列に入力します。
これをZapierというワークフローを作成するツールを利用していい感じに取得結果を使ったmention機構をつくります。

[Zapier](https://zapier.com)

# 準備
まずidの紐付けをしておきます。
新規でスプレッドシートを作成して下図の様に1行目にheader情報を付与します。
![スクリーンショット 2019-03-10 21.45.08_mosaic.png](https://qiita-image-store.s3.amazonaws.com/0/13766/f98d85c9-c962-5b71-bef7-146ee922919c.png)
2行目以降に実際のgithubのidとslackのidを入力しておきましょう。
# Zapを作成する
ZapierのタスクはZapと呼ばれています。mention用に新規作成して設定していきます。
全て英語なのが取っ掛かりにくいポイントですがそこは頑張ります。

## アプリケーションの選択
まずはベースとなるアプリケーションを選びます。後からどうにでも編集できますが、今回はトリガーとなるGithubと最終アウトプットとなるSlackを選択して Make a Zap!ボタンを押します。
<img width="474" alt="スクリーンショット 2019-03-10 21.53.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/13766/b9cdcf83-df90-aac8-ef12-bcae7572d24a.png">

## Githubの設定
### トリガー設定
まずはトリガーとなるGithubの設定です。最初にトリガーアクションの設定の選択画面が出てきます。最初は3個しか選択肢が見えませんが、show less common options をクリックすると画面が出てくるので New Pull Request を選びます。
<img width="499" alt="スクリーンショット 2019-03-10 21.55.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/13766/b07a5df4-e561-3da2-fbc0-151dd1caac37.png">

### アカウント設定
自身のGithubアカウントに接続して認証を行いましょう。

ここでOrganaization内のPrivateレポジトリを使っている場合は追加で認証が必要です。

### GithubでZapierの操作権限を許可
Githubでアカウント毎にZapierからのアクセスを許可する必要があります。
Githubのページにログインして、右上のアイコンをクリックして出てくるメニューから
Settings > Applications に進みます。
タブでAuthorized OAuth Appsを選択するとZapierが出てくるはずなので選択。
ページ右下にオーナーへの認証Requestを出すボタンがあるので押します。
あとは会社の偉い人に連絡して認可してもらいましょう。


### レポジトリ選択
次は連携したいレポジトリを選びましょう。これが一つしか選択できないのが少し残念なポイント。
今の所レポジトリ毎か、特定ユーザが作成したreview依頼単位でZapを作るしかできなそうです(自分調べ)

<img width="510" alt="スクリーンショット 2019-03-10 22.20.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/13766/8df8c66e-f8b6-89de-294d-70f960615dc6.png">

### サンプルを選ぶ
次にサンプルを選択します。これは結構大事で、この先の設定をどのプルリクのデータを参考に作っていくかを選ぶことになります。実際にreviewerを設定してるプルリクを選ぶと良いと思います。
<img width="490" alt="スクリーンショット 2019-03-10 22.25.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/13766/7d9fdc2b-e32b-4cd3-e004-0216c2f46163.png">

これでGithubの設定は終わりです。
次のアクションを設定します。
<img width="255" alt="スクリーンショット 2019-03-10 22.35.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/13766/8cabd799-4892-6ba0-9f02-cde5eb0ad0f2.png">

ADD A STEP でアクションを増やしてSpreadSeetを選びます。

## スプレッドシートの設定
次はプルリクに設定されたreviewer情報からslackのidを検索させます。
### アクションの選択
Lookup SpreadSheet Row という選択肢があるのでこれを選びます。
<img width="510" alt="スクリーンショット 2019-03-10 22.45.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/13766/948cfbcb-c2e9-0410-7b06-893a6ac57b44.png">

次の画面でアカウント選択画面になるので、自分のアカウントで連携させます。

### Lookupの設定
どのシートに対してどんな条件でデータ検索をするのかを設置します。

まずはスプレッドシート本体とWorksheetを選択します。
画像はズボラなのでデフォルトのシート1になってますが、適切な名前を選択しましょう。
<img width="511" alt="スクリーンショット 2019-03-10 22.48.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/13766/75534bb0-9fe9-f3d0-e150-939da77cbe02.png">

Lookup Columnにはシートの1行目のヘッダー情報の中から、検索条件に使う列を指定します。
今回だと「github」の列が対象なので選択します。

次にgithubの列をどの値で検索するかを選びます。今回はRequested Reviewersを選びます。
![mosaic_スクリーンショット 2019-03-10 22.52.45.png](https://qiita-image-store.s3.amazonaws.com/0/13766/d277ad34-f7fa-5200-ae58-7d2eb62270a7.png)

Reviewersは複数設定できます。複数いる場合はカンマ区切りで入ってきますのでそれを考慮する場合は別途処理が必要です。Actionでpythonを実行できるので、空の時、1人の時、2人以上の時で処理を分けるのが良い気がしていますが、本記事では触れません。

シートでデータが見つからなかったらエラーになって処理はストップします。

## Slackの設定
### アクションの選択
最後は通知設定です。
チームで使うならチャンネル通知がいいと思うのでそれを選びます。
<img width="511" alt="スクリーンショット 2019-03-10 23.02.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/13766/ccf38706-481e-1168-3c6e-9235d637f5f4.png">

### 通知時の内容選択
ここで投稿時の内容を入力するので、mentionの設定をします。
mentionは<@[slackId]>で通知できるので、うまく結果を埋め込んで使いましょう。
<img width="488" alt="スクリーンショット 2019-03-10 23.07.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/13766/b23862a8-4c26-e7ee-5fb6-881dbafebee9.png">

これで登録まで行えばあとは該当レポジトリでプルリクがreviewer付きで作られる度にmentionが飛んできます。

slack通知はbotとして投稿ができるので、アイコンカスタマイズできるので愛着がわくキャラクターで通知したら良いかもしれません。

うちのチームでは会社のキャラクー「たかし」がプルリク管理人として投稿してきます。
ちょっと和みます。


# 課題
気軽に作るには良い方法だと思いましたが、課題はあります。
- レポジトリごとにZapを作る必要がある
- Zapierの監視インターバルが5分なので最大5分の遅延がある

割と遅延が痛かったりします。
急ぎの時は自分でmentionつけちゃったりするので。あくまで保険的な役割のmentionとして使うのがいいかなと思います。