Claude Code GitHub Actions 可以在 Issue 或 Pull Request 中响应 @claude,也可以在 PR 打开或更新时自动执行 /review。它适合补充人工 Review,但默认示例不能直接等同于生产安全配置。
真正需要设计的是触发条件、GitHub Token 权限、模型凭据、允许工具、提示词来源、Fork PR 和费用上限。配置过宽时,一个普通评论就可能触发昂贵任务;使用错误事件时,不可信代码甚至可能接触仓库 Secret。
本文使用 Anthropic 官方 anthropics/claude-code-action@v1 接口,先建立按需触发,再添加自动审查。示例中的模型 ID不硬编码,以免发布后迅速过时;由账户可用模型和官方当前文档决定。
两种工作流不要混为一谈
交互式模式由评论中的 @claude 触发,适合:
- 解释某段变更;
- 根据 Review 意见修复代码;
- 从 Issue 创建实现;
- 只在人工需要时消耗模型额度。
自动模式由 pull_request 事件触发,适合:
- 每次新 PR 做基础检查;
- 新提交后重新审查;
- 对关键目录强制执行统一规则;
- 在人工 Review 前发现明显问题。 小团队建议先启用交互模式,收集使用数据后再决定是否对每个 PR 自动运行。
准备 GitHub 和 Anthropic 权限
你需要:
- 有权安装 GitHub App 的仓库管理员;
- Anthropic API Key,或受支持的 Bedrock/Vertex 配置;
- 可以创建 Actions Secret 和工作流文件的权限;
- 一个用于验证的测试仓库或测试分支。 不要用生产仓库中的第一个真实 PR 做试验。测试仓库应包含几类已知缺陷和几段安全代码,以便同时观察漏报与误报。
官方推荐可在 Claude Code 中运行 GitHub App 安装流程;若自动安装失败,也可以手动安装 Claude GitHub App,创建 Secret,再添加工作流。
创建 ANTHROPIC_API_KEY Secret
在 GitHub 仓库进入:
|
|
Secret 名称使用:
|
|
值只粘贴一次,不要保存到工作流、CLAUDE.md、Issue 或本地示例文件。
组织仓库可以使用 Organization Secret,但要限制可访问仓库,而不是默认开放给所有仓库。
定期轮换 Key,并在 Anthropic 控制台观察异常使用。删除工作流并不会自动撤销已经泄露的 Key。
先部署按需 @claude 模式
创建 .github/workflows/claude.yml:
|
|
该示例有意使用 contents: read。如果你希望 Claude 直接提交代码或创建分支,需要增加写权限,但应在确认只读流程安全后再做。
提交工作流后,在测试 Issue 中输入:
|
|
检查 Actions 日志、回复账号、持续时间和模型费用。
自动 PR Review 工作流
另建 .github/workflows/claude-review.yml:
|
|
synchronize 会在 PR 推送新提交时触发。cancel-in-progress: true 可以取消同一 PR 的旧审查,避免连续推送产生重复费用和过时评论。
timeout-minutes 是 GitHub Job 上限,--max-turns 是 Claude 执行回合限制,两者都要配置。
为什么不建议直接写 contents: write
代码审查只需要读取内容并写入 PR 评论。开放 contents: write 会让 Action 获得修改仓库内容的能力,超出单纯 Review 的需要。
权限应按任务拆分:
| 任务 | 建议权限 |
|---|---|
| 读取代码 | contents: read |
| 评论 PR | pull-requests: write |
| 回复 Issue | issues: write |
| 创建提交 | 单独工作流评估后开放 |
| 访问其他仓库 | 不默认授予 |
| 仓库默认 Token 权限也应设为只读,个别工作流再显式提升。 |
如果使用自定义 GitHub App,检查 App 的 Contents、Issues、Pull requests 权限,不要勾选 Administration、Secrets 或组织管理权限。
Fork PR 是最容易踩的安全坑
来自外部 Fork 的 pull_request 工作流通常拿不到仓库 Secret,这是 GitHub 用来保护凭据的限制。
不要为了让外部 PR 自动审查而简单改成:
|
|
pull_request_target 在目标仓库上下文运行并能访问 Secret。如果随后检出 Fork 提交并执行其中代码,攻击者可能窃取 Token 和 API Key。
安全选择包括:
- 外部 Fork 只做不需要 Secret 的静态检查;
- 维护者确认后通过受控命令触发;
- 不执行 PR 中的脚本、构建步骤和自定义 Action;
- 将 AI Review 放在隔离、低权限的人工批准环境;
- 对内部成员和外部贡献者使用不同工作流。 任何能修改工作流本身的 PR 都应额外谨慎。
用 CLAUDE.md 定义仓库规则
在仓库根目录创建 CLAUDE.md,写入短而可验证的要求:
|
|
规则要针对仓库真实故障模式。不要复制几百行通用风格指南,否则模型注意力会被稀释,Token 也会增加。 代码风格问题优先交给 ESLint、Ruff、golangci-lint、Checkstyle 或格式化工具,Claude 集中处理上下文相关问题。
自定义 Review 提示
若 /review 太宽,可以使用 prompt:
|
|
不要要求它“一定找出五个问题”。这种指标会诱导模型产生低质量评论。 也不要把 PR 标题或评论直接拼接成系统指令。用户提交的文本属于不可信输入。
限制工具与回合
官方 Action 的 claude_args 可以传递 CLI 参数,例如 --max-turns、--model、--mcp-config 和允许工具。
审查任务通常不需要写文件、执行部署或访问外部系统。仅开放读取和搜索所需能力。 示意写法:
|
|
允许工具名称和语法可能随 Claude Code 版本变化,提交前要与官方当前文档核对。 MCP Server 会扩大可访问数据范围。不要把生产数据库、工单系统或云管理 MCP 接入普通 PR Review。
路径过滤减少无效运行
纯文档或依赖锁文件变更可能不值得运行昂贵审查。可以在事件层限定路径:
|
|
但路径排除不能过度。认证配置、基础设施代码和 CI 工作流本身也可能很关键。 大型 Monorepo 可以为前端、后端和基础设施使用不同工作流与规则,避免把整个仓库上下文塞进一次审查。
防止评论重复和过期
同一 PR 连续 Push 时,旧审查可能还没完成。使用并发组取消旧 Job只是第一步。 还要在提示中要求只评论当前 Head SHA,并在人工处理评论前核对它对应的提交。 如果 Action 支持更新现有摘要而不是不断新增评论,优先使用官方推荐方式。否则可以把详细结果放在一次 Review 中,避免每个问题生成独立噪声。 过期评论不要自动标记为已解决,除非能确认相关代码确实变化。
怎样评价 Review 质量
准备至少 10 个小 PR,覆盖:
- 正常功能变更;
- 空值或边界错误;
- 权限检查遗漏;
- SQL 注入或 XSS;
- 资源泄漏;
- 并发竞态;
- 缺失测试;
- 只有格式变化;
- 生成代码变化;
- 安全但看起来可疑的代码。 每条评论标记为:确认问题、可能问题、误报、无法验证。 计算两个最实用指标:
|
|
同时记录漏报。评论很少不等于质量高,可能只是 Recall 很低。
成本控制要记录到 PR 级别
每周统计:
- 自动触发次数;
- 被取消的重复任务;
- 平均执行时间;
- 平均 Token 或费用;
- 每个有效问题的成本;
- 没有代码价值的运行次数。 降低费用的顺序通常是:
- 减少无关触发;
- 缩小文件范围;
- 取消过时任务;
- 限制回合;
- 调整模型;
- 优化规则长度。
只换便宜模型却继续对每次文档 Push 全库审查,节省有限。
将结果设为合并门禁之前
前两到四周把 Claude Review 作为非阻断检查。人工 Reviewer 可以参考,但不要求所有 AI 评论都解决。 只有同时满足下列条件才考虑门禁:
- 结果在多次运行中稳定;
- 误报率可接受;
- 评论能对应当前提交;
- 工作流失败有明确降级方式;
- API 故障不会永久阻塞紧急修复;
- 团队知道如何申诉错误评论;
- 费用和延迟有预算。 即使成为门禁,也应让确定性测试、静态分析和人工审批保持独立。
常见错误
Action 没有响应 @claude
检查工作流事件是否包含当前评论类型、GitHub App 是否安装到这个仓库、Job 的 if 条件是否匹配,以及 Actions 是否被组织策略禁用。
ANTHROPIC_API_KEY 为空
确认 Secret 名称完全一致。Fork PR 拿不到 Secret 通常是预期行为,不要在日志中打印变量确认。
返回 403 或无法评论 PR
检查 permissions 是否包含 pull-requests: write,组织是否限制 GitHub App,工作流是否由只读上下文触发。
每次 Push 都出现多组重复评论
增加 PR 编号并发组和 cancel-in-progress: true,确认没有两份相似工作流同时运行。
审查只谈格式问题
在 CLAUDE.md 和提示中明确格式由 Linter 处理,要求提供可复现行为与风险路径。
执行时间达到上限
检查 PR 大小、允许工具、回合数和 MCP 调用。超大 PR 应拆分,不要仅把超时改成一小时。
一套稳妥的启用顺序
第一周只开放内部成员使用 @claude,权限保持只读,记录费用与误报。
第二周对关键源码目录启用自动 /review,连续 Push 自动取消旧任务。
第三周根据数据精简 CLAUDE.md,区分安全、后端和前端规则。
之后再决定是否允许 Claude 创建修复提交,以及是否将某些结果变成合并要求。
Claude Code Review 的价值不在于评论数量,而在于用可控成本补充人工容易忽略的上下文问题。最小权限、可复现规则和真实误报统计,比一份看起来复杂的工作流更重要。