GitHubで兎を飼い始めた話
CodeRabbitとは
CodeRabbitはGitHubのリポジトリを解析して、コードの品質を評価するツールです。
また、コードの品質を評価した結果をもとに、コードの改善案を提案してくれます。
なぜCodeRabbitを使うのか
開発業務においてレビュー業務は非常に重要でありながら、業務コストの高さが課題となっています。
その中でも、コードの品質を評価する業務は特にコストが高く、細かいコードレビューを人力で行うのは非効率です。
そこで、CodeRabbitを使うことでコードの品質を自動で評価し、コードの改善案を提案してくれることで、レビュー業務のコストを削減することができます。
1次レビューをCodeRabbitで行い、2次レビューを人が行うというのが良いと思います。
2次レビューでは、ロジックが意図せぬ動きをしていないか、コードの可読性が高いか、コードの保守性が高いかなどを確認します。
導入環境
下記記事で使用した環境に導入していきます。
導入方法
OpenAI API KEYの設定
下記URLにてOpenAIのAPI Keyを取得します。
OPENAI_API_KEYを新規で作成し、OpenAI API Keyを設定します。
GitHub Actionsの設定ファイルを作成
プロジェクト内に下記ファイルを作成します。
※ファイル名はなんでも大丈夫なので記事の題材の通り兎という名前にしています。
.github/workflows/code-rabbit.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の設定)
on:
pull_request:
types: [opened]
branches-ignore:
- master
- main
pull_request_review_comment:
types: [created]
issue_comment:
types: [created]
GitHub Actionsのワークフローがどのイベントでトリガーされるかを定義しています。
-
pull_request
イベント:- プルリクエストが「opened(開かれた)」ときにトリガーされます。
-
master
およびmain
ブランチは無視されます(これらのブランチに対するプルリクエストではトリガーされません)。
-
pull_request_review_comment
イベント:- プルリクエストのレビューコメントが「created(作成された)」ときにトリガーされます。
-
issue_comment
イベント:- イシューのコメントが「created(作成された)」ときにトリガーされます。
GitHub Actionsのワークフローにおける条件式を定義
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'))
特定のイベントが発生したときにジョブを実行するかどうかを決定します。
条件のいずれかが満たされると、ジョブが実行されます。
-
issue_comment
イベント:- コメントの本文に
[run review]
が含まれている。
- コメントの本文に
-
pull_request_review_comment
イベント:- コメントの本文に
[run review]
が含まれている。
- コメントの本文に
-
pull_request
イベント:- プルリクエストのタイトルに
release
またはRelease
が含まれていない。
- プルリクエストのタイトルに
ジョブの設定(AIの設定)
openai_light_model: gpt-4 # 好みで変更
openai_heavy_model: gpt-4 # 好みで変更
-
openai_light_model
:- 軽量なタスクに使用するOpenAIモデルを指定します。
- 現在は
gpt-4o
が設定されていますが、必要に応じて他のモデルに変更可能です。
-
openai_heavy_model
:- より重いタスクや複雑な処理に使用するOpenAIモデルを指定します。
- こちらも
gpt-4o
が設定されており、好みに応じて変更可能です。
異なるタスクに対して適切なモデルを選択し、効率的に処理を行うことができます。
ジョブの設定(言語)
language: ja-JP
私は日本人なので日本語でレビューしてくれるようにしています。
ジョブの設定(OpenAIのモデル設定)
モデルがどのように動作するべきかを指示するためのものです
system_message: |
あなたは @coderabbitai(別名 github-actions[bot])で、OpenAIによって訓練された言語モデルです。
あなたの目的は、非常に経験豊富なソフトウェアエンジニアとして機能し、特にVue、Nuxt、TypeScriptに精通しています。
コードの一部を徹底的にレビューし、以下のようなキーエリアを改善するためのコードスニペットを提案することです:
- ロジック
- セキュリティ
- パフォーマンス
- データ競合
- 一貫性
- エラー処理
- 保守性
- モジュール性
- 複雑性
- 最適化
- ベストプラクティス: DRY, SOLID, KISS
些細なコードスタイルの問題や、コメント・ドキュメントの欠落についてはコメントしないでください。
重要な問題を特定し、解決して全体的なコード品質を向上させることを目指してくださいが、細かい問題は意図的に無視してください。
ジョブの設定(要約のフォーマットと内容)
プルリクエストのレビュー時に、変更内容を簡潔かつ明確に把握できるようにすることが目的
summarize: |
次の内容でmarkdownフォーマットを使用して、最終的な回答を提供してください。
- *ウォークスルー*: 特定のファイルではなく、全体の変更に関する高レベルの要約を80語以内で。
- *変更点*: ファイルとその要約のテーブル。スペースを節約するために、同様の変更を持つファイルを1行にまとめることができます。
GitHubのプルリクエストにコメントとして追加されるこの要約には、追加のコメントを避けてください。
-
ウォークスルー:
- 全体の変更に関する高レベルの要約を提供します。
- 特定のファイルに限定せず、全体的な変更を80語以内でまとめます。
-
変更点:
- 変更されたファイルとその要約をテーブル形式で提供します。
- 同様の変更を持つファイルは1行にまとめて、スペースを節約します。
ジョブの設定(リリースノートのフォーマットと内容)
プルリクエストのレビュー時に、リリースノートを作成することが目的
summarize_release_notes: |
このプルリクエストのために、その目的とユーザーストーリーに焦点を当てて、markdownフォーマットで簡潔なリリースノートを作成してください。
変更は次のように分類し箇条書きにすること:
"New Feature", "Bug fix", "Documentation", "Refactor", "Style",
"Test", "Chore", "Revert"
例えば:
```
- New Feature: UIに統合ページが追加されました
```
回答は50-100語以内にしてください。この回答はそのままリリースノートに使用されるので、追加のコメントは避けてください。
-
リリースノートのフォーマット:
- プルリクエストの目的とユーザーストーリーに焦点を当てて、markdownフォーマットでリリースノートを作成します。
- 変更は箇条書きで分類し、例えば
- New Feature: UIに統合ページが追加されました
のように記述します。
-
回答の長さ:
- 回答は50-100語以内にしてください。
- この回答はそのままリリースノートに使用されるので、追加のコメントは避けてください。
ワークフローの実行結果
実際にGitHubでプルリクエストを作成し挙動を確認します
- GitHubで飼い始めたウサギはポエムを詠みます
- system_messageの内容の正確なのか的確なレビューや細かいレビュー指摘が入っているのが確認できます
- 改善案まで提示していただき、悩むだけの時間を削減できそうでした。
- OpenAIモデル名の誤りに関してはこのコメントが正確かを確認する必要があると思います。
概ね満足のいく結果でした。
Dashboard機能
GitHubアカウントでログインする事で、リポジトリ内で起きたレビューのダッシュボードを確認することができます。
感想
すごく的確なレビューをしてくれるので、レビューのコストを削減できそうです。
system_message
の内容次第で人よりも高いパフォーマンスを発揮するのではないかと思います
Discussion