Jenkins集成jacoco收集集成測試覆蓋率
2020-02-28
0 整體思路
1 安裝版本
2 全局工具配置
3 Jenkins創建JacocoIntegrateTestDemo項目
3.1 配置源碼管理
3.2 配置構建
3.3 配置構建后操作
4 執行JacocoIntegrateTestDemo項目,查看代碼覆蓋率
0 整體思路
- 啟動被測系統
java -javaagent:D:/software/jacoco/lib/jacocoagent.jar=includes=*,output=tcpserver,port=6300,address=10.8.116.81,append=true -jar D:/Code/jacocodemo/target/jacocodemo.jar --server.port=9999
- 執行測試腳本(可通過postman執行,或自動化測試腳本)
- 通過jenkins Job收集展示覆蓋率報告
- 拉取codenet上的JacocoDemo的代碼(ant的build.xml也放在源代碼根目錄下)
- 編譯源代碼生成class文件(jacoco生成report需要)
- ant dump拉取覆蓋率信息jacoco.exec
- 配置jacoco coverage report展示覆蓋率信息
1 安裝版本
jenkins插件
jenkins -> 系統管理 -> 插件管理
- git
- jacoco
- maven
圖1 插件git、jacoco、maven
2 全局工具配置
jenkins -> 系統管理 -> 全局工具配置
以便在window批處理中使用
圖2 jdk git maven全局配置
3 Jenkins創建JacocoIntegrateTestDemo項目
圖3 新建自由風格的軟件項目
3.1 配置源碼管理
- Repository Url: git@e.coding.net:Ming8006/jacocodemo.git
- Credentials: ming
圖4 配置源碼管理
上圖4源碼管理配置中,點擊 立即構建 JacocoIntegrateTestDemo項目 時,會拉取 git@e.coding.net:Ming8006/jacocodemo.git 到jenkins部署的機器目錄下: D:\Program Files (x86)\Jenkins\workspace\JacocoIntegrateTestDemo
在上圖4中,源碼管理的憑據是 ming ,憑據設置如下
Jenkins->憑據->系統->添加域
圖5 添加域e.coding.net
圖6 在域中添加ssh憑據
在上圖6中,添加ssh的private key,jekins通過ssh 拉取代碼 git@e.coding.net:Ming8006/jacocodemo.git ,需在coding.net上添加公鑰,如下圖
圖7 電腦生成的公鑰私鑰
圖8 添加公鑰到codenet個人賬戶
3.2 配置構建
圖9 構建配置
在上圖9中,做2步構建操作:
- 添加window批處理命令,在jenkins workspace目錄項目JacocoIntegrateTestDemo下執行mun clean compile生成class文件
- 安裝build.xml的配置獲取覆蓋率信息jacoco.exec
注意:在獲取覆蓋率信息前,先postman調用JacocoDemo程序的接口
build.xml如下:

<?xml version="1.0" encoding="UTF-8"?> <project name="JacocoDmo" xmlns:jacoco="antlib:org.jacoco.ant" default="jacoco"> <!--Jacoco 的安裝路徑--> <property name="jacocoantPath" value="D:\software\jacoco\lib\jacocoant.jar"/> <!--最終生成 .exec 文件的路徑,Jacoco 就是根據這個文件生成最終的報告的--> <property name="jacocoexecPath" value=".\target\jacoco.exec"/> <!--遠程 Tomcat 服務的 ip 地址--> <property name="server_ip" value="10.8.116.81"/> <!--前面配置的遠程 Tomcat 服務打開的端口,要跟上面配置的一樣--> <property name="server_port" value="6300"/> <!--讓 ant 知道去哪兒找 Jacoco--> <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml"> <classpath path="${jacocoantPath}" /> </taskdef> <!--dump 任務: 根據前面配置的 ip 地址,和端口號, 訪問目標 Tomcat 服務,並生成 .exec 文件。--> <target name="dump"> <jacoco:dump address="${server_ip}" reset="false" destfile="${jacocoexecPath}" port="${server_port}" append="true"/> </target> </project>
圖 jenkins workspace下JacocoItegrateTestDemo目錄結構
3.3 配置構建后操作
圖10 構建后操作
如圖10中,配置Jacoco Coverage Report
4 執行JacocoIntegrateTestDemo項目,查看代碼覆蓋率
圖10 查看代碼覆蓋率
Jenkins控制台輸出

