GitHubで兎を飼い始めた話

## CodeRabbitとは
CodeRabbitはGitHubのリポジトリを解析して、コードの品質を評価するツールです。
また、コードの品質を評価した結果をもとに、コードの改善案を提案してくれます。

https://www.coderabbit.ai/

## なぜCodeRabbitを使うのか
開発業務においてレビュー業務は非常に重要でありながら、業務コストの高さが課題となっています。
その中でも、コードの品質を評価する業務は特にコストが高く、細かいコードレビューを人力で行うのは非効率です。
そこで、CodeRabbitを使うことでコードの品質を自動で評価し、コードの改善案を提案してくれることで、レビュー業務のコストを削減することができます。

1次レビューをCodeRabbitで行い、2次レビューを人が行うというのが良いと思います。
2次レビューでは、ロジックが意図せぬ動きをしていないか、コードの可読性が高いか、コードの保守性が高いかなどを確認します。

## 導入環境

下記記事で使用した環境に導入していきます。

https://zenn.dev/shunsuke_stack/articles/277e75e9b3df27

https://github.com/nakajima-sh-cnctor/vue-fizz-buzz-cursor.git

## 導入方法

### OpenAI API KEYの設定
下記URLにてOpenAIのAPI Keyを取得します。
https://platform.openai.com/api-keys


https://github.com/username/repository-name/settings/secrets/actions

:::note info
下記リンクの"/username/repository-name/"部分は自分のリポジトリに変更してください。
:::

OPENAI_API_KEYを新規で作成し、OpenAI API Keyを設定します。

![aaef31597a9c05-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822984/b05c75e1-66de-a3ed-e38b-1a549488044a.png)

## GitHub Actionsの設定ファイルを作成

プロジェクト内に下記ファイルを作成します。
※ファイル名はなんでも大丈夫なので記事の題材の通り兎という名前にしています。
`.github/workflows/code-rabbit.yaml`

## ファイルの内容

```yaml
name: CodeRabbit

permissions:
  contents: read
  pull-requests: write

on:
  pull_request:
    types: [opened]
    branches-ignore:
      - master
      - main
  pull_request_review_comment:
    types: [created]
  issue_comment:
    types: [created]

concurrency:
  group: ${{ github.repository }}-${{ github.event.number || github.head_ref || github.sha }}-${{ github.workflow }}-${{ github.event_name == 'pull_request_review_comment' && 'pr_comment' || 'pr' }}
  cancel-in-progress: ${{ github.event_name != 'pull_request_review_comment' }}

jobs:
  review:
    runs-on: ubuntu-latest
    if: (github.event_name == 'issue_comment' && contains(github.event.comment.body, '[run review]') && github.event.issue.pull_request) || (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '[run review]')) || (github.event_name == 'pull_request' && !contains(github.event.pull_request.title, 'release') && !contains(github.event.pull_request.title, 'Release'))
    timeout-minutes: 15
    steps:
      - uses: coderabbitai/openai-pr-reviewer@latest
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
        with:
          debug: false
          review_simple_changes: false
          review_comment_lgtm: false
          openai_light_model: gpt-4 # 好みで変更
          openai_heavy_model: gpt-4 # 好みで変更
          openai_timeout_ms: 900000 # 15分.
          language: ja-JP
          path_filters: |
            !db/**
            !**/*.lock
          system_message: |
            あなたは @coderabbitai（別名 github-actions[bot]）で、OpenAIによって訓練された言語モデルです。
            あなたの目的は、非常に経験豊富なソフトウェアエンジニアとして機能し、特にVue、Nuxt、TypeScriptに精通しています。
            コードの一部を徹底的にレビューし、以下のようなキーエリアを改善するためのコードスニペットを提案することです：
              - ロジック
              - セキュリティ
              - パフォーマンス
              - データ競合
              - 一貫性
              - エラー処理
              - 保守性
              - モジュール性
              - 複雑性
              - 最適化
              - ベストプラクティス: DRY, SOLID, KISS
            些細なコードスタイルの問題や、コメント・ドキュメントの欠落についてはコメントしないでください。
            重要な問題を特定し、解決して全体的なコード品質を向上させることを目指してくださいが、細かい問題は意図的に無視してください。
          summarize: |
            次の内容でmarkdownフォーマットを使用して、最終的な回答を提供してください。

              - *ウォークスルー*: 特定のファイルではなく、全体の変更に関する高レベルの要約を80語以内で。
              - *変更点*: ファイルとその要約のテーブル。スペースを節約するために、同様の変更を持つファイルを1行にまとめることができます。

            GitHubのプルリクエストにコメントとして追加されるこの要約には、追加のコメントを避けてください。
          summarize_release_notes: |
            このプルリクエストのために、その目的とユーザーストーリーに焦点を当てて、markdownフォーマットで簡潔なリリースノートを作成してください。
            変更は次のように分類し箇条書きにすること:
              "New Feature", "Bug fix", "Documentation", "Refactor", "Style",
              "Test", "Chore", "Revert"
            例えば:
            ```
            - New Feature: UIに統合ページが追加されました
            ```
            回答は50-100語以内にしてください。この回答はそのままリリースノートに使用されるので、追加のコメントは避けてください。

```

