java - SonarQube + Maven + JaCoCo + GitLab CI : Sonar started to show 0% code coverage after upgrading to SonarQube 7. 9.2

标签 java maven sonarqube code-coverage jacoco

将 SonarQube 升级到版本 7.9.2(内部版本 30863)、社区版后,运行 GitLab CI Pipeline 结果显示 0.0% 覆盖率(从大约86.2%),尽管 Sonar 显示了所有单元测试。

.gitlab-ci.yml 中执行的 Maven 构建如下所示:

    - mvn test sonar:sonar -Dsonar.host.url=${SONAR_HOST_URL} -Dsonar.login=${SONAR_TOKEN}

显然,这与臭名昭著的 sonar.coverage.jacoco.xmlReportPathssonar.jacoco.reportPaths Sonar-JaCoCo 插件设置有关(请参阅 https://docs.sonarqube.org/pages/viewpage.action?pageId=1442166 )。

查看管道作业日志后,我发现了以下内容(项目名称被混淆为 myProject):

SonarQube 升级之前:

[INFO] Sensor JaCoCo XML Report Importer [jacoco]
[INFO] Sensor JaCoCo XML Report Importer [jacoco] (done) | time=3ms
[INFO] Sensor SurefireSensor [java]
[INFO] parsing [/builds/myProject/target/surefire-reports]
[INFO] Sensor SurefireSensor [java] (done) | time=87ms
[INFO] Sensor JaCoCoSensor [java]
[WARNING] Property 'sonar.jacoco.reportPaths' is deprecated (JaCoCo binary format). 'sonar.coverage.jacoco.xmlReportPaths' should be used instead (JaCoCo XML format). Please check that the JaCoCo plugin is installed on your SonarQube Instance.
[INFO] Analysing /builds/myProject/target/jacoco.exec
[INFO] Sensor JaCoCoSensor [java] (done) | time=206ms

SonarQube 升级后:

[INFO] Sensor JaCoCo XML Report Importer [jacoco]
[INFO] Sensor JaCoCo XML Report Importer [jacoco] (done) | time=3ms
[INFO] Sensor SurefireSensor [java]
[INFO] parsing [/builds/myProject/target/surefire-reports]
[INFO] Sensor SurefireSensor [java] (done) | time=86ms
[INFO] Sensor JavaXmlSensor [java]
[INFO] 1 source files to be analyzed
[INFO] Sensor JavaXmlSensor [java] (done) | time=302ms

因此,在 sonar.jacoco.reportPaths 设置方面显然存在一些差异。 值得注意的是,我没有明确设置这两个设置中的任何一个。

如何修复 JaCoCo 报告的解析以使其正常工作(无论旧设置还是新设置)?

最佳答案

快速回答

mvn test 替换为 mvn verify。无需显式设置声明。

我的调查过程

我尝试使用显式设置值默认设置来执行构建。

1) 已弃用设置的显式默认值:-Dsonar.jacoco.reportPaths=target/jacoco.exec

这会产生以下日志,表明此设置对于新的 Sonar 不再起作用:

[INFO] Sensor JaCoCo XML Report Importer [jacoco] (done) | time=57ms
[INFO] Sensor SurefireSensor [java]
[INFO] parsing [/builds/myProject/target/surefire-reports]
[INFO] Sensor SurefireSensor [java] (done) | time=23ms
[INFO] Sensor Removed properties sensor [java]
[WARNING] Property 'sonar.jacoco.reportPaths' is no longer supported. Use JaCoCo's xml report and sonar-jacoco plugin.
[INFO] Sensor Removed properties sensor [java] (done) | time=1ms

显然,覆盖率保持在0.0%

另请参阅有关此主题的 SO 相关 Ant 问题:Display Sonar Code Coverage with jacoco.exec file in Sonar LTS 7.9.2 .

2) 新设置的显式默认值:-Dsonar.coverage.jacoco.xmlReportPaths=target/site/jacoco/jacoco.xml

