GitHubプルリクエストのレビューコメントを取得して振り返る

こんにちは、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.rbGitHub APIを使用しました。

https://github.com/octokit/octokit.rb

APIの認証にはpersonal access tokenを使用しました。

https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens

.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に対応します

ディレクト

  • ファイルパスからディレクトリを抽出した列を追加しました
    • ディレクトリ別に見ることでファイルの種類がわかります
    • CSV出力後に気づいたのでスプレッドシートの数式で対応しました
      • 数式は =IFERROR(JOIN("/", ARRAY_CONSTRAIN(SPLIT(J1, "/"), 1, 1)), "") です
      • J列にFile Path列があります

振り返り

ディレクトリ別で多い順のapp, frontend, specについてレビューコメントを振り返ります。

app

appディレクトリにはサーバーサイドのRailsのコードがあります。YOUTRUSTはCQRSアーキテクチャを採用しておりコントローラーやCQSアーキテクチャに基づいたQuery, UseCase, Commandがあります。

N+1が発生していないか、nilの扱いは適切かなどのコメントが参考になりました。

frontend

frontendディレクトリにはフロントエンドのReactのコードがあります。

Figmaで指定されたデザインが反映されているか確認するコメントがあり、これからも注意したいと思いました。

spec

specディレクトリにはRSpecのテストがあります。

テスト観点での指摘でJobからCommandが呼び出されることを担保するなどがあります。私も間違えやすい箇所になるので、そのファイルの役割をしっかり認識したいと思いました。

まとめ

GitHubプルリクエストのレビューコメントを取得して振り返りました。

次にやってみたいことはRuboCopのカスタムルールでディレクトリごとに書くべき内容を自動的にチェックできる仕組みを作ったり、目視で確認するには多すぎるコメントを自然言語処理で一括分析してみたいです。

最後にYOUTRUSTはエンジニア採用を積極的に進めております!ぜひご覧ください!

career.youtrust.co.jp