【PR-Agent】AIにコードレビューしてもらう(Bitbucket編)
はじめに
AIにコードレビューを手伝ってもらいたい!
ということで、Bitbucketで利用できるAIレビューツール「PR-Agent」を使ってみます。
PR-Agentについて
PR-Agentは、OpenAIでプルリクエスト(PR)の要約を作成したり、コードの改善提案をしてくれるツールです。
主な機能
- describe:要約を作成し、プルリクエストの説明に追記します。
- review:コードの改善点やセキュリティの懸念を、プルリクエストに対してコメントします。
- improve: コードの改善提案を、コードに対してコメントします。
GitHub - Codium-ai/pr-agent: Overview
Bitbucketでは、GitHubやGitLabに比べて使える機能が少ないです😭
プランと料金
Plans & Pricing | CodiumAI
多くの機能が使えてAIのトレーニングに使用されないProプランや、無料プランがあります。
無料プランの場合も、OpenAIの料金は別途かかります。
実行方法(Bitbucketでの注意点)
パイプラインからプルリクエスト作成/更新時に自動実行、または手動実行します。
GitHubやGitLabではプルリクエストのコメントに「/review
」とコマンド入力し、任意のタイミングで実行できますが、Bitbucketではコメントからの実行に未対応です😭
導入手順
公式ドキュメント:BitBucket - PR-Agent Documentation
- OpenAIで、APIキーを作成します。
- Bitbucketのリポジトリ設定で、アクセストークンを作成します。
- リポジトリ設定で、2つのリポジトリ変数を設定します。
- OPENAI_API_KEY:OpenAIのAPIキー
- BITBUCKET_BEARER_TOKEN:Bitbucketのアクセストークン
- リポジトリ設定で、パイプラインを有効にします。
- パイプライン設定ファイル「
bitbucket_pipelines.yml
」を作成し、リポジトリに追加します。
describe、review、improveの3つを自動実行する例
pipelines:
pull-requests:
'**':
- step:
name: PR Agent Review
image: python:3.10
services:
- docker
script:
- >
docker run
-e CONFIG.GIT_PROVIDER=bitbucket
-e OPENAI.KEY=$OPENAI_API_KEY
-e BITBUCKET.BEARER_TOKEN=$BITBUCKET_BEARER_TOKEN
codiumai/pr-agent:latest
--pr_url=https://bitbucket.org/$BITBUCKET_WORKSPACE/$BITBUCKET_REPO_SLUG/pull-requests/$BITBUCKET_PR_ID
describe
- >
docker run
-e CONFIG.GIT_PROVIDER=bitbucket
-e OPENAI.KEY=$OPENAI_API_KEY
-e BITBUCKET.BEARER_TOKEN=$BITBUCKET_BEARER_TOKEN
codiumai/pr-agent:latest
--pr_url=https://bitbucket.org/$BITBUCKET_WORKSPACE/$BITBUCKET_REPO_SLUG/pull-requests/$BITBUCKET_PR_ID
review
- >
docker run
-e CONFIG.GIT_PROVIDER=bitbucket
-e OPENAI.KEY=$OPENAI_API_KEY
-e BITBUCKET.BEARER_TOKEN=$BITBUCKET_BEARER_TOKEN
codiumai/pr-agent:latest
--pr_url=https://bitbucket.org/$BITBUCKET_WORKSPACE/$BITBUCKET_REPO_SLUG/pull-requests/$BITBUCKET_PR_ID
improve
- PR-Agent設定ファイル「
.pr_agent.toml
」を作成し、リポジトリに追加します。
configuration.tomlを参照し、実行条件を調整します。
extra_instructions
で日本語化や、プロンプトの調整がおこなえます。
日本語化し、改善提案やプロンプト指定を増やす例
[pr_description]
extra_instructions="""\
- 日本語で書いてください。
"""
[pr_reviewer]
extra_instructions="""\
- 日本語で書いてください。
- 可読性の改善点も教えてください。
"""
num_code_suggestions=10
[pr_code_suggestions]
extra_instructions="""\
- 日本語で書いてください。
- 可読性の改善点も教えてください。
"""
commitable_code_suggestions=true
num_code_suggestions=10
num_code_suggestions_per_chunk=10
設定やプロンプトの調整
.pr_agent.toml
は、プルリクエスト作成前に用意しておく必要があります。
PR-Agent設定をbitbucket_pipelines.yml
で実行パラメータとして指定した場合は、プルリクエスト作成後の変更も反映されます。
bitbucket_pipelines.ymlでPR-Agent設定を指定する例
pipelines:
pull-requests:
'**':
- step:
name: PR Agent Review
image: python:3.10
services:
- docker
script:
- >
docker run
-e CONFIG.GIT_PROVIDER=bitbucket
-e OPENAI.KEY=$OPENAI_API_KEY
-e BITBUCKET.BEARER_TOKEN=$BITBUCKET_BEARER_TOKEN
codiumai/pr-agent:latest
--pr_url=https://bitbucket.org/$BITBUCKET_WORKSPACE/$BITBUCKET_REPO_SLUG/pull-requests/$BITBUCKET_PR_ID
describe
--pr_description.extra_instructions='
* 日本語で書いてください。
'
- >
docker run
-e CONFIG.GIT_PROVIDER=bitbucket
-e OPENAI.KEY=$OPENAI_API_KEY
-e BITBUCKET.BEARER_TOKEN=$BITBUCKET_BEARER_TOKEN
codiumai/pr-agent:latest
--pr_url=https://bitbucket.org/$BITBUCKET_WORKSPACE/$BITBUCKET_REPO_SLUG/pull-requests/$BITBUCKET_PR_ID
review
--pr_reviewer.extra_instructions='
* 日本語で書いてください。
* 可読性の改善点も教えてください。
'
--pr_reviewer.num_code_suggestions=10
- >
docker run
-e CONFIG.GIT_PROVIDER=bitbucket
-e OPENAI.KEY=$OPENAI_API_KEY
-e BITBUCKET.BEARER_TOKEN=$BITBUCKET_BEARER_TOKEN
codiumai/pr-agent:latest
--pr_url=https://bitbucket.org/$BITBUCKET_WORKSPACE/$BITBUCKET_REPO_SLUG/pull-requests/$BITBUCKET_PR_ID
improve
--pr_code_suggestions.extra_instructions='
* 日本語で書いてください。
* 可読性の改善点も教えてください。
'
--pr_code_suggestions.commitable_code_suggestions=true
--pr_code_suggestions.num_code_suggestions=10
--pr_code_suggestions.num_code_suggestions_per_chunk=10
検証用コード
レビュー検証用に「FizzBuzz」のTypeScriptコードを作成しました。
1からカウントアップして3の倍数で「Fizz」、5の倍数で「Buzz」、両方の倍数で「FizzBuzz」を返すルールですが、レビューで指摘をもらうため改善点のある以下コードにしてみました。
function fizzBuzz(n: number): void {
for (let i = 1; i < n; i++) {
if (i % 3 === 0 && i % 5 === 0) {
console.log("FizzBuzz");
} else if (i % 3 === 0) {
console.log("Fizz");
} else if (i % 5 === 0) {
console.log("Buzz");
} else {
console.log(i);
}
}
}
fizzBuzz(100);
実行結果
describe(説明、要約)
「PR Type」や「Description」の見出しは、日本語で書いてくれませんでした😵
「PR Type」は、デフォルトで「Bug fix, Tests, Enhancement, Documentation, Other」の何れかになるので、enhancement(機能強化)で妥当だと思います。
「Description」も、コードの内容通り書かれています。
review(レビューコメント)
レビュー内容はPR-Agentの設定で変えられますが、
デフォルトでは以下記載されたコメントが登録されます。
- レビューに要する推定労力
- テストコードが含まれているか
- セキュリティ上の懸念があるか
今回はnum_code_suggestions
を設定したので、
コードのフィードバックも記載されています。
「関数の中でconsole.log出力せず、配列で返してください」
「i < n
だと引数の値までループされないからi <= n
にしてください」
「マジックナンバー(3, 5)は定数として定義してください」
おっしゃる通りです🎊
レビューが複数回実行されると、コメントが上書き更新されます。
improve(コードの改善提案)
reviewはプルリクエストのコメントとして登録されますが、
improveではコード差分の各行に対してコメントが書かれます。
指摘される内容は同じ場合もありますし、異なる点で指摘されることもあります。
なるほど、「0」からスタートしましょう、とのこと。
でもn-1
まででOK?
console.log
の実行回数を減らしてパフォーマンス改善しましょう、と。
ここはreviewコメントの通り、出力せず値を返した方が良いと思います。。
提案は上記2点で、マジックナンバー(3, 5)の指定はありませんでした。
おわりに
実行する度に指摘内容が変わったり、プロンプトによってもレビュー内容が変わりそうですが、AIにより新たな改善点の発見があったり、人による見落としを減らせるのではと思いました。
今回はPR-Agentを試しましたが、AIコードレビューツールによる違いも気になります。
効率化や精度向上のため、AIをうまく活用していければと思います。
Discussion