"Scheduled reminders" でGitHub上のやり取りをSlackに通知させよう！

GitHubでPRを出した時に `@XX さん、レビューお願いします！` とSlackで送ったり、レビューのままPRが放置されたりすること、ありませんか？

そんな時は `Scheduled reminders` !!

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">待望のGitHubのSlack通知が公式に使えるようになった！<a href="https://t.co/gy1Hq99nKQ">https://t.co/gy1Hq99nKQ</a></p>&mdash; みかん三世 (@mikan_the_third) <a href="https://twitter.com/mikan_the_third/status/1252872420580454400?ref_src=twsrc%5Etfw">April 22, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ということで、 GitHubの `Scheduled reminders` という新機能について紹介したいと思います

# 初期設定
![github.com_organizations_pathee_settings_reminders(Laptop with MDPI screen) (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178077/0d9c6478-0def-422e-1e5e-8fdfe9f0ab48.png)

- :warning: organizationのOwner権限が必要です
- organizationのSettingsタブを選択します
- サイドメニューの`Scheduled reminders`を選択します
- 初回はSlack連携のボタンが表示されるので選択して連携しましょう


# Slackチャンネルに定期通知する
- `Add reminder`から指定のSlackチャンネルにレビュー待ちのPRなどをの定期通知の設定ができます

![github.com_organizations_pathee_settings_reminders_3704(Laptop with MDPI screen).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178077/eac48fbd-35f8-a31d-c8a0-6decbdf71449.png)

- `Slack channel`には `#` を除いたチャンネル名を入力します
- `Days` で通知させたい曜日を選択します
- `Select Time(s)` で通知させたい時間（複数可能）とタイムゾーンを選択します
- `Ignore drafts` を選択するDraft（下書き）状態のPRは通知されないようにできます
- `Require review requests` を選択するとレビュアーに対してmention付きで通知できます
  - さらに、GitHubのTeamsでメンバーをチームに分けておくと `Filter by team assigned to review code` で指定のチームのメンバーに関するPRのみ通知することができます
- `Remind authors after reviews` を選択するとレビュー済みのPRについてはPR作成者に対してmention付きで通知できます


<img width="967" alt="スクリーンショット 2020-04-24 17.22.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178077/a818fb40-7267-3fee-9c8f-d7f2453cfc35.png">

例えば上記のようにSlackに通知されます

# 個人に対するSlackのDM通知を設定する
:warning: この設定は個々人で行う必要があります

![github.com_settings_reminders(Laptop with MDPI screen) (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178077/1d4d635c-2346-1698-a250-179836f8c096.png)

- 右上の自身のアイコンのSettingsを選択します
- サイドメニューの`Scheduled reminders` を選択します
- 所属するorganizationごとにSlackのDM通知を設定できます

![github.com_settings_reminders_pathee(Laptop with MDPI screen).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178077/79310931-ffe2-5e92-e0f5-2accb282c5ee.png)

- `Enable real-time alerts` を選択することで指定のイベントが発生したタイミングでリアルタイムにSlack通知を受け取ることができます
- これにより、レビュアーにアサインされた時、PRがapproveされた時、PRにコメントされた時、mentionされた時、conflictが発生した時などにSlackのDMで通知を受け取ることができます


# おまけ：レビュアーをTeamのメンバー内で自動アサインする
- `Code review assignment` という機能でレビュアーをTeamのメンバー内で自動アサインすることができます
- Scheduled remindersの元になった[Pull Panda](https://pullreminders.com/)から移植されているようなので合わせて紹介します
- :warning: Teamを設定しておく必要があります

![github.com_orgs_pathee_teams_storecast_edit_review_assignment(Laptop with MDPI screen).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178077/c184fcbb-ef18-c565-e215-b3507a8b18c2.png)

- GitHubでTeamsから設定したいチームを選択し、さらにSettingsの`Code review assignment`を選択します
- `Enable auto assignment` を選択することでレビュアーの自動アサインの設定ができます
- `Routing algorithm` は自動アサインのアルゴリズムを選択でき、`Round robin` の場合は現在レビュー中の数に関係なく交互にレビュアーがアサインされ、`Load balance` の場合はレビュー中の数も含めて全メンバーが同じレビュー数になるようにアサインされます
- チーム内にレビュアー以外のメンバーがいる場合などは `Never assign certain team member` で自動アサインの対象に含めないメンバーを設定することができます


# 公式ヘルプ
- [Managing scheduled reminders for your organization](https://help.github.com/en/github/setting-up-and-managing-organizations-and-teams/managing-scheduled-reminders-for-your-organization)
- [Managing scheduled reminders for your team](https://help.github.com/en/github/setting-up-and-managing-organizations-and-teams/managing-scheduled-reminders-for-your-team)
- [Managing your scheduled reminders](https://help.github.com/en/github/setting-up-and-managing-your-github-user-account/managing-your-scheduled-reminders#about-scheduled-reminders-for-users)
- [Managing code review assignment for your team](https://help.github.com/ja/github/setting-up-and-managing-organizations-and-teams/managing-code-review-assignment-for-your-team)