笔者前文 “浅析代码可视化” 中讲述了代码可视化的基本实现原理,并给出了一些业界的应用场景。由于涉及原理和技术范围较广,以笔者能力难以做到面面俱到,为了减少信息传递偏差,便给出了一些信息来源供读者深入阅读。不过针对文中提到应用场景中的一些小的功能点,可以拿出来详尽的分析一下实现方案,以小见大。因此本文将针对代码可视化在代码变更影响分析上的应用做较详细的阐述,希望能对大家有所帮助。
先用 2 个常见的开发场景来还原描述为什么我们需要 “代码变更影响分析”。
场景 1:修改了方法①逻辑,以为只会影响入口 A 便只回归了相关的场景,上线后发现影响了入口 B 的逻辑,造成了线上事故;
场景 2:修改了方法②逻辑,并回归了所有已知的流量入口,但上线一段时间后出现了大量异常告警,原来是影响了定时任务和 MQ 消费逻辑;
其他等等......
“代码变更影响分析” 具体的可以描述为:如何感知代码改动造成功能逻辑变化的影响范围,具体到影响了哪些类、方法、入口以及调用拓扑。
针对需求,下面给出一种基于源码静态分析的实现方案。
下面阐述基于 Java8 的具体实现方案
使用 JGit 拉取远程仓库到本地后使用 JavaParser 对源码进行分析,从而得到类、方法和方法调用信息,基于此构建方法调用拓扑图。
步骤一:使用 JGit 将远程仓库拉取到本地
步骤二:设置 JavaParser 配置并解析项目所有源码文件
步骤三:遍历所有类文件获取类、方法和方法调用信息
步骤四:识别项目入口类和方法(示例代码仅实现了 spring http 入口识别)
步骤五:将入口方法作为起始节点,基于方法和调用关系生成方法调用拓扑图
(用来解析的代码示例在 src/main/java/com/analysis/code/example 包下)
通过 Git Diff 获取变更影响了哪些 Java 类文件,然后对变更前后的类文件进行源码解析得到类方法列表并对比前后差异得到变更影响的方法节点,最后结合之前生成的方法拓扑信息得到变更影响拓扑图。
步骤一:使用 JGit 获取分支变更影响了哪些文件
步骤二:使用 JavaParser 对变更前后的 Java 文件进行解析,获取变更前后类的方法列表
步骤三:依次对照变更前后方法体信息(去除了注释影响,并格式化了代码),得到变更影响了哪些方法
步骤四:结合方法拓扑生成变更影响结果
越早评估出改动的影响面将更容易把风险扼杀在摇篮里,以更小的成本避免事故的发生。本文提供了一种"代码变更影响分析"功能的粗粒度实现方案,综合运用了 Git、源码分析、可视化图表等技术。不过针对愈发复杂的业务现状,文中描述的功能还比较初级,还需要按场景进行针对性的增强和细化,从而真正做到对开发者有帮助。
作者:京东科技 谢骁
来源:京东云开发者社区 转载请注明来源