【问题标题】:Merging Jacoco report files from multiple sources合并来自多个来源的 Jacoco 报告文件
【发布时间】:2014-11-21 15:33:55
【问题描述】:

我想解决以下挑战。这是当前的设置:

  • 詹金斯
  • 马文
  • SonarQube
  • 具有多个模块的 Java 应用程序

因此,目前在 Jenkins 中,我们有 2 个构建版本,一个用于正常交付,另一个用于生成声纳报告。

我们想做的是使用 JaCoCo 参数行生成一个构建并将其发送给我们的 QA 团队,以便获得更好的覆盖率数字,我们可以附加或合并声纳构建生成的数字我们每天都做。发送给 QA 的构建将安装到与我们生成构建的服务器不同的服务器上。

执行此操作的最佳方法是什么。最终,我们还想从我们的开发工作站获取 JaCoCo 报告,并将这些数字附加到我们的声纳页面。

编辑 1 感谢此线程上提供的详细信息,我能够使用以下 JVM 选项启动我的多模块应用程序:"-javaagent:${MAIN_DIR}/lib/jacocoagent.jar==destfile=/jacoco.exec,output=tcpserver,address=*"

在我的 Jenkins 构建中,我的 Pre Steps 如下: 调用目标 jacocoReport 的 ant 任务。 我用于此目的的 build.xml 具有以下代码;

<taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
    <classpath path="/opt/hudson/tools/jacocoant.jar"/>
</taskdef>

<target name="jacocoReport">
        <jacoco:dump address="${jacoco.host}" port="${jacoco.port}" dump="true" reset="true" destfile="${jacocoReportFile}" append="false"/>
</target>

<target name="jacocoReset">
        <jacoco:dump address="${jacoco.host}" port="${jacoco.port}" reset="true" destfile="${jacocoReportFile}" append="false"/>
    <delete file="${jacocoReportFile}"/>
</target>

最后我有一个调用 sonar:sonar 的 maven 构建步骤

这是 POM 中与我的集成报告相关的部分;

<sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
<sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
<sonar.jacoco.itReportPath>${WORKSPACE}/it-jacoco.exec</sonar.jacoco.itReportPath>
<sonar.language>java</sonar.language>
<sonar.branch>9.9.5</sonar.branch>

构建完成后,我的 Sonar 条目仍然显示为 0% 以进行集成测试。但是,当我使用相同的 it-jacoco.exec 报告并使用 Eclipse 的 Jacoco 导入覆盖会话导入它时,我得到了 26% 的覆盖率。

最后,当我查看我的 Jenkins 构建日志时,我看到以下内容;

Sensor JaCoCoItSensor...
Analysing /var/lib/jenkins/workspace/XXXXXX/it-jacoco.exec
No information about coverage per test.
Sensor JaCoCoItSensor done: 34 ms

【问题讨论】:

    标签: maven jenkins sonarqube jacoco


    【解决方案1】:

    由于 jacoco on-the-fly 检测功能,可以轻松实现从任何应用程序实例收集覆盖范围。您只需提供 jacocoagent.jar 并在 JVM 调用中添加以下选项:

    -javaagent:[yourpath/]jacocoagent.jar=[option1]=[value1],[option2]=[value2]
    

    这里有更详细的文档:

    http://www.eclemma.org/jacoco/trunk/doc/agent.html

    接下来,在 Maven Sonar 构建执行期间,您应提供以下参数以及生成的覆盖文件的路径:

    -Dsonar.jacoco.itReportPath=<path>
    

    您可以在此处找到详细说明:

    http://docs.codehaus.org/display/SONAR/Code+Coverage+by+Integration+Tests+for+Java+Project

    【讨论】:

    • 好的,听起来不错,但我正在使用 ant 和 build.xml 文件启动我的 java 应用程序。而且我不知道将 jacoco ant 变量放在哪里。 斜体 粗体
    • 您已经指定了一些 JVM 参数。只需添加另一个 jvmarg 标记,其值设置为启用 jacoco。
    • 我想我明白了。最后一个整合问题。假设我使用 TCPServer 选项以远程启动报告生成...一旦生成报告,Sonar 的最佳方法是什么?我已经在 Sonar 中有一个来自 Maven 的项目的条目。我可以将远程生成的文件附加到 maven 中生成的文件,如果可以,如何?
    • 是的,例如,您可以将其作为集成覆盖提供。只需在您的 mvn sonar:sonar 目标执行中添加以下选项: -Dsonar.jacoco.itReportPath= 。我在上面的回答中也提到了它;)
    • 听起来很公平,但是有没有办法在不使用 maven 的情况下将 jacoco 报告导入声纳?假设我使用 maven sonar:sonar 构建我的项目,但我还想在构建完成后导入其他 jacoco 报告?
    猜你喜欢
    • 2018-11-21
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    • 2021-06-04
    • 2019-10-23
    • 1970-01-01
    • 2017-01-31
    相关资源
    最近更新 更多