### トリガーの設定（GitHub Actionsの設定）

```yaml
on:
  pull_request:
    types: [opened]
    branches-ignore:
      - master
      - main
  pull_request_review_comment:
    types: [created]
  issue_comment:
    types: [created]
```

GitHub Actionsのワークフローがどのイベントでトリガーされるかを定義しています。


1. **`pull_request` イベント**:
   - プルリクエストが「opened（開かれた）」ときにトリガーされます
   - `master` および `main` ブランチは無視されます（これらのブランチに対するプルリクエストではトリガーされません）
2. **`pull_request_review_comment` イベント**:
   - プルリクエストのレビューコメントが「created（作成された）」ときにトリガーされます
3. **`issue_comment` イベント**:
   - イシューのコメントが「created（作成された）」ときにトリガーされます

### GitHub Actionsのワークフローにおける条件式を定義

```yaml
if: (github.event_name == 'issue_comment' && contains(github.event.comment.body, '[run review]') && github.event.issue.pull_request) ||　(github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '[run review]')) || (github.event_name == 'pull_request' && !contains(github.event.pull_request.title, 'release') && !contains(github.event.pull_request.title, 'Release'))
```

特定のイベントが発生したときにジョブを実行するかどうかを決定します。
条件のいずれかが満たされると、ジョブが実行されます。

1. **`issue_comment` イベント**:
   - コメントの本文に `[run review]` が含まれている
2. **`pull_request_review_comment` イベント**:
   - コメントの本文に `[run review]` が含まれている
3. **`pull_request` イベント**:
   - プルリクエストのタイトルに `release` または `Release` が含まれていない

### ジョブの設定(AIの設定)

```yaml
openai_light_model: gpt-4 # 好みで変更
openai_heavy_model: gpt-4 # 好みで変更
```


1. **`openai_light_model`**:
   - 軽量なタスクに使用するOpenAIモデルを指定します
   - 現在は `gpt-4o` が設定されていますが、必要に応じて他のモデルに変更可能です
2. **`openai_heavy_model`**:
   - より重いタスクや複雑な処理に使用するOpenAIモデルを指定します
   - こちらも `gpt-4o` が設定されており、好みに応じて変更可能です

異なるタスクに対して適切なモデルを選択し、効率的に処理を行うことができます。

### ジョブの設定(言語)

```yaml
language: ja-JP
```

私は日本人なので日本語でレビューしてくれるようにしています。

### ジョブの設定(OpenAIのモデル設定)

モデルがどのように動作するべきかを指示するためのものです

```yaml
system_message: |
    あなたは @coderabbitai（別名 github-actions[bot]）で、OpenAIによって訓練された言語モデルです。
    あなたの目的は、非常に経験豊富なソフトウェアエンジニアとして機能し、特にVue、Nuxt、TypeScriptに精通しています。
    コードの一部を徹底的にレビューし、以下のようなキーエリアを改善するためのコードスニペットを提案することです：
        - ロジック
        - セキュリティ
        - パフォーマンス
        - データ競合
        - 一貫性
        - エラー処理
        - 保守性
        - モジュール性
        - 複雑性
        - 最適化
        - ベストプラクティス: DRY, SOLID, KISS

    些細なコードスタイルの問題や、コメント・ドキュメントの欠落についてはコメントしないでください。
    重要な問題を特定し、解決して全体的なコード品質を向上させることを目指してくださいが、細かい問題は意図的に無視してください。
```

