Aone为阿里一站式智能研发协同平台,实际操作可替换其他对应平台。
问题痛点
当前CR流程说明:目前我们组的CR流程,是研发完成代码开发后,在代码平台上手动开启代码评审单,交由多位同学人工评审,同时触发Aone AI评审。
当前流程的主要问题如下:
1. 人工评审耗时较长,员工心力消耗大,可能会拖慢小组整体的研发节奏,同时也不一定保证能发现所有问题;
2. 现有的代码分析、AI评审工具,也都存在一些经常发生的问题:
- 误报较多;
- 分析不够深入,无法联合分析上下游代码,许多业务逻辑问题难发现;
- 纠正意见不太实用。
解决思路
我们尝试利用Claude Code的强大AI Coding Agent能力,结合AONE MCP Server,来在代码平台CI流水线中实现更智能的AI代码评审,为团队提供一个低成本、高收益的代码质量检查工具。
Claude Code 官方文档:https://docs.anthropic.com/zh-CN/docs/claude-code/quickstart
当前效果
运行效果
当代码评审开启以及后续新增commit时,会触发CR流水线开启AI分析,最终将分析结果同步至CR评论区,如下图(发现了项目里一直存在但没人提出的死循环阻塞获取限流锁的代码)。
提效效果
目前体感来看,许多AI建议是有必要的、能启发人的。其中,人分析到但AI没考虑到的情况比较少。但是,因为还在调试阶段,所以也不是能解决全部问题。因此,估摸给个数字的话,可能是 提效50% 以上。
长期预测来看,如果后续调教优化得好,应该在以下2方面给CR工作带来明显收益:
- 提效:辅助人工,大幅减少发现问题、分析问题、给出建议的时间,80%不是问题;
- 提质:超越人工,发现人工察觉不了的潜在问题,给质量工程满满安全感;
解决方案详细说明
整体流程架构
核心设计要点
1. 可配置的Claude Code流水线模板
封装了一个流水线模板在代码平台市场,提供了自动安装最新Claude Code的容器环境,支持配置Claude Code API相关信息、Aone MCP Server API、容器执行Shell脚本(可以完全自定义如何调用Claude Code)、流水线触发条件和事件通知方式。
2. 基于MCP的CR信息交互
通过AONE MCP Server获取CR相关信息,避免了git获取远程信息时的权限问题。
3. 变更代码智能分层处理策略
- Level 1:完全未分析的区域 → 重点深度分析;
- Level 2:部分分析过的区域 → 对于后续新增commit里,增量的新代码进行重点分析;
- Level 3:已完整分析过的区域 → 简单的重审分析;
4. Multi/Background Agent 并行处理提升效率
3个处理器同时工作,每个专注于不同类型的代码变更,提高整体处理速度。
5. 超时控制
调用Claude Code实例时,指定最大运行时长,默认30分钟。
具体流水线配置(迭代优化中)
name: Claude Code AI CR triggers: push: branches: - feature/** merge_request: target-branches: - '**' params: ANTHROPIC_BASE_URL: name: ANTHROPIC_BASE_URL description: Claude Code 环境变量,指定模型端口地址 required: true ANTHROPIC_AUTH_TOKEN: name: ANTHROPIC_AUTH_TOKEN description: Claude Code 环境变量,指定模型访问密钥 required: true ANTHROPIC_MODEL: name: ANTHROPIC_MODEL description: Claude Code 环境变量,指定模型型号,可为空 required: false AONE_MCP_URL: name: AONE_MCP_URL description: AONE MCP SERVER的url,在code界面右侧可以获取到 required: true shell: name: shell description: 执行脚本 required: false default: |- #!/bin/bash # ============================================================================= # 基于 MCP 的智能分层 AI 代码评审系统 # 解决方案:通过 AONE MCP 获取 CR 信息,实现智能增量分析 # ============================================================================= # 配置 MCP 连接 cat > mcp.json << 'EOF' { "mcpServers": { "aone": { "type": "sse", "url": "${{params.AONE_MCP_URL}}" } } } EOF repo=${{git.repo}} sourceBranch=${{git.branch}} echo "仓库: ${repo}, 分支: ${sourceBranch}" # ============================================================================= # 步骤1: 检查是否存在评审中的 CR # ============================================================================= echo "步骤1: 查找评审中的 CR..." cr_info=$(claude --permission-mode acceptEdits --mcp-config mcp.json --allowedTools "mcp__aone__list_repo_merge_requests" --print "使用 aone mcp 的 list_repo_merge_requests 工具,指定3个参数为 repo=${repo}, state=opened, sourceBranch=${sourceBranch} 来查看评审中的 CR,如果失败请重试3次,如果最终还是不存在,则返回 'CR_NOT_FOUND'") echo "CR查询结果: $cr_info" echo "$cr_info" | grep -q 'CR_NOT_FOUND' && { echo "未找到评审中的 CR,退出分析" exit 0 } # 判断已经存在的CR评论是否已经超过限制 comments_info=$(claude --permission-mode acceptEdits --mcp-config mcp.json --allowedTools "mcp__aone__list_merge_request_comments" --continue --print "使用 mcp__aone__list_merge_request_comments 工具获取当前分支已经提过的所有评论信息,如果已经存在的高风险问题评论数量超过 15个,则返回'CR_MORE_LIMIT',否则返回未超过限制") echo "评论结果: $comments_info" echo "$comments_info" | grep -q 'CR_MORE_LIMIT' && { echo "添加评论已超过限制,退出分析" exit 0 } # ============================================================================= # 步骤2: 获取 CR 的变更文件和现有评论 # ============================================================================= echo "步骤2: 获取 CR 变更文件和现有评论..." # 获取变更文件列表 echo "===================================获取变更文件列表 START==========================================" claude --permission-mode acceptEdits --mcp-config mcp.json --allowedTools "mcp__aone__list_merge_request_changed_files" --continue --print "使用 mcp__aone__list_merge_request_changed_files 工具获取当前分支用户更改过的所有变更文件列表,生成一个changed_files.md,必须写changed_files.md 文件成功,如果没有成功请重试3次" cat changed_files.md echo " ===================================获取变更文件列表 END========================================== " # 获取现有评论 echo "===================================获取现有评论 START==========================================" claude --permission-mode acceptEdits --mcp-config mcp.json --allowedTools "mcp__aone__list_merge_request_comments" --continue --print "使用 mcp__aone__list_merge_request_comments 工具获取当前分支已经提过的所有评论信息,生成一个existing_comments.md,必须写 existing_comments.md 文件成功,如果没有成功请重试3次" cat existing_comments.md echo " ===================================获取现有评论 END========================================== " # ============================================================================= # 步骤3: 主控分析器 - 智能分层分析 # ============================================================================= echo "步骤3: 执行智能分层分析..." exe_info=$(claude --permission-mode acceptEdits --mcp-config mcp.json --allowedTools "mcp__aone__get_changed_file_diff" --print " 作为代码评审的主控分析器,执行以下任务: 1. 读取当前分支中变更文件列表文档:changed_files.md 2. 读取当前分支中现有评论文档:existing_comments.md 3. 使用 mcp__aone__get_changed_file_diff 工具获取每个变更文件的具体 diff, 如果获取失败,忽略该文件,继续获取下个变更文件的具体 diff 然后进行智能分层分析,对变更区域进行3个划分,生成3个精炼的描述文件: **level1_unanalyzed.md** - 完全未分析的区域 - 格式:文件路径 | 行号范围 | 变更类型 | 关键信息 - 区域判断标准:没有任何评论覆盖的代码变更区域 - 要求:仅采纳高风险问题,添加的CR必须添加到对应的行数位置 **level2_partial.md** - 部分分析过的区域 - 格式:文件路径 | 行号范围 | 变更类型 | 新增部分描述 - 区域判断标准:有部分评论但存在新增行的代码区域 - 要求:仅采纳高风险问题,添加的CR必须添加到对应的行数位置 **level3_recheck.md** - 需要重新审视的区域 - 格式:文件路径 | 行号范围 | 变更类型 | 重审原因 - 区域判断标准:已有评论但代码发生显著变化的区域 - 要求:仅采纳高风险问题,添加的CR必须添加到对应的行数位置 要求: - 执行必须检查 changed_files.md 和 existing_comments.md 是否存在,如果不存在,则返回 'FILE_NOT_FOUND' - 严格注意底线:只看当前分支里变更的部分!不允许对当前分支未变更的部分添加评论! - 每个描述文件内容精炼简短 - 明确标识出具体的文件路径和行号范围 - 便于后续3个处理器并行处理 - 同样的问题不能重复提评论 - 添加的评论必须添加到对应代码对应的行数位置,不允许错位 - 仅采纳高风险问题 - 添加的评论必须检查之前是否已经存在相似评论,如果已经存在相似评论,不能重复添加 - 三个分层添加的评论,必须追加到 existing_comments.md, 每次添加评论必须检查是否在 existing_comments.md 存在相似记录,存在就不能重复添加 ") echo "分层分析执行结果: $exe_info" echo "$exe_info" | grep -q 'FILE_NOT_FOUND' && { echo "未找到变更文件和评论,退出分析" exit 0 } # ============================================================================= # 步骤4: 分层并行处理(3个独立的 Claude Code 实例) # ============================================================================= echo "步骤4: 启动分层并行处理..." # Level 1 处理器 - 深度分析未分析区域 echo "启动 Level 1 处理器(深度分析)..." claude --permission-mode acceptEdits --mcp-config mcp.json --allowedTools "mcp__aone" --print " 作为[仓库: ${repo}, 分支: ${sourceBranch}]代码评审的 Level 1 处理器,专注深度分析: 1. 读取 level1_unanalyzed.md 中的未分析区域 2. 对这些区域进行完整的代码审查(重点:全面分析逻辑、性能问题) 3. 给出问题点分析,严格遵守以下5个要点 **统一评论格式要求:** - 问题标题(带风险等级标识:🔴高风险 🟡中风险 🟢低风险) - 问题描述 - 代码范围(文件名和具体行号;如果代码不多,请用代码块直接展示出来) - 修改建议 - Markdown 格式,良好可读性 4. 最重要的任务:仅对高风险的问题点上报CR评论,上报CR时检查existing_comments.md是否存在相似评论,存在就不再添加,**不存在相似评论**使用mcp aone的 comment_merge_request_changed_file 工具来为CR添加评论。 ⚠️ 重要提醒:你在非交互式CI环境中运行,不能建议手动操作!必须自动执行工具调用! 要求: - 严格注意底线:只看当前分支里变更的部分!不允许对当前分支未变更的部分添加任何评论 - 添加的评论必须添加到当前分支对应的行数位置,不允许错位添加! - 仅采纳高风险问题 - 添加的评论必须检查是否已经存在相似评论,如果已经存在相似评论,就不要再添加评论了,只有没有存在相似评论才调用工具添加评论 - 添加的评论必须追加到 existing_comments.md, 每次添加评论前必须检查是否在 existing_comments.md 存在相似记录,存在就不能重复添加 - 类属性访问范围、接口访问范围 不添加评论 " & level1_pid=$! # Level 2 处理器 - 增量分析部分分析区域 echo "启动 Level 2 处理器(增量分析)..." timeout 1800 claude --permission-mode acceptEdits --mcp-config mcp.json --allowedTools "mcp__aone" --print " 作为[仓库: ${repo}, 分支: ${sourceBranch}]代码评审的 Level 2 处理器,专注增量分析: 1. 读取 level2_partial.md 中的部分分析区域 2. 重点关注新增的代码行(重点:新增逻辑正确性、兼容性、边界情况) 3. 避免与现有评论重复,只分析新增部分 4. 给出问题点分析,严格遵守以下5个要点 **统一评论格式要求:** - 问题标题(带风险等级标识:🔴高风险 🟡中风险 🟢低风险) - 问题描述 - 代码范围(文件名和具体行号;如果代码不多,请用代码块直接展示出来) - 修改建议 - Markdown 格式,良好可读性 5. 最重要的任务:仅对高风险的问题点上报CR评论,上报CR时检查existing_comments.md是否存在相似评论,存在就不再添加,**不存在相似评论**使用mcp aone的 comment_merge_request_changed_file 工具来为CR添加评论。 ⚠️ 重要提醒:你在非交互式CI环境中运行,不能建议手动操作!必须自动执行工具调用! 要求: - 严格注意底线:只看当前分支里变更的部分!不允许对当前分支未变更的部分添加任何评论 - 添加的评论必须添加到当前分支对应的行数位置,不允许错位添加! - 仅采纳高风险问题 - 添加的评论必须检查是否已经存在相似评论,如果已经存在相似评论,就不要再添加评论了,只有没有存在相似评论才调用工具添加评论 - 添加的评论必须追加到 existing_comments.md, 每次添加评论前必须检查是否在 existing_comments.md 存在相似记录,存在就不能重复添加 - 类属性访问范围、接口访问范围 不添加评论 " & level2_pid=$! # Level 3 处理器 - 轻量重审变更影响 echo "启动 Level 3 处理器(变更影响重审)..." timeout 1800 claude --permission-mode acceptEdits --mcp-config mcp.json --allowedTools "mcp__aone" --print " 作为[仓库: ${repo}, 分支: ${sourceBranch}]代码评审的 Level 3 处理器,专注变更影响重审: 1. 读取 level3_recheck.md 中需要重审的区域 2. 分析代码变更对现有逻辑的影响(重点:接口变更、业务逻辑风险) 3. 检查是否有破坏性变更或逻辑冲突 4. 给出问题点分析,严格遵守以下5个要点 **统一评论格式要求:** - 问题标题(带风险等级标识:🔴高风险 🟡中风险 🟢低风险) - 问题描述 - 代码范围(文件名和具体行号;如果代码不多,请用代码块直接展示出来) - 修改建议 - Markdown 格式,良好可读性 5. 最重要的任务:仅对高风险的问题点上报CR评论,上报CR时检查existing_comments.md是否存在相似评论,存在就不再添加,**不存在相似评论**使用mcp aone的 comment_merge_request_changed_file 工具来为CR添加评论。 ⚠️ 重要提醒:你在非交互式CI环境中运行,不能建议手动操作!必须自动执行工具调用! 要求: - 严格注意底线:只看当前分支里变更的部分!不允许对当前分支未变更的部分添加任何评论 - 添加的评论必须添加到当前分支对应的行数位置,不允许错位添加! - 仅采纳高风险问题 - 添加的评论必须检查是否已经存在相似评论,如果已经存在相似评论,就不要再添加评论了,只有没有存在相似评论才调用工具添加评论 - 添加的评论必须追加到 existing_comments.md, 每次添加评论前必须检查是否在 existing_comments.md 存在相似评论,存在就不能重复添加! - 类属性访问范围、接口访问范围 不添加评论 " & level3_pid=$! # 等待所有并行处理器完成(带超时监控) echo "等待所有处理器完成(最多10分钟)..." start_time=$(date +%s) max_wait=1800 # 10分钟 while true; do current_time=$(date +%s) elapsed=$((current_time - start_time)) # 检查是否超过最大等待时间 if [ $elapsed -gt $max_wait ]; then echo "处理器运行时间超过 ${max_wait} 秒,强制终止..." kill $level1_pid $level2_pid $level3_pid 2>/dev/null echo "所有处理器已强制终止" break fi # 检查所有进程是否完成 if ! kill -0 $level1_pid 2>/dev/null && ! kill -0 $level2_pid 2>/dev/null && ! kill -0 $level3_pid 2>/dev/null; then echo "所有处理器已完成" break fi # 显示进度 running_count=0 kill -0 $level1_pid 2>/dev/null && running_count=$((running_count + 1)) kill -0 $level2_pid 2>/dev/null && running_count=$((running_count + 1)) kill -0 $level3_pid 2>/dev/null && running_count=$((running_count + 1)) echo "还有 ${running_count} 个处理器在运行中... (已运行 ${elapsed}s)" sleep 30 # 每30秒检查一次 done echo "智能分层 AI 代码评审完成!" # ============================================================================= # 验证步骤:检查是否真的添加了评论 # ============================================================================= echo "验证步骤: 检查AI是否真的添加了评论..." claude --permission-mode acceptEdits --mcp-config mcp.json --allowedTools "mcp__aone__list_merge_request_comments" --print " 验证任务: 1. 使用 mcp__aone__list_merge_request_comments 工具重新获取CR的所有评论 2. 对比旧的existing_comments.md,检查是否有新的AI评论被添加 3. 如果没有发现新评论,明确报告'验证失败:AI未添加任何评论' 4. 如果发现了新评论,报告'验证成功:AI成功添加了X条评论' " # ============================================================================= # 完成总结 # ============================================================================= echo " ✅分析完成总结: " jobs: claude-code: image: alios-8u steps: - uses: checkout - uses: setup-env inputs: node-version: 20 tnpm-version: 10 tnpm-cache: true - id: Claude_Code_Run run: |- tnpm install -g @anthropic-ai/claude-code export ANTHROPIC_BASE_URL=${{params.ANTHROPIC_BASE_URL}} export ANTHROPIC_AUTH_TOKEN=${{params.ANTHROPIC_AUTH_TOKEN}} export ANTHROPIC_MODEL=${{params.ANTHROPIC_MODEL}} echo claude-code安装成功 ${{params.shell}}
使用方式:如何让你的代码库一分钟快速接入
1. 在代码仓库的持续集成页面,点击新建任务。
2. 在模板市场中,搜索 Claude Code AI CR 模板并引用。
3. 配置4个环境变量:
ANTHROPIC_BASE_URL: Claude Code 模型端点地址;ANTHROPIC_AUTH_TOKEN: Claude Code 访问密钥;ANTHROPIC_MODEL: 模型型号;AONE_MCP_URL: Aone · 代码平台的MCP端口;
4. 确认一下,触发策略这里最后选上这2个时机(通配符规则自己定)。
5. 提交配置。
6. 随后,开启一个代码评审,即可触发。通过观测流水线日志和CR评论区,来判断是否运行成功。
💡 注意入参配置里的shell,不填的话会默认使用我提供的命令(见上面流水线的脚本)。如果你觉得效果不好,需要调整(确实有很多细节要调整),可以自己设置哦。
使用建议
为了获得更好的CR效果,建议在项目中:
- 定制优化你的流水线Shell命令:当前流水线模板相当于提供了运行Claude Code的容器环境,里面如何执行命令、如何调用Claude Code,完全由你来自定义(将运行命令脚本填入入参配置里的shell字段,容器会在配置好Claude Code环境后,运行你的脚本)。
- 维护好CLAUDE.md(如果不了解,请查一下Claude Code相关使用教程)。
- 针对项目的特点,优化prompt和工具调用,比如重要项目强调数据一致性问题的检查。
- 建立起需求文档在代码库中的维护习惯,AI Coding后期本质上将会是文档工程,文档质量决定了Agent在代码研发周期里的提效上限。
后续优化方向
1. Background Agent 模式的应用:当前我们只是简单的对CR中变更代码,就“是否已经被分析过”来进行了简单的划分,然后并行执行。在不同的项目中,完全可以进行不同纬度的划分,来并行处理。
2. Sub Agent 模式的应用:是由Claude Code支持的模式,可以在一个agent实例中将任务分给不同的子agent去并行做不同的事,专人专职,分析力更强,减少了上下文限制和幻觉的影响。比如,对一个CR任务,可以建立起 代码规范检查agent、上下游业务影响分析agent、数据一致性分析agent、稳定性分析agent 的协作机制。
3. Prompt 工程、上下文工程的调优:如何在提出要求之前准备好模型可能需要的一切?
4. Memory 机制的建立:如何将整个代码库的历史变更、历史文档、历史CR,作为长期记忆留存下来并反哺?
总结
通过这次Claude Code AI CR流水线的实践,我们实现了包括但不限于:
- 自动检测评审中的CR并进行智能分析;
- 基于现有评论避免重复分析,提高效率;
- 通过分层处理策略,针对不同复杂度的代码变更采用不同的分析深度;
- 多个Claude Code实例并行处理,显著缩短分析时间;
- 直接在CR页面添加结构化的评审意见,包含问题描述、风险等级、修改建议等;
- 发现人工容易遗漏的潜在问题(如案例中的死循环阻塞问题);
- 沉淀了可配置的流水线模板,支持一键部署和复用;
AI Coding Agent在代码评审场景的应用证明了其实用价值,50%+的提效不仅减轻了人工负担,也提升了问题发现的广度和深度。这套方案展示了将AI Agent集成到现有研发流程中的一种可行路径,为团队探索AI提效提供了具体的参考案例。
当然,这个方案更多是给大家提供一个实践思路和技术起点,后续的优化空间还很大。
希望这次分享能启发更多团队探索AI Coding在自己业务场景中的应用可能性,共同推动研发效率的提升!欢迎大家尝试使用并提供反馈建议!
来源 | 阿里云开发者公众号
作者 | 仁执