CodeRabbitとは?
CodeRabbitは、自然言語モデルAIを使用してGitHubプルリクエストのコードレビューと要約を行います。
AIによる行ごとのコード提案、差分レビュー、PRのサマリーを実現し、コード品質の向上と手動レビューの負担軽減を目指します。
レビューに用いるプロンプトはカスタマイズ可能なため、チーム独自のルールでレビューをすることが可能です。
しくみ
CodeRabbitはGitHub Actionsを用いてAIレビューをおこないます。
GitHub Actionsを使用するので、各種設定をリポジトリ内のyamlファイルで任意に設定することができます。
出力されるもの
CodeRabbitを導入した場合の実際のアウトプット物を紹介します。
本記事で例として使用する画像は既存リポジトリに「CodeRabbitを実装するためのPR」を作成した際のCodeRabbitの挙動となります。
1. リリースノート
PRコメントの末尾にPRの目的レベルでの説明が記載されます。
PRの内容をもとに、変更点を以下の項目に分類します。
- New Feature:新機能
- Bug Fix:バグ修正
- Documentation:ドキュメント
- Refactor:リファクタリング
- Style:スタイル
- Test:テスト
- Chore:雑務
- Revert:取り消し
今回は「CodeRabbitを実装する」という内容なので新機能
として説明されています。
この箇所はGitHub Actionsが走るたびに内容が更新されます。
2. 要約
画像はオリジナルから項目を変更したものです。
今回は以下の項目を出力するようにしました。
- 要約
- PR全体の変更点を完結に説明してくれます
- 変更点
- 差分ファイルごとにどのような変更がなされたかを要約してくれます
この箇所はGitHub Actionsが走るたびに内容が更新されます。
3. コードレビュー
差分を元に、AIがコードレビューをしてくれます。
- レビューのサマリー
- 指摘箇所のレビュー
- 指摘箇所のレビュー
という形式でコメントが追加されます。
プロンプトに沿ったレビューをするので、各チームごとに視点を言語化しておくと良さそうです。
準備
GitHub Actions実行ファイルの作成
.github/workflows
配下にGitHub Actions用のyamlファイルを作成します。
自分は他のレビューAIの使用を見越して.github/workflows/code-rabbit.yaml
にしました。
OpenAI API KEYの設定
下記URLにてOpenAIのAPI Keyを取得します。
https://platform.openai.com/api-keys
https://github.com/username/repository-name/settings/secrets/actions
にてOPENAI_API_KEY
を新規で作成し、OpenAI API Keyを設定します。
デフォルトでの実行
https://github.com/coderabbitai/ai-pr-reviewer?tab=readme-ov-file#install-instructions
に記載されている内容でcode-rabbit.yaml
を設定し、CodeRabbitが起動するかどうかを確認します。
無事にGitHub Actionsが走り、CodeRabbitによるレビューが追加されたらひとまずの実装は完了です🎉
ここからは、ファイル内で独自に設定すると良さそうな項目を紹介していきます。
最終的なファイル
まずは完成形から見せてしまいます。
code-rabbit.yaml
は最終的に以下のようになりました。
設定ファイル
name: CodeRabbit
permissions:
contents: read
pull-requests: write
on:
pull_request:
types: [opened, ready_for_review]
concurrency:
group:
${{ github.repository }}-${{ github.event.number || github.head_ref || github.sha }}-${{ github.workflow }}-${{ github.event_name == 'pull_request' && 'pr_event' || 'pr' }}
cancel-in-progress: ${{ github.event_name != 'pull_request' }}
jobs:
review:
runs-on: ubuntu-latest
steps:
- uses: coderabbitai/ai-pr-reviewer@latest
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
with:
openai_light_model: gpt-4o
openai_heavy_model: gpt-4o
language: ja-JP
summarize: |
次のmarkdownフォーマット形式を使用して、本PRの要約を出力します。
[出力形式]
## 要約
<!-- 特定のファイルではなく、全体の変更に関する高レベルの要約を80語以内で。 -->
## 変更点
<!-- ファイルとその要約のテーブル。スペースを節約するために、同様の変更を持つファイルを1行にまとめることができます。 -->
以下では、デフォルトから変更した項目について説明します。
トリガーの設定を変更する(GitHub Actionsの設定)
デフォルトの状態では
- 新規PRが作成されたとき
- pushされたとき
で毎回ワークフローが走ってしまうので、以下のタイミングをトリガーにしました。
- 新規PRが作成されたとき
- PRがDraftからOpenに変わったとき
これにより、開発者の任意のタイミングでAIレビューをすることができます。
CodeRabbit独自の設定項目
jobs:
review:
steps:
with:
配下に独自に設定できる項目があります。
https://github.com/coderabbitai/ai-pr-reviewer/blob/main/action.yml
にデフォルト値が記載されており、変更や追加が必要なものはこちらで設定することができます。
openai_light_model, openai_heavy_model
レビューに使用する言語モデルを指定することができます。
openai_light_model
とopenai_heavy_model
は以下のように使い分けられているようです。
- openai_light_model
- 変更点の要約など、軽微なタスク
- openai_heavy_model
- レビューやコメントといった複雑なタスク
デフォルトではgpt-3.5-turbo
とgpt-4
になっています。
これをどちらも最新モデルであるgpt-4o
に変更しました。
openai_light_model: gpt-4o
openai_heavy_model: gpt-4o
理由は以下です。
- GPT-3.5での要約は信頼性と再現性が低い
- GPT-4よりもGPT-4oの方が高性能かつ安価
参考: 言語モデル別の価格
https://openai.com/api/pricing/
language
レビューの言語を設定します。
我々の開発チームは日本人から構成されるため、日本語に設定しました。
language: ja-JP
ちなみに、この項目で言語設定しておけばプロンプトを日本語訳して設定し直す必要はないハズです。
summarize
デフォルトで指定されているWalkthrough
という言葉に馴染みが無かったので要約
に変更しました。
また、デフォルトだとPoem
が入ってるので、削除しました。
出力形式をマークダウンフォーマットで指定し、各項目で何を出力するのかはコメント形式で指定しました。
その他の設定
その他にも設定可能な項目がいくつかありました。
自分は触っていないのですが、運用で参考になりそうな項目をいくつかピックアップします。
- path_filters
- CodeRabbitによるレビューをスキップするファイル
- disable_review
- デフォルト値:
false
-
true
にすることでレビューをスキップさせることが可能
- デフォルト値:
- disable_release_notes
- デフォルト値:
false
-
true
にすることでリリースノートの作成をスキップさせることが可能
- デフォルト値:
- openai_model_temperature
- デフォルト値: 0.05
- 0-2の範囲で変更可能。大きくするとより不確実性が増す
- tempratureって何?という方はこちら
- system_message
- CodeRabbitのシステムプロンプト
- どんな観点でレビューして欲しいのかを設定可能
- summarize_release_notes
- リリースノート作成用のシステムプロンプト
実際どうなの?
実案件で作成されたPRをCodeRabbitにレビューさせた感想は以下です。
- nil対策をしてくれる
- nilに対するエラーハンドリングをしていない箇所に対して指摘してくれました
- タイポを指摘してくれる
- メソッド名のタイポを指摘してくれました
全体的にtoo muchなレビューではありますが、「指摘された箇所の修正が不要であること」をPR作成者がコメントした上でレビュワー(人間)に渡すことでコードの理解度は増すと思います。
また、CodoRabbitが作成した文章はすべてマークダウンで書かれているので、これを編集することで人間がゼロから書く作業コストを削減できます。
ただし、レビューコメントを修正するのはあまりよろしく無い気がします。
個人的な結論としては、CodeRabbitは現状でも十分に活用可能なレベルであり、導入することで得られるメリットの方が大きいと感じています。
参考