### ジョブの設定(要約のフォーマットと内容)

プルリクエストのレビュー時に、変更内容を簡潔かつ明確に把握できるようにすることが目的

```yaml
summarize: |
    次の内容でmarkdownフォーマットを使用して、最終的な回答を提供してください。

    - *ウォークスルー*: 特定のファイルではなく、全体の変更に関する高レベルの要約を80語以内で。
    - *変更点*: ファイルとその要約のテーブル。スペースを節約するために、同様の変更を持つファイルを1行にまとめることができます。

    GitHubのプルリクエストにコメントとして追加されるこの要約には、追加のコメントを避けてください。
```

1. **ウォークスルー**:
   - 全体の変更に関する高レベルの要約を提供します
   - 特定のファイルに限定せず、全体的な変更を80語以内でまとめます
2. **変更点**:
   - 変更されたファイルとその要約をテーブル形式で提供します
   - 同様の変更を持つファイルは1行にまとめて、スペースを節約します

### ジョブの設定(リリースノートのフォーマットと内容)

プルリクエストのレビュー時に、リリースノートを作成することが目的

```yaml
summarize_release_notes: |
    このプルリクエストのために、その目的とユーザーストーリーに焦点を当てて、markdownフォーマットで簡潔なリリースノートを作成してください。
    変更は次のように分類し箇条書きにすること:
        "New Feature", "Bug fix", "Documentation", "Refactor", "Style",
        "Test", "Chore", "Revert"
    例えば:
    ```
    - New Feature: UIに統合ページが追加されました
    ```
    回答は50-100語以内にしてください。この回答はそのままリリースノートに使用されるので、追加のコメントは避けてください。
```

1. **リリースノートのフォーマット**:
   - プルリクエストの目的とユーザーストーリーに焦点を当てて、markdownフォーマットでリリースノートを作成します
   - 変更は箇条書きで分類し、例えば `- New Feature: UIに統合ページが追加されました` のように記述します
2. **回答の長さ**:
   - 回答は50-100語以内にしてください
   - この回答はそのままリリースノートに使用されるので、追加のコメントは避けてください


## ワークフローの実行結果
実際にGitHubでプルリクエストを作成し挙動を確認します

- GitHubで飼い始めたウサギはポエムを詠みます
- system_messageの内容の正確なのか的確なレビューや細かいレビュー指摘が入っているのが確認できます
- 改善案まで提示していただき、悩むだけの時間を削減できそうでした
- OpenAIモデル名の誤りに関してはこのコメントが正確かを確認する必要があると思います

概ね満足のいく結果でした。

![aaef31597a9c05-2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822984/7c93fa5d-a5a2-cd10-fd45-3697aeb9aaf4.jpeg)

## Dashboard機能

GitHubアカウントでログインする事で、リポジトリ内で起きたレビューのダッシュボードを確認することができます。

https://www.coderabbit.ai/

![aaef31597a9c05-3.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822984/c93403ae-2484-db93-fb21-15132f7b5c82.jpeg)


## 感想
すごく的確なレビューをしてくれるので、レビューのコストを削減できそうです。
`system_message`の内容次第で人よりも高いパフォーマンスを発揮するのではないかと思います。

## 一緒に働く仲間を募集しています！
株式会社コネクター・ジャパンでは一緒に働いてくれる仲間を募集しています！

事業拡大に伴い、エンジニアを大募集しています。
興味のある方は下記リンクから弊社のことをぜひ知っていただき応募してもらえると嬉しいです。

▼会社について
https://www.wantedly.com/companies/cnctor/about
▼代表メッセージ
https://cnctor.jp/10years-anniversary/
▼応募はこちら
https://www.wantedly.com/companies/cnctor/projects