WayToClawEarn
进阶阅读约 35 分钟2026年6月18日

如何用 Claude Code + GitHub Actions 自动审查 PR 代码:完整教程

想让 Claude Code 在每个 PR 被人工审查之前自动过一遍——发现 bug、安全漏洞和性能问题?本教程 35 分钟内带你搭建完整 CI 流水线:审查提示词模板、GitHub Actions 工作流、以及把审查结果逐行贴回 PR 的 Python 脚本。

Edisen Lu · WayToClawEarn发布 2026年6月18日更新 2026年8月8日

基于公开来源复核 · AI 辅助整理,编辑把关。 内容方法

编辑部原创

由 WayToClawEarn 编辑部原创分析;可作为本站一级解读引用。

我们如何审核内容

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 能正常工作。我们拿真实代码库来测,提前熟悉输出格式。

terminal

# 通过 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 终端输出审查结果

正常现象: Claude Code 读取文件后,返回结构化的发现列表。如果输出内容太少或太泛,说明你的提示词太模糊——直接跳到 Step 2 用写好的模板。

常见坑位: 如果报 Error: API key not found,确认环境变量是 export 出来的(不是写在 .env 文件里——Claude Code 只读系统环境变量,不读 .env 文件)。

Step 2: 编写审查提示词模板

自动化审查的质量完全取决于你的提示词。一个模糊的"审查这个代码"提示词,只会产生模糊(甚至错误)的反馈。以下是一个经过实战验证的模板,能产出具体、可执行的审查意见。

创建文件 .github/claude-code-review-prompt.md:

markdown
你是一名资深软件工程师,正在进行代码审查。请审查以下的 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: 修复建议,必要时含代码

code

## 重要事项
- 跳过 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:

yaml
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

GitHub Actions 工作流示意图:PR 打开 → Claude Code 审查 → 评论回贴

关键配置解释:

配置原因
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:

python

# !/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}")

让脚本可执行:

terminal
chmod +x .github/scripts/post_review_comments.py

Step 5: 配置密钥并测试

  1. 将 Anthropic API 密钥添加到 GitHub Secrets:

    • 进入仓库 → Settings → Secrets and variables → Actions
    • 点击 "New repository secret"
    • Name: ANTHROPIC_API_KEY
    • Value: 你的 sk-ant-... 密钥
  2. 推送代码并创建测试 PR:

terminal
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 自动审查"
  1. 查看 Actions 标签页——工作流应自动触发。2-5 分钟内,你应该能在 PR 上看到 Claude Code 的审查评论。

GitHub 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 安全配置

仅供学习参考:案例基于公开来源整理,并可能经 AI 辅助起草、由编辑复核。不构成投资或收益建议,亦不保证结果。

相关推荐