用 AI Agent 搭一个自动化 PR Review 流水线
适用场景
- 团队 5-20 人,PR review 是瓶颈
- 想让 AI 做第一轮审查,人只看 AI 标记的问题
- 需要 CI 阻断有严重问题的 PR(而非只评论)
如果团队只有 1-2 人,单挂一个 CodeRabbit 就够,不必上完整流水线。这篇面向"review 已经成为瓶颈"的团队。各家 review 工具的横向对比见 AI 代码审查工具横评。
整体思路:AI 做机械层,人做判断层
自动化 review 的目标不是取代人,而是分工:
- AI 层:揪机械性问题——空指针、未处理异常、SQL 注入、密钥泄露、console.log 残留。这些数量多、容易漏、判断标准明确。
- 人层:看架构合理性、业务逻辑正确性、命名和抽象是否得当。这些需要上下文和判断,AI 给建议但不拍板。
流水线把 AI 层做成全自动,让人的注意力集中在真正需要思考的地方。
架构
PR 提交 → GitHub Actions 触发
├─ CodeRabbit Bot 自动评论(逐行 + 摘要)
├─ Claude Code 自定义规则审查(安全 / 性能 / 团队规范)
└─ 严重问题 → 设置 commit status = failure → 阻断合并
两个 AI 审查器分工:CodeRabbit 做通用全面审查(覆盖广),Claude Code 做团队特定规则(精准卡你最在意的几类问题)。互补而非重复。
落地路线:分三阶段,别一步到位
直接上"阻断合并"是新手最容易翻车的地方——AI 误报会卡住所有人,团队两天就把你的流水线绕过去了。建议分阶段:
- 阶段一(第 1 周):只装 CodeRabbit,纯评论模式,不阻断。让团队习惯 AI 评论的存在,观察误报率。
- 阶段二(第 2-3 周):加 Claude Code 自定义规则,仍只评论。调 prompt 直到误报可接受。
- 阶段三(误报率够低后):开启"严重问题阻断合并",且只阻断安全类(注入、密钥),其余仍是建议。
下面按这个顺序配。
第一步:CodeRabbit 接入(阶段一)
CodeRabbit 是开箱即用的 GitHub App,装上就自动 review。
- 去 coderabbit.ai 安装 GitHub App
- 选择要 review 的仓库
- 在仓库根目录加
.coderabbit.yaml:
reviews:
auto_review:
enabled: true
drafts: false # 草稿 PR 不审,省配额
path_filters:
- "!**/*.lock" # 不审 lock 文件
- "!**/dist/**" # 不审构建产物
- "!**/*.generated.ts" # 不审生成代码
instructions: |
- 用中文评论
- 重点关注 SQL 注入、XSS、敏感信息泄露
- 不要评论代码风格(用 ESLint 管)
- 性能问题只在 O(n²) 以上才报
- 提交一个 PR 测试,CodeRabbit 会在约 30 秒内出评论。
path_filters 和 instructions 是这步的关键——前者省配额、防刷屏,后者把 CodeRabbit 的"啥都说"收敛到你团队真正在意的范围。
第二步:Claude Code 自定义规则(阶段二)
CodeRabbit 是通用审查,团队特定规范(你们项目独有的约定)用 Claude Code 补。
创建 .github/workflows/ai-review.yml:
name: AI Review
on:
pull_request:
types: [opened, synchronize]
jobs:
claude-review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # 必须,否则 git diff 拿不到完整历史
- name: Get changed files
id: changed
run: |
files=$(git diff --name-only ${{ github.event.pull_request.base.sha }}..${{ github.event.pull_request.head.sha }})
echo "files=$files" >> $GITHUB_OUTPUT
- name: Claude Code Review
uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
prompt: |
审查以下文件的改动,重点关注:
1. 是否有未处理的 Promise rejection
2. 是否有 SQL 拼接(而非参数化查询)
3. 是否有 console.log 遗留在生产代码中
4. 是否有 hardcoded 密钥 / token
输出格式:
- 🔴 严重问题(必须修复):文件:行号 + 原因
- 🟡 建议(可选):文件:行号 + 建议
- ✅ 没问题的文件不用提
改动的文件:
${{ steps.changed.outputs.files }}
把 prompt 里的检查项换成你团队真正踩过坑的那几类——这才是 Claude Code 比 CodeRabbit 值钱的地方:它管的是"我们项目特有的雷"。
第三步:严重问题阻断合并(阶段三)
误报率调到可接受后,再开阻断。在 review workflow 末尾加 commit status:
- name: Set check status
if: steps.claude-review.outputs.severity == 'critical'
run: |
curl -X POST \
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
-H "Accept: application/vnd.github.v3+json" \
https://api.github.com/repos/${{ github.repository }}/statuses/${{ github.event.pull_request.head.sha }} \
-d '{"state": "failure", "context": "AI Review / Critical Issues", "description": "发现严重问题,请修复后重新提交"}'
然后在 GitHub 仓库设置 → Branch protection → Require status checks → 添加 AI Review / Critical Issues。
只阻断安全类严重问题(SQL 注入、密钥泄露)。 把"风格""性能建议"也设成阻断,开发者会想尽办法绕过你的流水线——这是落地失败最常见的原因。
效果
某团队上线一个月后的实测变化(供参考,具体因团队而异):
| 指标 | 之前 | 之后 |
|---|---|---|
| PR 平均 review 时间 | 8 小时 | 2 小时 |
| 人工 review 评论数 | 15 条/PR | 5 条/PR |
| 合并后发现的 bug | 3 个/周 | 1 个/周 |
| 开发者满意度 | 6/10 | 8/10 |
人工评论从 15 条降到 5 条不是"人变懒了",而是机械性问题被 AI 提前清掉,人只需对剩下的判断性问题发言。
成本估算
| 项 | 成本 | 备注 |
|---|---|---|
| CodeRabbit | 开源仓库免费 / 私有 $24/seat/mo | 小团队可只给核心仓库开 |
| Claude Code API | 约 $0.1-0.5/PR | 取决于改动量,月费一般 $50 内 |
| GitHub Actions | 公开仓库免费额度足够 | 私有仓库算入 Actions 分钟数 |
控制 API 成本的关键:path_filters 排除无意义文件、drafts: false 不审草稿、只在 opened/synchronize 触发而非每次 push。
踩坑记录
- 别一上来就开阻断——分三阶段落地,先纯评论养成习惯、压低误报,再开阻断。
- 只阻断安全类严重问题——风格/性能设成阻断,开发者会绕过整条流水线。
path_filters必配——不加会审 lock 文件、dist 目录,既浪费 API 又刷屏。- Claude Code Action 需要
fetch-depth: 0——否则git diff拿不到完整历史,diff 范围错乱。 - 两个审查器会有重叠评论——CodeRabbit 和 Claude 偶尔报同一个问题,用 instructions 把两者的职责划清(CodeRabbit 管通用、Claude 管团队特定)减少重复。
- secrets 配置别漏——
ANTHROPIC_API_KEY要在仓库 Settings → Secrets 里配,组织级仓库注意 secret 作用域。
延伸阅读
- AI 代码审查工具横评 — CodeRabbit/Ellipsis/Qodo/Greptile 选型
- CodeRabbit 工具卡 · Greptile
- Claude Code 深度评测 — 流水线里的自定义审查器
- AI Code Review 工作流 — 人机协作 review 的日常流程