NEXTSCAPE blog

株式会社ネクストスケープの社員による会社公式ブログです。ネスケラボでは、社員が日頃どのようなことに興味をもっているのか、仕事を通してどのような面白いことに取り組んでいるのかなど、会社や技術に関する情報をマイペースに紹介しています。

MENU

AIコードレビューツール「CodeRabbit」を試す

はじめに

株式会社ネクストスケープ Chief Technology Office所属の小野塚です。

最近は実装そのものをAIに任せる場面が増え、Claude CodeやCursorがどんどんコードを書いてくれる一方で、「本当にちゃんと実装できているか」を人間が全部追いきれなくなってきている、ということが社内外で挙がっているかと思います。

書くスピードにレビューが追いつかない以上、レビューの一部もAIに任せて、人間は最終確認に集中する体制が必要になってきているように感じます。そこで今回常々気になっていたCodeRabbitをあらためて試してみようと思い、記事にしてみました。

CodeRabbitは、CodeRabbit Inc.が開発するAIコードレビューツールです。2023年にサンフランシスコで創業されたスタートアップで、急成長しているサービスの一つで、GitHubやGitLabのプルリクエストに対してAIが自動でレビューを行い、変更内容のサマリー生成から、バグやセキュリティ上の懸念、コーディング規約からの逸脱といった指摘まで、コード行単位でコメントを付けてくれるとのこと。

今回GithubのリポジトリでTodoアプリを作り、CodeRabbitにレビューさせてみて分かったことをまとめます。

PRを作成してCodeRabbitに読み込ませる

まずはTodoアプリを作成しGithubリポジトリにプッシュします。その後、featureブランチを切ってpushします。

Githubを開くと、PR作成画面が表示されるので、タイトルと説明を適当に入力し、「Create pull request」ボタンをクリックします。

そしてここからがポイントなのですが、実際にPRのタイミングでレビューを走らせるにはCodeRabbit側でリポジトリを有効化しておく必要があります。 

CodeRabbitのWebサイトを開いてGitHubアカウントでログインし、左側のメニューから「Review」ー>「Organization Settings」を選択すると以下のような画面になりますので、「General」ー>「Language」を確認し、Englishの場合はJapaneseに変更しておきましょう。

次に「Review」ー>「Repositories」で自身のGithubのリポジトリが表示されるので、今回の対象リポジトリを選びます。

そうすると以下のような画面になりますので、ここでもLanguageがJapaneseになっていることを確認します。Use Organization SettingsがONになっていればその設定が引き継がれていると思います。場合によっては「Use Organization Settings」のチェックをOFFにすることでそのリポジトリ独自の設定が可能です。

レビュー開始

さて、PRを作成してGithubの画面を見てみると、しばらくしてCodeRabbitのレビューコメントが付きました。今回はあらかじめコードに10個ほど意図的なミスや問題点(バグやアンチパターン)を仕込んでおいたので、どこまで拾ってくれるかを確認します。

設定漏れに気づく

レビュー自体は無事に返ってきたのですが、コメントを見るとProプランを契約しているはずなのに、なぜかFreeプランとして動作している様子でした。

そこで以下の画面のように「Account」ー>「Team Management」をクリックします。

Team Management画面に移動すると、自分のアカウントの「Seat Status」が「Unassigned」(未割り当て)になっていました。

このためにレビューは動作するものの、私がProプランとして参加していない状態だったのでFreeプランと見なされていたようです。

左端のチェックボックスで自分の行を選択し、「Assign」を選択するとシートが割り当てられ、

Seat Statusが「Assigned」に変わります。

これでProプランが自分のGitHubアカウントに正しく紐づいた状態になりました。もう一度改めてレビューしてくれると楽だったのですが、一旦レビューが終わってしまうともう一度。。というのできないらしいです。。
ということで既存のPRに戻り、再度featureブランチ作成ー>変更を行い、プルリクを作成します。そうすると再度レビューが行われます。

Proプランでの本格レビュー:13件の指摘

今回、新しく「優先度・期限・一括削除・CSVエクスポート」機能を追加したPRを作成し、今度は次のような粗を意図的に仕込んでみました。

  1. パストラバーサル — OnGetExport(string fileName) がユーザー入力のfileNameをそのままパス結合に使用(../../等でwwwroot外への書き込みが可能)
  2. エクスポート先ディレクトリ未作成 — wwwroot/exportsが存在しないとFile.WriteAllTextが例外
  3. CSVインジェクション/未エスケープ — ExportToCsvでカンマ・改行・=始まりの値を一切エスケープせず出力(Excelで開くと数式実行の危険あり)
  4. コレクション変更中の反復 — ClearCompletedforeach中に_todos.Removeを呼び出しInvalidOperationExceptionを誘発
  5. 誤ったソートロジック — GetTodosSortedByPriorityPriorityを文字列としてソートし、意図(High→Medium→Low)と異なる順序になる
  6. null参照の可能性 — Editも既存のToggle/Delete同様、Findの結果をnullチェックせず使用
  7. 入力検証欠如 — 編集フォームのtitleも空文字・nullチェックなし
  8. DateTime比較の不整合 — DueDate(フォーム入力、Kind未指定)をDateTime.Now(ローカル時刻)と直接比較し、UTC/ローカルが混在

