1.在项目pom.xml中build->plugins下添加
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.2</version>
<executions>
<execution>
<id>default-prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>post-unit-test</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
2.由于项目在编译时会运行单元测试,会将/src/main/resources/lib拷贝到target/classes/lib下,
运行jacoco插件会检测到lib下jar,这些jar会阻碍jacoco正常执行,具体原因可能有以下:
1.这些jar与Maven pom.xml依赖引入的包有重复冲突
2.这些jar本身不能被jacoco探针机制正常注入相关字节码代码
解决思路:阻止/lib下jar文件拷贝到/target/classes/lib
具体做法:1.移动/src/main/resources/lib到项目顶层目录/lib下(即与src同级)
2.打包编译将顶层目录/lib拷贝到target/lib下
具体在pom.xml文件的build->plugins下找到<artifactId>maven-resources-plugin</artifactId>,在其<executions>下添加
<execution>
<id>app ext lib</id>
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/lib</outputDirectory>
<resources>
<resource>
<directory>lib</directory>
</resource>
</resources>
</configuration>
</execution>
3.为了将覆盖率统计结果显示在gitlab上需要在gitlab编译环境中做一些配置(此步骤已做)
首先需要改写gitlab-ci.yml文件调用执行的job-runner.sh文件,
登录编译服务器(172.17.197.230),
cd /home/ci/gitAgent
vi job-runner.sh
在函数function execute_job() 循环编译变动项目的代码中添加访问/target/site/jacoco/index.html的逻辑
function execute_job() {
local result=0
for project in ${CHANGED_PROJ_LIST[@]}
do
print_info ""
print_info "Executing job for project [$project]..."
if can_process $project ./$default_compile_script
then
run $project "sh ./$default_compile_script"
result=$?
print_info "Job execution complete - result [$result]"
if [ $result -ne 0 ];
then
break
fi
elif can_process $project pom.xml
then
run $project "${default_maven_script}"
result=$?
print_info "Job execution complete - result [$result]"
if [ $result -ne 0 ];
then
break
fi
else
print_info "Job execution for $project skipped"
fi
cur_report="${project}/target/site/jacoco/index.html"
if [ -f $cur_report ];then
cat $cur_report
echo "\n----key coverage results---------"
totalCoverage=$(grep -Eo "Total.*?([0-9]{1,3})%" $cur_report | grep -Eo '([0-9]{1,3})%')
totalInsCoverage=$(echo $totalCoverage | cut -d ' ' -f 1 )
totalBrchCoverage=$(echo $totalCoverage | cut -d ' ' -f 2 )
echo "total instructions coverage:$totalInsCoverage,branch coverage:$totalBrchCoverage"
serviceCoverage=$(grep -Eo ".service.Impl.*?([0-9]{1,3})%" $cur_report | grep -Eo '([0-9]{1,3})%')
serviceInsCoverage=$(echo $serviceCoverage | cut -d ' ' -f 1 )
serviceBrchCoverage=$(echo $serviceCoverage | cut -d ' ' -f 2 )
echo "service package instructions coverage:$serviceInsCoverage,branch coverage:$serviceBrchCoverage"
controllerCoverage=$(grep -Eo ".controller.*?([0-9]{1,3})%" $cur_report | grep -Eo '([0-9]{1,3})%')
controllerInsCoverage=$(echo $controllerCoverage | cut -d ' ' -f 1 )
controllerBrchCoverage=$(echo $controllerCoverage | cut -d ' ' -f 2 )
echo "controller package instructions coverage:$controllerInsCoverage,branch coverage:$controllerBrchCoverage"
else
echo "cannot find jacoco reports in ${cur_report}"
fi
done
return $result
}
4.配置覆盖率数据提取正则表达式(此步骤已做)
首先需要确保登录gitlab后左侧栏能看到Settings选项,如果没有则需要需要申请权限
点击展开Settings,点击CI/CD, 点击General pipelines settings右侧Expand 按钮
找到Test coverage parsing输入框
输入Total.*?([0-9]{1,3})%
点击save Changes按钮即可
5.验证
如果不想通过推送变更触发重新编译,可以在gitlab CI/CD的job下找到可以运行jacoco插件的项目编译任务,
进入console界面,点击右上角Retry按钮,运行通过时,应该在右侧job面板下多出一个Coverage输出