マージリクエストのレビュー自動化を体験する

Posted on 2025/07/22

ToC

PR-Agentとは

マージリクエストの作成やレビューは開発フローの重要な部分ですが、しばしば時間のかかる作業でもあります。 PR-Agent(現在は、Qodo Mergeが正式名称となっているようです)は、AIを活用してマージリクエストの作成から、レビュー、改善提案まで自動化するツールです。 GitHubやGitLabと連携し、開発チームの生産性を大幅に向上させることができます。

主な機能と対応プラットフォーム

PR-Agentは、以下のような機能を提供しています。 プラットフォームもGitLabをはじめ、GitHubAzure DevOpsなどにも対応しているようです。

  • 自動PR説明生成: マージリクエストの変更内容を解析し、詳細で読みやすい説明を自動生成
  • コードレビュー: AIによる自動コードレビューと改善提案
  • 問題点の検出: セキュリティやパフォーマンスの問題を早期発見
  • 質問応答: PRに関する質問に対する自動回答
  • 改善提案: コード品質向上のための具体的な提案

導入手順

GitLabを使った導入

GitHubを使った開発のパターンも多くあるかと思いますが、今回はローカルの閉じた環境で機能を確認してみました。
Dockerにて、GitLabを構築してさらにpr-agentを連携して動作させる環境にて試してみます。

/posts/2025/07/img/pr-image_hu_abb21247a43c8f.png

以下のdocker-compose.yamlを使用してGitLabとPR-Agentを同時に起動します。 PR-Agentは /webhook エンドポイントでGitLabからのWebhookを受信します。
なお、各設定のプロセスで取得した値をとdocker-compose.yamlファイルに反映する必要がある箇所では、都度、コンテナの再起動が必要です。

docker-compose.yamlのファイル

services:
  gitlab:
    image: gitlab/gitlab-ce:18.1.0-ce.0
    container_name: gitlab-18-1
    restart: always
    hostname: 'gitlab'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://localhost:8929'
        gitlab_rails['gitlab_shell_ssh_port'] = 2424
        gitlab_rails['registry_enabled'] = true
        registry_external_url 'http://localhost:5005'
        registry['enable'] = true
        registry['registry_http_addr'] = "0.0.0.0:5000"
        registry['storage_delete_enabled'] = true
        registry['log_level'] = 'debug'

        gitlab_rails['allowed_hosts'] = ['localhost', 'gitlab', '127.0.0.1']
        nginx['listen_port'] = 8929
        nginx['listen_addresses'] = ['*']
      GITLAB__KEEP_BASE_URL: 'true'

    ports:
      - '8929:8929'
      - '5005:5000'
      - '443:443'
      - '2424:22'
    volumes:
      - '../data/config:/etc/gitlab'
      - '../data/logs:/var/log/gitlab'
      - '../data/data:/var/opt/gitlab'
    networks:
      - mynet
    shm_size: '256m'

  pr-agent:
    build:
      context: ./pr-agent
      dockerfile: ./docker/Dockerfile
      target: gitlab_webhook
    env_file:
      - .secrets.env  #AWSのBedrockのシークレットは別ファイルにしています
    environment:
      # GitLab configuration
      CONFIG__GIT_PROVIDER: gitlab
      GITLAB__URL: 'http://gitlab:8929'
      GITLAB__PERSONAL_ACCESS_TOKEN: 'gitlab-access-token-is-here'
      GITLAB__KEEP_BASE_URL: 'true'
      
      # PR Agent behavior settings
      CONFIG__PUBLISH_OUTPUT_TO_COMMENTS: 'true'
      CONFIG__PUBLISH_OUTPUT: 'true'
      PR_DESCRIPTION__PUBLISH_DESCRIPTION: 'false'
      PR_DESCRIPTION__ENABLE_AUTO_DESCRIPTION: 'false'
      PR_DESCRIPTION__PUBLISH_DESCRIPTION_AS_COMMENT: 'true'
      PR_DESCRIPTION__PUBLISH_DESCRIPTION_AS_COMMENT_PERSISTENT: 'true'
      
      # Webhook configuration
      GITLAB__SHARED_SECRET: 'shared-secret-is-here'
      
      # Server configuration
      PORT: '3000'
      HOST: '0.0.0.0'
      
      # Logging
      LOG_LEVEL: 'DEBUG'
      
      # Locale setting for English
      LANG: 'en_US.UTF-8'
      LC_ALL: 'en_US.UTF-8'

      # AI Model
      CONFIG__MODEL: 'bedrock/amazon.nova-pro-v1:0'
      CONFIG__MODEL_TURBO: 'bedrock/amazon.nova-pro-v1:0'
      CONFIG__FALLBACK_MODELS: '["bedrock/anthropic.claude-3-haiku-20240307-v1:0"]'
      
      # English output configuration
      CONFIG__LANGUAGE: 'english'
      
      # Enable essential PR commands
      CONFIG__ENABLE_PR_REVIEWER: 'true'
      CONFIG__ENABLE_PR_DESCRIPTION: 'true'
      CONFIG__ENABLE_PR_IMPROVE: 'true'
      CONFIG__ENABLE_PR_ASK: 'true'
      CONFIG__ENABLE_PR_CODE_SUGGESTIONS: 'true'
      CONFIG__ENABLE_PR_UPDATE_CHANGELOG: 'true'
      
      # Optional: Configuration file path
      CONFIG_FILE: '/app/config/.pr_agent.toml'
    restart: always
    ports:
      - '3002:3000'
    volumes:
      - '../data/pr-agent:/app/data'
      - './.pr_agent_en.toml:/app/.pr_agent.toml'
      - './.pr_agent_en.toml:/app/config/.pr_agent.toml'
    networks:
      - mynet
    depends_on:
      - gitlab

