jenkins - "Project coverage is set to 0%"– Jenkins 中的 JaCoCo 和 Sonar with Ant

标签 jenkins sonarqube jacoco

我将我的工作从一台 Hudson 机器转移到了多从机 Jenkins 环境,现在 JaCoCo 覆盖不再有效。

工作(旧):
hudson 2.0.1,
Jenkins Sonar 插件 1.7.1,
Sonar 2.1.2

splinter (新):
Jenkins 1.446,
Jenkins Sonar 插件 1.7.2,
Sonar 2.1.2

我的 Hudson 工作称为 Pinnacle,它曾经在同一台机器上与 Sonar 的单个 Hudson 服务器上运行。我通过执行以下操作来设置我的(NO MAVEN)构建。

1) 在我的 build.xml 中添加了一个名为 test-with-coverage 的 Ant 目标

2) 将 Hudson 中的 Pinnacle 作业配置为使用以下属性“调用独立 Sonar 分析”:

sonar.projectKey=com.skyboximaging:pinnacle
sonar.projectName="Pinnacle"
sonar.projectVersion=1.0
sources=Pinnacle/src/java
tests=Pinnacle/test/java
binaries=Pinnacle/classes
sonar.jacoco.reportPath=Pinnacle/jacoco.exec
sonar.jacoco.antTargets=test-with-coverage

(请注意,代码已 check out 到 Jenkins 作业工作区的 Pinnacle 目录中。)

3) 配置 Sonar “常规设置”以使用 JaCoCo 进行代码覆盖

一切都很顺利!

但是在新的 Jenkins 环境中,我在 Jenkins 构建输出中看到这个错误:
23:15:17.863 INFO  Sensor JaCoCoSensor...
23:15:17.868 INFO  Project coverage is set to 0% as no JaCoCo execution data has been dumped: /var/lib/jenkins/workspace/Pinnacle/Pinnacle/jacoco.exec

该文件在构建运行的从站上不存在。 (目录/var/lib/jenkins/workspace/Pinnacle/Pinnacle 确实存在。)

所有其他传感器(FindBugs、PMD 等)似乎工作正常。只是 JaCoCo 坏了。

Sonar/JaCoCo 甚至可以在多从站 Jenkins 环境中工作吗?

我怀疑 Ant 任务 test-with-coverage没有跑起来。 Sonar 如何定位build.xml?新旧装置有什么不同?

最佳答案

我最近设置并成功地让 Sonar 和 Jacoco 一起运行。由于我最近接触过这个话题,我想我会在 stackoverflow 上检查类似的问题并提供帮助。我正在从 Jacoco 获得结果,但发现除了您在帖子中列出的属性之外,您还必须明确设置以下参数:

sonar.core.codeCoveragePlugin=jacoco
sonar.jacoco.reportPath=tests/jacoco-exec/jacoco.exec
sonar.dynamicAnalysis=reuseReports
sonar.surefire.reportsPath=tests/test-reports

如果您希望能够使用 sonar.jacoco.reportPath 属性,则必须设置 sonar.core.codeCoveragePlugin=jacoco。否则,您将不得不使用 sonar.jacoco.itReportPath 属性。但是,我建议只设置 codeCoveragePlugin 和 reportPath 属性。否则,它不会显示在 Sonar 的默认覆盖小部件下。请注意,您不能同时使用默认覆盖工具和 jacoco。它必须是其中之一。我决定使用 Jacoco。

在运行 Sonar 任务之前,您的 ant 目标必须配置为生成 jacoco.exec 结果:
<jacoco:coverage enabled="${tests.code.coverage}" destfile="${jacoco.exec.dest}">
  <junit fork="yes" printsummary="withOutAndErr" dir="${tests.working.dir}">
  ...

如果您在 Sonar 之前运行 junit,即如果您在 Sonar 之外运行 junit,请务必告诉 Sonar 重用报告和任何 sunfire 报告:
sonar.dynamicAnalysis=reuseReports
sonar.jacoco.reportPath=tests/jacoco-exec/jacoco.exec
sonar.surefire.reportsPath=tests/test-reports

无论出于何种原因,如果您需要更详细的调试,请使用以下属性:

sonar.verbose=true

关于jenkins - "Project coverage is set to 0%"– Jenkins 中的 JaCoCo 和 Sonar with Ant,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8864765/

相关文章:

java - Jacoco 离线检测 Gradle 脚本

jenkins - 使用 job-dsl/pipeline 语法的多个 cron 表达式

Jenkins 构建循环列表

Sonar 与 Sonar 扫描仪

c# - Sonarqube 没有显示任何 c# 问题

gradle - jacoco代码覆盖率和aspectJ编织

gradle - 如何将 Kotlin 源码的测试报告上传到 Coveralls?

Jenkins 共享库 - 如何为声明性管道定义通用选项

c++ - Jenkins 中的 Visual Studio 代码分析

java - Mockito JUnit 测试简单的 api 调用