🚀 CI+GPT双引擎驱动,🤖 开启AI代码评审新纪元
一. 现状问题
代码评审 Code Review 是提高代码质量、促进团队合作、知识间共享的关键环节,对于系统代码质量和稳定性都至关重要。
时间消耗大:代码评审是一个耗时的过程,特别对于大型项目和复杂的代码更是如此。 |
无档期:评审者无时间会造成研发卡点。 |
一致性缺乏:不同的审查者可能会有不同的编码标准和偏好,这可能导致代码审查的反馈缺乏一致性,给开发者带来混淆。 |
可能遗漏错误:人为审查的过程中可能会因为疲劳、疏忽或知识限制而遗漏一些错误,尤其是对于难察觉的逻辑错误和性能问题。 |
主观性:代码审查很容易受到审查者个人偏好和情绪的影响,有时可能会导致不必要的争议。 |
二. 分析原因
🤔人为代码评审存在的弊端主要源于人力的局限性(如疲劳、无时间、主观偏见、认知局限等)。这些因素共同作用导致审查过程中可能出现的时间效率低、一致性差、错误遗漏和主观性问题。
🗣用五个词语总结: 易疲劳
主观偏见
规范少
沟通难
知识缺
三. 采取措施
🤖 利用AI大模型进行代码评审,可以显著提高效率、减少人为错误,通过自动化分析和建议,弥补人为评审的局限性。同时还能促进代码一致性和质量,但需要适当的人机协作模式以充分发挥其潜力。
将GPT嵌入到CI实时code review 助研发一臂之力。 |
---|
提高效率:自动化审查过程大大减少了人工审查所需的时间,加快了开发周期。 |
增强准确性:AI模型可以持续学习,减少人为疏漏,提高代码审查的准确性和质量。 |
一致性保障:确保代码遵循最佳实践和项目规范,整体一致性。 |
即时反馈:开发者可以即时获得反馈,快速修正问题,不卡点。 |
知识共享:AI评审过程中的建议可以作为学习资源,帮助开发团队提升编码水平。 |
底层依赖:京东言犀大模型、行云流水线(云原生)、单元测试脚本、coding 代码评审机制(webhook)
【简易版📌】AI代码评审接入手册 👉 见评论 已成型机制,京东内部一键式接入! 群号见评论区哦!
四. 实践步骤
4.1 接入京东言犀大模型(行业内类ChatGPT大模型均可)
言犀大模型文档 (JD内部免费-代码安全)
申请接入GPT(评论区加群 or 私信我 审批连接):填写申请原因和基础信息。🖐(行业内类ChatGPT大模型均可~)
审批完成会收到API key (chatrhino-14B 暂时输入内容的最大长度为45000字符,通常代码修改可以满足)
4.2 内置AI Review脚本(Git代码库API打通)
1、调用coding API(获取MR的commit起止点) 2、调用coding API(获取本次代码diff) 3、调用GPT- API(京东大模型)
脚本链接汇总(评论区加群 or 私信我 获取): 目前支持的模型有Chatrhino-14B(最新版本-选择此模型)、Chatrhino、Chatrhino-JingYan 其它模型持续集成中。
AiCodeReview.java 脚本案例(java语言-junit5版本)粘贴到自己代码库中即可
📢注意:不必须依赖junit5,可以自行切换junit4,demo只是提供框架思路,落地后可根据代码库场景优化脚本!
替换2个变量:
① API Token
•建议申请协同虚拟账号(优势:很稳定,不会随个人账号离职等变化):部门公共AI架构师评审,设置API Token
【流程中心-协同办公-协同(虚拟)账号管理】👉 别忘了coding给他加个权限!
② PROJECT_ID:替换为您的Git 应用id(如下查看)
③ 大模型api-key:替换为您的key(查看4.1部分)
•核心脚本逻辑步骤 如下示例:
void aiCodeReviewByChatrhino() {
//1、get mr
String mergeRequest = System.getProperty("mergeRequest");
if (mergeRequest == null) return;
System.out.println("【流水线触发MergeRequest】------------------------------------------------ " + mergeRequest);
//2、get coding diff
String codeDiff = getCodingDiff(mergeRequest);
System.out.println("【coding的diff内容】------------------------------------------------" + codeDiff);
//3、gpt code review
String result = gptReview(codeDiff);
System.out.println("【京东言犀大模型评论】------------------------------------------------" + result);
//4、output review content
note(objectMapper.readTree(result).get("choices").get(0).get("message"