【问题标题】:"Project coverage is set to 0%" – JaCoCo and Sonar in Jenkins with Ant“项目覆盖率设置为 0%”——JaCoCo 和 Sonar 在 Jenkins 中与 Ant
【发布时间】:2012-02-10 11:51:49
【问题描述】:

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

工作(旧): 哈德逊 2.0.1, 詹金斯声纳插件 1.7.1, 声纳 2.1.2

破损(新): 詹金斯 1.446, 詹金斯声纳插件 1.7.2, 声纳 2.1.2

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

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

2) 将 Hudson 中的 Pinnacle 作业配置为“调用独立声纳分析”,并具有以下属性:

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

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

3) 配置声纳“常规设置”以使用 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?新旧安装有什么不同?

【问题讨论】:

    标签: jenkins sonarqube jacoco


    【解决方案1】:

    我最近设置并成功地让 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 属性。否则,它不会显示在声纳的默认覆盖小部件下。请注意,您不能同时使用默认覆盖工具和 jacoco。它必须是其中之一。我决定使用 Jacoco。

    您的 ant 目标必须配置为在运行声纳任务之前生成 jacoco.exec 结果:

    <jacoco:coverage enabled="${tests.code.coverage}" destfile="${jacoco.exec.dest}">
      <junit fork="yes" printsummary="withOutAndErr" dir="${tests.working.dir}">
      ...
    

    如果您在声纳之前运行 junit,请务必告诉声纳重复使用报告和任何 sunfire 报告,也就是说,如果您在声纳之外运行 junit:

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

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

    sonar.verbose=true

    【讨论】:

    • 谢谢!设置 sonar.jacoco.reportPath 的指针是让我的多项目蚂蚁驱动声纳正确加载覆盖数据所需的最后一点。
    • @Jason:如果我使用 sahi 而不是 junit 报告,那么我可以在 sonar.surefire.reportsPath 中使用 sahi 报告(在 html 中)
    猜你喜欢
    • 1970-01-01
    • 2013-02-07
    • 2017-05-31
    • 2012-06-11
    • 2012-12-22
    • 2012-09-07
    • 1970-01-01
    • 2012-09-29
    • 2016-11-08
    相关资源
    最近更新 更多