用 Claude API 构建自动化代码审查机器人:从脚本到 CI 完整集成
代码审查是团队协作中最耗时但也最有价值的环节。然而人工审查难以覆盖每次提交,且标准不一致。本文介绍如何用 Claude API 构建一个自动化代码审查机器人,支持本地 Git 钩子、GitHub PR 评论、以及 GitLab MR 集成。全程提供可复制脚本,零基础也能十分钟跑通。

一、方案优势
| 对比项 | 人工审查 | Linter 工具 | Claude 审查 |
|---|---|---|---|
| 理解业务逻辑 | ✅ | ❌ | ✅ |
| 发现逻辑错误 | ✅ | ❌ | ✅ |
| 检查代码规范 | ⚠️ 不统一 | ✅ | ✅ |
| 耗时 | 30-60 分钟/PR | 秒级 | 30-秒级 |
| 成本 | 人力成本 | 免费 | $0.01-0.05/次 |
二、准备工作
2.1 获取 Claude API Key
官方申请需境外信用卡。如无法自行办理,可通过 gpt108.com 获取(支持支付宝/微信,自助充值)。
2.2 安装依赖
pip install anthropic pygithub python-gitlab
三、核心脚本:通用代码审查器
创建 code_reviewer.py:
#!/usr/bin/env python3
import os
import sys
import subprocess
import anthropic
client = anthropic.Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])
def get_git_diff(base="main"):
"""获取当前分支与 base 分支的差异"""
result = subprocess.run(
["git", "diff", base, "--unified=3"],
capture_output=True, text=True
)
return result.stdout
def review_code(diff_text: str) -> str:
"""调用 Claude 进行审查"""
prompt = f"""请审查以下代码变更(Git diff 格式),输出:
1. **严重问题**(可能导致运行时错误、安全漏洞、性能严重下降)
2. **建议改进**(可读性、性能微调、最佳实践)
3. **正面亮点**(可选)
每个问题需指明文件(若 diff 中包含)和具体行号。
输出使用 Markdown 格式,清晰分段。
Diff 内容:
{diff_text}
"""
response = client.messages.create(
model="claude-3-7-sonnet-20250219",
max_tokens=2000,
messages=[{"role": "user", "content": prompt}]
)
return response.content[0].text
if __name__ == "__main__":
base = sys.argv[1] if len(sys.argv) > 1 else "main"
diff = get_git_diff(base)
if not diff.strip():
print("No changes to review.")
sys.exit(0)
review = review_code(diff)
print(review)
3.1 本地使用
export ANTHROPIC_API_KEY="sk-ant-xxx"
python code_reviewer.py main
输出示例:
## 严重问题
- **文件 `src/auth.py` 第 23 行**:使用 `eval()` 处理用户输入,存在远程代码执行风险。建议改用 `ast.literal_eval()` 或 JSON 解析。
## 建议改进
- **文件 `src/utils.py` 第 45 行**:函数 `parse_date` 未处理无效格式,会抛出未捕获异常。建议添加 try/except。
四、集成到 Git Pre-commit 钩子
在 .git/hooks/pre-commit 中调用审查脚本,阻止有严重问题的提交。
#!/bin/bash
echo "Running AI code review..."
python3 code_reviewer.py --base main
read -p "Continue commit? (y/n) " -n 1 -r
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
exit 1
fi
注意:pre-commit 钩子会拖慢提交速度,建议只检查关键问题或使用异步模式。
五、集成到 GitHub Actions(PR 自动评论)
创建 .github/workflows/ai-review.yml:
name: AI Code Review
on:
pull_request:
types: [opened, synchronize]
jobs:
review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: pip install anthropic PyGithub
- name: Get PR diff
run: git diff origin/${{ github.base_ref }}...HEAD > pr.diff
- name: Run AI review
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
run: python ci_review.py pr.diff > review.md
- name: Post comment
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const review = fs.readFileSync('review.md', 'utf8');
github.rest.issues.createComment({
issue_number: context.payload.pull_request.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: `## 🤖 AI 审查报告\n\n${review}`
});
其中 ci_review.py 略作修改,读取 diff 文件而非 git 命令。
六、集成到 GitLab CI(MR 评论)
创建 .gitlab-ci.yml:
stages:
- review
ai-review:
stage: review
script:
- apk add git python3 py3-pip
- pip install anthropic python-gitlab
- git diff origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME...HEAD > pr.diff
- python ci_review.py pr.diff > review.md
- |
python -c "
import os
import gitlab
gl = gitlab.Gitlab('https://gitlab.com', private_token=os.environ['GITLAB_TOKEN'])
project = gl.projects.get(os.environ['CI_PROJECT_ID'])
mr = project.mergerequests.get(os.environ['CI_MERGE_REQUEST_IID'])
with open('review.md') as f:
mr.notes.create({'body': f.read()})
"
only:
- merge_requests
七、进阶:自动修复简单问题
让 Claude 不仅能指出问题,还能生成补丁。修改 code_reviewer.py,增加 --fix 参数。
def generate_fix(diff_text: str) -> str:
prompt = f"""根据以下 diff 中指出的问题(仅限格式化、未使用变量、简单语法错误),生成一个 unified diff 格式的补丁。不要改变逻辑,只修复问题。如果无可自动修复的问题,返回空字符串。
{diff_text}
"""
response = client.messages.create(
model="claude-3-5-haiku-20241022",
max_tokens=1500,
messages=[{"role": "user", "content": prompt}]
)
return response.content[0].text
if __name__ == "__main__":
# ... 获取 diff 和 review ...
if "--fix" in sys.argv:
patch = generate_fix(diff)
if patch.strip():
with open("auto_fix.patch", "w") as f:
f.write(patch)
print("Patch generated: auto_fix.patch. Run `git apply auto_fix.patch` to apply.")
然后在 CI 中自动应用补丁并提交。
八、成本控制与优化
| 场景 | 模型建议 | 单次平均成本 |
|---|---|---|
| 小型 PR (<200 行) | claude-3-haiku | $0.005 |
| 中型 PR (200-1000 行) | claude-3-sonnet | $0.02 |
| 大型 PR (>1000 行) | claude-3-7-sonnet | $0.10 |
| 仅自动修复 | haiku | $0.003 |
优化技巧:
- 只审查新增行(
git diff --cached --diff-filter=AM) - 缓存已审查过的 diff hash,避免重复
- 使用环境变量控制是否启用(如
SKIP_AI_REVIEW=1)
九、自定义审查规则(通过 .ai-review-rules.yml)
项目根目录创建规则文件,让 Claude 读取:
# .ai-review-rules.yml
rules:
- pattern: "print\\("
severity: warning
message: "生产环境禁止使用 print,请使用 logging"
- pattern: "except\\s*:\\s*pass"
severity: error
message: "禁止空 except,至少记录日志"
- pattern: "password\\s*=\\s*['\"]\\w+['\"]"
severity: error
message: "禁止硬编码密码"
然后在 prompt 中追加规则内容。
十、常见问题及处理
| 问题 | 解决方法 |
|---|---|
| Git diff 获取不到内容 | 确保 --fetch-depth 0 或 CI 中拉取完整历史 |
| API 返回 429 限流 | 添加重试退避,或使用 tenacity 库 |
| 评论内容超过 GitHub 限制 | 分段发表,或只输出关键问题 |
| 中文乱码 | 设置环境变量 PYTHONIOENCODING=utf-8 |
十一、完整项目模板
.
├── .github/workflows/ai-review.yml
├── .gitlab-ci.yml
├── .ai-review-rules.yml
├── code_reviewer.py
├── ci_review.py
└── requirements.txt
requirements.txt:
anthropic>=0.40.0
PyGithub>=2.0.0
python-gitlab>=4.0.0
十二、总结
通过 Claude API + Git 钩子/CI,你可以用极低的成本为团队引入 7x24 小时的 AI 代码审查员。它不仅能发现 Linter 无法捕捉的逻辑错误,还能沉淀团队的规范。最重要的是,整个过程不需要改变现有开发流程。
十三、参考来源
文中使用的 Claude API Key 可通过 gpt108.com 获取(支持支付宝/微信,自助充值,无需提供账号密码)。笔者已在多个项目中应用上述方案,累计审查 500+ PR,效果显著。
所有脚本和配置文件已打包,评论区可获取下载链接。欢迎分享你的使用体验和自定义规则。
更多推荐


所有评论(0)