SonarQube + Maven + JaCoCo + GitLab CI:Sonar 在升级到 SonarQube 7.9.2 后开始显示 0% 的代码覆盖率

Posted

技术标签:

【中文标题】SonarQube + Maven + JaCoCo + GitLab CI:Sonar 在升级到 SonarQube 7.9.2 后开始显示 0% 的代码覆盖率【英文标题】:SonarQube + Maven + JaCoCo + GitLab CI: Sonar started to show 0% code coverage after upgrading to SonarQube 7.9.2 【发布时间】:2020-07-28 19:05:37 【问题描述】:

在我们将 SonarQube 升级到 Version 7.9.2 (build 30863), Community Edition 后,运行 GitLab CI 管道会显示 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 报告的解析以使其正常工作(无论旧设置还是新设置)?

【问题讨论】:

【参考方案1】:

请使用以下

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

【讨论】:

【参考方案2】:

快速解答

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.coverage.jacoco.xmlReportPaths 的值未明确设置时,主要声纳陷阱不会写入有关“未找到报告文件”的错误日志。 SonarQube 开发人员可以修复它。

【讨论】:

以上是关于SonarQube + Maven + JaCoCo + GitLab CI:Sonar 在升级到 SonarQube 7.9.2 后开始显示 0% 的代码覆盖率的主要内容,如果未能解决你的问题,请参考以下文章

SonarQube + Maven 进行代码分析

为啥删除的 Maven 模块不会从 SonarQube 中消失?

Maven Sonarqube 插件:无法执行 SonarQube:无法从服务器获取引导索引

SonarQube + Maven + JaCoCo + GitLab CI:Sonar 在升级到 SonarQube 7.9.2 后开始显示 0% 的代码覆盖率

sonarQube使用maven进行检查

SonarQube+sonar-scanner+Maven+jenkins项目构建记录