sonarqube9配置修改
项目基础环境:maven jdk8
操作目标:
-
推送sonar并在sonar上能查看到结果
-
能看到代码问题,单元测试覆盖率等具体指标
操作步骤:
参考官方文档执行操作(multi-module Maven project):
-
对于多模块 Maven 项目,您可以在父 pom 中配置
jacoco-maven-plugin
配置文件,就像在上面的单个模块案例中一样。默认情况下,将为每个模块生成单独的覆盖率报告。 -
如果要将所有特定于模块的报告聚合到一个项目级报告中,最简单的解决方案是创建一个特殊的 Maven 模块(与您已有的模块一起),该模块除了使用
report-aggregate
目标之外pom.xml
什么都不包含。下面是一个示例:<project> <artifactId>my-project-report-aggregate</artifactId> <name>My Project</name> <description>Aggregate Coverage Report</description> <dependencies> <dependency> <groupId>${project.groupId}</groupId> <artifactId>my-module-1</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>${project.groupId}</groupId> <artifactId>my-module-2</artifactId> <version>${project.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <executions> <execution> <id>report-aggregate</id> <phase>verify</phase> <goals> <goal>report-aggregate</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
-
maven clean verify
在该目录中调用时,将生成聚合报告并将其放置在report-aggregate-module
该目录中的标准位置target/site/jacoco-aggregate/jacoco.xml
。然后,在顶层pom.xml
中,您设置sonar.coverage.jacoco.xmlReportPaths
到此位置:
```
<properties>/
<sonar.coverage.jacoco.xmlReportPaths>
${project.basedir}/report-aggregate/target/site/
jacoco-aggregate/jacoco.xml
</sonar.coverage.jacoco.xmlReportPaths>
</properties>
```
支持**通配符和逗号分隔的路径**列表。有关详细信息,请参阅测试覆盖率参数。
执行文档操作后出现问题:
1. sonar能推送上去,没有单元测试覆盖率
问题处理:
-
查看到该父级目录也就是sonar.coverage.jacoco.xmlReportPaths下的xml生成大小为1kb,但是很多模块下的jacoco.xml都为十几或者上百kb,怀疑是报告聚合的问题。
-
搜索到jacoco:report-aggregate,了解到有些特性0.8.7版本后的才支持于是升级到0.8.11,进行打包尝试,参考如下
<formats> List 0.8.7 A list of report formats to generate. Supported formats are HTML, XML and CSV. Defaults to all formats if no values are given. Default value is : HTML,XML,CSV . <includeCurrentProject> boolean 0.8.9 Include this project in the report. If true then this projects class and source files as well as JaCoCo execution data files will be collected.
ps:打包发布这里花了不少时间,因为是在父模块修改,大多模块都会依赖父模块,所以都需要重新打包发布
-
再次执行后发现父模块下的jacoco.xml还是1kb,开始查看各个模块下的jacoco.xml的大小以及依赖关系,发现依赖只有两级的情况下jacoco.xml正常生成,比如一个父模块下面只有平铺的子模块依赖,这样的模块会聚合生成一个xml,如果下面还含其他父模块,那么jacoco.xml就不会生成。
ps: 找到该问题后,后面进行了很多次尝试,比如是不是需要把jacoco的配置写在jar包生成的模块等。最后不依赖官方提供的实例,阅读官方文档,按照项目以前的配置设置,尽量最小修改。
靠谱操作:
-
在以前的sonar版本生成的jacoco.exec文件时,我们并没有指定生成报告依赖的文件,但是sonar会扫描到所有的exec并集成。于是再去查看官方文档,发现指定文件这个配置支持通配符于是进行配置,扫描所有模块下的jacoco.xml
<properties> <sonar.coverage.jacoco.xmlReportPaths>${project.basedir}/**/target/site/jacoco/jacoco.xml</sonar.coverage.jacoco.xmlReportPaths> </properties>
-
这里我们就不需要聚合报告report-aggregate了,于是只需要修改以前jacoco配置,产生xml报告即可
<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.5</version> <executions> <execution> <id>pre-test</id> <goals> <goal>prepare-agent</goal> </goals> </execution> <!--增加xml报告配置--> <execution> <id>report</id> <goals> <goal>report</goal> </goals> </execution> </executions> </plugin>
ps:目前来看已经很简单了,只需要修改两个文件两个位置。能不能够更简单,因为以前的jacoco.exec的报告整合可没有sonar.coverage.jacoco.xmlReportPaths这个配置,于是删除这个配置推送发现,代码覆盖率正常,发现sonar扫描会读取默认配置的xml。所以新sonar版本升级只需要在以前pom配置上增加6行配置即可。
<execution> <id>report</id> <goals> <goal>report</goal> </goals> </execution>