注意:尽管此默认值(由于某种原因)没有记录在 https://docs.sonarqube.org/pages/viewpage.action?pageId=1442166 上,我刚刚通过在本地 target 目录中搜索 jacoco.xml 找到了它。

覆盖率保持在 0.0%,GitLab CI 作业日志开始终于显示出一些清晰的内容:

[INFO] Sensor SonarCSS Rules [cssfamily] (done) | time=1ms
[INFO] Sensor JaCoCo XML Report Importer [jacoco]
[WARNING] Report doesn't exist: '/builds/myProject/target/site/jacoco/jacoco.xml'
[INFO] Sensor JaCoCo XML Report Importer [jacoco] (done) | time=4ms
[INFO] Sensor SurefireSensor [java]

! 遗憾的是,在没有显式设置的情况下运行时,不会写入此日志。这将大大简化调查。

现在我们明白了:/target/site 不是在我的 GitLab CI 管道上生成的。显然,这是因为该脚本仅包含 mvn test,它没有通过 Maven Build Lifecycle 走得足够远。 .

查看 Maven + Sonar 示例:它们包含 mvn verify sonar:sonarmvn install sonar:sonar

因此我们开始:

3) mvn verify + 新设置的显式默认值:-Dsonar.coverage.jacoco.xmlReportPaths=target/site/jacoco/jacoco。 xml

这成功了! SonarQube 上显示覆盖范围,JaCoCo 相关日志部分中不存在错误:

[INFO] Sensor JaCoCo XML Report Importer [jacoco]
[INFO] Sensor JaCoCo XML Report Importer [jacoco] (done) | time=94ms
[INFO] Sensor SurefireSensor [java]
[INFO] parsing [/builds/myProject/target/surefire-reports]
[INFO] Sensor SurefireSensor [java] (done) | time=92ms
[INFO] Sensor JavaXmlSensor [java]
[INFO] Sensor JavaXmlSensor [java] (done) | time=7ms

4) mvn verify 无需显式设置。

所以最后我在没有任何设置值的情况下进行了尝试,并且它有效:

  - mvn verify sonar:sonar -Dsonar.host.url=${SONAR_HOST_URL} -Dsonar.login=${SONAR_TOKEN}

摘要

  • 旧的 sonar.jacoco.reportPaths 设置不适用于新的 SonarQube 版本 (7.9.2+)。
  • sonar.coverage.jacoco.xmlReportPaths 设置的默认值为 target/site/jacoco/jacoco.xml
  • 根本原因是未生成/target/site/jacoco目录(包括jacoco.xml和JaCoCo报告的所有其他文件)
  • 我所要做的就是将 mvn test 替换为 mvn verify
  • 主要的 Sonar 缺陷是,当未显式设置 sonar.coverage.jacoco.xmlReportPaths 的值时,不会写入有关“找不到报告文件”的错误日志。 SonarQube 开发人员修复它会很有好处。

关于java - SonarQube + Maven + JaCoCo + GitLab CI : Sonar started to show 0% code coverage after upgrading to SonarQube 7. 9.2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61235045/

相关文章:

maven - apache cxf-codegen-plugin wsdl2java 相对 wsdlLocation

java - Android 项目中的 Creative SDK 图像编辑器 UI

java - 防止从 Git 存储库 pull 时需要 "add external jars"

Eclipse/SonarQube 集成 : How to handle Checkstyle/PMD/FindBugs

Sonar Qube 6.1 : How can I see the changes over time without the dashboards?

java - Android:如果 API 级别低于 21,则禁用内容转换动画

java - 如何在 java 中检索特定类的实例化对象?

sonarqube - 哪个版本的 java 兼容 sonar-maven-plugin

java - 修复 Android 8+ 上的 'background service' 问题

java - 如何在没有任何内置函数的情况下从java中的两个字符串中删除重复的字母表?