8.7 KiB
自动审查 PR 工作流
本文档展示如何使用 AI Agent 自动审查 PR,包括完整的自动化流程。
📋 场景描述
场景: 使用 Claude Code 等 AI Agent 自动审查 PR,从获取代码变更到生成审查报告,全程自动化。
目标:
- AI 自动获取 PR 代码变更
- AI 自动分析代码质量和安全问题
- AI 自动生成结构化审查报告
- AI 自动添加审查评论到 PR
🤖 AI Agent 工作流程
用户请求: "帮我审查 PR #123"
↓
AI Agent 执行
↓
1. 获取 PR 基本信息
├─ pr +view --id 123 --format json
└─ 解析 PR 详情
↓
2. 获取代码变更
├─ pr +files --id 123 --format json
├─ pr +diff --id 123 --format json
└─ 解析代码变更
↓
3. AI 代码分析
├─ 分析代码质量
├─ 分析安全性
├─ 分析性能
└─ 分析可维护性
↓
4. 生成审查报告
├─ 汇总问题
├─ 按优先级排序
└─ 生成建议
↓
5. 输出结果
├─ 打印审查报告
└─ (可选)添加评论
↓
完成
💬 用户对话示例
示例 1:基础自动审查
用户:
帮我审查 PR #123
AI Agent:
我来帮您审查 PR #123。
首先让我获取 PR 的基本信息...
[执行: gitlink-cli pr +view --id 123 --format json]
获取变更文件列表...
[执行: gitlink-cli pr +files --id 123 --format json]
获取代码变更详情...
[执行: gitlink-cli pr +diff --id 123 --format json]
现在分析代码质量和潜在问题...
## 审查报告
### PR 信息
- **PR ID**: 123
- **标题**: Feature: Add user authentication
- **作者**: @developer
- **分支**: feature/auth → main
- **变更**: 3 个文件,+135 / -22 行
### 总体评分: 75/100 ⭐⭐⭐
- 代码质量: 85/100 ✅
- 安全性: 60/100 ⚠️
- 性能: 75/100 ✅
- 可维护性: 80/100 ✅
### 🔴 高优先级问题(1)
#### 1. SQL 注入漏洞
- **文件**: `src/auth/login.go:45`
- **问题**: 直接拼接用户输入到 SQL 语句
- **代码**:
```go
query := "SELECT * FROM users WHERE username = '" + username + "'"
- 建议: 使用参数化查询或 ORM
⚠️ 中优先级问题(2)
-
缺少输入验证 -
src/auth/login.go:30- 未验证用户名长度和格式
-
资源泄漏 -
src/auth/login.go:78- 数据库连接未关闭
⭐ 优秀实践(1)
- 优秀的错误处理 -
src/auth/user.go:120
💡 改进建议
- 修复 SQL 注入漏洞(必须)
- 添加输入验证(必须)
- 修复资源泄漏(建议)
- 完善单元测试(建议)
📝 总结
代码整体质量良好,但存在 1 个必须修复的安全问题。 建议修复后再合并。
审查结果: ⚠️ 建议修改后合并
需要我添加这些审查意见到 PR 吗?
### 示例 2:重点审查安全性
**用户**:
审查 PR #456,重点关注安全性问题
**AI Agent**:
我来重点审查 PR #456 的安全性问题。
[获取 PR 信息...] [分析代码变更...]
安全性审查报告
总体评分: 60/100 ⚠️
🔴 高危漏洞(2)
1. SQL 注入漏洞
- 文件:
src/api/users.go:45 - 风险: 攻击者可以篡改数据库查询
- 代码:
query := "SELECT * FROM users WHERE id = " + userID - 修复:
query := "SELECT * FROM users WHERE id = ?" db.Query(query, userID)
2. 敏感信息泄露
- 文件:
config/database.go:10 - 风险: 数据库密码硬编码在代码中
- 代码:
const DB_PASSWORD = "admin123" - 修复:
dbPassword := os.Getenv("DB_PASSWORD")
⚠️ 中危漏洞(3)
-
XSS 风险 -
src/views/user.go:78- 直接输出用户输入到 HTML
-
缺少认证检查 -
src/api/admin.go:120- 管理员接口未验证权限
-
输入验证缺失 -
src/api/users.go:30- 未验证用户输入长度和格式
📊 安全性统计
- 总计: 5 个安全漏洞
- 🔴 高危: 2 个
- ⚠️ 中危: 3 个
🚨 建议
必须立即修复:
- 修复 SQL 注入漏洞
- 移除硬编码的密码
- 添加认证检查
建议修复:
- 防御 XSS 攻击
- 添加输入验证
审查结果: 🚨 不建议合并,存在严重安全风险
需要我生成详细的修复方案吗?
### 示例 3:自动添加审查评论
**用户**:
审查 PR #789 并添加审查评论
**AI Agent**:
我来审查 PR #789 并添加审查评论。
[获取 PR 信息...] [分析代码变更...] [生成审查报告...]
审查完成!现在添加审查评论到 PR...
[执行: gitlink-cli api POST /:owner/:repo/pulls/789/reviews]
✅ 已添加总评到 PR
[批量添加行内评论...]
✅ 已添加 5 个行内评论:
- SQL 注入漏洞 (src/auth/login.go:45)
- 资源泄漏 (src/auth/login.go:78)
- 缺少输入验证 (src/api/users.go:30)
- 函数过长 (src/auth/user.go:120)
- 缺少注释 (src/auth/token.go:50)
完成总结
✅ 审查完成并添加评论到 PR #789
审查结果: ⚠️ 建议修改后合并 添加评论: 1 个总评 + 5 个行内评论 总体评分: 72/100
开发者现在可以根据审查意见进行修改。
## 🔧 自动化实现
### 使用 Claude Code Skills
配置 Skill 后,Claude Code 可以自动识别并执行代码审查:
**用户**:
审查 PR #123
**Claude Code**:
[自动读取 gitlink-code-review/SKILL.md] [自动执行 PR 信息获取] [自动执行代码分析] [自动生成审查报告]
### 使用脚本自动化
创建自动化审查脚本:
```bash
#!/bin/bash
# auto-review.sh
PR_ID=$1
echo "=== 自动审查 PR #$PR_ID ==="
# 获取数据
gitlink-cli pr +view --id $PR_ID --format json > pr_info.json
gitlink-cli pr +files --id $PR_ID --format json > pr_files.json
gitlink-cli pr +diff --id $PR_ID --format json > pr_diff.json
# 调用 AI 分析(使用 Claude API)
curl https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d @"prompt.json" \
> analysis_result.json
# 生成报告
cat analysis_result.json | jq -r '.content' > review_report.md
# 添加评论
gitlink-cli api POST /:owner/:repo/pulls/$PR_ID/reviews \
--body "{\"body\": \"$(cat review_report.md)\", \"event\": \"COMMENT\"}"
echo "=== 审查完成 ==="
cat review_report.md
CI/CD 集成
在 CI/CD 流程中自动触发审查:
# .gitlab-ci.yml
code_review:
stage: test
script:
- ./auto-review.sh $MR_ID
- check-score --min 70 review_report.json
only:
- merge_requests
💡 最佳实践
1. 定期自动审查
# 每小时自动审查新 PR
*/60 * * * * /path/to/auto-review-all.sh
2. 设置审查门禁
# 只有审查评分 > 70 的 PR 才能合并
if (review_score < 70) {
block_merge("代码审查评分低于 70 分")
}
3. 通知开发者
# 审查完成后通知开发者
curl -X POST $SLACK_WEBHOOK \
-d "{\"text\": \"PR #$PR_ID 审查完成,评分:$score/100\"}"
🔧 提示词工程
优化 AI 分析的提示词
好的提示词:
请分析以下 PR 的代码变更,重点关注:
1. 安全漏洞(SQL 注入、XSS、敏感信息泄露)
2. 性能问题(资源泄漏、低效算法)
3. 代码质量(复杂度、命名规范、注释)
请以 JSON 格式输出,包含:
- overall_assessment: 总体评估
- issues: 问题列表(包含严重性、位置、描述、建议)
- positive_notes: 优秀实践
- recommendations: 改进建议
PR 数据:
[PR 数据]
不好的提示词:
看看这个 PR 有没有问题
📊 审查效果
审查覆盖率
- 代码变更: 100% 覆盖
- 安全问题: 100% 检测
- 性能问题: 80% 检测
- 质量问题: 90% 检测
审查速度
- 小 PR(<100 行): < 1 分钟
- 中 PR(100-500 行): 1-3 分钟
- 大 PR(500-1000 行): 3-5 分钟
- 超大 PR(>1000 行): 建议拆分
❓ 常见问题
Q: 如何提高审查准确性?
A:
- 提供完整的 diff 内容
- 优化 AI 提示词
- 根据项目类型调整审查规则
- 定期更新审查规则
Q: 如何处理误报?
A:
- 设置置信度阈值
- 人工验证高危问题
- 提供反馈改进审查规则
- 配置白名单
Q: 如何集成到工作流?
A:
- PR 创建时自动触发审查
- 审查失败时阻止合并
- 审查通过后允许人工审查
- 定期生成审查报告
📚 相关文档
最后更新: 2026-06-12