前言
质量保障过程中,基于jenkins+jacoco+sonar进行代码覆盖率统计往往是必不可少的一步。笔者前段时间进行相关专题研究时,也遇到了不少坑,因此在《jacoco 代码覆盖率使用中遇到的一些坑》文章提到的填坑基础上,笔者再做一些补充。
问题及解决方法
《jacoco 代码覆盖率使用中遇到的一些坑》提到的“覆盖率数据不准确”的问题,笔者在实践过程中也遇到了,具体的问题如下。
问题:被测服务部署的版本与jenkins拉取的版本不一致。
问题描述:jenkins拉取开发代码的分支及commitid可能与被测服务部署的不一致,从而导致代码覆盖率不准确。比如被测服务部署的是master分支2b9a4d commitid版本,但由于在测试过程中,开发不断的修改push代码,此时jenkins拉取的代码肯定跟服务部署的版本不一致。
解决思路:提取被测服务的分支及commitid,作为变量传递给jenkins,从而确保两边保持一致。
具体步骤:
1、jenkins上安装Dynamic Parameter插件
该插件依赖scriptler.hpi和token-macro.hpi。
2、配置Dynamic Parameter,提取分支
//提取部署服务所在分支,根据curl返回调整var1及var2的分隔符
def response= ("curl http://172.16.11.11:8080/healthcheck.html").execute()
response.waitFor()
var1= {it.split("git.branch=")[1]}
var2={it.split(" <br/>")[0]}
var2(var1("${response.in.text}"))
上面的curl命令会返回被测服务部署的分支和commitid,整段代码的意思就是提取分支名称,后续通过${branch}来引用即可。
3、配置分支变量
引用变量
4、提取commitid
提取commitid
shell.sh如下:
#确保git上拉取的commitId与部署服务器的一致,否则会统计覆盖率不准确
var=$(curl http://172.16.13.11:8080/healthcheck.html)
var1=${var#*git.commit.id=}
commitId=${var1%% <br>*}
echo ${commitId}
cd ${WORKSPACE}
git checkout -B tomandy ${commitId}
上面的curl命令会返回被测服务部署的分支和commitid,整段脚本的意思是强制检出当前分支(第2步提取的分支)下的某个commitid版本。此处需使用大写的 -B,使用-b的话,否则反复进行jenkins构建会报错,具体原因去查下两者的区别就明白了。
按以上的步骤配置后,就能确保被测服务部署的版本与jenkins拉取的版本一致了,代码覆盖率统计不准确的问题也就解决了。至于jenkins+jacoco+sonar的环境搭建,参考《jacoco+sonarQube+sonarScanner+ant+jenkins环境搭建》即可。
网友评论