forked from Gitlink/gitlink-cli
421 lines
8.7 KiB
Markdown
421 lines
8.7 KiB
Markdown
# 自动审查 PR 工作流
|
||
|
||
本文档展示如何使用 AI Agent 自动审查 PR,包括完整的自动化流程。
|
||
|
||
## 📋 场景描述
|
||
|
||
**场景**: 使用 Claude Code 等 AI Agent 自动审查 PR,从获取代码变更到生成审查报告,全程自动化。
|
||
|
||
**目标**:
|
||
1. AI 自动获取 PR 代码变更
|
||
2. AI 自动分析代码质量和安全问题
|
||
3. AI 自动生成结构化审查报告
|
||
4. 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)
|
||
|
||
1. **缺少输入验证** - `src/auth/login.go:30`
|
||
- 未验证用户名长度和格式
|
||
|
||
2. **资源泄漏** - `src/auth/login.go:78`
|
||
- 数据库连接未关闭
|
||
|
||
### ⭐ 优秀实践(1)
|
||
|
||
1. **优秀的错误处理** - `src/auth/user.go:120`
|
||
|
||
### 💡 改进建议
|
||
|
||
1. 修复 SQL 注入漏洞(必须)
|
||
2. 添加输入验证(必须)
|
||
3. 修复资源泄漏(建议)
|
||
4. 完善单元测试(建议)
|
||
|
||
### 📝 总结
|
||
|
||
代码整体质量良好,但存在 1 个必须修复的安全问题。
|
||
建议修复后再合并。
|
||
|
||
**审查结果**: ⚠️ 建议修改后合并
|
||
|
||
需要我添加这些审查意见到 PR 吗?
|
||
```
|
||
|
||
### 示例 2:重点审查安全性
|
||
|
||
**用户**:
|
||
```
|
||
审查 PR #456,重点关注安全性问题
|
||
```
|
||
|
||
**AI Agent**:
|
||
```
|
||
我来重点审查 PR #456 的安全性问题。
|
||
|
||
[获取 PR 信息...]
|
||
[分析代码变更...]
|
||
|
||
## 安全性审查报告
|
||
|
||
### 总体评分: 60/100 ⚠️
|
||
|
||
### 🔴 高危漏洞(2)
|
||
|
||
#### 1. SQL 注入漏洞
|
||
- **文件**: `src/api/users.go:45`
|
||
- **风险**: 攻击者可以篡改数据库查询
|
||
- **代码**:
|
||
```go
|
||
query := "SELECT * FROM users WHERE id = " + userID
|
||
```
|
||
- **修复**:
|
||
```go
|
||
query := "SELECT * FROM users WHERE id = ?"
|
||
db.Query(query, userID)
|
||
```
|
||
|
||
#### 2. 敏感信息泄露
|
||
- **文件**: `config/database.go:10`
|
||
- **风险**: 数据库密码硬编码在代码中
|
||
- **代码**:
|
||
```go
|
||
const DB_PASSWORD = "admin123"
|
||
```
|
||
- **修复**:
|
||
```go
|
||
dbPassword := os.Getenv("DB_PASSWORD")
|
||
```
|
||
|
||
### ⚠️ 中危漏洞(3)
|
||
|
||
1. **XSS 风险** - `src/views/user.go:78`
|
||
- 直接输出用户输入到 HTML
|
||
|
||
2. **缺少认证检查** - `src/api/admin.go:120`
|
||
- 管理员接口未验证权限
|
||
|
||
3. **输入验证缺失** - `src/api/users.go:30`
|
||
- 未验证用户输入长度和格式
|
||
|
||
### 📊 安全性统计
|
||
|
||
- 总计: 5 个安全漏洞
|
||
- 🔴 高危: 2 个
|
||
- ⚠️ 中危: 3 个
|
||
|
||
### 🚨 建议
|
||
|
||
**必须立即修复**:
|
||
1. 修复 SQL 注入漏洞
|
||
2. 移除硬编码的密码
|
||
3. 添加认证检查
|
||
|
||
**建议修复**:
|
||
1. 防御 XSS 攻击
|
||
2. 添加输入验证
|
||
|
||
**审查结果**: 🚨 不建议合并,存在严重安全风险
|
||
|
||
需要我生成详细的修复方案吗?
|
||
```
|
||
|
||
### 示例 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 流程中自动触发审查:
|
||
|
||
```yaml
|
||
# .gitlab-ci.yml
|
||
code_review:
|
||
stage: test
|
||
script:
|
||
- ./auto-review.sh $MR_ID
|
||
- check-score --min 70 review_report.json
|
||
only:
|
||
- merge_requests
|
||
```
|
||
|
||
## 💡 最佳实践
|
||
|
||
### 1. 定期自动审查
|
||
|
||
```bash
|
||
# 每小时自动审查新 PR
|
||
*/60 * * * * /path/to/auto-review-all.sh
|
||
```
|
||
|
||
### 2. 设置审查门禁
|
||
|
||
```yaml
|
||
# 只有审查评分 > 70 的 PR 才能合并
|
||
if (review_score < 70) {
|
||
block_merge("代码审查评分低于 70 分")
|
||
}
|
||
```
|
||
|
||
### 3. 通知开发者
|
||
|
||
```bash
|
||
# 审查完成后通知开发者
|
||
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**:
|
||
1. 提供完整的 diff 内容
|
||
2. 优化 AI 提示词
|
||
3. 根据项目类型调整审查规则
|
||
4. 定期更新审查规则
|
||
|
||
### Q: 如何处理误报?
|
||
|
||
**A**:
|
||
1. 设置置信度阈值
|
||
2. 人工验证高危问题
|
||
3. 提供反馈改进审查规则
|
||
4. 配置白名单
|
||
|
||
### Q: 如何集成到工作流?
|
||
|
||
**A**:
|
||
1. PR 创建时自动触发审查
|
||
2. 审查失败时阻止合并
|
||
3. 审查通过后允许人工审查
|
||
4. 定期生成审查报告
|
||
|
||
## 📚 相关文档
|
||
|
||
- [基础审查工作流](basic-review-workflow.md) - 手动审查
|
||
- [全面审查工作流](comprehensive-review-workflow.md) - 深度审查
|
||
- [SKILL.md](../SKILL.md) - 技能总览
|
||
|
||
---
|
||
|
||
*最后更新: 2026-06-12*
|