networks:
  mynet:
    driver: bridge

.pr_agent_en.tomlのファイル

[config]
model = "anthropic.claude-3-haiku-20240307-v1:0"
language = "english"

# Essential commands only
enable_pr_reviewer = true
enable_pr_description = true
enable_pr_improve = true
enable_pr_ask = true
enable_pr_code_suggestions = true
enable_pr_update_changelog = true

[pr_reviewer]
num_code_suggestions = 6

[pr_description]
publish_description_as_comment = true

環境変数の設定

PR-Agentを動作させるために、今回はAWSのBedrockにてAmazon Nova Proを利用しました。
検証用のためBedrockの実行権限があるIAMユーザーを作成し、そのユーザーのシークレット情報を別ファイル .secrets.envとして保存しています。

  • AWS_ACCESS_KEY_ID: AWSのアクセスキーID
  • AWS_SECRET_ACCESS_KEY: AWSのアクセスキー
  • AWS_DEFAULT_REGION: モデルの利用リージョン

GitLabでWebhookの許可設定

GitLabは、初期状態ではWebhookが有効になっていません。そのため管理者ユーザーでログイン後に許可設定が必要です。

  1. Settings > Network > Outbound requests を展開
  2. 以下の項目を有効化
    • ☑ Allow requests to the local network from web hooks and services
    • ☑ Allow requests to the local network from system hooks
  3. 許可するIPアドレス範囲を追加 Local IP addresses and domain names that hooks and services may access に以下を追加する
172.0.0.0/8
10.0.0.0/8
192.168.0.0/16
pr-agent
localhost
127.0.0.1

GitLabからPR AgentへのWebhookの設定

GitLabプロジェクトにWebhookを設定して、PR-Agentサーバーに自動的にイベントを送信します。

  1. 対象プロジェクトの設定画面へ移動

    • GitLabプロジェクトページで Settings > Webhooks を選択
  2. Webhookの基本設定

    • URL: http://pr-agent:3000/webhook(Docker環境の場合)
    • Secret token: 前述のdocker-compose.yamlで設定した GITLAB__SHARED_SECRET の値を入力
  3. トリガーの設定 以下のイベントを有効化します:

    • ☑ Push events
    • ☑ Tag push events
    • ☑ Comments
    • ☑ Merge request events
  4. SSL verification

    • ローカル環境では Enable SSL verification のチェックを外します
  5. Webhookのテスト

    • Add webhook をクリックして保存
    • Test ボタンでWebhookが正常に動作することを確認
    • PR-Agentのログに接続確認のメッセージが表示されれば成功

