如何用 Claude Code + GitHub Actions 自动审查 PR 代码:完整教程
想让 Claude Code 在每个 PR 被人工审查之前自动过一遍——发现 bug、安全漏洞和性能问题?本教程 35 分钟内带你搭建完整 CI 流水线:审查提示词模板、GitHub Actions 工作流、以及把审查结果逐行贴回 PR 的 Python 脚本。
TL;DR
如果你在搜「怎么用 Claude Code 自动做代码审查」,本教程 35 分钟内带你搭建一条 AI 驱动的 PR 审查流水线:自动检查 Bug、强制执行代码规范、生成审查评论——全部由 GitHub Actions 自动触发,无需人工介入。
你将学到
- 在 CI 环境(GitHub Actions)中安装配置 Claude Code CLI
- 编写能发现真 Bug(而不只是格式问题)的审查提示词模板
- 配置 GitHub Actions 工作流,在 PR 事件触发时自动运行
- 通过 GitHub API 将审查结果以行级评论形式回贴到 PR
- 处理常见坑位:Token 超限、大文件 diff、AI 幻觉反馈
准备清单
- 一个你拥有推送权限的 GitHub 仓库(公开或私有均可)
- Claude Code CLI(先在本地安装测试——CI 中会再装一次)
- Anthropic API 密钥,需有余额(免费额度足够测试,生产环境约 $5/月可处理 ~50 个 PR)
- 基本的 GitHub Actions YAML 语法概念(我们会逐行解释)
Step 1: 安装 Claude Code CLI 并本地测试
在自动化之前,先在本地验证 Claude Code 能正常工作。我们拿真实代码库来测,提前熟悉输出格式。
# 通过 npm 安装 Claude Code(需要 Node.js 18+)
npm install -g @anthropic-ai/claude-code
# 验证安装
claude --version
# 预期输出: claude-code/1.x.x
# 设置 API 密钥
export ANTHROPIC_API_KEY="sk-ant-..."
# 对你的项目做一次测试审查
cd /path/to/your-project
claude "审查 src/main.py 文件,找出其中的 bug、安全问题和代码风格问题。以列表形式输出发现的问题。"
正常现象: Claude Code 读取文件后,返回结构化的发现列表。如果输出内容太少或太泛,说明你的提示词太模糊——直接跳到 Step 2 用写好的模板。
常见坑位: 如果报 Error: API key not found,确认环境变量是 export 出来的(不是写在 .env 文件里——Claude Code 只读系统环境变量,不读 .env 文件)。
Step 2: 编写审查提示词模板
自动化审查的质量完全取决于你的提示词。一个模糊的"审查这个代码"提示词,只会产生模糊(甚至错误)的反馈。以下是一个经过实战验证的模板,能产出具体、可执行的审查意见。
创建文件 .github/claude-code-review-prompt.md:
你是一名资深软件工程师,正在进行代码审查。请审查以下的 Pull Request diff。
## 审查规则
1. **Bug 和逻辑错误(严重):** 检查差一错误、空指针风险、竞态条件、API 使用错误。如果发现 bug,解释为什么有问题,并给出修复建议(含代码)。
2. **安全问题(高危):** SQL 注入、XSS、硬编码密钥、缺少输入校验、不安全反序列化。
3. **性能问题(中危):** N+1 查询、不必要的内存分配、缺少索引、同步调用应改为异步。
4. **代码风格(低危):** 命名不规范、不一致的模式、缺少类型标注。只在真正影响可读性时才提——不要纠结格式问题。
## 输出格式
每个问题使用以下精确格式,方便 CI 脚本解析:
FILE: path/to/file.py LINE: 42 SEVERITY: critical|high|medium|low ISSUE: 一行描述问题 SUGGESTION: 修复建议,必要时含代码
## 重要事项
- 跳过 import 顺序、空格、代码格式等问题——linter 已经处理了。
- 如果 PR 完全是文档修改,输出 "No code changes to review — documentation PR, skipping."
- 最多列出 10 个最重要的问题。不要列举每一个小问题。
- 如果不确定某个发现是否真实存在,标记为 SEVERITY: low 并附加 "CONFIDENCE: uncertain"。
以下是需要审查的 PR diff:这个模板为什么好用:
- 严重程度分级:防止 AI 在第 200 行有 SQL 注入时,却跑去提 50 个"加个类型标注"的意见。
- 结构化输出(
FILE:LINE:):让 GitHub Actions 脚本能解析并逐行贴到 PR 上。 - 显式排除项:告诉 Claude Code 别在 import 顺序上浪费 Token,那些是 linter 的活。
- 不确定性标记:AI 能说"我不确定"比自信满满地胡说八道更可信。
Step 3: 创建 GitHub Actions 工作流
接下来创建 CI 流水线。这个工作流在每个 PR(打开、更新、重新打开)时触发,运行 Claude Code 审查 diff,并把发现的问题贴成 PR 评论。
创建 .github/workflows/claude-code-review.yml:
name: Claude Code PR Review
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
permissions:
contents: read
pull-requests: write
issues: write
jobs:
ai-review:
runs-on: ubuntu-latest
if: github.event.pull_request.draft == false
timeout-minutes: 15
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0 # 完整历史,用于准确计算 diff
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install Claude Code CLI
run: npm install -g @anthropic-ai/claude-code
- name: Generate PR diff
id: diff
run: |
git diff origin/${{ github.base_ref }}...HEAD > /tmp/pr.diff
echo "diff_lines=$(wc -l < /tmp/pr.diff)" >> $GITHUB_OUTPUT
echo "diff_size=$(stat -c%s /tmp/pr.diff)" >> $GITHUB_OUTPUT
- name: Skip if diff too large
if: steps.diff.outputs.diff_lines > 5000
run: |
echo "⚠️ Diff 超过 5000 行 (${{ steps.diff.outputs.diff_lines }}),跳过 AI 审查以避免 Token 溢出。"
echo "LARGE_DIFF=true" >> $GITHUB_ENV
- name: Run Claude Code Review
if: env.LARGE_DIFF != 'true'
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
run: |
# 拼接提示词模板和 diff
cat .github/claude-code-review-prompt.md /tmp/pr.diff > /tmp/full_prompt.md
# 以非交互模式运行 Claude Code
claude --print --max-turns 1 \
-p "$(cat /tmp/full_prompt.md)" \
> /tmp/review_output.txt 2>/tmp/review_error.txt
echo "审查输出行数: $(wc -l < /tmp/review_output.txt)"
- name: Post Review Comments
if: env.LARGE_DIFF != 'true'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PR_NUMBER: ${{ github.event.pull_request.number }}
run: |
python3 .github/scripts/post_review_comments.py \
/tmp/review_output.txt \
$PR_NUMBER
关键配置解释:
| 配置 | 原因 |
|---|---|
fetch-depth: 0 | 需要完整 Git 历史才能准确计算与基准分支的 diff |
if: draft == false | 草稿 PR 不浪费 API 额度——等标记为 ready 后再审查 |
timeout-minutes: 15 | 大 diff 下 Claude Code 可能跑 5-10 分钟,15 分钟是安全上限 |
--max-turns 1 | 防止 Claude Code 进入 Agent 循环——我们只要单次审查,不要它调用工具 |
--print | 输出到 stdout 而非交互模式,CI 环境必需 |
| 5000 行 diff 上限 | Claude 上下文窗口约 200K Token;5000 行 diff ≈ 80K Token 加上提示词,留足回复空间 |
Step 4: 编写评论回贴脚本
Claude Code 输出结构化的审查发现。我们需要一个 Python 脚本来解析 FILE:LINE:SEVERITY: 格式,并通过 GitHub API 把发现贴到 PR 对应行上。
创建 .github/scripts/post_review_comments.py:
# !/usr/bin/env python3
"""解析 Claude Code 审查输出,回贴到 GitHub PR。"""
import os, re, sys, json, urllib.request
GITHUB_TOKEN = os.environ["GITHUB_TOKEN"]
REPO = os.environ["GITHUB_REPOSITORY"]
PR_NUMBER = sys.argv[2] if len(sys.argv) > 2 else os.environ.get("PR_NUMBER")
REVIEW_FILE = sys.argv[1]
if not PR_NUMBER:
print("ERROR: PR_NUMBER not set")
sys.exit(1)
# 解析 Claude Code 输出
with open(REVIEW_FILE) as f:
text = f.read()
# 匹配 FILE/LINE/SEVERITY/ISSUE/SUGGESTION 块
pattern = re.compile(
r"FILE:\s*(.+?)\n"
r"LINE:\s*(\d+)\n"
r"SEVERITY:\s*(critical|high|medium|low)\n"
r"ISSUE:\s*(.+?)\n"
r"SUGGESTION:\s*(.+?)(?:\n---|\n$|\Z)",
re.DOTALL
)
findings = []
for m in pattern.finditer(text):
findings.append({
"path": m.group(1).strip(),
"line": int(m.group(2)),
"severity": m.group(3).strip(),
"issue": m.group(4).strip(),
"suggestion": m.group(5).strip(),
})
print(f"从审查输出中解析出 {len(findings)} 条发现")
if not findings:
# 没有问题,贴一条正面总结
print("未发现问题 — 贴出正面审查总结")
findings = [{
"path": "GENERAL",
"line": 1,
"severity": "low",
"issue": "✅ Claude Code 自动审查未发现严重问题",
"suggestion": "做得很好!继续进行人工审查,关注业务逻辑和架构决策。",
}]
# 逐条贴到 PR
api_base = f"https://api.github.com/repos/{REPO}/pulls/{PR_NUMBER}"
severity_emoji = {
"critical": "🔴", "high": "🟠", "medium": "🟡", "low": "🟢"
}
for f in findings:
body = f"**{severity_emoji.get(f['severity'], '')} [{f['severity'].upper()}] {f['issue']}**\n\n{f['suggestion']}\n\n---\n*🤖 Claude Code 自动审查*"
payload = json.dumps({
"body": body,
"path": f["path"] if f["path"] != "GENERAL" else None,
"line": f["line"] if f["path"] != "GENERAL" else None,
"side": "RIGHT",
}).encode()
url = f"{api_base}/comments"
req = urllib.request.Request(url, data=payload, method="POST")
req.add_header("Authorization", f"token {GITHUB_TOKEN}")
req.add_header("Accept", "application/vnd.github+json")
req.add_header("Content-Type", "application/json")
try:
with urllib.request.urlopen(req) as resp:
result = json.loads(resp.read())
print(f" ✅ 已贴出: {f['path']}:{f['line']} [{f['severity']}] — 评论 ID {result.get('id')}")
except urllib.error.HTTPError as e:
err_body = e.read().decode()
print(f" ❌ 贴出失败 {f['path']}:{f['line']}: {e.code} — {err_body[:200]}")
print(f"\n完成。共 {len(findings)} 条评论已贴至 PR #{PR_NUMBER}")让脚本可执行:
chmod +x .github/scripts/post_review_comments.pyStep 5: 配置密钥并测试
-
将 Anthropic API 密钥添加到 GitHub Secrets:
- 进入仓库 → Settings → Secrets and variables → Actions
- 点击 "New repository secret"
- Name:
ANTHROPIC_API_KEY - Value: 你的
sk-ant-...密钥
-
推送代码并创建测试 PR:
git add .github/
git commit -m "添加 Claude Code 自动 PR 审查工作流"
git push
# 创建一个故意有问题的分支来测试
git checkout -b test-ai-review
echo "def divide(a, b): return a / b # 如果 b=0 呢?" > src/buggy.py
git add src/buggy.py
git commit -m "添加除法函数(故意缺零检查)"
git push origin test-ai-review
# 通过 GitHub CLI 创建 PR
gh pr create --title "测试:AI 审查有 bug 的代码" --body "测试 Claude Code 自动审查"- 查看 Actions 标签页——工作流应自动触发。2-5 分钟内,你应该能在 PR 上看到 Claude Code 的审查评论。

