🤖

PR-AgentをAzure DevOpsに導入してPull Requestを自動レビューする

2024/11/13に公開

はじめに

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の概要を自動生成
  • 変更内容の解説
  • コードの改善提案

自動レビューの例1
自動レビューの例2

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→から支払方法を登録します。

OpeAI Platform

Dashboard→API keys→Create new secret keyでAPIキーを発行します。

発行されたAPIキーはこの時点でしか参照できないのでメモしておきます。

(忘れてしまった場合は再度作り直せば大丈夫です)

APIキーの作成

APIキーの設定

AzureDevOpsに取得したAPIキーを設定します。

LibraryからVariable groupの作成を選択します。

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に設定します。

Build Serviceユーザーの権限設定

設定ファイルの作成

リポジトリのルートに下記ファイルを追加しマージします。(この段階では自動レビューを実行できません)

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を選択します。

pipelineの新規作成

Use the classic editorを選択します。

登録ウィザード1

適用したいリポジトリに関する情報を選択し、Continueで先に進みます。

登録ウィザード2

YAMLを選択します。

登録ウィザード3

Nameにpipeline名を指定します。

YAML file pathで作成したymlファイルを選択し、Saveします。

登録ウィザード4

PipelinesのAllタブから作成したpipelineが確認できます。

PR作成時に実行されるように設定する

Project settings→Repositories→対象のリポジトリ→Policiesを選択し、対象のブランチを選択します。

ブランチ選択

Build Validationの項目に新規追加します。

Build Validationへの追加

作成したpipelineを選択します。

PR作成時に自動でレビューさせたい場合は、TriggerをAutomaticにしてください。(ただし、PR作成後にpushした場合でも動いてしまいます。)

ビルドポリシーの設定

PRレビューを実行する

ビルドポリシーのTriggerでAutomaticを選択した場合は、以降のPR作成時に自動で実行されます。

Manualを選択した場合は、PR画面上から手動で実行することになります。

人間によるレビューは結局必要

元々PR-Agentを導入した背景としては、レビューワーの稼働コストを下げる目的がありましたが、完全な代替は不可能というのが所感です。

命名規則やコメントの書き方といった、プロジェクト固有のコンテキストに則ったレビューを期待してプロンプトを設定してみたのですが、的外れな指摘が増えてしまいました。

これには、PR-Agent内での設定やコンテキストの与え方といった課題があり、より精度を求めるのであればそもそもOSSに頼るべきではないでしょう。

また、レビューイーからすれば、適当な指摘が続くと自動レビューに対する信頼を一度失ってしまい、その結果有益な指摘が含まれていたとしても見逃されることにつながりかねません。

そのため、PR-Agentにはすべてを正確に評価することを期待するのではなく、タイポや明らかなミスといった機械的に判断しやすい点を一次レビューとして任せ、本質的なレビューの部分を人間に繋ぐ役割として捉えた方が良さそうです。

GitHubで編集を提案

Discussion