プルリクのレビュー件数をグラフにしてみた
こんにちは、tkyです。
社内でプルリクをいろいろなメンバーにレビューしてもらっているのですが、
「最近特定の人ばかりにレビュー依頼してる気がする・・・負荷溜まってないかな・・・」
という一抹の不安をいだき誰にレビュー依頼するか判断する材料にしようと考え(完全に個人用で)作った感じです。
何作ったの
社内のメンバーのプルリク溜まってる件数をグラフにしてみました。
token, organization, teamを入力することでこんな感じのグラフが出るようなものです。
こうすることでレビュー溜まってない人にレビューアサインしたほうが早いかな?など検討の余地が生まれて良いですね。
技術的なところ
せっかくだしTypescriptとVueも一緒に触ってみながら成果物残してみるかー!というモチベーションです。 私はAndroidエンジニアですが、Reactとかのフロントの経験はあるのでそんなに抵抗はないです。
chart.jsのおかげでグラフ化はかんたんでした。感謝・・・
使ったAPI
大まかな流れは /orgs/:org_id/team/:team_id/members
で特定のチームに属するメンバーを抽出して
そのメンバーが持っているPRレビューの数を /search/issues
で取得します。
Search | GitHub Developer Guide
Team Members | GitHub Developer Guide
/search/issues
の課題
search/issues?q=is:open+is:pr+review-requested:ticktakclock
こんな感じで私がレビューすべきプルリクIssueが取得できるのですが、
review-requestedが1人しか指定できないのか、例えば
Aさん・・・2件、 Bさん・・・1件、 Cさん・・・4件
あったとして
search/issues?q=is:open+is:pr+review-requested:a-san+review-requested:b-san
・・・3件取得search/issues?q=is:open+is:pr+review-requested:a-san+review-requested:c-san
・・・0件取得
みたいなことがあってなぜか複数指定して検索できるパターンとできないパターンがあり
指定したメンバー全員を一気に検索することができなかったことです。
配列を一気にasync - await するのにはPromise.all()でくくってあげる必要がある、というのは本件に関係ありませんがそこそこ重要なポイントかなと思います。
const res = await api( "/orgs/" + this.organization + "/teams/" + this.team + "/members" ); const results: Array<RequestedReviewer> = await Promise.all( res.data.flatMap(async (user: User) => { const res = await api( "search/issues?q=is:open+is:pr+org:" + this.organization + "+archived:false" + "+review-requested:" + user.login + "&sort=created&order=asc&page=1&per_page=10" ); return { user: user, issues: res.data.items }; }) );
これで何が問題かというとGitHubAPIのレート制限にすぐに引っかかるということです。
普通にtoken使ってやる場合は1時間あたり最大60件なので、比較的すぐに制限に引っかかります。
GitHub API v3 | GitHub Developer Guide
まとめ
- レビュー件数がわかって少し幸せ
- search apiもう少し拡張してほしい
- typescriptとVueの勉強しようと思ったのにGitHubAPIの勉強になってしまった・・・
こうすれば複数人のIssue検索できるよ、のような知見があるかたはぜひ教えていただきたいです!!