こんにちは、YOUTRUSTのしぶしゅん(YOUTRUST/X)です。 今回はGitHubプルリクエストのレビューコメントを取得して振り返る取り組みを行いましたので紹介します。
普段プルリクエストをレビューするときはレビュワーとして担当になったプルリクエストだけを見ているので、全体を振り返る機会がありませんでした。 レビューコメントをまとめて見ることで、異なる視点から発見があるかもしれないと思い振り返りました。
GitHub のプルリクエストレビューコメントを取得する
プログラム
プログラムの内容です。
require 'octokit' require 'dotenv' require 'csv' require 'date' # 環境変数をロード Dotenv.load # GitHubのクライアントを設定 client = Octokit::Client.new(access_token: ENV['GITHUB_ACCESS_TOKEN']) # リポジトリを指定 repository = ENV['GITHUB_REPOSITORY'] # 開始と終了日を設定 start_date = Time.new(2023, 7, 1) end_date = Time.new(2023, 12, 31) # ファイル名を設定 filename = "pr_comments_#{repository.gsub('/', '_')}.csv" CSV.open(filename, "wb") do |csv| # CSVヘッダー csv << ["PR Title", "PR Author", "Comment Body", "Comment Author", "Authors Match", "File Path", "File Extension", "Comment URL", "Is First Comment", "Created At"] page = 1 loop do pull_requests = client.pull_requests(repository, state: 'all', sort: 'created', direction: 'desc', page: page) if pull_requests.empty? || pull_requests.first.created_at < start_date break end pull_requests.each do |pr| if pr.created_at <= start_date || pr.created_at >= end_date next end pr_author = pr.user.login comments = client.pull_request_comments(repository, pr.number) comments.each do |comment| is_first_comment = comment.in_reply_to_id.nil? ? "Yes" : "No" file_extension = File.extname(comment.path).delete_prefix('.') authors_match = pr_author == comment.user.login ? "Yes" : "No" csv << [ pr.title, pr_author, comment.body, comment.user.login, authors_match, comment.path, file_extension, comment.html_url, is_first_comment, pr.created_at ] end end page += 1 end end
GitHub API
レビューコメントの取得はoctokit.rb
でGitHub APIを使用しました。
https://github.com/octokit/octokit.rb
APIの認証にはpersonal access tokenを使用しました。
.env
ファイルにGITHUB_ACCESS_TOKEN
を記載し、dotenv
で読み込んでいます。
コメントの種類
プルリクエストのコメントにはプルリクエスト全体へのIssueのコメントと、ファイルと行を指定したレビューのコメントがあります。
https://docs.github.com/ja/rest/issues/comments?apiVersion=2022-11-28 https://docs.github.com/ja/rest/pulls/comments?apiVersion=2022-11-28
レビューのコメントにはコメントしたファイルのcomment.path
があり、ファイルのディレクトリや拡張子情報を抽出できます。
コメントの傾向を比較するのに利用したいためレビューのコメントを対象にしました。
絞り込み
すべてのレビューコメントを取得すると多いため絞り込みました。
コメント作成日
- コメント作成日を2023年7月〜12月としました
- リポジトリ全期間だと多いので絞り込みました
- この期間だけでもレビューのコメントは5000件ほどありました。
スレッド
- レビューのコメントをスレッドの先頭のみとしました
- これはスレッドの2つ目以降は「修正しました!」などのコメントがあるためです
Is First Comment
列のYes
に対応します
ユーザー別
- プルリクエストを作成したユーザーとレビュワーが異なるものとしました
- プルリクエストを作成したユーザーがレビュワーに向けてコメントすることがあるためです
Authors Match
列のNo
に対応します
ディレクトリ
- ファイルパスからディレクトリを抽出した列を追加しました
振り返り
ディレクトリ別で多い順のapp, frontend, specについてレビューコメントを振り返ります。
app
appディレクトリにはサーバーサイドのRailsのコードがあります。YOUTRUSTはCQRSアーキテクチャを採用しておりコントローラーやCQSアーキテクチャに基づいたQuery, UseCase, Commandがあります。
N+1が発生していないか、nilの扱いは適切かなどのコメントが参考になりました。
frontend
frontendディレクトリにはフロントエンドのReactのコードがあります。
Figmaで指定されたデザインが反映されているか確認するコメントがあり、これからも注意したいと思いました。
spec
テスト観点での指摘でJobからCommandが呼び出されることを担保するなどがあります。私も間違えやすい箇所になるので、そのファイルの役割をしっかり認識したいと思いました。
まとめ
GitHubプルリクエストのレビューコメントを取得して振り返りました。
次にやってみたいことはRuboCopのカスタムルールでディレクトリごとに書くべき内容を自動的にチェックできる仕組みを作ったり、目視で確認するには多すぎるコメントを自然言語処理で一括分析してみたいです。
最後にYOUTRUSTはエンジニア採用を積極的に進めております!ぜひご覧ください!