こんにちは、ソーシャル経済メディア「NewsPicks」の池川です。
NewsPicks Advent Calendar 2023 の 6 日目です。 qiita.com
昨日は中村さんによる『LLMで叶える「あの人のコメントが読みたい!」』でした!
NewsPicks では GitHub のプルリクエスト (以下 PR) を介してソースコードレビューを行っています。
一般論として、案件に関わりのない PR や修正が複雑な PR などは後回しにされがちです。
後回しにして問題なければいいのですが、後回しにすると何のための変更だったのか思い出せずレビューが苦しくなりますことも度々あります。
また、せっかく Approve されてもリリース作業を後回しにしたりすると、気づいたらコンフリクトしている、というようなこともあります。
このような背景があり、業務の合間合間に ChatGPT 先生に自動通知機能を作ってもらうことにしました。
実際の通知
こういう通知を送ってもらうようにしました。
社内ですでに他の方が同様の通知を作っていたのですが、そちらは Approve 後の PR をリリースさせることが目的で、若干目的が違ったのとそこまで難しくないので、自前で作ることにしました。
想定した要件
やりたいことは、「自分のチームの人が作った PR のレビュー・リリース漏れに気づきたい」ということだったので、(多少飛躍がありますが、)
- GitHub の Team に属するメンバーが
- 業務で関わりのある Repository で作った Open な PR を
- Approve 待ち・Approve 直後・Approve から時間が経っているの 3 種類に分類し、
- Team に属するメンバーが主に使う Slack チャンネルへ定時投稿したい
としました。
使ったツール
Google App Script
定時実行処理を実装するのに便利でした。
Google Spread Sheet
GitHub の Team や Repository を直接ソースコードへ書いても良いのですが、要件を考える段階で他のチームにもしれっと入れたいなと思ったので、設定管理しやすい Google Spread Sheet を使うことにしました。
GitHub API
PR の一覧を取得するために、https://api.github.com/repos/{owner}/{repo}/pulls を利用しました。
↑↑のエンドポイントでは、Approve されているかどうかが分からなかったため、https://api.github.com/repos/{owner}/{repo}/pulls/{pull_number}/reviews を利用しました。
Team から GitHub 上のアカウント情報を引くために、 https://api.github.com/orgs/{org}/teams/{team_slug}/members を利用しました。
Slack Api
Slack 通知に利用します。
https://slack.com/api/chat.postMessage がエンドポイントです。
処理フロー
Google Spread Sheet に書いてある設定値をベースに PR の取得とメンバー情報の取得、PR の分類等を経て、Slack へ通知しています。
なお、当初はソースコードを貼り付けようと思っていたのですが、ChatGPT に書いてもらったもののままでリファクタリングをしていなかったため、割愛することとしました。
ChatGPT に聞いていただければ大丈夫だと思います。
設定管理
既出の通り、PR の取得先 Repository やメンバー管理単位である GitHub Team / Slack Channel をお手軽に管理したかったので、Google Spread Sheet にて管理するようにしました。
このような簡便な形式で管理しております。
PR の取得先 Repository を増やしたい場合は A 列に追加し、通知先を増やしたい場合は C 列・D 列へ追加する仕様としました。
実装時に気にした点
API を利用する都合上、Token を管理する必要があります。 スクリプトにベタ書きは避けたかったので、Property Service という機能を利用して管理しました。
また、通知文字列をバッククオートでくくると、改行をそのままソースコード上で表現でき変数も展開できるので便利でした。
const text = `PR のレビュー・リリースを、よろしくお願いいたします!! :bow_emo: :white_check_mark: 24H 以内に Approve されている PR ${approvedWithin24H.join('\n')} :rotating_light: Approve されてから 24H 経過した PR ${approvedAfter24H.join('\n')} :runrun: Open だが、まだ Approve されていない PR ${openNotDraftNotApproved.join('\n')} `
通知を実際に利用してみて
毎朝通知が来るので、もし未レビューの PR があればとりあえず Chrome タブに開いておく、といった使い方ができて便利です。
ご参考になれば幸いです。
ただ、この記事を読んで実装してみようと思った方、ブログを書きながら GitHub 側を眺めてみたところ、以下の機能があるようなのでこちらで要望を満たせるか確認してから実装すると良いのではと思いました。
レビュー待ちのプルリクを通知してくれるようです。
アカウントへ付与された権限によっては使えないかも知れませんが、こちらを先にご検討いただくのが良さそうです。
告知
NewsPicks ではエンジニアを募集中です!ご興味のある方はこちらまで。
https://hrmos.co/pages/uzabase/jobs/NP_Eng004
今回の記事がおもしろいと思ったら NewsPicks アドベントカレンダーの他の記事も見てみてくださいね。 qiita.com 明日は鶴房さんが書いてくれます。お楽しみに!