在 master 上構建 在工作空間 D:\Program Files (x86)\Jenkins\workspace\JacocoIntegrateTestDemo 中 using credential 904f882b-46cf-42d6-ae43-68639b1b1482 > D:\Program Files\Git\bin\git.exe rev-parse --is-inside-work-tree # timeout=10 Fetching changes from the remote Git repository > D:\Program Files\Git\bin\git.exe config remote.origin.url git@e.coding.net:Ming8006/jacocodemo.git # timeout=10 Fetching upstream changes from git@e.coding.net:Ming8006/jacocodemo.git > D:\Program Files\Git\bin\git.exe --version # timeout=10 using GIT_SSH to set credentials > D:\Program Files\Git\bin\git.exe fetch --tags --force --progress -- git@e.coding.net:Ming8006/jacocodemo.git +refs/heads/*:refs/remotes/origin/* # timeout=10 > D:\Program Files\Git\bin\git.exe rev-parse "refs/remotes/origin/master^{commit}" # timeout=10 > D:\Program Files\Git\bin\git.exe rev-parse "refs/remotes/origin/origin/master^{commit}" # timeout=10 Checking out Revision 06b9139dc9be810a86df0d093e2ab278ad765957 (refs/remotes/origin/master) > D:\Program Files\Git\bin\git.exe config core.sparsecheckout # timeout=10 > D:\Program Files\Git\bin\git.exe checkout -f 06b9139dc9be810a86df0d093e2ab278ad765957 # timeout=10 Commit message: "build.xml" > D:\Program Files\Git\bin\git.exe rev-list --no-walk 06b9139dc9be810a86df0d093e2ab278ad765957 # timeout=10 [JacocoIntegrateTestDemo] $ cmd /c call C:\Windows\TEMP\jenkins2606191743471144903.bat D:\Program Files (x86)\Jenkins\workspace\JacocoIntegrateTestDemo>d: D:\Program Files (x86)\Jenkins\workspace\JacocoIntegrateTestDemo>cd D:\Program Files (x86)\Jenkins\workspace\JacocoIntegrateTestDemo D:\Program Files (x86)\Jenkins\workspace\JacocoIntegrateTestDemo>mvn clean compile [INFO] Scanning for projects... [INFO] [INFO] -----------------------< com.example:jacocodemo >----------------------- [INFO] Building jacocodemo 0.0.1-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-clean-plugin:3.0.0:clean (default-clean) @ jacocodemo --- [INFO] Deleting D:\Program Files (x86)\Jenkins\workspace\JacocoIntegrateTestDemo\target [INFO] [INFO] --- jacoco-maven-plugin:0.8.3:prepare-agent (jacoco-initialize) @ jacocodemo --- [INFO] argLine set to "-javaagent:D:\\software\\maven\\repo\\m2\\org\\jacoco\\org.jacoco.agent\\0.8.3\\org.jacoco.agent-0.8.3-runtime.jar=destfile=D:\\Program Files (x86)\\Jenkins\\workspace\\JacocoIntegrateTestDemo\\target\\coverage\\jacoco-unit.exec" [INFO] [INFO] --- maven-resources-plugin:3.0.2:resources (default-resources) @ jacocodemo --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Copying 1 resource [INFO] Copying 0 resource [INFO] [INFO] --- maven-compiler-plugin:3.7.0:compile (default-compile) @ jacocodemo --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 6 source files to D:\Program Files (x86)\Jenkins\workspace\JacocoIntegrateTestDemo\target\classes [INFO] /D:/Program Files (x86)/Jenkins/workspace/JacocoIntegrateTestDemo/src/main/java/com/example/controller/MathController.java: D:\Program Files (x86)\Jenkins\workspace\JacocoIntegrateTestDemo\src\main\java\com\example\controller\MathController.java使用了未經檢查或不安全的操作。 [INFO] /D:/Program Files (x86)/Jenkins/workspace/JacocoIntegrateTestDemo/src/main/java/com/example/controller/MathController.java: 有關詳細信息, 請使用 -Xlint:unchecked 重新編譯。 [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.773 s [INFO] Finished at: 2020-02-28T14:13:11+08:00 [INFO] ------------------------------------------------------------------------ [JacocoIntegrateTestDemo] $ cmd.exe /C "ant.bat -file build.xml dump && exit %%ERRORLEVEL%%" Buildfile: D:\Program Files (x86)\Jenkins\workspace\JacocoIntegrateTestDemo\build.xml dump: [jacoco:dump] Connecting to /10.8.116.81:6300 [jacoco:dump] Dumping execution data to D:\Program Files (x86)\Jenkins\workspace\JacocoIntegrateTestDemo\target\jacoco.exec BUILD SUCCESSFUL Total time: 0 seconds [JaCoCo plugin] Collecting JaCoCo coverage data... [JaCoCo plugin] **/target/**.exec;**/target/classes;**/src/main/java; locations are configured [JaCoCo plugin] Number of found exec files for pattern **/target/**.exec: 1 [JaCoCo plugin] Saving matched execfiles: D:\Program Files (x86)\Jenkins\workspace\JacocoIntegrateTestDemo\target\jacoco.exec [JaCoCo plugin] Saving matched class directories for class-pattern: **/target/classes: [JaCoCo plugin] - D:\Program Files (x86)\Jenkins\workspace\JacocoIntegrateTestDemo\target\classes 6 files [JaCoCo plugin] Saving matched source directories for source-pattern: **/src/main/java: [JaCoCo plugin] Source Inclusions: **/*.java,**/*.groovy,**/*.kt,**/*.kts [JaCoCo plugin] Source Exclusions: [JaCoCo plugin] - D:\Program Files (x86)\Jenkins\workspace\JacocoIntegrateTestDemo\src\main\java 6 files [JaCoCo plugin] Loading inclusions files.. [JaCoCo plugin] inclusions: [] [JaCoCo plugin] exclusions: [] [JaCoCo plugin] Thresholds: JacocoHealthReportThresholds [minClass=0, maxClass=0, minMethod=0, maxMethod=0, minLine=0, maxLine=0, minBranch=0, maxBranch=0, minInstruction=0, maxInstruction=0, minComplexity=0, maxComplexity=0] [JaCoCo plugin] Publishing the results.. [JaCoCo plugin] Loading packages.. [JaCoCo plugin] Done. [JaCoCo plugin] Overall coverage: class: 100, method: 79, line: 72, branch: 63, instruction: 76, complexity: 71 Finished: SUCCESS
參考
[1] jenkins+jacoco+ant自動化代碼和應用服務代碼分離場景獲取遠程服務的覆蓋率
[2] Jenkins + Jacoco 持續集成代碼覆蓋率
、