📢

もう『誰かレビューして〜!📢』って言わなくていい!放置PRと戦うSlack-Review-Notifyを作った

に公開

はじめに

近年、CursorやClineなど各種開発支援AIツールの登場によってコードを書く速度が格段に上がり、開発者は以前より多くのプルリクエストが速い速度で上がってきてはないでしょうか?
それと同時に、レビューがボトルネックになって、開発速度がなかなか上がらない。なんてことはないでしょうか?
例えば、
「このPRだれかレビューして!」
「レビュー依頼したけど、誰も引き受けてくれない・・・」
「レビューリクエストしたのに一向に進まない・・・」
「私ばかりレビューしてる・・・」

今後、こういった悩みもAIツールによって解決されるとは思いますが、まずは古典的な手法として、
botが自動でリマインドするSlack Review Notifyというツールを開発しました。

https://github.com/haruotsu/slack-review-notify
スターお待ちしております⭐️

Slack Review Notifyとは

GitHubのPRにラベルを付けるだけで、Slackに自動通知してレビュワーをランダムにアサインし、定期的にリマインドするツールです。

主な機能は以下の通りです:

  • PRにラベルが付けられると、設定されたSlackチャンネルに通知を送信
  • レビュワーをランダムに選択して自動アサイン
  • レビュー完了までリマインド通知を定期送信
  • リマインダーの頻度変更や一時停止も可能
  • すべての設定をSlackコマンドから変更可能

使い方

まずはざっくりとした使い方を! (試してみたい!の場合にngrokで検証する方法は後述します)

GitHubの設定

GitHubのリポジトリのSettingsのWebhooksから、以下を設定してください:

  • Payload URL: https://<あなたのドメイン>/webhook
  • Content type: application/json
  • Secret: 空やお好きな文字列
  • Enable SSL verification: チェックを入れる
  • Let me select individual eventsにチェックを入れる: Pull requestsにチェックを入れる

1. ボットをチャンネルに招待

/invite @review-notify-bot

2. 基本設定

/slack-review-notify set-label needs-review
/slack-review-notify add-repo owner/repo
/slack-review-notify add-reviewer @user1, @user2, @user3
/slack-review-notify activate

現在の設定は以下で確認できます。

/slack-review-notify show

3. PRにラベルを付ける

GitHubのPRに「needs-review」ラベルを付けると、自動的にSlackへ通知されます。

4. レビューの管理

通知メッセージから以下のアクションが可能です:

  • 「レビュー完了」ボタンでレビュー完了を記録
  • 「変わってほしい!」ボタンで別のレビュワーに再アサイン
  • リマインド頻度の変更

5. その他のコマンド

コマンド一覧 (この設定は、/slack-review-notify helpで確認できます。)

`/slack-review-notify show` - 現在の設定を表示
`/slack-review-notify set-mention @user` - メンション先を設定
`/slack-review-notify add-reviewer @user1, @user2` - レビュワーを追加
`/slack-review-notify show-reviewers` - 登録済みのレビュワーリストを表示
`/slack-review-notify clear-reviewers` - レビュワーリストをクリア
`/slack-review-notify add-repo owner/repo` - 通知対象リポジトリを追加
`/slack-review-notify remove-repo owner/repo` - 通知対象リポジトリを削除
`/slack-review-notify set-label label-name` - 通知対象ラベルを設定
`/slack-review-notify set-reviewer-reminder-interval 30` - レビュー中のリマインド間隔(分)
`/slack-review-notify activate` - 通知を有効化
`/slack-review-notify deactivate` - 通知を無効化
`/slack-review-notify help` - ヘルプを表示

実装上のこだわり

1. レビュワーのランダム選出と変わってほしい!ボタン

当初、レビューします!ボタンをつけて、ボタンを押した人をレビュワーにするようにしていました。しかし、これではこれまでのように、誰かが偏ってレビューしている状態であったり、なかなか拾わないということが改善されないということを考えました。

そこで、今回レビュワーをランダムに選出するようにしました。かといって、「今忙しい!」ということもあるかと思います。

それに対しても解決策を提案しています。今回「変わってほしい!」ボタンをつけて、レビュワーの再抽選を可能にしました。

2. リマインダー機能

親スレッドでチームメンションが飛ぶようなことを想定しています。(@hoge-dev レビューをお願いします!) そしてこのスレッドでレビューが完了するまでリマインダーをすることで、チームメンバーにも通知がいくことで、放置できない心理を働かせることを狙っています。

しかし、MTGなどで立て込んでいることもあるとでしょう。そのために、リマインド一時停止機能を実装しています。

これら以外にも、実際にユーザーとして使う視点にたって、いろいろな機能をもりこんでいるので、ぜひ使ってみてください!💪

Slack Review Notifyを試してみる

ここからは、試しに使ってみたい人に向けての方法を残します。ご自身でサーバーを用意できる方は、README.mdに沿って、進めてみてください!

ngrokという、ローカルサーバーを公開するツールを使って、Slack Review Notifyを試す方法を残します。

ngrokの設定

1. ngrokに登録してインストール

https://dashboard.ngrok.com/signup

登録すると、各種OSに応じたインストール方法が表示されるので手順にしたがってインストールします。

2. ngrokを起動

