Jenkins 管道中的 Jacoco 覆盖率

Jacoco coverage in Jenkins Pipeline

谁能建议是否有在 Jenkins 管道中执行 Jacoco 的方法?我已经下载了插件,但在 'Pipeline Syntax' 中没有找到 Jacoco 的选项,这是管道脚本帮助。

引用此 URL:https://wiki.jenkins-ci.org/display/JENKINS/JaCoCo+Plugin 没有关于 jenkins jacoco 管道的信息

如果你想看看 list of plugins compatible with pipeline, you'll find that Jenkins JaCoCo Plugin was made compatible, but without any update of documentation, except entry in changelog:

Version 2.1.0 (Sep 29, 2016)

JENKINS-27120 Adding Workflow support for JaCoCo publisher

可能是因为它的用法很简单,和很多其他步骤的用法类似:

step([$class: 'JacocoPublisher', ...])

在尝试在互联网上搜索如何执行此操作的简单示例后,我最终在我们的 Jenkins 实例中找到了 "step" 工具。

它知道如何根据您安装的插件和模块生成 Jenkinsfile 管道代码片段。

总而言之,基本条目如下所示:

stage('Build') {
     steps {
        sh './jenkins_build.sh'
        junit '*/build/test-results/*.xml'
        step( [ $class: 'JacocoPublisher' ] )
     }
}

jenkins 文档确实需要更新一些 one-liner 示例。

从 Jacoco 插件 2.2.1 开始,您现在可以使用 jacoco(execPattern: 'target/jacoco.exec')

我个人有几个不同的 Jacoco 文件用于不同的执行,并希望同时支持 Maven 和 Gradle(所以 build/target/ 目录),所以我使用 jacoco(execPattern: '**/*.exec').

参考:https://github.com/jenkinsci/jacoco-plugin/pull/83

jacoco 管道步骤配置使用此格式:

step([$class: 'JacocoPublisher', 
      execPattern: 'target/*.exec',
      classPattern: 'target/classes',
      sourcePattern: 'src/main/java',
      exclusionPattern: 'src/test*'
])

或者使用更简单的声明性管道语法:

jacoco( 
      execPattern: 'target/*.exec',
      classPattern: 'target/classes',
      sourcePattern: 'src/main/java',
      exclusionPattern: 'src/test*'
)

您可以在 JaCoCo Pipeline Steps Reference

中找到更多选项

使用 Jacoco jenkins 插件的最佳方式是在应用程序,然后指向该文件在管道中的位置。 虽然对于多模块项目,配置会略有不同,请参考:Jacoco code coverage for multi module maven project

Jenkins 管道看起来像:

jacoco(
    execPattern: '**/path_to_file/jacoco.exec',
    classPattern: '**/coverage/**',
    sourcePattern: '**/coverage/**',
    inclusionPattern: '**/*.class'
)

再发布一个答案,因为 jacoco 来自已接受答案的 DSL 对我不起作用。

WorkflowScript: 86: Invalid parameter "execPattern", did you mean "path"? @ line 86, column 20.
               jacoco(execPattern: 'build/jacoco/test.exec')

我不能确切地说出我的 Jenkins 使用了哪一套插件。我只知道Jenkins的版本是2.289.1

以下用于从 Code Coverage API plugin 收集报道的 DSL 对我有用:

publishCoverage adapters: [jacocoAdapter('build/reports/jacoco/test/jacocoTestReport.xml')]