そして、また以下のようにレビューが開始されます。

以下のようにレビュー結果が対象となるコードの箇所を含め詳しく表示されます。

今回はPRのコメント数としては13件の指摘が付きました。仕込んだ粗との照合結果は次のとおりです。

仕込んだエラー、問題点 検出
Html.Raw(item.Title) によるXSS
静的リストによるスレッドセーフでない共有状態
Id = _todos.Count + 1 のID重複バグ
GetPage のオフバイワン(範囲外アクセス)
Toggle/Delete/Edit のnull参照可能性
Task.Delay(100).Wait() の同期ブロッキング
パストラバーサル(OnGetExport の fileName)
CSVインジェクション/未エスケープ
ClearCompleted のforeach中の要素削除
GetTodosSortedByPriority の文字列ソートバグ

検出されなかった/見落とされたものは次の3点でした。

  • 編集フォームでのtitle未入力チェック(バリデーション欠如)
  • DueDate(Kind未指定)とDateTime.Now(ローカル時刻)の比較不整合
  • wwwroot/exportsディレクトリが存在しない場合にFile.WriteAllTextが例外になる点(直接的な指摘はなし。ただし代替実装への変更提案の中で間接的に解消される形)

逆に、意図せず仕込んでいた「本物のバグ」まで拾われていました。

  • 編集フォームの<select>/日付inputが現在の値を反映していない(pre-populateされていない)
  • _Layout.cshtmlのnavbarトグラーでdata-bs-targetと実際のIDが不一致(デフォルトテンプレート由来の不具合)
  • Privacy.cshtmlがプレースホルダーのまま

ということで、主要なエラーや問題点(重大度の高いもの10種類)はほぼ全て検出されており、細かい入力バリデーション欠如や日時のKind不整合など軽微なものは拾われませんでした。

このあたりはプロジェクト、ソースコードによるものなので一概に判断することは難しいですが、なかなか高いカバレッジだと思います。

使っているモデルは?自分のAPIキーは使える?

気になったので、レビューに使われているAIモデルについても調べてみました。公式には固定のモデル名は明かされていないようなのですが、ドキュメントには「コードはレビュー目的でOpenAIおよび/またはAnthropicに共有される」と記載があります。

つまり内部的にはGPT系とClaude系のモデルを組み合わせて使っており、最近ではNVIDIAのNemotronモデルへの対応も発表されているようです。基本的には複数モデルを組み合わせた独自パイプラインで、ユーザー側から中身は見えないブラックボックスという位置づけです。

「自分のAPIキーで契約しているモデルを使わせたい」という点については、「Bring your own model」というセルフホスト版の機能として存在します。

ただし公式ドキュメントには「The self-hosted option is available for CodeRabbit Enterprise customers with 500 or more user seats」と明記されており、Enterpriseプラン(しかも500シート以上)専用の機能でした。今回契約しているProプランでは、モデルの指定やAPIキーの持ち込みはできず、CodeRabbit側が用意したモデルをそのまま使う形になります。

日本語化できない部分がある

さて、Organization Settingsで言語をJapaneseに設定しているので、レビュー本文はきちんと日本語で返ってきます。ただし、以下の画面にように英語のまま出力されている部分があります。

 

CodeRabbitの「Language」設定で翻訳されるのは、AIが生成する説明文の本文(「利用者入力をHTMLとして出力しないでください」といった指摘内容そのもの)だけのようです。

以下のような部分は固定のテンプレート文言(UIラベル)として扱われており、Language設定に関わらず常に英語のままでした。

  • 「Committable suggestion」「Apply suggestion」「Add suggestion to batch」といったボタンやセクション見出し
  • 「IMPORTANT: Carefully review the code before committing...」という定型の注意書き
  • 「Prompt for AI Agents」というセクションとその中身

「Prompt for AI Agents」については、これはCursorやClaude CodeなどAIコーディングツールにそのままコピペして使うための、AI向けの指示文だと考えられます。

実際、コードの修正はCodeRabbit自体にやらせるより、この内容をコピーして普段使っているAIコーディングツールに渡し、ローカルで直させるためにコピー先のツール側で一貫して正しく解釈されるよう、あえて英語で統一しているのかもしれません(公式に明言されているわけではなく推測です)。

使い方としてはAIに丸投げなのでいいと言えばいいのですが、できれば日本語にしてほしいな。。という思いがあります。

チャットで対話してみる

普通のチャットツールのようにPR上で@coderabbitaiにメンションすると、指摘の理由を説明してもらったり、修正を依頼したりできます。試しに次のように聞いてみました。

@coderabbitai なぜこの指摘が問題なのか、初心者にも分かるように説明して

そうすると以下のように回答が出力されます。

