核心用法
PR Reviewer 是一个面向 GitHub 仓库的自动化代码审查脚本工具,主要用于在合并前捕获潜在问题。它通过 gh CLI 获取 PR 的 diff 内容,结合正则模式匹配和本地 linter(golangci-lint、ruff)执行多维度分析,最终生成 Markdown 格式的审查报告。
工作流程:
1. 调用 gh pr view/diff 获取 PR 元数据和变更内容
2. 按语言分类(Go/Python/JavaScript/TypeScript)应用内置检测模式
3. 可选执行本地 lint 检查(需仓库 checkout)
4. 生成结构化报告并保存至指定目录
5. 支持将评论直接发布到 GitHub PR
检测维度:
| 类别 | 检测内容 |
|------|---------|
| 🔴 安全 | 硬编码凭证、AWS 密钥、secrets 泄露 |
| 🟡 错误处理 | Go 的 `_ :=` 丢弃错误、Python 裸 `except:`、未检查的 `Close()` |
| 🟠 风险代码 | `panic()`、`process.exit()` 等危险调用 |
| 🔵 代码风格 | 生产环境残留 `fmt.Print`/`console.log`、超长行 |
| 📝 TODO 标记 | TODO/FIXME/HACK/XXX 追踪 |
| 📊 测试覆盖 | 源文件变更但无对应测试文件变更 |
智能重审机制:记录每个 PR 的 HEAD SHA,仅在新提交推送时触发重新审查,避免重复劳动。
显著优点
- 开箱即用:单一 bash 脚本,依赖仅为
ghCLI 和可选 linter - 多语言支持:覆盖 Go、Python、JavaScript/TypeScript 主流栈
- 状态持久化:JSON 状态文件跟踪审查历史,支持 cron/heartbeat 集成
- 可扩展架构:通过修改
analyze_diff()中的 pattern 列表即可添加新规则 - CI 友好:返回码和
list-unreviewed子命令便于自动化流水线集成
潜在局限与风险
| 局限 | 说明 |
|-----|------|
| 静态分析限制 | 基于正则的模式匹配,无法替代深度语义分析或 SAST 工具(如 CodeQL、Semgrep) |
| 误报率 | 简单的正则可能产生误报(如注释中的 "TODO" 被标记) |
| gh CLI 依赖 | 完全依赖 GitHub CLI 的认证状态,token 权限不足会导致静默失败 |
| 本地 lint 耦合 | 完整功能需要本地仓库 checkout,纯远程模式仅能做 diff 分析 |
| 并发安全 | 状态文件为本地 JSON,多进程同时写入可能存在竞态条件 |
| 无策略配置 | 缺乏 severity 阈值、忽略规则、团队配置等高级功能 |
适用人群
- 小型团队需要轻量级、零成本的 PR 预检流程
- 个人开发者管理多个开源项目,需要批量审查 open PR
- 已有 CI 流水线,希望补充快速安全扫描层(非替代完整 SAST)
- 需要生成结构化审查报告用于审计或团队同步的场景
常规风险
1. 凭证泄露风险:脚本需 gh CLI 认证,若运行环境(如共享 CI runner)未妥善隔离,可能导致 GitHub token 暴露
2. 权限放大:post 子命令需要写权限,错误的 token 配置可能意外暴露评论到生产仓库
3. 规则绕过:简单的正则模式可被刻意构造的代码绕过(如字符串拼接的 os.Exit)
4. 数据残留:状态文件和报告目录默认写入 ./data/,若未加入 .gitignore 可能意外提交敏感信息(如内部 PR 分析结果)
5. 供应链风险:依赖 gh CLI 和 linter 的二进制,若安装源不可信可能引入恶意工具链