前言
基于Jacoco获取增量代码覆盖率的方案社区上已经有很多帖子了,这个帖子就不赘述了,有兴趣的可以在社区搜索或参考我的这个工程-jacoco
方案的实现大体分成两类,一类是基于jacoco的插件通过命令行生成,这种方式对于了解个中原理的童鞋来说比较轻便且排错简单,但是对于不熟悉maven或gradle的童鞋来说还是有一定门槛的,所以就出现另一种方式即将整个方案平台化,通过一些平台的封装提升方案的易用性,但是对于大多数公司来说,可能不允许做过多投入来做平台(特别在社区也有童鞋提出过领导不认可覆盖率报告的情况),因此需要一种相对折中的方案,即无需做过多改造但又可轻便实现整套方案。
Jenkins作为CICD使用最广泛的开源工具/平台,可轻易实现任务的编排,且丰富的插件体系使得它可以方便地集成各种功能,其中集成Jacoco生成覆盖率报告也是功能之一。因此我们考虑改造Jacoco插件以使得它可以支撑获取增量代码覆盖率,结合Jenkins自带的自动任务调度,就可以非常方便地实现增量代码覆盖率方案了。
实现原理
其实增量代码覆盖率的实现是比较简单的,主要就是两个点,一个是获取增量代码,另一个是过滤报告。其中获取增量代码可结合AST语法树实现,过滤报告则只需要对Jacoco的报告生成部分做少量改造即可,细节请参考这个工程-jacoco。因此我们要做的就是把这两个点直接照搬至Jacoco插件的实现即可。
获取增量代码
这一步因为在其他介绍增量代码覆盖率获取方案的帖子中已经重复介绍过很多遍,因此不再重复说明,请在社区搜索相关帖子。
替换默认Analyzer
Jacoco插件的实现是结合Jacoco,因此第一步我们需要做的就是替换默认的Analyzer,使得其在生成报告时能够插入我们自定义的逻辑,即根据变更方法来过滤报告。我们需要增加3个Analyzer,包括Analyzer
,ClassAnalyzer
,MethodAnalyzer
,其中主要代码变更在MethodAnalyzer
,代码片段如下:
|
|
然后替换默认的Analyzer,入口在包hudson.plugins.jacoco
下的ExecutionFileLoader
。
|
|
修改插件前端
由于需要实现代码对比,因此需要一个基线代码信息的输入入口,因此我们需要在插件前端增加相关入口。修改hudson/plugins/jacoco/JacocoPublisher/config.jelly
:
|
|
修改报告发布机制,修改hudson.plugins.jacoco
下的JacocoPublisher
:
|
|
使用效果
更新后的插件前端如下图:
以工程-springboot-crud-demo为例,两个tag(20200121_01和20200121_02)之间的变更只涉及一个方法。
在新增入口输入基线代码,执行Job日志中会出现增量代码相关日志:
查看覆盖率报告只显示变更代码部分:
若两个输入框都为空,则显示所有代码报告:
插件安装方式
插件工程地址:https://github.com/AngryTester/jacoco-plugin
打包命令:mvn clean package -Dmaven.test.skip=true
通过Jenkins安装官方Jacoco插件(这一步的主要目的是安装Jacoco插件依赖的其他插件),然后删除Jenkins主目录plugins下的jacoco:
将上面打包后target目录下的jacoco.hpi复制至Jenkins主目录下plugins目录,重启Jenkins即可。