Agent工坊

【Agent工坊】Claude Code PR审查流水线:让AI在你睡觉时Review代码

一个人写代码最怕什么?不是写不出来,是写出来的 bug 没人帮你找。本文教你用 Claude Code 搭一条自动化 PR 审查流水线——提交代码后5分钟内收到AI审查意见,零人力成本。

一人公司的代码质量困境

凌晨1点,你刚写完一个新功能。git push 之后,你盯着屏幕想:这代码有没有边界条件没处理?SQL 查询会不会慢?错误处理完善了吗?

如果是团队开发,同事会在 PR review 里帮你发现这些问题。但一人公司没有同事。

这就是 AI 代码审查的价值。Claude Code 不仅能帮你写代码,还能帮你审代码——而且在你睡觉的时候工作。

核心思路

整个流水线就三步:

git push → GitHub Actions 触发 → Claude Code 读取 PR diff → 输出审查报告 → 评论到 PR

用到的工具
- Claude Code:执行审查逻辑(读 diff、按规则审查、生成报告)
- GitHub Actions:触发器和执行环境
- CLAUDE.md:审查规则定义(一次配置,持续生效)

第一步:编写审查规则(CLAUDE.md)

在项目根目录创建或更新 CLAUDE.md,定义你的代码审查标准:

# CLAUDE.md - PR Review Rules

## 审查规则

当被要求审查代码时,按以下维度检查:

### 1. 安全性(高优先级)
- [ ] SQL 查询是否使用参数化,防止注入
- [ ] 用户输入是否做了校验和转义
- [ ] 敏感信息(API Key、密码)是否硬编码
- [ ] 文件上传是否有类型和大小限制

### 2. 错误处理
- [ ] 所有 async 操作是否有 try-catch
- [ ] 外部 API 调用是否有超时和重试
- [ ] 错误信息是否对用户友好(不暴露内部细节)

### 3. 性能
- [ ] 循环内是否有不必要的数据库查询(N+1 问题)
- [ ] 大列表是否做了分页
- [ ] 是否有不必要的 await(可并行的操作)

### 4. 代码风格(本项目的约定)
- [ ] TypeScript 严格模式,禁止 any
- [ ] 函数不超过 50 行
- [ ] 文件名:组件用 PascalCase,工具函数用 kebab-case
- [ ] 所有公共函数必须有 JSDoc

### 5. 测试
- [ ] 新增功能是否有对应测试
- [ ] 边界条件是否覆盖(空值、超长输入、并发)

### 输出格式
生成审查报告,每个问题标注严重程度:
- 🔴 严重:必须修复才能合并
- 🟡 建议:应该修复,但不阻塞
- 🟢 可选:锦上添花

关键技巧[ ] 格式的清单让 Claude 逐项检查,不会遗漏。严重程度标注让报告直接可用。

第二步:创建 GitHub Actions 工作流

.github/workflows/claude-review.yml 创建:

name: Claude Code PR Review

on:
  pull_request:
    types: [opened, synchronize]

jobs:
  review:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: write

    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '22'

      - name: Install Claude Code
        run: npm install -g @anthropic-ai/claude-code

      - name: Get PR diff
        id: diff
        run: |
          git diff origin/${{ github.base_ref }}...HEAD > pr.diff
          echo "diff_size=$(wc -l < pr.diff)" >> $GITHUB_OUTPUT

      - name: Run Claude Code Review
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          claude --print \
            "请审查这个 PR。读取 pr.diff 文件,按照 CLAUDE.md 中的审查规则逐项检查,生成中英文双语审查报告。

            审查维度:安全性、错误处理、性能、代码风格、测试覆盖。

            每个问题标注严重程度(🔴严重/🟡建议/🟢可选),给出具体文件和行号,附修复建议。

            最后给出总体评分(1-10)和一句话总结。" \
            > review-report.md

      - name: Post review comment
        uses: actions/github-script@v7
        with:
          script: |
            const fs = require('fs');
            const report = fs.readFileSync('review-report.md', 'utf8');
            const summary = report.split('\n').slice(0, 3).join('\n');

            await github.rest.issues.createComment({
              owner: context.repo.owner,
              repo: context.repo.repo,
              issue_number: context.issue.number,
              body: `## 🤖 Claude Code 自动审查

            ${report}

            ---
            *由 Claude Code 自动生成 · 仅供参考 · 最终决定权在你*`
            });

注意ANTHROPIC_API_KEY 需要在 GitHub 仓库的 Settings → Secrets and variables → Actions 中配置。

第三步:本地 Git Hook(可选,更快反馈)

如果不想等 GitHub Actions,可以加一个 pre-push hook,在 push 前自动审查:

.git/hooks/pre-push 创建:

#!/bin/bash
# Pre-push: Claude Code 自动审查即将推送的代码

echo "🔍 Claude Code 正在审查你的代码..."

