跳到正文

用 GitHub Actions 做多模型代码审查

单模型做代码审查有视角盲区,误报、漏报都难消除。让 2–3 个模型并行独立审查同一个 PR,再合并去重、标注置信度,正确率明显高于单模型。GitHub 的 claude-code-action 只会说 Anthropic 协议——靠网关的协议互通,qwen3.8-maxkimi-k3 这类非 Anthropic 模型也能进入审查队列;一把网关访问密钥统一承接所有审查流量,凭证集中、成本可计量。

场景背景与「为什么经网关」见 增强模型能力 场景三。

配好后的体验:每次 PR 打开或更新,审查 job 自动运行,模型在 PR 下发布审查评论(发现项 + 机器可解析的 TODO 修复清单);多模型模式额外带置信度标注。开发者还可以在评论区 @claude 追问,触发带上下文的再次审查。

工作原理

PR 打开/更新(或 @claude 评论)
    → GitHub Actions 触发审查 job
    → 经网关调用审查模型(ANTHROPIC_BASE_URL 指向网关,网关做协议互译)
    → 多模型并行独立审查 → 汇总去重、标注共识 → 发布一条 PR 评论

现成组件:开源的 gatellm-io/gatellm-code-review 封装了 anthropics/claude-code-action,自带 PR 行数门限、历史评论最小化、短结果重试、@claude 追问触发。下面按 5 步配齐。

