前提是Jenkins环境已经搭建完成,相关插件下载完成。可以参考我的上一篇文章:Linux下配置Jenkins+git+sonar+sonar-scanner
我使用到的各个工具的版本:
jenkins: 2.164.3
jacoco:0.8.2
ant:1.9.14
git:公司内部的
maven:3.5.4
jenkins整体构建过程介绍:
a.jekins 从git上 拉代码,编译
b. 远程机器配置jacocoagent启动方式,提供端口给下面ant dump用
c.jekins上 编写build.xml文件放下job路径下,执行ant dump命令,得到jacoco.exec文件(路径在build.xml中配置)
d.jekins执行ant report,生成覆盖率报表
操作步骤:
1. 下载jacoco插件,下载地址:https://www.jacoco.org/jacoco/ 我下载的是jacoco-0.8.2版本,解压后需要使用的是lib包下面的jacocoagent.jar和jacocoant.jar。其中jacocoant.jar放到jenkins所在机器上,jacocoagent.jar放到远程服务所在的机器上
2. 远程tomcat服务增加启动参数:-javaagent:/usr/local/app/jacoco/jacocoagent.jar=includes=*,output=tcpserver,port=6300,address=*,append=true 服务启动后记得检查6300端口是否处于监听状态
3. Jenkins所在机器安装ant,网上教程很多不再赘述
4. Jenkins所在的机器新增build.xml文件,内容如下(这是最简单的情况,第7点有多台机器,多个模块的情况):
<?xml version="1.0" ?>
<project name="statistical" xmlns:jacoco="antlib:org.jacoco.ant" default="jacoco">
<!--Jacoco的安装路径-->
<property name="jacocoantPath" value="/home/devs/ant/jacocoant.jar"/>
<!--最终生成.exec文件的路径,Jacoco就是根据这个文件生成最终的报告的-->
<property name="jacocoexecPath" value="/var/lib/jenkins/workspace/xxx-code-coverage/exec/jacoco.exec"/>
<!--生成覆盖率报告的路径-->
<property name="reportfolderPath" value="/var/lib/jenkins/workspace/xxx-code-coverage/report/"/>
<!--远程tomcat服务的ip地址-->
<property name="server_ip1" value="xxx"/>
<!--前面配置的远程tomcat服务打开的端口,要跟上面配置的一样-->
<property name="server_port" value="xxx"/>
<!--源代码路径-->
<property name="commonSrc" value="/var/lib/jenkins/workspace/xxx-code-coverage/src/main/java" />
<!--.class文件路径-->
<property name="commonClass" value="/var/lib/jenkins/workspace/xxx-code-coverage/target/classes" />
<!--让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_ip1}" reset="false" destfile="${jacocoexecPath}" port="${server_port}" append="true"/>
</target>
<!--jacoco任务:
根据前面配置的源代码路径和.class文件路径,
根据dump后,生成的.exec文件,生成最终的html覆盖率报告。-->
<target name="report">
<delete dir="${reportfolderPath}" />
<mkdir dir="${reportfolderPath}" />
<jacoco:report>
<executiondata>
<file file="${jacocoexecPath}" />
</executiondata>
<structure name="JaCoCo Report">
<group name="statistical">
<classfiles>
<fileset dir="${commonClass}" />
</classfiles>
<sourcefiles encoding="gbk">
<fileset dir="${commonSrc}" />
</sourcefiles>
</group>
</structure>
<html destdir="${reportfolderPath}" encoding="utf-8" />
</jacoco:report>
</target>
</project>
5. jenkins新增统计代码覆盖率的任务,主要配置如下:
pwd
mvn clean compile -Dmaven.test.skip=true
git checkout test
git pull
pwd
echo $WORKSPACE
/home/devs/ant/apache-ant-1.9.14/bin/ant dump
/home/devs/ant/apache-ant-1.9.14/bin/ant report
6. 点立即构建,即可统计到结果
7. 附一个多台机器,并且工程下有多个模块的build.xml:
<?xml version="1.0" ?>
<project name="dev-console-web" xmlns:jacoco="antlib:org.jacoco.ant" default="jacoco">
<!--Jacoco的安装路径-->
<property name="jacocoantPath" value="/XXXXX/jacocoant.jar"/>
<!--最终生成.exec文件的路径,Jacoco就是根据这个文件生成最终的报告的-->
<property name="jacocoexecPath" value="/XXXX/jacoco.exec"/>
<!--生成覆盖率报告的路径-->
<property name="reportfolderPath" value="/XXX/"/>
<!--远程tomcat服务的ip地址-->
<property name="server_ip1" value="ip1"/>
<property name="server_ip2" value="ip2"/>
<!--前面配置的远程tomcat服务打开的端口,要跟上面配置的一样-->
<property name="server_port" value="XXX"/>
<!--源代码路径-->
<property name="1Src" value="/.../模块一/src/main/java" />
<property name="2Src" value="/.../模块二/src/main/java" />
<property name="3Src" value="/.../模块三/src/main/java" />
<property name="4Src" value="/.../模块四/src/main/java" />
<property name="5Src" value="/.../模块五/src/main/java" />
<!--.class文件路径-->
<property name="1Class" value="/.../模块一/target/classes" />
<property name="2Class" value="/.../模块二/target/classes" />
<property name="3Class" value="/.../模块三/target/classes" />
<property name="4Class" value="/.../模块四/target/classes" />
<property name="5Class" value="/.../模块五/target/classes" />
<!--让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_ip1}" reset="false" destfile="${jacocoexecPath}" port="${server_port}" append="true"/>
<jacoco:dump address="${server_ip2}" reset="false" destfile="${jacocoexecPath}" port="${server_port}" append="true"/>
</target>
<!--jacoco任务:
根据前面配置的源代码路径和.class文件路径,
根据dump后,生成的.exec文件,生成最终的html覆盖率报告。-->
<target name="report">
<delete dir="${reportfolderPath}" />
<mkdir dir="${reportfolderPath}" />
<jacoco:report>
<executiondata>
<file file="${jacocoexecPath}" />
</executiondata>
<structure name="JaCoCo Report">
<group name="dev-console-common">
<classfiles>
<fileset dir="${commonClass}" />
</classfiles>
<sourcefiles encoding="gbk">
<fileset dir="${commonSrc}" />
</sourcefiles>
</group>
<group name="dev-console-dao">
<classfiles>
<fileset dir="${daoClass}" />
</classfiles>
<sourcefiles encoding="gbk">
<fileset dir="${daoSrc}" />
</sourcefiles>
</group>
<group name="dev-console-rpc">
<classfiles>
<fileset dir="${rpcClass}" />
</classfiles>
<sourcefiles encoding="gbk">
<fileset dir="${rpcSrc}" />
</sourcefiles>
</group>
<group name="dev-console-web">
<classfiles>
<fileset dir="${consoleWebClass}" />
</classfiles>
<sourcefiles encoding="gbk">
<fileset dir="${consoleWebSrc}" />
</sourcefiles>
</group>
<group name="dev-operation-web">
<classfiles>
<fileset dir="${operationWebClass}" />
</classfiles>
<sourcefiles encoding="gbk">
<fileset dir="${operationWebSrc}" />
</sourcefiles>
</group>
</structure>
<html destdir="${reportfolderPath}" encoding="utf-8" />
</jacoco:report>
</target>
</project>