Claude APIでPull Requestを自動レビューする

コードレビューは品質を保つうえで欠かせない工程ですが、レビュアーの負荷は高くなりがちです。 この記事では Claude API を使ってPull Requestのレビューを自動化し、人間のレビュアーが本質的な議論に集中できる環境を作る方法を紹介します。

全体構成

開発者が MR を作成
  → GitLab CI が起動
  → 差分を取得して Claude API に投げる
  → レビューコメントを MR に投稿
  → 人間がコメントを確認して最終判断

CI はあくまで「一次フィルター」として機能させます。最終的なマージ判断は人間が行います。

実装

必要なもの

  • Python 3.12+
  • anthropic パッケージ
  • GitLab CI の CI_JOB_TOKEN または Personal Access Token

差分の取得

import subprocess

def get_diff(base_branch: str = "main") -> str:
    result = subprocess.run(
        ["git", "diff", f"origin/{base_branch}...HEAD"],
        capture_output=True,
        text=True,
        check=True,
    )
    return result.stdout

差分が大きすぎる場合はファイル単位に分割し、複数回に分けてAPIを呼び出します。 一度に渡せるトークン数には上限があるため、目安として 1リクエストあたり 200 行程度 に抑えると安定します。

Claude API を呼び出す

import anthropic

client = anthropic.Anthropic()

SYSTEM_PROMPT = """
あなたはシニアエンジニアとしてコードレビューを行います。
以下の観点でレビューし、日本語で指摘してください。

- バグや論理的な誤りがないか
- セキュリティ上の問題がないか(SQLインジェクション、XSS など)
- 可読性・命名規則が適切か
- テストの網羅性に問題がないか

問題がなければ「問題なし」と一言返してください。
指摘は箇条書きにし、深刻度(高/中/低)を添えてください。
"""

def review_diff(diff: str) -> str:
    message = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=1024,
        system=SYSTEM_PROMPT,
        messages=[
            {
                "role": "user",
                "content": f"以下の差分をレビューしてください:\n\n```diff\n{diff}\n```",
            }
        ],
    )
    return message.content[0].text

モデルには claude-sonnet-4-6 を使います。速度とコスト、精度のバランスが良く、CIでの利用に向いています。

MR にコメントを投稿する

import os
import httpx

def post_comment(comment: str) -> None:
    gitlab_url = os.environ["CI_API_V4_URL"]
    project_id = os.environ["CI_PROJECT_ID"]
    mr_iid = os.environ["CI_MERGE_REQUEST_IID"]
    token = os.environ["CI_JOB_TOKEN"]

    url = f"{gitlab_url}/projects/{project_id}/merge_requests/{mr_iid}/notes"
    resp = httpx.post(
        url,
        headers={"JOB-TOKEN": token},
        json={"body": f"🤖 **AI Code Review**\n\n{comment}"},
        verify=False,
    )
    resp.raise_for_status()

まとめて実行

def main() -> None:
    diff = get_diff()
    if not diff.strip():
        print("差分なし、スキップします")
        return

    review = review_diff(diff)
    post_comment(review)
    print("レビュー投稿完了")

if __name__ == "__main__":
    main()

GitLab CI への組み込み

.gitlab-ci.yml に以下のジョブを追加します。

ai-review:
  stage: review
  image: python:3.12-slim
  script:
    - pip install anthropic httpx --quiet
    - python scripts/ai_review.py
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
      changes:
        - "**/*.py"
        - "**/*.go"
        - "**/*.ts"

ANTHROPIC_API_KEY は GitLab の CI/CD Variables に登録しておきます。

運用してみてわかったこと

よかった点

  • 凡ミス(変数の使い忘れ、型ミスなど)をかなりの精度で拾ってくれる
  • レビュアーが見落としがちなセキュリティ観点を毎回チェックしてくれる
  • MR 作成直後にフィードバックが返ってくるので修正サイクルが速い

注意点

  • 大きな差分は分割しないとコンテキストが薄くなる
  • アーキテクチャ全体の整合性は見られないため、設計レビューは人間が担う
  • APIコストがかかるため、トリガー条件を絞ることが重要

まとめ

Claude API を CI に組み込むことで、コードレビューの一次対応を自動化できます。 人間のレビュアーは「AIが問題なしと判断したコード」を受け取るため、より深い議論に時間を使えるようになります。

このブログ自体も同様の仕組みで記事品質を管理しています。詳細は別記事で紹介予定です。