Version 7.9.2 (build 30863), Community Edition
后,运行GitLab CI Pipeline会显示0.0%的覆盖率(从大约85%下降),尽管Sonar正在显示所有测试。在.gitlab-ci.yml
中执行的Maven构建看起来像这样:
- mvn test sonar:sonar -Dsonar.host.url=${SONAR_HOST_URL} -Dsonar.login=${SONAR_TOKEN}
显然,这要处理臭名昭著的sonar.coverage.jacoco.xmlReportPaths
和sonar.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报告的解析问题,使其能够正常工作(无论使用旧设置还是新设置)?
[我们将SonarQube升级到7.9.2版(内部版本30863),社区版后,运行GitLab CI Pipeline会显示0.0%的覆盖率(从大约85%下降),尽管Sonar显示了...]]] >>
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中记录此默认值,但我只是通过在本地jacoco.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]
!
很可惜,如果没有显式设置,则在运行时不会写入此日志。它将大大简化调查。所以现在我们有了一个了解:在我的GitLab CI管道上没有生成/target/site
。显然,这是因为脚本仅包含mvn test
,而通过Maven Build Lifecycle还不够。查看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
[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开发人员对其进行修复将是一件好事。