实操二:PR 双评审落地——AI 评审 + 安全门禁接入,findings 必答制与轮次上限

83次阅读
实操二:PR 双评审落地——AI 评审 + 安全门禁接入,findings 必答制与轮次上限

循序渐进实操 · 2026-10-29 · 本篇为 ”AI 代码评审 ” 系列第 4 篇(实操二),第 1 篇解读 · 第 2 篇选型 · 第 3 篇实操一 · 对应 Anthropic 七层的 L2(AI 评审)+ L3(安全门禁) · 前置:已完成实操一的四件套;第 2 篇选型定了路线(本篇以 $0 组合为主线,CodeRabbit 路线给等价操作)


写在前面

实操一把 ”PR 存在之前 ” 的验证环搭好了;本篇进入 PR 层——AI 评审 + 安全门禁双评审 ,外加两条从 Anthropic 文章里抄来的纪律:findings 必答制(每条发现要么修复要么带理由关闭,这是澄清误报的官方通道)与 轮次上限(agent 作者×agent 评审的 50 轮死循环,靠三条配置治住)。全篇以 $0 组合为主线(PR-Agent 自托管 + claude-code-security-review Action),CodeRabbit 用户的等价操作单独给注记。完成后你的仓库将拥有七层中的 L2+L3:每个 PR 先过 AI 评审、安全发现可阻断合并、评审收敛有上限。

一、总览:要装的两个组件与要配的三条纪律

组件:
1.
PR-Agent(自托管)——承担 L2 的 AI 评审:/review(找 bug)、/improve(建议改进),模型走你第 2 篇选的通道(本文用 deepseek-flash 示例)
2.
claude-code-security-review Action(官方开源,MIT)——承担 L3 的安全门禁:分析 diff 中的安全问题,发现未关闭则阻断合并

纪律(写进配置,不靠自觉):
– findings 必答制——GitHub 分支保护开启 “Require conversation resolution before merging”
– 轮次上限——评审 prompt 里写死 ” 三轮后要求作者退一步重新考虑方法 ”,且复审只看新 diff
– 发现分级——Important / Nit / Pre-existing 三标签,风格类不进评论

二、组件一:PR-Agent 自托管接入

方案 a:GitHub Action 方式(最省事,密钥走仓库 Secrets)

.github/workflows/pr-agent.yml:

name: PR Agent
on:
  pull_request:
    types: [opened, reopened, ready_for_review]
  issue_comment:
    types: [created]
permissions:
  pull-requests: write
  issues: write
  contents: write
jobs:
  pr_agent_job:
    runs-on: ubuntu-latest
    if: ${{github.event.sender.type != 'Bot'}}
    steps:
      - uses: The-PR-Agent/pr-agent@main
        env:
          GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
          OPENAI_API_KEY: ${{secrets.DEEPSEEK_API_KEY}}
          OPENAI_API_BASE: "https://api.deepseek.com"
          config.model: "deepseek-chat"
          config.fallback_models: '["deepseek-chat"]'
          pr_reviewer.extra_instructions: |
            Follow REVIEW.md at repo root. Cite file:line for every finding.
            Start summary with a count. Max 3 rounds; after that ask the
            author to reconsider the approach. Re-review only the new diff.
          pr_reviewer.num_max_findings: 6

(DEEPSEEK_API_KEY 存到仓库 Settings → Secrets;模型名按你 DeepSeek 控制台实际可用型号替换。)

方案 b:本地 / 自托管 docker-compose(隐私边界最紧)——PR-Agent 官方提供 docker-compose,跑在你自己的 runner 上,GitHub 只收 webhooks。适合 ”diff 不出内网 ” 的要求,配置同上,略。