PR AgentからGitLabへのコメント作成設定

起動したGitLab上にPR-Agentのユーザー(pr-agent)を作成します。 ユーザーを作成後にGitLabのコメントへの書き込みができるように対象プロジェクトにReporter権限で参加します。
また、API経由のコメントができるように下記の設定を行います。

  1. PR-Agent用ユーザーの作成

    • GitLab管理者で Admin Area > Users > New user を選択
    • ユーザー名: pr-agent
    • Email: pr-agent@example.net(実在するメールアドレスでなくても可)
    • ユーザーを作成後、パスワードを設定
  2. Personal Access Tokenの作成

    • PR-Agentユーザーでログイン
    • Preferences > Access Tokens を選択
    • Token名: pr-agent-token
    • Expiration date: 適切な期限を設定
    • 以下のスコープを選択:
      • ☑ api
      • ☑ read_user
      • ☑ read_repository
      • ☑ write_repository
    • Create personal access token をクリック
    • 生成されたトークンをコピーし、docker-compose.yamlの GITLAB__PERSONAL_ACCESS_TOKEN に設定
  3. プロジェクトメンバーへの追加

    • 対象プロジェクトページで Project information > Members を選択
    • Invite members から pr-agent ユーザーを検索
    • Role: Reporter 以上を選択(コメント権限が必要)
    • Invite をクリックして追加
  4. API アクセスの有効化

    • GitLab管理者で Admin Area > Settings > Network を選択
    • Outbound requests セクションで以下を有効化:
      • ☑ Allow requests to the local network from web hooks and services
      • ☑ Allow requests to the local network from system hooks

実際に使ってみた

設定が正しく行われるとGitLabとPR Agentが連携した状態になります。
マージリクエストのコメントとして、下記のコマンドを実行するとPR Agentが各種の対応を実施してくれます。 利用可能なコマンドとしては、下記を利用して動作の確認ができました。(2025/7現在)

コマンド説明
/describeマージリクエストの説明を生成 - タイトル、種類、要約、コードウォークスルー、ラベル
/reviewマージリクエストに関する調整可能なフィードバック、潜在的な問題、セキュリティ上の懸念、レビュー工数など
/improveマージリクエストを改善するためのコード提案
/update_changelog変更履歴を自動更新
/askPRに関する自由形式の質問への回答

今回はサンプルとして、pr-agentのv0.29からv0.30にバージョンアップした差分をマージリクエストした際にどのように振る舞うかを確認してみました。

describeコマンド

マージリクエストの内容を説明してくれます。

/posts/2025/07/img/pr-describe_hu_b03bedd2dc1835af.png

reviewコマンド

マージリクエストの内容をレビューしてくれます。

/posts/2025/07/img/pr-review_hu_a16336c030ad2329.png

improveコマンド

マージリクエストの内容に対して改善の提案をしてくれます。

/posts/2025/07/img/pr-improve_hu_ba2ebac1d4d18f7e.png

update_changelogコマンド

マージリクエストの内容のChange Logを作成してくれます。

/posts/2025/07/img/pr-changelog_hu_174a94f4216ca02b.png

askコマンド

純粋に/askのあとに質問を記載すると回答してくれます。

/posts/2025/07/img/pr-ask_hu_a296ea5c8ef8457c.png

コスト管理の注意点

PR-Agentは、LLMのAPIを使用するため、使用量に応じてコストが発生します。 特に大きなマージリクエストや頻繁な実行は、予想以上のコストになる可能性があります。

まとめ

PR Agentは、マージリクエストワークフローの自動化において強力なツールです。 適切に設定すれば、開発チームの生産性を大幅に向上させることができる可能性があります。類似のツールも多く出てきている中でオープンソースで対応できるPR-Agent(Qodo Merge)はここまで対応できるんですね。
今回試した中では、日本語化はうまくいかなかった部分もありましたが、モデルを変更したりプロンプトを改良することで実現可能だと思います。さらにAIの進化でますます精度も向上してゆくと考えられますので、精度の高いコードが作成できる良い時代になってきましたね。


参照