前置

  • 网关已运行、能登录控制台(还没部署先走 Docker 单机
  • 已设 ENCRYPTION_KEY(保存上游与签发密钥都要用,见 Docker 单机 → 前置
  • 参与审查的模型已在网关配好上游
  • 对目标 GitHub 仓库有管理员权限(要配 Secrets / Variables)

第 1 步:网关侧配好审查模型

控制台 → 上游与模型,确认参与审查的模型(如 qwen3.8-maxkimi-k3)已建好。大 PR 多的话,优先用带 [1m] 后缀的 1M 上下文窗口变体。注意 [1m] 只是模型名的一部分(命名约定),不是审查流程的语法要求——带不带后缀都是合法模型名,以你网关里的实际配置为准;所以下文示例里 qwen3.8-maxqwen3.8-max[1m] 两种写法都有效。

模型名在后面两处会用到:单模式的 CODE_REVIEW_MODEL、多模式的 CODE_REVIEW_MODELS / summary_model它们必须与网关里的模型名逐字一致,否则审查请求打过去就是 404 model_not_found

第 2 步:为 CI 签发专用访问密钥

控制台 → 访问密钥:

  1. 新建一个密钥组models 只勾选审查用的模型(最小权限;机制见 多租户隔离)。
  2. 签发一把访问密钥挂到该组,记下来——它要放进 GitHub Secret。
  3. 给这把密钥设 RPM / 并发上限(RATE_LIMIT_*):多模型审查是并行请求,限流避免挤占生产流量。

控制台实际界面(截图为英文 UI,中文 UI 对应「访问控制 / 访问密钥 / 密钥组 / 添加访问密钥」):

Key Groups 页签:密钥组列表,Models 与 Load Balancers 是两个独立授权维度

Edit Group:Models 页签按上游分组列出全部模型,逐个勾选该组可达的模型(* (All Models) 为全选);CI 密钥组只勾审查模型

组里勾的是模型完整名称(带上游前缀)——与控制台模型列表是同一份清单。

Add Access Key:生成 API Key、填 Name、在 Group 勾选所属密钥组后保存

Access Keys 页签:签发后的密钥列表,显示掩码密钥、所属组与状态;点该行复制按钮取完整密钥,放进 GitHub Secret

专用密钥的好处:审查开销与业务流量天然分账;出问题时吊销密钥即刻切断审查流量。

第 3 步:GitHub 侧配凭证

仓库 Settings → Secrets and variables → Actions(多仓库共用可放组织级):

类型名称
SecretCODE_REVIEW_API_KEY第 2 步签发的网关访问密钥
VariableCODE_REVIEW_BASE_URL网关根地址,如 http://your-gateway:7890不带 /v1,Claude Code 自己拼)
VariableCODE_REVIEW_MODEL单模式用的审查模型名,如 qwen3.8-max
VariableCODE_REVIEW_MODELS多模式用的逗号分隔列表,如 qwen3.8-max[1m],kimi-k3[1m]
VariableCODE_REVIEW_SUMMARY_MODEL多模式的汇总模型(可选,留空取列表第一个)

第 4 步:添加 workflow 文件

两种接法,按需求二选一。

接法 A:单模型审查(Composite Action,快速上手)

新建 .github/workflows/claude-code-review.yml。下面这份改三处即可用:branchesruns-on、模型变量:

yaml
name: Claude Code Review

on:
  pull_request:
    types: [opened, synchronize, reopened]
    branches: [main]          # ← 只审查指向该分支的 PR,按你的默认分支改
  issue_comment:
    types: [created]

jobs:
  claude-review:
    # 两种触发:PR 打开/更新;或有人在 PR 评论里 @claude 追问
    if: >-
      github.event_name == 'pull_request' ||
      (github.event_name == 'issue_comment' &&
       github.event.issue.pull_request != null &&
       github.event.comment.user.type != 'Bot' &&
       contains(github.event.comment.body, '@claude'))
    runs-on: ubuntu-latest    # ← 可换自托管 runner 标签,如 [code-review, arm64]
    permissions:
      contents: read
      pull-requests: write
      issues: write
      actions: read
    # 同一 PR 的新推送会取消进行中的旧审查,只留最新一轮
    concurrency:
      group: claude-review-${{ github.event.pull_request.number || github.event.issue.number }}-${{ github.event_name }}
      cancel-in-progress: true
    steps:
      - name: Checkout repository
        uses: actions/checkout@v7
        with:
          fetch-depth: 1

      - name: Run Claude Auto Review
        uses: gatellm-io/gatellm-code-review@v1
        with:
          # 凭证:指向你的网关
          anthropic_api_key: ${{ secrets.CODE_REVIEW_API_KEY }}
          anthropic_base_url: ${{ vars.CODE_REVIEW_BASE_URL }}

          # 业务参数(均有默认值,按需覆盖)
          model: ${{ vars.CODE_REVIEW_MODEL }}   # 必须显式转发:composite action 读不到 vars
          # max_lines: 10000                     # PR 变更行数超上限则跳过;-1 = 不限
          # review_language: "Simplified Chinese"  # 审查评论语言,默认 English
          # prompt: |                            # 覆盖默认审查提示词
          #   自定义...

要点:

  • 审查模型同样可以是 qwen3.8-maxkimi-k3 这类非 Anthropic 模型——claude-code-action 说的是 Anthropic 协议,网关负责翻译。
  • runner 没预装 Claude CLI 时 action 会自动安装;自托管 runner 预装了则直接复用。
  • 评论短于 100 字符会判定审查失败并自动重试一次,无需额外处理。

接法 B:多模型共识审查(Reusable Workflow,推荐)

多模型才有共识置信度。新建 .github/workflows/pr-review.yml,整段调用三阶段工作流(setup → review 矩阵 → summarize):

yaml
name: PR Review
on:
  pull_request:
    types: [opened, synchronize, reopened]
  issue_comment:
    types: [created]

jobs:
  claude-review:
    if: >-
      github.event_name == 'pull_request' ||
      (github.event_name == 'issue_comment' &&
       github.event.issue.pull_request != null &&
       github.event.comment.user.type != 'Bot' &&
       contains(github.event.comment.body, '@claude'))
    uses: gatellm-io/gatellm-code-review/.github/workflows/claude-auto-review.yml@v1
    secrets: inherit   # 把 CODE_REVIEW_API_KEY 等透传给子工作流
    with:
      runs_on: "ubuntu-latest"          # 或自托管 runner 标签
      models: "qwen3.8-max[1m],kimi-k3[1m]"   # 2–3 个,超过 3 个会截断
      summary_model: "qwen3.8-max"
      review_language: "Simplified Chinese"    # 审查评论用中文

要点:

  • models 给 ≥2 个才启用多模型模式;只给 1 个(或留空走 model)则自动回退单模型直评。
  • permissions / concurrency 都由子工作流内置,调用方不用操心。
  • 多仓库统一改模型组合时,把 models 换成 ${{ vars.CODE_REVIEW_MODELS }} 即可集中管理。

第 5 步:验证

  1. 开一个测试 PR(随便改一行),Actions 里应出现审查 job 并开始运行。
  2. job 完成后 PR 页面出现审查评论:多模型模式下发现项带 [Consensus N/M] / [Single model] 标注。
  3. 控制台 → 日志,能看到审查流量经网关(User-Agent 含 gatellm-claude-code-review);→ 统计按模型查看审查用量。
  4. 在 PR 评论区回复 @claude 重点看并发安全,应触发一次带该请求的再次审查。

没跑通时

  • job 报 401 → CODE_REVIEW_API_KEY 填错或密钥被禁用。
  • 报 404 model_not_found → 模型变量与网关模型名不一致,回第 1 步核对。
  • 连不上网关 / 超时 → GitHub-hosted runner 只能访问公网地址;内网网关要用自托管 runner 或打通网络。
  • job 成功但没评论 → 查看 Actions artifacts 里的执行日志定位。

产出长什么样

  • 发现项带置信度(多模型):[Consensus N/M] 表示 N 个模型独立得出同样结论(M 为参与模型数),[Single model] 表示单模型独有发现,采信优先级一目了然。
  • 评论结构固定:Findings(按严重度排序、带 file:line)→ ## TODO Fix List(机器可解析,[P0][P3] 分级,可直接交给 coding AI 认领修复)→ Requires manual attention(需人工把关项);多模式底部折叠区块保留每个模型的原始审查。
  • 护栏:PR 变更行数超 max_lines(默认 10000)自动跳过,手动重跑可强制;每轮审查前历史 Claude 评论自动折叠为 OUTDATED,PR 不积噪声。

完整输入项、权限要求与行为细节见该仓库的 README

常见问题

Q:每个 PR 都审,评论会刷屏吗? 不会。每轮审查开始前,action 会把该 PR 上历史 Claude 评论自动折叠为 OUTDATED,PR 时间线里只留最新一轮的展开评论;超大 PR(超 max_lines)默认直接跳过。

Q:审查费用怎么算? 按各审查模型分别计价、网关统一汇总,统计与账单里体现为各审查模型的用量。见 定价与计费

下一步增强模型能力 看场景全貌;Claude Code 经网关接入 看 Claude Code 的基础接法;多租户隔离 看最小权限密钥组的设计。