チームのコードレビューをよりスムーズにするツールを作りました

これは DeNA Advent Calendar 2019 12/20 の記事です。

チームのコードレビューをよりスムーズにするライブラリを作りました

チームのコードレビューをよりスムーズにするために notifierというツールを作りました。

notifier って何

notifier は 現在はGitHub→Slackに対応しています。例えばGitHubのPullRequestのReviewersAssigneesを追加される事があると思います。このときに自分宛てのメッセージがSlackに通知される。そういった仕組みになっています。他にもGitHubではコメントでメンションを付けるとSlackに通知が行きます。下の画像はGitHubでメンション付きのコメント → Slack に通知が来る流れをスクショして貼りました。SlackにGitHubで実際にコメントされたURLも付いてくるようになってすぐにメンション内容を確認できてGitHub上でのやりとりがSlackの通知をONにしておけばスムーズになります。

image.png image.png

モチベーション

別の人が書いた記事にSlackの返信とGitHubのReviewを爆速でやる理由という記事があります。その中に

Slackで質問したり、GitHubでレビュー依頼をしたりすると、その作業は返信が来ない限り先に進めることができなくなります。 その待っている間にできる別の作業があれば良いのですが、基本的に仕事は直列で進めるのが最速なことが多い。 (特にエンジニアだと[要出典])スイッチングコストが掛かりがちなので、複数のブランチで並列作業したりはあんまりやらない(そうだよね?)。 つまり、自分がボールを持っている間は他の人の作業の作業を止めていることになり、時間のロスになる。

という文章があります。この意見には同意でコードレビューやその他の意見を求められているコミュニケーションは反応が早いほうが良いと思っていて、ただGitHub上のやりとりを検知する方法が通常だと(私は)普段開いていないメーラー経由での通知から対象のページ開くことになります。それよりもSlackで単純なリンクだけ送られてきてそこからすぐに開きたいな。というモチベーションで作りました。

ちなみにここまで読んだ方でこういったものを自作している方だったり、pullpandaの存在を思い浮かべる方がいると思いますが、弊社はGitHub Enterpriseの制約がありpullpanda使えなかったり と思ったら使えるみたいですね。執筆後に気づいたので今回はできないと思っていた前提で読んでもらえると。

Enterpriseだとpullpandaを使う上で制約があると思っていた & 今回は個人レベルというよりもチーム全体に一度導入したかったので設定(yaml)ファイルでチームのメンバー全員のGitHubとSlackを結びつけるものを用意したいな。と思い notifier を作ることにしました。(実を言うと作る段階ではpullpanda自体使ったことなかったのですが。だいたい一緒な事できそうだなと思っている)

あとこのタイミングで謝辞を述べたいのですが、実を言うとほとんど同じ機能を持っているツールがすでに存在します。mentions ってツールです。こっちの方が対応サービスも多いです。これは以前の職場でも使っていて大変助けられたツールです。ただ、自分の環境に合わせて、例えば通知先にDiscordを追加してSlackではなくDiscordに通知送るようにしたいな。となったときにシュッと自分で作れそうな Go で作られた物が欲しい。と思って自作しました。逆にRuby on Railsのほうが慣れている方は mentions から拡張しても良さそうですね。mentions 今までお世話になりました(まだ使うことあるかもしれないけど)。

使い方

簡単に notifier の使い方、設定の仕方を紹介します。しかし、これ案外やることが多い。そのうち設定を簡単にするサポート機能みたいなのもつけたいな。と思っています。

GitHub

GitHubのイベントを notifier に通知する必要があります。というわけで webhooksの追加を行います。Payload URLは実際に notifierホスティングするサーバーのURLのendpointを入れましょう。

それで送るイベントも設定しましょう。下の項目をクリックすると選択できるようになります。

image.png

チェックする項目
  • Issue comments
  • Issues
  • Pull requests
  • Pull request reviews
  • Pull request review comments

GitHub側の設定は以上です。

Slack

Slackのアプリケーションを作ります。 https://api.slack.com/apps から Create New App を押しましょう。 次にどの操作をするアプリケーションかの設定を行います。OAuth Scopeを設定しましょう。Web上からだと下の操作で設定できます。

必要なOAuth Scopeは下記のとおりです。設定できる項目があるので入力しましょう。

必要なOAuth Scope

最後に OAuth Access Token を控えておきましょう。Webの画面からcopyできます。

Slack側の設定は以上です。

IDのマッピング

次にGitHubとSlackのIDをmappingするためのyamlファイルを用意します。

id: owata
github:
  login: owata
slack:
  id: YYYYYYYYY
id: bannzai
github:
  login: bannzai
slack:
  id: XXXXXXXXX
  • トップレベルの id はユニークであれば何でも良いです。
  • github.loginGitHubのIDを入れます。
  • slack.id はSlackのworkspaceごとのユーザーIDを入れます。ユーザーIDはここからテストして取得できます。

環境変数の設定

notifierYAML_FILE_PATHNOTIFIER_SLACK_TOKEN という2つの環境変数を用意する必要があります。

  • YAML_FILE_PATH には用意したyamlファイルのファイルパスを入れましょう。ちなみにリモートのファイルパスも対応しているので、例えばgistにあげて https://gist.githubusercontent.com/~ とか書いても動きます。
  • NOTIFIER_SLACK_TOKEN ではcopyしておいた xoxp から始まる OAuth Access Token をここに入れます。

ホスティング

はい。ここまでやればあとはホスティングだけです。ホスティングは自由にしてください(雑)。 ただ、notifierを開発していときの動作確認のためにherokuを使用して開発していました。 なので、herokuのアカウント持っていて一つホスティングできる場所を用意しておくとすぐに動作まで持っていくことができると思います。 $ make heroku ってやるとDeployされます。これで良ければ使用してください。詳しくはREADMEもみてください

https://github.com/bannzai/notifier#deploy

実際導入してみて

まだ日が導入して浅かったりするのですが、GitHubを使っている開発者全員に通知を飛ばすようにして運用しています。 個人的にはすぐにReviewerに巻き込まれたりしたことがわかってすぐにレビューできるので作ってよかったな。と思います。 またこれの第一目的が端的に言うと迅速なレビューしようぜ。って感じだったのですが人によっては「すぐにレビューできないことが多いから、まだ見ていないレビューを一覧できるチャンネル代わりになる」みたいな使い方も見出してそうです。あと「もう少しリッチな表示にしてほしい」とか要望もあったりするので、少し手が空いたときにですが継続的に開発はしていこうと思います。 あとは特にチームから不満も聞いていないです。が、未だに急ぎのレビューがSlackのメンション使われているな。と悲しい時があるのでこれからは布教活動にもう少し精を出すか。とも思っています。

終わりに

Discord対応とかPRお待ちしてます。あと個人的に今PullPanda使う機会が無かったりするのでPullPanda(とかその他のサービス)はもっと便利。逆にこれはできないからこういうのあると良いんじゃないの。とか意見ももらえたら嬉しいです。

notifierリポジトリはこちらです。 良いな。と思ったそこのあなた。

スターください 🌟

おしまい \(^o^)/