代码变更影响分析

背景描述

在开发过程中,每一次的代码改动都可能对程序的运行结果造成影响。越早评估出改动的影响面将更容易把风险扼杀在摇篮里,以更小的成本避免事故的发生。先用2个常见的开发场景来还原描述为什么我们需要“代码变更影响分析”:

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

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

场景2

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

实现方案

针对上述背景,本案例将使用源码静态分析的方式生成CallGraph,并提供代码变更影响分析能力。基本思路为:

代码变更影响分析方案

关键代码

下面阐述基于Java的具体实现方案,完整源码获取:java-call-graph-diff.

方法调用拓扑生成

变更影响判断基于CG,因此首先需要实现方法调用拓扑的可视化。生成CG的关键数据是方法和方法调用关系,基于前文编译器的理论知识,抽象语法树(AST)包含了完整的类、方法和方法调用相关的信息。因此整个方法调用拓扑的过程可以归纳为:Code -> AST -> CallGraph.

  • Code获取:使用JGit将远程仓库拉取到本地;

  • AST生成:使用JavaParser解析项目所有源码文件得到类、方法和方法调用信息;

  • CallGraph生成:选择起始节点,基于方法和调用关系生成方法调用拓扑图。

CallGraph

代码变更影响分析

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

  • 变更文件获取:使用JGit获取分支变更影响了哪些文件;

  • 变更前后方法Diff:使用JavaParser对变更前后的Java文件进行解析,获取变更前后类的方法列表。之后依次对照变更前后方法体信息(去除了注释影响,并格式化了代码),得到变更影响了哪些方法;

  • 变更分析生成:结合方法拓扑生成变更影响拓扑图

变更分析图

Last updated

Was this helpful?