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

Posted

技术标签:

【中文标题】Sonarqube:为多模块导入 Jacoco xml 报告【英文标题】:Sonarqube: Import Jacoco xml report for multimodule 【发布时间】:2020-11-07 01:27:58 【问题描述】:

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

重现步骤:

    在github project 之后结帐并使用mvn clean verify 构建它。之后,存在位于coverage/target/site/jacoco-aggregate-all/jacoco.xml 的聚合 xml 报告。您可以在其中以及相应的 html-Report 中查看覆盖率数据。

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

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

    使用以下(详细)命令发布覆盖率数据。报告导入成功(见日志)。
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'
...
    浏览至http://localhost:9000/dashboard?id=example。您会看到 0 的覆盖率。

我做错了什么?

【问题讨论】:

【参考方案1】:

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

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

到顶部的maven pom,所以每个模块都指向同一个报告文件。对于模块目录的更深嵌套,您必须引入属性 main.basedir 或其他东西。

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

【讨论】:

【参考方案2】:

请在 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

【讨论】:

感谢您的回答。在给定的 docker 映像中,此插件已安装。请参阅附加的主题截图。 @Rokko_11 您能否分享您在上面添加到描述中的第 3 步的完整日志? 我使用 dockerized maven 命令生成following log。 docker run -it --rm --name example -v "%CD%":/usr/src/mymaven -w /usr/src/mymaven maven:3.6-jdk-8 mvn sonar:sonar -X -Dsonar.projectKey=example -Dsonar.host.url=http://kubernetes.docker.internal:9000 -Dsonar.login=admin -Dsonar.password=admin -Dsonar.coverage.jacoco.xmlReportPaths=target/site/jacoco-aggregate-all/jacoco.xml | grep -i "jacoco\|sonar|squid" &gt; out-***2.log。报告在第 640 行读取 声纳日志显示,覆盖成功导入:pastebin.com/CgdQg7TH

以上是关于Sonarqube:为多模块导入 Jacoco xml 报告的主要内容,如果未能解决你的问题,请参考以下文章

SonarQube + JaCoCo + TeamCity 模块名称错误

Sonarqube + Jacoco - 声纳不会从属性中读取报告路径

SonarQube Jacoco离线仪器在Maven Multi Module Project中显示0%的覆盖率

gradle、sonarqube 和 jacoco 插件的哪些版本兼容

使用 Powermock 在 Sonarqube 中配置 jacoco 以进行集成和单元测试报告

SonarQube 覆盖缺少 Jacoco 报告涵盖的一些行