PR-AgentをAzure DevOpsに導入してPull Requestを自動レビューする
はじめに
PRのレビューを効率化するために、PR-AgentというOSSを導入してみました。
PR-AgentはOpenAIのAPIキーを使用してPRを自動でレビューする機能を提供しており、サポートされているプラットフォームとしては下記が挙げられています。
- GitHub
- GitLab
- Bitbucket
- Azure DevOps
ネット上で検索すると、GitHubやGitLabへの導入記事は見つかったのですが、Azure DevOps環境への導入記事がなかったので、今回実際に導入した流れをまとめておきます。
できるようになること
Azure DevOps上でCI/CDの機能を提供しているpipelinesを使用して、PR作成時に自動でレビューや解説のコメントなどを入れてくれます。
- PRの概要を自動生成
- 変更内容の解説
- コードの改善提案
GitHubに導入する場合は、PRのコメントで/describe
といった内容を投稿することでPR-Agentの起動をトリーがすることができますが、残念ながらAzure DevOpsでは対応していません。
というか2024/11時点で、PR-Agentが提供している機能に対して、Azure DevOpsが一番サポートされていないです。
必要なもの
- OpenAI APIキー(課金が必要です)
- Azure DevOpsの設定を弄れる権限
設定手順
OpenAI APIキーの準備
PR AgentではOpenAIのAPIキーが必要なのでPlatformのページからアカウントを作成します。
アカウント作成後、Settings→Billing→から支払方法を登録します。
Dashboard→API keys→Create new secret keyでAPIキーを発行します。
発行されたAPIキーはこの時点でしか参照できないのでメモしておきます。
(忘れてしまった場合は再度作り直せば大丈夫です)
APIキーの設定
AzureDevOpsに取得したAPIキーを設定します。
LibraryからVariable groupの作成を選択します。
下記の情報で登録します。
- Variable group name:pr_agent
- Variables
- Name: OPENAI_KEY
- Value: {取得したAPIキー}
アクセストークンの準備
PR AgentのドキュメントではAPIキーと同様に、PAT(Personal Access Token)をVariableに定義するように記載されているため、その通りに設定すると、自分のアカウントでレビュー結果を投稿する形になってしまいます。
また、PATは有効期限(最長で1年)があるため更新が必要であったり、プロジェクトを離れた場合にも亡霊のごとく自分のアカウントで常にコメントが投稿される状況を避けたかったので、別のアカウントを使用するようにします。
Azure DevOpsではプロジェクトごとにBuild Serviceユーザーが存在するため、彼にコメントしてもらうようにします。
Project settings→Repositories→対象のリポジトリ→Security→Build Serviceを選択し、Contribute to pull requestsをAllowに設定します。
設定ファイルの作成
リポジトリのルートに下記ファイルを追加しマージします。(この段階では自動レビューを実行できません)
azure-pipelines.yml
pipelineの設定ファイルです。
この設定ファイルをAzure DevOps側で読み込むことでpipelineを構築することができます。
公式ドキュメントで用意されている内容とほとんど同じですが、上述の通りアクセストークンの設定を変えているので、対応する部分を修正しています。
env:
azure_devops__pat: $(System.AccessToken)
openai__key: $(OPENAI_KEY)
-
$(System.AccessToken)
でBuild Serviceユーザーのアクセストークンを取得し設定しています。 -
$(OPENAI_KEY)
でVariableとして設定したOpenAIのAPIキーを取得し設定しています。
長いので折り畳み
# Opt out of CI triggers
trigger: none
# Configure PR trigger
pr:
branches:
include:
- "*"
autoCancel: true
drafts: false
stages:
- stage: pr_agent
displayName: "PR Agent Stage"
jobs:
- job: pr_agent_job
condition: and(succeeded(), eq(variables['Build.Reason'], 'PullRequest'), eq(variables['System.PullRequest.targetBranchName'], 'main'))
displayName: "PR Agent Job"
pool:
vmImage: "ubuntu-latest"
container:
image: codiumai/pr-agent:latest
options: --entrypoint ""
variables:
- group: pr_agent
steps:
- script: |
echo "Running PR Agent action step"
# Construct PR_URL
PR_URL="${SYSTEM_COLLECTIONURI}${SYSTEM_TEAMPROJECT}/_git/${BUILD_REPOSITORY_NAME}/pullrequest/${SYSTEM_PULLREQUEST_PULLREQUESTID}"
echo "PR_URL=$PR_URL"
# Extract organization URL from System.CollectionUri
ORG_URL=$(echo "$(System.CollectionUri)" | sed 's/\/$//') # Remove trailing slash if present
echo "Organization URL: $ORG_URL"
export azure_devops__org="$ORG_URL"
export config__git_provider="azure"
pr-agent --pr_url="$PR_URL" describe
pr-agent --pr_url="$PR_URL" review
pr-agent --pr_url="$PR_URL" improve
env:
azure_devops__pat: $(System.AccessToken)
openai__key: $(OPENAI_KEY)
displayName: "Run Qodo Merge"
.pr_agent.toml
PR-Agentの設定ファイルです。
このファイルで、設定可能な項目に対する指定や独自のプロンプトを設定することができます。
下記では3つの機能の呼び出しと、それぞれの実行結果を日本語で出力する指示を与えています。
[azure_devops_server]
pr_commands = [
"/describe",
"/review",
"/improve"
]
[pr_description]
extra_instructions="Please use Japanese in descriptions"
[pr_reviewer]
extra_instructions="Please use Japanese in descriptions"
[pr_code_suggestions]
extra_instructions="Please use Japanese in descriptions"
構成としては、 pr_commands
でPR作成時に実行するPR-Agentの機能を列挙しています。
実行可能な機能はドキュメントに記載されています。
続けて、下記の様に、実行するそれぞの機能に対応するセクションにて、設定値を記載しています。
実行する機能 | 概要 | toml上で対応するセクション |
---|---|---|
/describe |
PRの説明を自動で記載してくれます。 | [pr_description] |
/review |
レビュワーに向けたPRのサマリーをコメントしてくれます | [pr_reviewer] |
/improve |
レビュイーに向けたコードの改善提案をコメントしてくれます | [pr_code_suggestions] |
各機能ごとに設定可能な項目が異なるので、詳しくはデフォルトの設定ファイルを参照することをお勧めします。
デフォルトから変更したい項目を.pr_agent.tomlファイルにてオーバーライドすることで適用できます。
Pipelineの作成
用意したファイルを基に、CIとして実行するためのpipelineを構築します。
Pipelines→New pipelineを選択します。
Use the classic editorを選択します。
適用したいリポジトリに関する情報を選択し、Continueで先に進みます。
YAMLを選択します。
Nameにpipeline名を指定します。
YAML file pathで作成したymlファイルを選択し、Saveします。
PipelinesのAllタブから作成したpipelineが確認できます。
PR作成時に実行されるように設定する
Project settings→Repositories→対象のリポジトリ→Policiesを選択し、対象のブランチを選択します。
Build Validationの項目に新規追加します。
作成したpipelineを選択します。
PR作成時に自動でレビューさせたい場合は、TriggerをAutomaticにしてください。(ただし、PR作成後にpushした場合でも動いてしまいます。)
PRレビューを実行する
ビルドポリシーのTriggerでAutomaticを選択した場合は、以降のPR作成時に自動で実行されます。
Manualを選択した場合は、PR画面上から手動で実行することになります。
人間によるレビューは結局必要
元々PR-Agentを導入した背景としては、レビューワーの稼働コストを下げる目的がありましたが、完全な代替は不可能というのが所感です。
命名規則やコメントの書き方といった、プロジェクト固有のコンテキストに則ったレビューを期待してプロンプトを設定してみたのですが、的外れな指摘が増えてしまいました。
これには、PR-Agent内での設定やコンテキストの与え方といった課題があり、より精度を求めるのであればそもそもOSSに頼るべきではないでしょう。
また、レビューイーからすれば、適当な指摘が続くと自動レビューに対する信頼を一度失ってしまい、その結果有益な指摘が含まれていたとしても見逃されることにつながりかねません。
そのため、PR-Agentにはすべてを正確に評価することを期待するのではなく、タイポや明らかなミスといった機械的に判断しやすい点を一次レビューとして任せ、本質的なレビューの部分を人間に繋ぐ役割として捉えた方が良さそうです。
Discussion