コード例付きで、初心者向けにかみ砕いた説明が日本語で返ってきました。

あとは今更ではありますが、CodeRabbitからのコメントはメールにも以下のように都度通知されます。

その場で修正を依頼する:Autofixの正しい使い方

次に、その場で修正を依頼することができるかを確認してみるため、次のように送ってみました。

「@coderabbitai この`Tags`のnull参照の問題を修正して

CodeRabbitからは「修正計画を提示しました」という返信があり、新しいコミットが追加されたように見えたのですが、よく確認するとそのコミットはPR作成時の元のコミット(Claude Codeで機能を実装した際の共著表記)で、修正依頼によって新しく追加されたものではありませんでした。つまり、この自然文での依頼だけでは実際の修正・コミットまでは行われていなかったことになります。

公式ブログを調べたところ、実際に自動修正・自動プッシュをしてくれる機能は「Autofix」という名前で、決まったコマンド構文があることが分かりました。

正しい使い方

@coderabbitai autofix

これで、指摘事項をCodeRabbitが実際に実装し、作業中のPRのブランチに直接修正をプッシュしてくれます。直接ブランチには入れず、別PRとして確認してからマージしたい場合は次のコマンドを使います。

@coderabbitai autofix stacked pr

重要な注意点

  • AutofixはCodeRabbit Proプランのオープンベータ機能です。
  • 自動マージまではされず、生成された修正はユーザーがレビュー・承認する必要があります。
  • GitHub・GitLab両方で利用可能とのことです。

つまり、先ほどの「このTagsのnull参照の問題を修正して」という自然文の依頼では、正式なautofixコマンドとして認識されず、単なる質問への回答(修正案の説明)として処理されていたと考えられます。

ちなみに、公式ドキュメントによるとautofixは「未解決のCodeRabbitレビュースレッドをすべてスキャンして修正指示をまとめる」という仕様になっており、1つの指摘だけをピンポイントで指定するオプションはありませんでした。

とりあえず修正を指示して、受け付けられた旨が表示されます。

そして数分待ちますと、以下のように修正が完了したことが通知されます。

と、ここまでやっては見たものの、あくまで実装・修正はClaudeCodeやCursor等の別ツール、CodeRabbitはレビューのみ、としっかり切り分けた方がよいかもしれません。コンテンツを共有してしまうことによる弊害もありますし、それを防ぐためのCodeRabbitですので。。

シーケンス図の自動生成

あともう1つ、見た目にも分かりやすい機能があったので試してみました。PRのコメント欄で次のようにコメントします。

「@coderabbitai generate sequence diagram

PRで追加した機能(タグ付け、検索、完了率統計など)の処理の流れを、Mermaid記法によるシーケンス図として生成してくれました。GitHubはMarkdown内のMermaid記法を標準でそのまま図として描画してくれるため、コメント欄に自動で綺麗な図が表示されます。

ラベルまできちんと日本語化されていてかなり実用的でした。

その他に使えるコマンド

PR上のコメントで使える主なコマンドは次のとおりです。

  • @coderabbitai summary — PRの変更内容のサマリーを再生成する
  • @coderabbitai help — 利用可能な全コマンドの一覧を表示する
  • @coderabbitai configuration — このリポジトリに適用されている現在の設定内容を表示する
  • @coderabbitai resolve — 未解決のレビューコメントをまとめて解決済みにする
  • @coderabbitai ignore — このPRに対するレビューを以後スキップさせる
  • @coderabbitai pause / resume — 自動レビューを一時停止・再開する

まとめ

他にも機能がありますが、今回は一旦以上としたいと思います。

今回、Proプランを実際に手を動かして検証してみたことで、以下のような発見がありました。

  • Proプランを契約していても、シートを割り当てないとFree扱いでレビューされる(Team Managementでの割り当てが必要)
  • 意図的に仕込んだバグの検出率はかなり高め
  • 自分のAPIキーやモデルの持ち込みはEnterprise限定機能で、Proでは不可
  • 日本語化されるのはAIの説明文本文のみで、UIラベルやAIエージェント向けプロンプトは英語のまま
  • チャットでの自然文の修正依頼だけでは実際のコミットまでは行われず、実際に自動修正・プッシュさせるには@coderabbitai autofixという専用コマンドが必要
  • シーケンス図生成やチャット対話など、レビュー結果の理解を深めるための機能も有り

これからCodeRabbitを検討している方の参考になれば幸いです。

当社ネクストスケープはこのように生成AIをはじめとした新しい技術・知識を日々取り入れており、Webサイト、スマホアプリ、Hololensアプリの開発をはじめ、CMSを利用したサイトの新規構築やリニューアルなど、お客様のニーズに幅広く対応いたします。お困りのことがございましたら、いつでもお気軽にお問い合わせください。

nextscape.net

(以下当社お問合せフォーム)

Microsoft Forms

当社では一緒に働いてくれる仲間を募集しています。是非以下のサイトよりお申込みください。

recruit.nextscape.net