今回、slack-review-notifyは8080番ポートで起動するので、ngrokも8080番ポートに向けて起動します。

ngrok http 8080

すると、以下のような画面になるので、https://<ngrokのID>.ngrok-free.appをコピーしておきます。

ngrok                                       (Ctrl+C to quit)
                                                            
👋 Goodbye tunnels, hello Agent Endpoints: https://ngrok.com
                                                            
Session Status                online                        
Account                       hoge-piyo@example.com
Version                       3.22.1                        
Region                        Japan (jp)                    
Latency                       6ms                           
Web Interface                 http://127.0.0.1:4040         
Forwarding                    https://<ngrokのID>.ngrok-free.app -> http://localhost:8080     

Slack Botの設定

1. Slack Appの作成

以下のリンクから、Slack Appを作成します。

https://api.slack.com/apps

作成の際は、From scratchから作成します。 App Nameは適当に入力してください。

2. Manifest.jsonの設定

左のメニューから、Features -> AppManifestを選択して、以下のManifestをJSONにコピペしてSave Changesします。

{
    "display_information": {
        "name": "slack-review-notify"
    },
    "features": {
        "bot_user": {
            "display_name": "slack-review-notify",
            "always_online": false
        },
        "slash_commands": [
            {
                "command": "/slack-review-notify",
                "url": "https://<ngrokのID>.ngrok-free.app/slack/command",
                "description": "PRレビュー通知ボットの設定",
                "usage_hint": "help",
                "should_escape": false
            }
        ]
    },
    "oauth_config": {
        "scopes": {
            "bot": [
                "channels:manage",
                "channels:read",
                "chat:write",
                "commands",
                "groups:read",
                "groups:write",
                "mpim:read",
                "channels:history",
                "groups:history"
            ]
        }
    },
    "settings": {
        "interactivity": {
            "is_enabled": true,
            "request_url": "https://<ngrokのID>.ngrok-free.app/slack/actions"
        },
        "org_deploy_enabled": false,
        "socket_mode_enabled": false,
        "token_rotation_enabled": false
    }
}

4. Slack Botのインストール

左のメニューから、Features -> OAuth & Permissionsを選択して、Install to slack-notify-testを選択してインストールまで行います。

インストールが完了すると、OAuthTokensが発行されるので、それをコピーしておきます。

xoxb-hoge-piyo-1234567890

通知対象とするリポジトリのWebhook設定

これから通知対象とするリポジトリの設定をします。GitHubのリポジトリの設定画面から、Settings -> Webhooks -> Add webhookを選択して、以下を入力してください。

  • Payload URL: https://<ngrokのID>.ngrok-free.app/github/webhook
  • Content type: application/json
  • Secret: 任意の文字列 (入力しなくてもよい)
  • Enable SSL verification: チェックを入れる
  • Let me select individual eventsにチェックを入れる: Pull requestsにチェックを入れる

ローカルサーバーの設定

ngrokの画面を立てた状態で、以下のようにGitHubからリポジトリをクローンしてきます

git clone https://github.com/haruotsu/slack-review-notify.git

対象のリポジトリに移動して、.env.exampleをコピーして.envファイルを作成して以下の内容を記載してください。

SLACK_BOT_TOKEN=xoxb-hoge-piyo-1234567890 (Slack BotのOAuthTokenを記載してください)
GITHUB_WEBHOOK_SECRET=fugafuga (もしWebhookのSecretを設定している場合は、その値を記載してください)

その後、以下のコマンドを実行してローカルサーバーを起動します。

make dev

これで、アプリが使えるようになりました。

ボットを招待

対象のチャンネルで以下のコマンドを実行するなり、@メンションで呼ぶなりで招待をします。

/invite @slack-review-notify

これにて、Slack Appの設定は完了です。

テスト

はじめにコマンドを入力して初期設定をみてみましょう。

/slack-review-notify show

初期設定では、通知対象リポジトリを設定していないので、通知対象リポジトリを設定します。

/slack-review-notify add-repo yourname/yourrepo

今回はテストなので、リマインド間隔を1分にしてみましょう。

/slack-review-notify set-reviewer-reminder-interval 1

レビュワーも設定しましょうか。今回は仮置きでなんでも大丈夫です

/slack-review-notify add-reviewer @user1, @user2

なお、コマンドがわからなくなったら、/slack-review-notify helpで確認できるので積極的に使っていってください。他にもいろいろなコマンドを準備しています。

/slack-review-notify help

それでは、先ほどWebhookを設定したリポジトリにPRを作成して、needs-reviewラベルを付けてみましょう! これで通知がきたら成功です。
ぜひ、いろいろな使い方を試してみてください!

まとめ

いかがだったでしょうか!AIの登場でコード生成が加速する現代のチームに特に役立つツールをつくってみました。今後もしかすると、AIツールによる自動mergeやレビューの定量指標を具体化することで、こういった悩みは解決されるかもしれませんが、まずは簡単なところから、という気持ちで実装してみました。

botが自動でリマインドするSlack Review Notifyというツール、ぜひ使ってみて感想を教えてください。こうしたらもっとよくなる、などじゃんじゃんお待ちしています。

リポジトリのスターも押してくれると嬉しいです!
https://github.com/haruotsu/slack-review-notify

GMOペパボ株式会社

Discussion