👀

【PR-Agent】AIにコードレビューしてもらう(Bitbucket編)

2024/08/31に公開

はじめに

AIにコードレビューを手伝ってもらいたい!
ということで、Bitbucketで利用できるAIレビューツール「PR-Agent」を使ってみます。

PR-Agentについて

PR-Agentは、OpenAIでプルリクエスト(PR)の要約を作成したり、コードの改善提案をしてくれるツールです。

主な機能

https://pr-agent-docs.codium.ai/tools/

  • 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

  1. OpenAIで、APIキーを作成します。
  2. Bitbucketのリポジトリ設定で、アクセストークンを作成します。
  3. リポジトリ設定で、2つのリポジトリ変数を設定します。
    • OPENAI_API_KEY:OpenAIのAPIキー
    • BITBUCKET_BEARER_TOKEN:Bitbucketのアクセストークン
  4. リポジトリ設定で、パイプラインを有効にします。
  5. パイプライン設定ファイル「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
  1. 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をうまく活用していければと思います。

コラボスタイル Developers

Discussion