forked from Gitlink/gitlink-cli
10 KiB
10 KiB
全面审查工作流示例
本文档展示一个完整的代码审查工作流,包括数据获取、AI 分析、报告生成和评论集成。
📋 场景描述
场景: Reviewer 需要对一个 PR 进行全面的代码审查,包括代码质量、安全性、性能等多个维度。
目标:
- 获取完整的 PR 代码变更数据
- 使用 AI 进行多维度代码分析
- 生成结构化的审查报告
- 将审查意见添加为 PR 评论
🔄 工作流程
开始全面审查
↓
1. 获取 PR 基本信息
├─ 获取 PR 详情
├─ 获取变更文件列表
└─ 获取 diff 内容
↓
2. 数据预处理
├─ 过滤无关文件
├─ 提取代码片段
└─ 组织分析数据
↓
3. AI 代码分析
├─ 代码质量检查
├─ 安全性检查
├─ 性能检查
└─ 可维护性检查
↓
4. 生成审查报告
├─ 汇总分析结果
├─ 按优先级排序问题
└─ 生成改进建议
↓
5. 输出审查报告
├─ 打印 JSON 格式(AI 解析)
└─ 打印 Markdown 格式(人类阅读)
↓
6. (可选)添加评论到 PR
↓
完成
🔧 实施步骤
步骤 1:获取 PR 基本信息
# 1.1 获取 PR 详情
gitlink-cli pr +view --id 123 --format json > pr_info.json
# 1.2 获取变更文件列表
gitlink-cli pr +files --id 123 --format json > pr_files.json
# 1.3 获取 diff 内容
gitlink-cli pr +diff --id 123 --format json > pr_diff.json
# 验证数据获取成功
echo "=== PR 信息 ===" && cat pr_info.json | jq '.ok'
echo "=== 变更文件 ===" && cat pr_files.json | jq '.data.total_files'
echo "=== Diff 大小 ===" && cat pr_diff.json | jq '.data | length'
步骤 2:数据预处理
# 2.1 过滤代码文件(排除二进制、配置、文档文件)
cat pr_files.json | jq '.data.files[] |
select(.filename | test("\\.(go|js|ts|py|java|rb)$"))' > code_files.json
# 2.2 统计代码文件
CODE_FILES_COUNT=$(cat code_files.json | jq 'length')
echo "代码文件数: $CODE_FILES_COUNT"
# 2.3 提取主要变更文件
cat pr_files.json | jq '.data.files |
map(select(.changes > 10)) |
sort_by(.changes) | reverse' > main_changes.json
步骤 3:准备 AI 分析数据
# 3.1 组织分析数据
cat > analysis_input.json <<EOF
{
"pr_info": $(cat pr_info.json | jq '.data'),
"files": $(cat pr_files.json | jq '.data.files'),
"diff": $(cat pr_diff.json | jq -r '.data.diff')
}
EOF
# 3.2 验证数据格式
cat analysis_input.json | jq '.'
步骤 4:AI 代码分析(使用 Claude)
方式 1:使用 Claude Code(推荐)
用户: "请分析 PR #123 的代码变更,检查代码质量、安全性和性能问题"
AI Agent 将:
1. 读取 analysis_input.json
2. 分析代码质量和潜在问题
3. 生成结构化的审查报告
4. 输出 JSON 和 Markdown 格式报告
方式 2:使用 Claude API
# 调用 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 '{
"model": "claude-3-5-sonnet-20240620",
"max_tokens": 4096,
"messages": [
{
"role": "user",
"content": "请分析以下 PR 的代码变更,检查代码质量、安全性和性能问题。输出 JSON 格式的审查报告。\n\nPR 数据:\n'$(cat analysis_input.json)'"
}
]
}' > analysis_result.json
步骤 5:生成审查报告
# 5.1 提取 JSON 报告
cat analysis_result.json | jq -r '.content' > review_report.json
# 5.2 生成 Markdown 报告
cat analysis_result.json | jq -r '.content' > review_report.md
# 5.3 验证报告格式
cat review_report.json | jq '.overall_assessment'
cat review_report.md | head -50
步骤 6:输出审查报告
# 6.1 打印概要信息
echo "=== 代码审查报告 ==="
echo "PR ID: $(cat pr_info.json | jq -r '.data.project_issues_index')"
echo "总体评分: $(cat review_report.json | jq -r '.overall_assessment.total_score')/100"
echo "质量评分: $(cat review_report.json | jq -r '.overall_assessment.quality_score')/100"
echo "安全评分: $(cat review_report.json | jq -r '.overall_assessment.security_score')/100"
# 6.2 打印问题列表
echo -e "\n=== 发现的问题 ==="
cat review_report.json | jq -r '.issues[] |
"\(.severity) - \(.category): \(.file):\(.line)"'
# 6.3 打印优秀实践
echo -e "\n=== 优秀实践 ==="
cat review_report.json | jq -r '.positive_notes[] |
"⭐ \(.file):\(.line) - \(.description)"'
# 6.4 打印改进建议
echo -e "\n=== 改进建议 ==="
cat review_report.json | jq -r '.recommendations[]' | nl
步骤 7:(可选)添加评论到 PR
# 7.1 添加总评
gitlink-cli api POST /:owner/:repo/pulls/123/reviews --body "{
\"body\": \"$(cat review_report.md)\",
\"event\": \"COMMENT\"
}"
# 7.2 批量添加行内评论
cat review_report.json | jq -r '.issues[] |
"gitlink-cli api POST /:owner/:repo/pulls/123/comments --body '"'"'{
\"body\": \"\(.suggestion)\",
\"path\": \"\(.file)\",
\"position\": \(.line)
}'"'"'"' | bash
📊 审查报告示例
JSON 格式报告
{
"pr_info": {
"id": 123,
"title": "Feature: Add user authentication",
"author": "developer",
"branch": "feature/auth → main"
},
"overall_assessment": {
"total_score": 75,
"quality_score": 85,
"security_score": 60,
"performance_score": 75,
"maintainability_score": 80,
"status": "NEEDS_IMPROVEMENTS"
},
"issues": [
{
"id": 1,
"severity": "HIGH",
"category": "security",
"file": "src/auth/login.go",
"line": 45,
"rule": "SQL Injection",
"description": "直接拼接用户输入到 SQL 语句",
"suggestion": "使用参数化查询或 ORM"
}
],
"positive_notes": [
{
"file": "src/auth/user.go",
"line": 120,
"description": "优秀的错误处理"
}
],
"recommendations": [
"修复 SQL 注入漏洞",
"添加输入验证",
"完善单元测试"
]
}
Markdown 格式报告
# 代码审查报告
## 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`
- **类别**: security
- **问题**: 直接拼接用户输入到 SQL 语句
- **代码**:
```go
query := "SELECT * FROM users WHERE username = '" + username + "'"
- 建议: 使用参数化查询或 ORM
⭐ 优秀实践(1)
1. 优秀的错误处理
- 文件:
src/auth/user.go:120 - 描述: 完善的错误处理和日志记录
💡 改进建议
- 修复 SQL 注入漏洞
- 添加输入验证
- 完善单元测试
📝 总结
代码整体质量良好,但存在 1 个需要立即修复的安全问题。建议修复后再合并。
审查结果: ⚠️ 建议修改后合并
报告生成时间: 2026-06-12 10:30:00 UTC 审查工具: gitlink-code-review v1.0.0
## 🎯 审查标准
### 评分标准
| 分数范围 | 等级 | 合并建议 |
|---------|------|---------|
| 90-100 | ⭐⭐⭐⭐⭐ 优秀 | 可以直接合并 |
| 75-89 | ⭐⭐⭐⭐ 良好 | 建议合并 |
| 60-74 | ⭐⭐⭐ 一般 | 需要改进 |
| < 60 | ⭐⭐ 较差 | 不建议合并 |
### 问题优先级
| 优先级 | 图标 | 合并影响 |
|--------|------|---------|
| CRITICAL | 🚨 | 阻止合并 |
| HIGH | 🔴 | 强烈建议修复 |
| MEDIUM | ⚠️ | 建议修复 |
| LOW | ℹ️ | 可选修复 |
## 💡 最佳实践
### 1. 定期审查
- PR 创建后 24 小时内完成初审
- PR 更新后及时审查新代码
- 合并前进行最终审查
### 2. 平衡严格与灵活
- 核心模块严格审查
- 工具函数适度审查
- 文档和配置文件宽松审查
### 3. 建设性反馈
- 指出问题的同时提供解决方案
- 认可优秀的代码实践
- 解释为什么需要修改
## 🔧 自动化脚本
完整的审查脚本:
```bash
#!/bin/bash
# comprehensive-review.sh - 全面代码审查脚本
set -e
PR_ID=${1:-123}
OWNER=${2:-"myuser"}
REPO=${3:-"myrepo"}
echo "=== 开始全面审查 PR #$PR_ID ==="
# 步骤 1:获取数据
echo "步骤 1:获取 PR 数据..."
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
# 步骤 2:验证数据
echo "步骤 2:验证数据..."
if [ "$(cat pr_info.json | jq '.ok')" != "true" ]; then
echo "错误:无法获取 PR 信息"
exit 1
fi
# 步骤 3:组织分析数据
echo "步骤 3:组织分析数据..."
cat > analysis_input.json <<EOF
{
"pr_info": $(cat pr_info.json | jq '.data'),
"files": $(cat pr_files.json | jq '.data.files'),
"diff": $(cat pr_diff.json | jq -r '.data.diff')
}
EOF
# 步骤 4:AI 分析
echo "步骤 4:AI 分析(需要 Claude Code 或 API)..."
# 这里调用 AI 分析工具
# claude-code-analyze analysis_input.json > analysis_result.json
# 步骤 5:生成报告
echo "步骤 5:生成审查报告..."
# cat analysis_result.json | jq -r '.content' > review_report.json
# cat analysis_result.json | jq -r '.content' > review_report.md
# 步骤 6:输出报告
echo "步骤 6:输出审查报告..."
# cat review_report.md
echo "=== 审查完成 ==="
使用方法:
chmod +x comprehensive-review.sh
./comprehensive-review.sh 123 myuser myrepo
📚 相关文档
最后更新: 2026-06-12