常见坑位
- CI 中报 "API key not found":反复检查密钥名是否完全一致——
ANTHROPIC_API_KEY是大小写敏感的。GitHub Actions 的${{ secrets.XXX }}区分大小写。 - Claude Code 卡在 Agent 循环里:
--max-turns 1参数至关重要。没有它,Claude Code 可能会尝试执行 bash 命令、修改文件,进入消耗 API 额度并超时的死循环。 - 审查结果中有"不存在的问题":如果 Claude Code 产生幻觉(比如在没有 SQL 的文件里报 SQL 注入),提示词需要更多上下文。加上"本项目使用 SQLAlchemy ORM,不存在原始 SQL 查询"这样的说明就可以解决。
- 大 PR 超时或超 Token 限制:5000 行 diff 的上限可以处理大多数情况。如果频繁遇到大 PR,可以考虑只审查有变更的函数(
git diff --function-context),或把 diff 拆成多个片段分别审查。 - 评论错行:GitHub PR Review API 使用右侧(新代码)行号。如果审查过程中有人又推送了新 commit,行号可能偏移。用
pull_request.synchronize事件可以在每次推送时重新触发审查。 - 成本控制:每次 PR 审查大约消耗 $0.05-0.30 的 Anthropic API 额度(取决于 diff 大小和 claude-sonnet-4-20250514 的定价)。一个每天 20 个 PR 的团队大约花费 $3-6/天。建议设置 Anthropic 使用量告警 以防成本意外暴涨。
下一步
- 为你的技术栈定制:编辑
.github/claude-code-review-prompt.md中的审查规则,适配你的语言特性(Rust 的 borrow checker、React 的 hook 依赖、SQL 查询模式等) - 添加自动修复:扩展工作流,让 Claude Code 直接往 PR 分支提交修复建议(使用
gh pr checkout+claude --dangerously-skip-permissions,需谨慎) - 审查摘要评论:把逐行评论改成一个汇总评论,使用 GitHub Reviews API 批量提交
- 与人工审查配合:当 AI 标注
critical或high时自动 @ 特定团队成员——用 GitHub CODEOWNERS 或自定义路由脚本 - 试用其他 AI 工具:同样的模式也适用于 OpenAI Codex CLI——把
claude换成codex exec,调整提示词格式即可
相关教程:如何为 Claude Code 构建自定义 MCP 服务器 · OpenAI Codex CLI 使用教程 · AI 编程 Agent 安全配置
相关推荐
如何为 Claude Code 构建自定义 MCP 服务器:手把手教程
如果你想为 Claude Code 写一个自定义 MCP 服务器,让 AI 调用你自己的工具——天气查询、文件摘要、待办管理——本教程 45 分钟内带你用 Python 从零到一,含完整代码、真实 API 接入和调试技巧。
Copilot vs Cursor vs Claude Code 2026:三大AI编程工具实测对比
结论速览:要生态选 Copilot,要 IDE Agent 选 Cursor,要终端自治选 Claude Code;预算紧再叠加 DeepSeek 后端。
Claude Code工作流指南:2026日常AI编程4种实战模式详解
Claude Code最有效的使用方式,是把它当成一个有超能力的初级开发者——而不是一个神奇的黑箱。本工作流指南覆盖四种核心模式。
主题中心
2026 AI 编程工具全景指南
从 Copilot 改版到 Claude Code / DeepSeek 低成本方案——把分散资讯收成可搜索、可对比的工具矩阵。
进入「2026 AI 编程工具全景指南」 →赚钱视角
这个趋势怎么赚钱?
WayToClawEarn 的差异在可验证的赚钱案例,而不只是资讯。从这些复盘开始:
浏览全部案例 →