# 获取即将推送的 commits 的 diff
REMOTE="$1"
URL="$2"
while read local_ref local_sha remote_ref remote_sha; do
    if [ "$local_sha" = "0000000000000000000000000000000000000000" ]; then
        continue  # 删除分支,跳过
    fi

    # 获取 diff
    if [ "$remote_sha" = "0000000000000000000000000000000000000000" ]; then
        # 新分支,跟 main 比较
        RANGE="main..$local_sha"
    else
        RANGE="$remote_sha..$local_sha"
    fi

    git diff "$RANGE" > /tmp/pr.diff

    # 调用 Claude Code 审查
    claude --print \
      "审查 /tmp/pr.diff 中的代码变更。按 CLAUDE.md 规则检查。
       只关注 🔴严重 问题。如果有严重问题,输出 'BLOCK' 并列出。
       如果没有严重问题,输出 'PASS'。" \
      > /tmp/review.txt

    cat /tmp/review.txt

    if grep -q "BLOCK" /tmp/review.txt; then
        echo ""
        echo "⚠️  Claude Code 发现严重问题。建议修复后再 push。"
        echo "   如果要跳过审查:git push --no-verify"
        exit 1
    fi
done

echo "✅ 审查通过"
exit 0
chmod +x .git/hooks/pre-push

实战效果:一个真实案例

假设你提交了这段代码:

// 用户注册接口
app.post('/api/register', async (req, res) => {
  const { email, password } = req.body;
  const user = await db.query(
    `SELECT * FROM users WHERE email = '${email}'`
  );
  if (user) {
    return res.json({ error: 'User exists' });
  }
  await db.query(
    `INSERT INTO users (email, password) VALUES ('${email}', '${password}')`
  );
  res.json({ success: true });
});

Claude Code 的审查报告会输出:

## 🤖 Claude Code 自动审查

### 🔴 严重问题

**1. SQL 注入漏洞**  `src/routes/auth.ts:4,9`
- 问题直接拼接用户输入到 SQL 语句
- 风险攻击者可通过 email/password 字段注入任意 SQL
- 修复使用参数化查询
  ```typescript
  const user = await db.query(
    'SELECT * FROM users WHERE email = $1', [email]
  );
  ```

**2. 密码明文存储**  `src/routes/auth.ts:9`
- 问题密码直接写入数据库未加密
- 修复使用 bcrypt 哈希
  ```typescript
  const hashedPassword = await bcrypt.hash(password, 12);
  ```

### 🟡 建议

**3. 缺少输入校验**  `src/routes/auth.ts:2`
- email 格式未校验password 长度未限制
- 建议添加 zod  joi 校验

### 总体评分3/10(🔴 严重安全问题必须修复

这就是 AI 审查的价值——它在一秒内发现了两个可能让你半夜被叫醒修漏洞的安全问题。

进阶技巧

1. 分场景审查规则

不同模块可能有不同规则。用 .claude/rules/ 目录:

.claude/rules/
├── backend.md      # API 安全、数据库查询优化
├── frontend.md     # 无障碍访问、Bundle 大小
└── infrastructure.md  # IAM 权限、Terraform 最佳实践

在 CLAUDE.md 中引用:

## 审查规则

根据 PR 涉及的文件路径,加载对应的审查规则:
- `src/api/` → 加载 `.claude/rules/backend.md`
- `src/components/` → 加载 `.claude/rules/frontend.md`
- `infra/` → 加载 `.claude/rules/infrastructure.md`

2. 抑制已知问题

某些警告你可能故意忽略。用 .claudereviewignore

# .claudereviewignore
src/legacy/**          # 遗留代码不审查
**/*.test.ts            # 测试文件跳过性能检查
WARNING:no-jsdoc       # 内部工具函数可以没有 JSDoc

3. 与 CI/CD 集成

把审查结果作为 merge 的条件之一:

# 在 workflow 末尾添加
- name: Check review result
  run: |
    if grep -q "🔴" review-report.md; then
      echo "❌ 存在严重问题,阻止合并"
      exit 1
    fi
    echo "✅ 无严重问题"

成本分析

项目 用量
每次 PR 审查 ~2000-8000 tokens
Claude API 费用 ~$0.03-0.12/次
每天10个 PR ~$1.2/天
月度成本 ~$36

对比雇一个兼职 code reviewer($2000+/月),ROI 超过 50 倍。

一个坑:diff 太大怎么办

如果 PR 超过 500 行,Claude 可能超出上下文窗口。解决方案:

# 在 workflow 中裁剪 diff
MAX_LINES=500
if [ "$diff_size" -gt "$MAX_LINES" ]; then
  echo "⚠️ Diff 过大($diff_size 行),只审查关键文件"
  # 只保留 .ts/.py/.go 等核心代码文件
  grep -E '^\+\+\+ b/.*\.(ts|py|go|rs)$' pr.diff > /tmp/key_files.txt
  # 提取这些文件的 diff
  # ... (用 sed/awk 按文件路径裁剪)
fi

或者用 claude --continue 分批审查:先审安全问题,再审性能,最后审风格。

总结

一人公司不需要雇人做 code review。投入 1 小时配置 CLUADE.md + GitHub Actions workflow,换来的是:
- ✅ 每次 PR 自动审查,5 分钟内反馈
- ✅ SQL 注入、XSS 等安全问题不再漏网
- ✅ 代码风格统一,不用手动检查
- ✅ 月成本不到 40 美元

今晚就开始:把上面的 CLAUDE.md 模板复制到你的项目,创建 workflow 文件,push 一个 PR 试试效果。


AI创业 #ClaudeCode #一人公司 #自动化 #代码审查