一个人写代码最怕什么?不是写不出来,是写出来的 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 试试效果。
