Sonarqube:为多模块导入 Jacoco xml 报告

Sonarqube: Import Jacoco xml report for multimodule

我有一个多模块 Maven 项目,其中覆盖率报告位于另一个模块中,而不是被覆盖的 Java 类。将非空 xml 覆盖率报告(包含覆盖率信息)导入 Sonarqube 成功但显示覆盖率 0.

重现步骤:

  1. 检查 github project 并使用 mvn clean verify 构建它。之后,coverage/target/site/jacoco-aggregate-all/jacoco.xml 中存在一个汇总的 xml 报告。您可以在其中以及相应的 html-Report.
  2. 中查看覆盖率数据

  1. 使用以下命令启动sonarqube(当前版本8.4.1)并稍等片刻。
docker run -d -p 9000:9000 sonarqube

编辑:此映像中已安装插件“JaCoco xml 报告导入器”。

  1. 使用以下(详细)命令发布覆盖率数据。报告导入成功(查看日志)。
mvn sonar:sonar -X -Dsonar.projectKey=example -Dsonar.host.url=http://localhost:9000 -Dsonar.login=admin -Dsonar.password=admin -Dsonar.coverage.jacoco.xmlReportPaths=target/site/jacoco-aggregate-all/jacoco.xml

## Log output contains
...
 10:54:28.519 Reading report '<project-path>\maven-multimodule-coverage\coverage\target\site\jacoco-aggregate-all\jacoco.xml'
...
  1. 浏览至 http://localhost:9000/dashboard?id=example。您看到的覆盖率为 0。

我做错了什么?

请在 sonarqube 实例上安装 JaCoco xml report importer 插件(您可以在市场下找到它,只需在那里搜索 jacoco)。该插件将获取您的代码覆盖率并将其导入 sonarqube。所以在安装插件后请使用相同的命令在 sonarqube 上查看结果

mvn sonar:sonar -X -Dsonar.projectKey=example -Dsonar.host.url=http://localhost:9000 -Dsonar.login=admin -Dsonar.password=admin -Dsonar.coverage.jacoco.xmlReportPaths=target/site/jacoco-aggregate-all/jacoco.xml

事实证明,如果我对 xml 报告文件使用绝对路径,它就可以工作。所以我添加了

<sonar.coverage.jacoco.xmlReportPaths>${project.basedir}/../coverage/target/site/jacoco-aggregate-all/jacoco.xml</sonar.coverage.jacoco.xmlReportPaths>

到顶部 maven pom 所以 每个模块 指向同一个报告文件。为了更深入地嵌套模块目录,您必须引入 属性 main.basedir 或其他内容。

主要的理解是,您不提供映射到模块 类 的声纳覆盖报告,而是提供映射到覆盖报告的模块 类。