GitHub - Pull Assignerでレビュアーを効率的にアサインする

# はじめに
GitHubがPull Pandaを買収して、次の3つの機能が無料公開されたので実際に導入してみました。
この記事では、レビュアーを効率的にアサインするための機能である`Pull Assigner`について紹介します。

|機能名|機能|
|:-:|:--|
|Pull Reminders|Slackのリマインダと通知を使って、プルリクエストをすばやく確認してマージできます。|
|Pull Analytics|GitHubデータの分析結果を元にボトルネックを取り除き、プロセスを最適化します。|
|Pull Assigner|レビュアーをアサインして、プロセスをよりバランスのとれた効率的なものにします。|


`Pull Reminders`および`Pull Analytics`については、@turmericNさんの記事「[【GitHub】コードレビューツールのPull Pandaを一部触ってみた](https://qiita.com/turmericN/items/095c0318dd14cad71cdc)」がわかりやすかったのでオススメです。

# Pull Assigner とは？

Pull Assignerはコードレビュー（のレビュアー）をアサインすることで、プロセスをよりバランスのとれた効率的なものにします。

<img width="1076" alt="スクリーンショット 2019-07-22 12.32.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63892/16287869-2933-ffb8-1d5e-260c66b23e66.png">

その結果として、次のような効果が期待できます。

* Balance workloads / 作業負荷の平準化
コードレビューを均等にアサインすることで、全員が貢献できます。

* Increase accountability / 説明責任を高める
レビュアーが明確なため、コードレビューがすばやく実行されます。

* Eliminate silos / サイロ化（孤立した状態）の解消
チーム全体に知識を広めて、より協調的な文化を作り出します。

また、`「休暇中のメンバーを一時的にレビュアー候補から除外する」といった柔軟な対応`を（コードを変更することなく）簡単に実施できるというのもPull Assignerの特徴です。
（「[Pull Assigner の設定をカスタマイズする](# Pull Assigner の設定をカスタマイズする)」でやり方を紹介しています。）

# Pull Assigner の使い方

<img width="978" alt="スクリーンショット 2019-07-22 12.47.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63892/05412755-a073-17cf-53a7-d7be7742c11a.png">

次の手順を行うことで、Pull Assignerでレビュアーをアサインすることができます。

❶ GitHub Teamsを使用して、チーム（レビュアーのグループ）を編成する
❷ プルリクエストのレビュアーにチームをアサインする
❸ Pull Assignerが、チームの1人以上のメンバーをレビュアーとして自動でアサインする

ここからは、各手順について詳しく説明していきます。

## ❶ GitHub Teamsを使用して、チーム（レビュアーのグループ）を編成する
以下では、新しく`Pull Assigner Test`という名前のチームを作成します。
すでにチームがある場合は既存のチームを使用することも可能です。

### GitHubでチームを作成する
0. GitHubの`Organization画面`を開きます。
0. `Teams`タブを選択します。
0. `New team`をクリックします。  
![スクリーンショット 2019-07-22 13.01.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63892/0c49953c-21fc-d0e0-caeb-8e32d83ea7e2.png)
0. 情報を入力して、`Create team`をクリックします。
![スクリーンショット 2019-07-22 13.04.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63892/2c216415-be2b-1ed7-6f02-62bab8b679d7.png)

0. 作成されたチームの設定画面が表示されるので、`Members`タブを選択します。
0. `Add a member`をクリックして、レビュアーになるメンバーを追加します。
<img width="1280" alt="スクリーンショット 2019-07-30 11.23.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63892/772d54da-5bf6-a79d-c5fe-0c60bd6c0aff.png">


### Pull Assignerにチームを関連付けする

0. [Pull Pandaの管理画面](https://pullreminders.com/login)にGitHubアカウントでログインします。
0. 「[GitHubでチームを作成する](# GitHubでチームを作成する)」で作成したチームが所属する（organizationの）accountを選択します。
（必要に応じて、`Add organization`でorganizationを追加してください。）
<img width="1280" alt="スクリーンショット 2019-07-30 11.29.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63892/7948d256-068a-8ed2-2c08-9ee80dc779aa.png">

0. `Assigner`を選択します。
<img width="1280" alt="スクリーンショット 2019-07-30 11.34.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63892/ff02f5a5-a35c-7df5-7f5b-6fd5a9636686.png">

0. `Add team`を選択します。
![スクリーンショット 2019-07-30 11.34.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63892/602bc60d-b3f8-a744-1709-dec866bc5f6a.png)

0. 「[GitHubでチームを作成する](# GitHubでチームを作成する)」で作成したチームを選択し、`Continue to settings`を実行します。
<img width="1280" alt="スクリーンショット 2019-07-30 11.42.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63892/a058c8a1-35b6-2b1e-2735-b44914189982.png">

0. [レビュアーのアサイン設定](# レビュアーのアサイン設定)をカスタマイズし、`Enable Pull Assigner`を実行します。
<img width="1280" alt="スクリーンショット 2019-07-30 11.48.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63892/5fd9c8f0-db5a-0dbb-fba5-08bffccb8bb1.png">

0. GitHubのチームに対して、Pull Assignerを有効にしていいか確認されるので許可します。
<img width="1280" alt="スクリーンショット 2019-07-30 11.50.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63892/6d1b22d0-0e28-66b9-8649-91c433a44680.png">

ここまでの作業で、Pull Assignerにチームが関連付けできました。
正しく作業が完了していれば、以下のような画面が表示されます。
<img width="1280" alt="スクリーンショット 2019-07-30 11.53.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63892/ee2ea313-82d7-73cf-3a31-158b2d6edcc5.png">
※ `！マーク`はチームをレビュアーに初めてアサインしたタイミング（チームに対してPull Assignerが初めて動作したタイミング）で表示されなくなるので問題ありません。

## ❷ プルリクエストのレビュアーにチームをアサインする
プルリクエストのレビュアーに手動でチームをアサインするか、GitHubの[CODEOWNERS](https://docs.pullpanda.com/products/assigner/codeowners)を使用して自動的にチームをアサインするようにします。

## ❸ Pull Assignerが、チームの1人以上のメンバーをレビュアーとして自動でアサインする
❶、❷によって、チームの1人以上のメンバーがレビュアーとして自動でアサインされます。
あとは、レビュアーとしてアサインされたメンバーが責任を持ってコードレビューをしましょう！！

# Pull Assigner の設定をカスタマイズする

Pull Assignerでは、[Pull Pandaの管理画面](https://pullreminders.com/login)で設定をカスタマイズすることができます。

![スクリーンショット 2019-07-22 13.43.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63892/a6372636-8897-f370-9ac5-37211ecfa5e2.png)

* [レビュアーのアサイン設定](# レビュアーのアサイン設定)
アサインするレビュアーの数や、作業負荷を平準化するためのアルゴリズムなどを設定できます。

* [チーム設定](# チームに関する設定)
チームにはエンジニア以外のメンバーやbotなどが含まれている場合がありますが、そのようなメンバーをレビュアー候補から除外できます。
また、休暇で不在となるメンバーを一時的にレビュアー候補から外しておくといった運用も簡単に行う事ができます。

以下では、これらの設定に関する詳細を説明します。

## レビュアーのアサイン設定

`Settings`セクションで、`Update settings`を実行することでレビュアーのアサイン設定を変更することができます。

<img width="1280" alt="スクリーンショット 2019-07-30 11.02.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63892/59c41b7d-d434-fde3-bd92-4869f86f45ba.png">


### Auto-assign
アサインするレビュアーの人数を指定します。

* One reviewer
1名のレビュアーをアサインします。

* Two reviewers
2名のレビュアーをアサインします。

* Three reviewers
3名のレビュアーをアサインします。

### [Algorithm](https://docs.pullpanda.com/products/assigner/algorithms)
レビュアーをアサインする際のアルゴリズムを指定します。

* Round-robin
ラウンドロビンアルゴリズムは、各チームメンバーが過去に要求したレビューの数に関係なく、レビューを循環的な順序で割り当てます。`このアルゴリズムは、知識を広め、多様な意見を得るために、チーム全体のさまざまな人々からプルリクエストを受けることに関心があるチームに最適`です。

* Load balance
ロードバランスアルゴリズムでは、過去30日以内に（または[統計のリセット]が最後にクリックされてから）要求されたレビューの数が最も少なかった人に基づいてレビューが割り当てられます。 このアルゴリズムでは、Pull Assignerによって要求されたものだけでなく、すべてのレビュー要求が考慮されます。`このアルゴリズムは、各チームメンバーによって行われたコードレビューの数を等しくしたいチームに最適`です。

### [Proxy team](https://docs.pullpanda.com/products/assigner/avoiding-team-notifications)
Pull Assignerを使用すると、botが個々のレビュアーを割り当てる前にチームにレビューが割り当てられます。
したがって、各チームメンバーは、個別に割り当てられていなくても、チームが要求されるたびにGitHub通知を受け取ります。

これらの通知は邪魔になる可能性があります。
この問題を解決するには、`「Proxyチーム」（Pull Assignerを実際のチームのために走らせることができるメンバーレスのGitHubチーム）`を設定することができます。

### Counting method
（[Auto-assign](# Auto-assign)で指定した）Pull Assignerがアサインするレビュアーの人数に対して、既存のレビュアーをカウントするかどうかを制御します。

* Count existing reviewers
既存のレビュアーをカウントする

* Ignore existing reviewers
既存のレビュアーを無視する（カウントしない）

### Team review request
この設定は、レビュアーをアサインした後にレビュアーからチームを削除するかどうかを制御します。

* Delete after assigning reviewer(s)
レビュアーをアサインした後に（レビュアーからチームを）削除する

* Do not delete
（レビュアーからチームを）削除しない

## チーム設定
[Pull Pandaの管理画面](https://pullreminders.com/login)で、休暇中またはレビューの責任を負わないチームメンバーを除外します。

![スクリーンショット 2019-07-30 10.52.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63892/55f595cd-94d8-27c3-6c5d-15cc39a06466.png)

* メンバーを除外する場合
`Excluded team members`セクションで、`Select team member`リストから除外するメンバーを選択して`Exclude`を実行します。

* 除外したメンバーを戻す場合
`Excluded team members`セクションで、`TEAM MEMBER`欄に表示されている除外したメンバーの`Remove`を実行します。

# 終わりに
このような機能が無料で公開されるのは非常にありがたいですね。
現在は[Pull Pandaの管理画面](https://pullreminders.com/login)を利用する必要がありますが、いずれGitHub側に統合されていく可能性が高いと思います。
そうなれば、今後ますます便利になっていきそうなので期待していきましょう！！


# 参考資料
* [Pull Panda is joining GitHub!](https://pullpanda.com/github)
* [【GitHub】コードレビューツールのPull Pandaを一部触ってみた](https://qiita.com/turmericN/items/095c0318dd14cad71cdc)
* [About code owners](https://help.github.com/en/articles/about-code-owners)