【設定ファイルあり】CodeRabbitを試してみた！

## CodeRabbitとは？

CodeRabbitは、自然言語モデルAIを使用してGitHubプルリクエストのコードレビューと要約を行います。
AIによる行ごとのコード提案、差分レビュー、PRのサマリーを実現し、コード品質の向上と手動レビューの負担軽減を目指します。
レビューに用いるプロンプトはカスタマイズ可能なため、チーム独自のルールでレビューをすることが可能です。

- HP: https://coderabbit.ai/ja/
- GitHub: https://github.com/coderabbitai/ai-pr-reviewer

### しくみ

CodeRabbitはGitHub Actionsを用いてAIレビューをおこないます。
GitHub Actionsを使用するので、各種設定をリポジトリ内のyamlファイルで任意に設定することができます。

### 出力されるもの

CodeRabbitを導入した場合の実際のアウトプット物を紹介します。
本記事で例として使用する画像は既存リポジトリに「CodeRabbitを実装するためのPR」を作成した際のCodeRabbitの挙動となります。

#### 1. リリースノート

![スクリーンショット 2024-06-05 10.28.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2688241/72c2bfe0-1ae0-f7c7-1295-c927c78a55b9.png)

PRコメントの末尾にPRの目的レベルでの説明が記載されます。
PRの内容をもとに、変更点を以下の項目に分類します。

- *New Feature*：新機能
- *Bug Fix*：バグ修正
- *Documentation*：ドキュメント
- *Refactor*：リファクタリング
- *Style*：スタイル
- *Test*：テスト
- *Chore*：雑務
- *Revert*：取り消し

今回は「CodeRabbitを実装する」という内容なので`新機能`として説明されています。

この箇所はGitHub Actionsが走るたびに内容が更新されます。

#### 2. 要約

PRの差分を要約します。
![スクリーンショット 2024-06-05 11.02.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2688241/6f305e35-9663-87ac-72d9-ef1cbcb580cf.png)

画像はオリジナルから項目を変更したものです。
今回は以下の項目を出力するようにしました。

- 要約
    - PR全体の変更点を完結に説明してくれます
- 変更点
    - 差分ファイルごとにどのような変更がなされたかを要約してくれます

この箇所はGitHub Actionsが走るたびに内容が更新されます。

#### 3. コードレビュー

差分を元に、AIがコードレビューをしてくれます。

- レビューのサマリー
    - 指摘箇所のレビュー
    - 指摘箇所のレビュー

という形式でコメントが追加されます。

![スクリーンショット 2024-06-05 11.07.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2688241/5016b0fb-d8da-127e-5b08-74a4db856e93.png)

プロンプトに沿ったレビューをするので、各チームごとに視点を言語化しておくと良さそうです。


## 準備

### 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`は最終的に以下のようになりました。

:::note
<details><summary>設定ファイル</summary>

```yaml: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行にまとめることができます。 -->

```
</details>
:::

以下では、デフォルトから変更した項目について説明します。

### トリガーの設定を変更する（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
    - レビューやコメントといった複雑なタスク

[参考](https://github.com/coderabbitai/ai-pr-reviewer?tab=readme-ov-file#models-gpt-4-and-gpt-35-turbo)

デフォルトでは`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`が入ってるので、削除しました。

![スクリーンショット 2024-05-27 15.58.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2688241/c61dd76d-e75d-b924-60b3-c02aa9cd6c5a.png)


出力形式をマークダウンフォーマットで指定し、各項目で何を出力するのかはコメント形式で指定しました。

#### その他の設定

その他にも設定可能な項目がいくつかありました。
自分は触っていないのですが、運用で参考になりそうな項目をいくつかピックアップします。

- path_filters
    - CodeRabbitによるレビューをスキップするファイル
- disable_review
    - デフォルト値: `false`
    - `true`にすることでレビューをスキップさせることが可能
- disable_release_notes
    - デフォルト値: `false`
    - `true`にすることでリリースノートの作成をスキップさせることが可能
- openai_model_temperature
    - デフォルト値: 0.05
    - 0-2の範囲で変更可能。大きくするとより不確実性が増す
    - tempratureって何？という方は[こちら](https://qiita.com/suzuki_sh/items/8e449d231bb2f09a510c)
- system_message
    - CodeRabbitのシステムプロンプト
    - どんな観点でレビューして欲しいのかを設定可能
- summarize_release_notes
    - リリースノート作成用のシステムプロンプト

## 実際どうなの？

実案件で作成されたPRをCodeRabbitにレビューさせた感想は以下です。

- nil対策をしてくれる
    - nilに対するエラーハンドリングをしていない箇所に対して指摘してくれました
- タイポを指摘してくれる
    - メソッド名のタイポを指摘してくれました

全体的にtoo muchなレビューではありますが、「指摘された箇所の修正が不要であること」をPR作成者がコメントした上でレビュワー（人間）に渡すことでコードの理解度は増すと思います。

また、CodoRabbitが作成した文章はすべてマークダウンで書かれているので、これを編集することで人間がゼロから書く作業コストを削減できます。
ただし、レビューコメントを修正するのはあまりよろしく無い気がします。

個人的な結論としては、CodeRabbitは現状でも十分に活用可能なレベルであり、導入することで得られるメリットの方が大きいと感じています。

## 参考

https://zenn.dev/minedia/articles/7928ef7545b393