验收:开一个测试 PR,bot 应在几分钟内留下以计数开头的评审评论(”3 findings: 2 Important, 1 Nit…”),且支持 /review、/improve、`/ask “…”“ 的评论指令。

三、组件二:安全门禁(可阻断)

.github/workflows/security-review.yml(基于官方 anthropics/claude-code-security-review,MIT):

name: Security Review
on:
  pull_request:
    types: [opened, reopened, ready_for_review]
permissions:
  contents: read
  pull-requests: write
  security-events: write
jobs:
  security:
    runs-on: ubuntu-latest
    steps:
      - uses: anthropics/claude-code-security-review@main
        env:
          ANTHROPIC_API_KEY: ${{secrets.ANTHROPIC_API_KEY}}
        with:
          comment-pr: true

让它 ” 能阻断 ”:仓库 Settings → Branches → Branch protection → 勾选 Require conversation resolution before merging,并把该 workflow 设为 required check(Settings → Branches → Require status checks)。效果即第 1 篇的 L3:安全发现未关闭 → PR 合并按钮灰掉;后续 commit 修好 → 自动解除。

(注意:此 Action 消耗 ANTHROPIC_API_KEY 的 token;纯 DeepSeek 预算的团队可改用 PR-Agent 的 /review 加安全 extra_instructions 替代,代价是没有专门的 CWE 知识库提示。)

四、三条纪律的落地

findings 必答制:上面 Branch protection 的勾选就是全部实现。补充一条团队规范进 CONTRIBUTING.md:关闭线程时写一句理由(”false positive: 该行为由上游校验覆盖 #issue”)——这正是第 1 篇说的 ”clear the false positive” 通道。

轮次上限:已在 pr_agent.yml 的 extra_instructions 里写死(Max 3 rounds + reconsider + diff-only)。PR-Agent 自身支持配置级正则过滤重复 finding;再配合 GitHub 的自动化(同一线程 bot 重复评论超过 3 次可加 workflow 自动 mark resolved),双保险。

发现分级:PR-Agent 的 /review 默认区分 severity;在 extra_instructions 里追加三标签映射(Important / Nit / Pre-existing),并要求 ”PR 未引入的问题标 Pre-existing,不计入作者 ”。

CodeRabbit 用户等价操作:Settings 里开启 path filters(对应 REVIEW.md 的 skip paths)、把 “REQUEST_CHANGES” 策略设为仅安全类(对应 L3 阻断)、learning 功能开启后它自己积累你的纠正(对应部分 L1 反馈环)。收敛控制上 CodeRabbit 默认每 PR 一轮,agent 作者场景注意别让自动化回复再触发它。

五、验证与调参

用一个故意带伤的 PR 验证全链路:

# 建测试分支,塞入三个典型问题
git checkout -b test/review-e2e
# 1) 硬编码密钥(安全评审应抓)echo 'API_KEY = "sk-live-1234567890"' >> src/config.ts
# 2) 错误处理缺失(AI 评审应抓 Important)#    在路由里直接 throw new Error(...)
# 3) 变量命名不一致(应为 Nit 级)git commit -am "test: review e2e" && git push

验收清单:① PR-Agent 评论以计数开头、按 Important/Nit 分级、引用 file:line;② security-review 的发现出现在 PR 且为 required check;③ 不修复时合并被阻断;④ 在某条评论里回复修复说明后线程可关闭;⑤ 同一 PR 连续触发 /review 三次,第三轮的回复里应出现 ” 仅评审新增 diff” 的行为。

调参经验 :评审噪声偏高(Nit 太多)→ 在 extra_instructions 里收紧(”Only report issues that would cause bugs, data loss, or security problems”);漏报偏高 → 放开 num_max_findings、加 Deep 模式(换 deepseek-v4-pro 当评审模型); 任何调整都记录在 REVIEW.md 的变更史里——评审器的 prompt 就是你团队的评审政策,改政策要留痕。

六、成本账(第 1 篇欠的补上)

以本篇配置粗估(deepseek-flash 定价口径,实际以官方为准):一个 500 行 diff 的 PR,/review 约 1 次大调用(输入含 diff+REVIEW.md+CLAUDE.md ≈ 10-20K tokens,输出 1-2K);security-review 每次约 3-5 万 tokens(带 CWE 知识提示)。按每 PR 一次评审 + 一次安全扫描计,单 PR 成本约在 0.05-0.3 美元量级——百 PR/ 周的仓库月成本约 $20-120 的 token 费,仍远低于 CodeRabbit Pro 5 席的 $120/ 月,且隐私边界在自己手里。agent 作者高频触发场景(每 push 一评)要把这个数乘 3-5,轮次上限因此不是可选项是必需品。

七、小结与下一篇

本篇落地了 L2+L3:PR-Agent 承担 AI 评审(findings 计数式、分级、file:line),官方 Action 承担安全门禁(阻断 + 自动解除),三条纪律(必答制 / 轮次上限 / 发现分级)配置化落地;成本账补齐——$0 订阅 + 每 PR 几毛钱 token。验收五条全过即算 L2/L3 达标。下一篇(实操三·终篇)收尾 L4-L7:分支保护与 CODEOWNERS、手写风险分级表、回滚与轮次看板——把 ” 护栏指标 ” 变成你仓库里的两个数字。


参考与延伸

by 飞熊 · yunying(增长运营官)· 配置片段以工具当前版本文档为准;成本估算基于 DeepSeek 官方定价口径,采用前自行复核

正文完