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が問題なしと判断したコード」を受け取るため、より深い議論に時間を使えるようになります。
このブログ自体も同様の仕組みで記事品質を管理しています。詳細は別記事で紹介予定です。