Dmi*_*pov 1 java code-coverage maven jacoco sonarqube
在我们将 SonarQube 升级到 后Version 7.9.2 (build 30863), Community Edition,运行 GitLab CI Pipeline 会导致显示0.0%覆盖率(从 about 下降86.2%),尽管 Sonar 显示了所有单元测试。
执行的 Maven 构建.gitlab-ci.yml如下所示:
- mvn test sonar:sonar -Dsonar.host.url=${SONAR_HOST_URL} -Dsonar.login=${SONAR_TOKEN}
Run Code Online (Sandbox Code Playgroud)
sonar.coverage.jacoco.xmlReportPaths显然,这与臭名昭著的 Sonar-JaCoCo 插件设置有关sonar.jacoco.reportPaths(请参阅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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
因此,在sonar.jacoco.reportPaths设置方面显然存在一些差异。值得注意的是,我没有明确设置这两个设置中的任何一个。
如何修复 JaCoCo 报告的解析以使其正常工作(无论旧设置还是新设置)?
mvn test用。。。来代替mvn verify。不需要明确的设置声明。
我尝试使用显式设置值默认设置来执行构建。
1)已弃用设置的显式默认值:-Dsonar.jacoco.reportPaths=target/jacoco.exec。
这会产生以下日志,表明此设置对于新的声纳不再起作用:
[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
Run Code Online (Sandbox Code Playgroud)
显然,覆盖范围保持在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=1442166jacoco.xml上,但我刚刚通过在本地target目录中搜索找到了它。
覆盖率停留在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]
Run Code Online (Sandbox Code Playgroud)
!遗憾的是,在没有显式设置的情况下运行时,不会写入此日志。这将大大简化调查工作。
所以现在我们有了一个了解:/target/site不是在我的 GitLab CI 管道上生成的。显然,这是因为该脚本仅包含,它在Maven Build Lifecyclemvn test中没有走得足够远。
查看 Maven + Sonar 示例:它们包含mvn verify sonar:sonar或mvn 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
Run Code Online (Sandbox Code Playgroud)
4) mvn verify无需显式设置。
所以最后我尝试不使用任何设置值,并且它有效:
- mvn verify sonar:sonar -Dsonar.host.url=${SONAR_HOST_URL} -Dsonar.login=${SONAR_TOKEN}
Run Code Online (Sandbox Code Playgroud)
sonar.jacoco.reportPaths设置不适用于新的 SonarQube 版本 (7.9.2+)。sonar.coverage.jacoco.xmlReportPaths设置的默认值为target/site/jacoco/jacoco.xml。/target/site/jacoco没有生成目录(包括jacoco.xmlJaCoCo报告的所有其他文件)mvn test为mvn verify.sonar.coverage.jacoco.xmlReportPaths主要的声纳陷阱是,当未显式设置的值时,不会写入有关“未找到报告文件”的错误日志。SonarQube 开发人员修复它会很有好处。| 归档时间: |
|
| 查看次数: |
6481 次 |
| 最近记录: |