我们有一个多模块 Maven 项目。我们正在使用jacoco进行代码覆盖率分析。我准备了 pom 文件来运行测试用例并获取代码覆盖率。当我在本地构建项目时,我可以在声纳仪表板上看到代码覆盖率。
将更改推送到 github 并且触发 jenkins 构建后,声纳仪表板上的代码覆盖率不可用。我在 jenkins 构建日志中发现了以下错误:
未收集覆盖信息。也许您忘记在编译的类中包含调试信息?
jenkins 构建成功后如何使代码覆盖可用?
我们有一个多模块 Maven 项目。我们正在使用jacoco进行代码覆盖率分析。我准备了 pom 文件来运行测试用例并获取代码覆盖率。当我在本地构建项目时,我可以在声纳仪表板上看到代码覆盖率。
将更改推送到 github 并且触发 jenkins 构建后,声纳仪表板上的代码覆盖率不可用。我在 jenkins 构建日志中发现了以下错误:
未收集覆盖信息。也许您忘记在编译的类中包含调试信息?
jenkins 构建成功后如何使代码覆盖可用?
您必须确保在编译 Java 或 Groovy 等代码时,调试选项已打开。我使用 Gradle(而不是 Maven)并启用调试选项,我在Gradle中做了类似的事情。您可以将以下代码放在项目的 build.gradle 或顶级 $GRADLE_HOME/init.d/some-global.gradle 文件中(在 allprojects { ... } 部分内)。
tasks.withType(JavaCompile) {
options.debug = true
options.compilerArgs = ["-g"]
}
tasks.withType(GroovyCompile) {
options.debug = true
}
在 Maven 中做同样的事情(如何打开调试选项,使用 Java 的 -g 和基于 Groovy 的项目的 true )。
在此之后,您需要确保在调用 sonar runner(即 Gradle 中的 sonarRunner 任务)时正确设置了您的 sonar.xx.yyy 变量。
我将这些变量设置为(UT 用于单元测试,IT 用于集成测试)。仅当您将 jacocoagent.jar 附加到运行应用程序的 .war/.ear 文件的 Tomcat/外部 JVM(而不是 Gradle/Maven JVM)时,才会生成 IT 代码覆盖率。
-Dsonar.jacoco.itReportPath=build/jacoco/IT/jacocoIT.exec
-Dsonar.jacoco.reportPath=build/jacoco/UT/jacocoUT.exec
您可以在线/文档查看其他 sonar.xx.yy 变量。
在 Maven 中,您可以使用以下命令打开 Java 调试:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<debug>true</debug>
<debuglevel>lines,vars,source</debuglevel>
</configuration>
</plugin>