【代码可视化实践】代码变更影响分析 | 京东云技术团队

1.前言

笔者前文"浅析代码可视化"中讲述了代码可视化的基本实现原理,并给出了一些业界的应用场景。由于涉及原理和技术范围较广,以笔者能力难以做到面面俱到,为了减少信息传递偏差,便给出了一些信息来源供读者深入阅读。不过针对文中提到应用场景中的一些小的功能点,可以拿出来详尽的分析一下实现方案,以小见大。因此本文将针对代码可视化在代码变更影响分析上的应用做较详细的阐述,希望能对大家有所帮助。

2.场景

先用2个常见的开发场景来还原描述为什么我们需要"代码变更影响分析"。

场景1:修改了方法①逻辑,以为只会影响入口A便只回归了相关的场景,上线后发现影响了入口B的逻辑,造成了线上事故;

场景2:修改了方法②逻辑,并回归了所有已知的流量入口,但上线一段时间后出现了大量异常告警,原来是影响了定时任务和MQ消费逻辑;

其他等等......

"代码变更影响分析"具体的可以描述为:如何感知代码改动造成功能逻辑变化的影响范围,具体到影响了哪些类、方法、入口以及调用拓扑。

3.方案

针对需求,下面给出一种基于源码静态分析的实现方案。

4.实现

下面阐述基于Java8的具体实现方案

4.1 方法调用拓扑生成

  • 基本思路

使用JGit拉取远程仓库到本地后使用JavaParser对源码进行分析,从而得到类、方法和方法调用信息,基于此构建方法调用拓扑图。

  • 实现步骤

步骤一:使用JGit将远程仓库拉取到本地

步骤二:设置JavaParser配置并解析项目所有源码文件

步骤三:遍历所有类文件获取类、方法和方法调用信息

步骤四:识别项目入口类和方法(示例代码仅实现了spring http入口识别)

步骤五:将入口方法作为起始节点,基于方法和调用关系生成方法调用拓扑图

(用来解析的代码示例在src/main/java/com/analysis/code/example包下)

4.2 代码变更影响分析

  • 基本思路

通过Git Diff获取变更影响了哪些Java类文件,然后对变更前后的类文件进行源码解析得到类方法列表并对比前后差异得到变更影响的方法节点,最后结合之前生成的方法拓扑信息得到变更影响拓扑图。

  • 实现步骤

步骤一:使用JGit获取分支变更影响了哪些文件

步骤二:使用JavaParser对变更前后的Java文件进行解析,获取变更前后类的方法列表

步骤三:依次对照变更前后方法体信息(去除了注释影响,并格式化了代码),得到变更影响了哪些方法

步骤四:结合方法拓扑生成变更影响结果

5.总结

越早评估出改动的影响面将更容易把风险扼杀在摇篮里,以更小的成本避免事故的发生。本文提供了一种"代码变更影响分析"功能的粗粒度实现方案,综合运用了Git、源码分析、可视化图表等技术。不过针对愈发复杂的业务现状,文中描述的功能还比较初级,还需要按场景进行针对性的增强和细化,从而真正做到对开发者有帮助。

6.参考

JavaParser

JGit-CookBook

Graphviz

Graphviz-Java

作者:京东科技 谢骁

来源:京东云开发者社区 转载请注明来源

相关推荐
NexTunnel29 分钟前
公司老项目还在 SVN,远程维护怎么做更稳?
git·svn·gitlab·远程工作·nextunnel
满天星830357712 小时前
【Git】原理及使用(七) (多人协作 [下])
git
航鑫光电15 小时前
Canvas 手写实时波形图:一套通用的传感器数据可视化方案
数据可视化
997_oo17 小时前
MCP踩坑记录
代码规范
郡杰18 小时前
Git基础与开发平台搭建
git·后端
尘中远20 小时前
【Qwt 7.0 系列】快速入门与核心新特性概览 —— 更现代的 Qt 数据可视化库
qt·数据可视化·绘图·qwt·科学绘图
钟智强20 小时前
我警告了 329 天
git·php·wordpress·webshell
乐观的冷风1 天前
我们需要将文件添加到暂存区才能提交,而移除文件后是无法添加到暂存区的,那么怎么移除一个文件让GIT不再将其纳入版本控制呢?上图中GIT已经给出了说明:
git
tjl521314_211 天前
Git SSH Host Key Verification Failed 问题排查与解决
运维·git·ssh
嘶哈哈哈1 天前
[特殊字符] Git 协作指南
git