AI 编程实战:用 Claude Code 自动化代码审查
学习如何用 Claude Code 搭建自动化代码审查流程,包括 PR 审查、代码质量检查、安全漏洞扫描,提升团队代码质量。
·
AI 编程实战:用 Claude Code 自动化代码审查
一、为什么需要自动化代码审查?
传统代码审查的痛点:
- 耗时 - 每个 PR 需要人工逐行审查
- 不一致 - 不同审查者标准不同
- 容易遗漏 - 疲劳时容易忽略问题
- 知识依赖 - 新人不了解项目规范
AI 审查的优势:
- 7x24 小时待命
- 标准一致
- 快速反馈
- 可学习团队规范
二、Claude Code 简介
Claude Code 是 Anthropic 推出的命令行 AI 编程工具,特点:
- 深度理解代码上下文
- 支持多文件分析
- 可执行 shell 命令
- 支持自定义规则
2.1 安装 Claude Code
# 安装 Node.js
brew install node
# 安装 Claude Code
npm install -g @anthropic-ai/claude-code
# 配置 API Key
export ANTHROPIC_API_KEY="your-api-key"
# 或者写入 ~/.zshrc
echo 'export ANTHROPIC_API_KEY="sk-ant-..."' >> ~/.zshrc
source ~/.zshrc
2.2 验证安装
claude --version
claude "Hello, test"
三、基础用法
3.1 单文件审查
# 审查单个文件
claude "请审查这个文件,检查代码质量、潜在 bug 和风格问题" src/user-service.ts
3.2 多文件审查
# 审查整个 PR 变更
claude "审查这些文件的变更,关注:
1. 逻辑错误
2. 性能问题
3. 安全隐患
4. 代码风格
5. 测试覆盖" --file src/auth.ts src/user.ts src/validator.ts
3.3 Git Diff 审查
# 审查当前分支的所有变更
git diff main | claude "审查这些代码变更,列出所有问题和建议"
四、搭建自动化审查流程
4.1 创建审查规则文件
在项目根目录创建 .claude/review-rules.md:
# 代码审查规则
## 项目信息
- 语言:TypeScript
- 框架:Express + React
- 数据库:PostgreSQL
## 必须检查项
### 安全性
- [ ] SQL 注入风险(必须使用参数化查询)
- [ ] XSS 风险(用户输入必须转义)
- [ ] 敏感信息泄露(不能硬编码密钥)
- [ ] 认证授权(需要验证用户权限)
### 性能
- [ ] 数据库查询优化(避免 N+1 查询)
- [ ] 循环内避免同步 I/O
- [ ] 大数组操作使用合适的数据结构
### 代码质量
- [ ] 函数长度不超过 50 行
- [ ] 圈复杂度不超过 10
- [ ] 必须有错误处理
- [ ] 变量命名清晰
### 测试
- [ ] 新增功能必须有单元测试
- [ ] 边界条件有测试覆盖
- [ ] 错误场景有测试
## 代码风格
### TypeScript
- 使用 interface 定义对象类型
- 避免使用 any,使用 unknown 或具体类型
- 导出类型使用大驼峰
- 函数使用小驼峰
### 命名规范
- 变量:camelCase
- 类/接口:PascalCase
- 常量:UPPER_SNAKE_CASE
- 文件:kebab-case.ts
## 常见问题检查清单
1. 是否有未处理的 Promise?
2. 是否有内存泄漏风险?
3. 是否有竞态条件?
4. 日志是否包含敏感信息?
5. API 响应格式是否统一?
4.2 创建审查脚本
创建 scripts/ai-review.sh:
#!/bin/bash
# AI 代码审查脚本
set -e
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
echo "🔍 开始 AI 代码审查..."
# 获取变更文件
CHANGED_FILES=$(git diff --name-only main)
if [ -z "$CHANGED_FILES" ]; then
echo "没有检测到变更"
exit 0
fi
echo "检测到以下变更:"
echo "$CHANGED_FILES"
echo ""
# 生成审查提示
PROMPT="请作为高级代码审查专家,审查以下代码变更。
审查重点:
1. 安全性问题(SQL 注入、XSS、认证授权等)
2. 性能问题(查询优化、内存使用等)
3. 代码质量(可读性、可维护性等)
4. 测试覆盖(单元测试、边界条件等)
5. 是否符合项目规范(参考 .claude/review-rules.md)
输出格式:
## 审查结果
### ✅ 做得好的地方
- 列出优点
### ⚠️ 需要改进
- 问题 1:描述 + 建议
- 问题 2:描述 + 建议
### ❌ 必须修复
- 严重问题 1:描述 + 修复建议
- 严重问题 2:描述 + 修复建议
### 📝 建议
- 优化建议 1
- 优化建议 2
### 总结
整体评价和下一步建议
"
# 调用 Claude Code 审查
echo "🤖 AI 正在审查代码..."
claude "$PROMPT" --file $CHANGED_FILES > review-result.md
# 显示结果
echo ""
echo "📋 审查结果:"
echo "============"
cat review-result.md
# 检查是否有必须修复的问题
if grep -q "### ❌ 必须修复" review-result.md; then
echo ""
echo -e "${RED}⚠️ 发现必须修复的问题,请处理后再提交${NC}"
exit 1
else
echo ""
echo -e "${GREEN}✅ 审查通过,没有发现严重问题${NC}"
exit 0
fi
4.3 添加 Git Hook
创建 .git/hooks/pre-push:
#!/bin/bash
# 在 push 前自动执行 AI 审查
echo "🔒 运行 AI 代码审查..."
# 运行审查脚本
./scripts/ai-review.sh
if [ $? -ne 0 ]; then
echo ""
echo "❌ AI 审查未通过,push 被阻止"
echo "请修复问题后重新提交,或使用 --no-verify 跳过检查(不推荐)"
exit 1
fi
echo "✅ AI 审查通过,允许 push"
# 添加执行权限
chmod +x .git/hooks/pre-push
chmod +x scripts/ai-review.sh
五、集成到 CI/CD
5.1 GitHub Actions 配置
创建 .github/workflows/ai-review.yml:
name: AI Code Review
on:
pull_request:
branches: [main, develop]
jobs:
ai-review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install Claude Code
run: npm install -g @anthropic-ai/claude-code
- name: Get changed files
id: changed-files
run: |
FILES=$(git diff --name-only origin/main...HEAD)
echo "files=$FILES" >> $GITHUB_OUTPUT
- name: AI Code Review
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
run: |
cat > review-prompt.txt << 'EOF'
请审查以下代码变更,检查:
1. 安全性问题
2. 性能问题
3. 代码质量
4. 测试覆盖
5. 是否符合规范
输出格式:
## 审查结果
### ✅ 优点
### ⚠️ 改进建议
### ❌ 必须修复
EOF
claude "$(cat review-prompt.txt)" --file ${{ steps.changed-files.outputs.files }} > review-result.md
- name: Upload Review Result
uses: actions/upload-artifact@v4
with:
name: ai-review-result
path: review-result.md
- name: Post Review Comment
uses: actions/github-script@v7
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
const fs = require('fs');
const review = fs.readFileSync('review-result.md', 'utf8');
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body: `## 🤖 AI 代码审查结果\n\n${review}`
});
5.2 配置 API Key
在 GitHub 仓库设置中添加 Secret:
Settings → Secrets and variables → Actions → New repository secret
Name: ANTHROPIC_API_KEY
Value: sk-ant-...
六、高级技巧
6.1 自定义审查模板
创建 .claude/review-template.md:
# PR #{{PR_NUMBER}} 审查报告
**审查时间:** {{TIMESTAMP}}
**审查分支:** {{BRANCH_NAME}}
**变更文件:** {{FILE_COUNT}} 个
## 变更概览
{{SUMMARY}}
## 详细审查
### 安全性
{{SECURITY_REVIEW}}
### 性能
{{PERFORMANCE_REVIEW}}
### 代码质量
{{CODE_QUALITY_REVIEW}}
### 测试
{{TEST_REVIEW}}
## 问题清单
| 严重性 | 文件 | 行号 | 问题描述 | 建议 |
|--------|------|------|----------|------|
{{ISSUE_TABLE}}
## 审查结论
- [ ] 通过,可以合并
- [ ] 需要小修改后合并
- [ ] 需要大修改后重新审查
**审查者:** AI Assistant
6.2 增量审查
只审查变更部分,提高效率:
# 创建增量审查脚本
cat > scripts/incremental-review.sh << 'EOF'
#!/bin/bash
# 只审查变更的行
git diff -U0 main | while read -r line; do
if [[ $line == "+"* ]] && [[ $line != "+++"* ]]; then
echo "检查新增行:$line"
claude "这行代码是否有问题:$line"
fi
done
EOF
6.3 历史问题追踪
# 创建问题追踪文件
cat > .claude/issue-tracker.md << 'EOF'
# AI 审查问题追踪
## 2026-03-17
- [x] src/auth.ts:45 - JWT 过期时间配置问题(已修复)
- [ ] src/user.ts:123 - SQL 查询未参数化(待修复)
- [ ] src/api.ts:89 - 缺少输入验证(待修复)
## 2026-03-16
- [x] src/validator.ts:34 - 正则表达式性能问题(已修复)
EOF
七、实际案例
7.1 案例:发现 SQL 注入漏洞
原始代码:
// ❌ 有问题的代码
async getUserById(id: string) {
const query = `SELECT * FROM users WHERE id = '${id}'`;
return await db.query(query);
}
AI 审查意见:
### ❌ 必须修复
**文件:** src/user-service.ts:45
**问题:** SQL 注入漏洞
代码直接使用字符串拼接构建 SQL 查询,攻击者可以传入恶意输入:
id = “’ OR ‘1’='1”
**修复建议:**
```typescript
// ✅ 修复后
async getUserById(id: string) {
const query = 'SELECT * FROM users WHERE id = $1';
return await db.query(query, [id]);
}
### 7.2 案例:性能优化建议
**原始代码:**
```typescript
// ❌ N+1 查询问题
async getUsersWithOrders() {
const users = await db.query('SELECT * FROM users');
for (const user of users) {
user.orders = await db.query(
'SELECT * FROM orders WHERE user_id = $1',
[user.id]
);
}
return users;
}
AI 审查意见:
### ⚠️ 需要改进
**文件:** src/order-service.ts:78
**问题:** N+1 查询性能问题
当前实现会对每个用户执行一次查询,100 个用户 = 101 次数据库查询。
**修复建议:**
```typescript
// ✅ 使用 JOIN 或批量查询
async getUsersWithOrders() {
const query = `
SELECT u.*, json_agg(o.*) as orders
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id
`;
return await db.query(query);
}
## 八、最佳实践
### 8.1 审查频率
- **小 PR(<200 行)** - 每次提交前审查
- **中 PR(200-500 行)** - 每日审查
- **大 PR(>500 行)** - 拆分后审查
### 8.2 问题优先级
| 级别 | 类型 | 响应时间 |
|------|------|----------|
| ❌ 必须修复 | 安全漏洞、严重 bug | 立即修复 |
| ⚠️ 需要改进 | 性能问题、代码异味 | 本次 PR 修复 |
| 📝 建议 | 优化建议、风格问题 | 后续迭代 |
### 8.3 人工复核
AI 审查不能完全替代人工:
- **必须人工审查:** 业务逻辑、架构设计、用户体验
- **可以 AI 审查:** 代码规范、常见 bug、性能问题
- **建议混合审查:** AI 初筛 + 人工复核
## 九、成本优化
### 9.1 Token 使用统计
```bash
# 创建使用统计脚本
cat > scripts/review-stats.sh << 'EOF'
#!/bin/bash
# 统计 AI 审查的 Token 使用
LOG_FILE=".claude/review-log.jsonl"
echo "=== AI 审查统计 ==="
echo "总审查次数:$(wc -l < $LOG_FILE)"
echo "总输入 Token: $(cat $LOG_FILE | jq -s '[.[].input_tokens] | add')"
echo "总输出 Token: $(cat $LOG_FILE | jq -s '[.[].output_tokens] | add')"
echo "估算成本:$(cat $LOG_FILE | jq -s '([.[].input_tokens] | add) * 0.000003 + ([.[].output_tokens] | add) * 0.000015') 美元"
EOF
9.2 优化策略
- 只审查变更文件 - 避免全量扫描
- 增量审查 - 只审查变更的行
- 缓存结果 - 相同变更不重复审查
- 批量审查 - 合并多个小 PR
十、总结
使用 Claude Code 自动化代码审查的核心价值:
- 提升效率 - 减少人工审查时间
- 提高质量 - 发现人眼容易忽略的问题
- 统一标准 - 所有代码按相同标准审查
- 知识沉淀 - 审查规则可复用
实施建议:
- 从简单的 Git Hook 开始
- 逐步集成到 CI/CD
- 根据团队反馈调整规则
- 定期回顾审查效果
注意事项:
- AI 审查是辅助工具,不是替代品
- 业务逻辑仍需人工审查
- 定期更新审查规则
- 关注 API 使用成本
现在就开始搭建你的自动化代码审查流程吧!
更多推荐
所有评论(0)