1. Jacoco 的原理可参考官网或网上其他 Jacoco 相关的文章

https://www.eclemma.org/jacoco/trunk/doc/index.html

2. Jacoco 与 Jenkins 集成获取覆盖率报告的步骤

2.1 服务启动命令中,加入 jacoco 的代理参数

如:

[“/bin/sh”,”-c”,”mkdir /project/jacoco && cd /project/jacoco && wget http://search.maven.org/remotecontent?filepath=org/jacoco/jacoco/0.8.5/jacoco-0.8.5.zip -O ./jacoco-0.8.5.zip && unzip jacoco-0.8.5.zip && java -javaagent:/project/jacoco/lib/jacocoagent.jar=dumponexit=true,includes=com.*,output=tcpserver,port=6300,address=0.0.0.0 -jar -Dspring.profiles.active=test /project/start.jar”]
2.2 jenkins 目录下创建 build.xml

如:/var/lib/jenkins/workspace/build.xml

<!-- reset="true"是指在 dump 完成之后,重置 jvm 中的覆盖率数据为空。append="true"是指 dump 出来的 exec 文件为增量方式 -->

2.3 jenkins 中创建任务

-- 创建自由风格任务
-- 拉取服务的代码

-- 配置 mvn 命令进行编译生成 class 文件

-- 配置 ant 命令进行 dump 拉取覆盖率信息

-- 配置 jacoco report 信息

以上配置完成后,执行任务,可得到覆盖率报告,如:

但,仍存在问题:被测服务部署的版本与 jenkins 拉取的版本不一致时,会导致覆盖率报告信息不准确

3. 解决问题:被测服务部署的版本与 jenkins 拉取的版本不一致

解决方案:为 jenkins 安装 Dynamic Parameter 插件,动态获取测服务的分支及 commitid,作为变量传递给 jenkins,从而确保两边保持一致
参考:https://blog.csdn.net/A_man_only/article/details/95320389
https://www.jianshu.com/p/dd1b0f5c6a01

Step1:在项目的 pom 文件中加入插件:

<plugin>
       <groupId>pl.project13.maven</groupId>
       <artifactId>git-commit-id-plugin</artifactId>
</plugin>

验证:重新部署服务后,通过访问<项目的访问 url>/actuator/info 得到返回结果,内含分支信息及提交版本号信息,如:

{"git":{"commit":{"time":"2020-07-02T09:11:58Z","id":"bdcae43"},"branch":"master"}}

Step2:Jenkins 任务中配置动态变量,获取提交版本号 commitId

def response= "curl http://[host]/promotion/actuator/info".execute()
response.waitFor()
def respStr = response.text
def firstIndex = respStr.lastIndexOf("id")+5
def lastIndex = respStr.lastIndexOf("branch")-4
def id=respStr.substring(firstIndex, lastIndex)

Step3:Jenkins 任务中,配置使用 commitId 获取源码


↙↙↙阅读原文可查看相关链接,并与作者交流