前言
質量保障過程中,基于jenkins+jacoco+sonar進行代碼覆蓋率統計往往是必不可少的一步。筆者前段時間進行相關專題研究時,也遇到了不少坑,因此在《jacoco 代碼覆蓋率使用中遇到的一些坑》文章提到的填坑基礎上,筆者再做一些補充。
問題及解決方法
《jacoco 代碼覆蓋率使用中遇到的一些坑》提到的“覆蓋率數據不準確”的問題,筆者在實踐過程中也遇到了,具體的問題如下。
問題:被測服務部署的版本與jenkins拉取的版本不一致。
問題描述:jenkins拉取開發(fā)代碼的分支及commitid可能與被測服務部署的不一致,從而導致代碼覆蓋率不準確。比如被測服務部署的是master分支2b9a4d commitid版本,但由于在測試過程中,開發(fā)不斷的修改push代碼,此時jenkins拉取的代碼肯定跟服務部署的版本不一致。
解決思路:提取被測服務的分支及commitid,作為變量傳遞給jenkins,從而確保兩邊保持一致。
具體步驟:
1、jenkins上安裝Dynamic Parameter插件
該插件依賴scriptler.hpi和token-macro.hpi。
2、配置Dynamic Parameter,提取分支
//提取部署服務所在分支,根據curl返回調整var1及var2的分隔符
def response= ("curl http://171.11.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,整段代碼的意思就是提取分支名稱,后續(xù)通過${branch}來引用即可。
3、配置分支變量
4、提取commitid
shell.sh如下:
#確保git上拉取的commitId與部署服務器的一致,否則會統計覆蓋率不準確
var=$(curl http://171.11.11.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構建會報錯,具體原因去查下兩者的區(qū)別就明白了。
按以上的步驟配置后,就能確保被測服務部署的版本與jenkins拉取的版本一致了,代碼覆蓋率統計不準確的問題也就解決了。至于jenkins+jacoco+sonar的環(huán)境搭建,參考《jacoco+sonarQube+sonarScanner+ant+jenkins環(huán)境搭建》即可。