介绍
# PR Reviewer
GitHub 拉取请求的自动化代码审查。分析差异以发现安全问题、错误处理缺口、样式问题和测试覆盖率。
## 前置条件
- 已安装并经过身份验证的 `gh` CLI (`gh auth status`) - 仓库访问权限(至少为读取权限,发布评论需要写入权限) - 可选:`golangci-lint` 用于 Go 代码检查,`ruff` 用于 Python 代码检查
## 快速开始
```bash # Review all open PRs in current repo scripts/github/pr-reviewer.sh check
# Review a specific PR scripts/github/pr-reviewer.sh review 42
# Post review as GitHub comment scripts/github/pr-reviewer.sh post 42
# Check status of all open PRs scripts/github/pr-reviewer.sh status
# List unreviewed PRs (useful for heartbeat/cron integration) scripts/github/pr-reviewer.sh list-unreviewed ```
## 配置
设置这些环境变量,或者脚本会自动从当前的 git 仓库检测:
- `PR_REVIEW_REPO` — 格式为 `owner/repo` 的 GitHub 仓库(默认:从 `gh repo view` 检测) - `PR_REVIEW_DIR` — 用于代码检查的本地检出路径(默认:当前工作目录的 git 根目录) - `PR_REVIEW_STATE` — 状态文件路径(默认:`./data/pr-reviews.json`) - `PR_REVIEW_OUTDIR` — 报告输出目录(默认:`./data/pr-reviews/`)
## 写入目录
- **`PR_REVIEW_STATE`**(默认:`./data/pr-reviews.json`) — 跟踪已审查的 PR 及其 HEAD SHA - **`PR_REVIEW_OUTDIR`**(默认:`./data/pr-reviews/`) — Markdown 审查报告
## 检查内容
| 类别 | 图标 | 示例 | |----------|------|----------| | 安全 | 🔴 | 硬编码凭据、AWS 密钥、代码中的机密信息 | | 错误处理 | 🟡 | 丢弃的错误(Go `_ :=`)、裸 `except:`(Python)、未检查的 `Close()` | | 风险 | 🟠 | `panic()` 调用、`process.exit()` | | 样式 | 🔵 | 生产环境中的 `fmt.Print`/`print()`/`console.log`、非常长的行 | | 待办事项 | 📝 | TODO, FIXME, HACK, XXX 标记 | | 测试覆盖率 | 📊 | 源文件已更改但没有相应的测试更改 |
## 智能重新审查
跟踪每个 PR 的 HEAD SHA。仅当推送新提交时才重新审查。使用 `review <PR#>` 强制重新审查。
## 报告格式
报告以 markdown 文件形式保存在输出目录中。每份报告包括:
- PR 元数据(作者、分支、更改) - 提交列表 - 按语言/类型分类的更改文件 - 自动差异发现,包含文件、行、类别和上下文 - 测试覆盖率分析 - 本地代码检查结果(当仓库在本地检出时) - 总结裁定:🔴 安全问题 / 🟡 需要注意 / 🔵 次要备注 / ✅ 看起来不错
## 心跳/Cron 集成
添加到定期检查(心跳、cron 任务或 CI):
```bash UNREVIEWED=$(scripts/github/pr-reviewer.sh list-unreviewed) if [ -n "$UNREVIEWED" ]; then scripts/github/pr-reviewer.sh check fi ```
## 扩展
脚本中的分析模式按语言组织。通过在 `analyze_diff()` 函数中追加到相关的模式列表来添加新模式:
```python # Add a new Go pattern go_patterns.append((r'^\+.*os\.Exit\(', 'RISK', 'Direct os.Exit() — consider returning error')) ```