【问题标题】:Exclude package from Jacoco coverage in Jenkins从詹金斯的 Jacoco 覆盖范围中排除包
【发布时间】:2019-05-21 20:58:18
【问题描述】:

由于我的 Jenkins 管道失败,试图从覆盖率报告中排除包。我有一个包含所有 POJO:s 的子项目。我不想为所有这些写 uittest。因此,他们将拖累分支/线路覆盖率,以至于覆盖率将低于阈值并导致我的构建失败。

应该可以排除一些包,但我不能让它工作。

我有以下 jacoco.gradle 文件:

apply plugin: 'jacoco'  
apply plugin: 'java'  
jacoco {  
  toolVersion = "0.8.2"  
}  

jacocoTestReport {  
reports {  
  xml.enabled true  
  csv.enabled false  
  html.enabled true  
}  

afterEvaluate {  
  classDirectories = files(classDirectories.files.collect {  
     fileTree(dir: it, exclude: '**xxx/yyy/zzz/**')  
  })  
}  

task coverage { dependsOn 'jacocoTestReport' }  

check.dependsOn 'jacocoTestReport'  

我的 sonar.gradle 文件中的以下内容:

apply plugin: 'org.sonarqube'  

sonarqube {  
properties {  
  property "sonar.forceAnalysis", "true"  
  property "sonar.forceAuthentication", "true"  
  property "sonar.java.coveragePlugin", "jacoco"  
  property "sonar.login", ""  
  property "sonar.password", ""  
 }  
}  

subprojects {  
 sonarqube {  
  properties {  
     property "sonar.jacoco.reportPaths", 
 "$buildDir/reports/jacoco/allTests.exec"
     property "sonar.junit.reportsPath", "$buildDir/test-results/test"  
  }  
 }  
}  

task sonar { dependsOn 'sonarqube' }  

在我的 build.gradle 中:

apply from: 'gradle/sonar.gradle'  
...  
apply plugin: 'java'  
...  
subprojects {  
  apply from: '../gradle/jacoco.gradle'   
  ...  
}  

最后来自我的 Jenkins 文件:

step([$class: 'JacocoPublisher', changeBuildStatus: false, 
 exclusionPattern: '**/*Test*.class', inclusionPattern: 
 '**/*.class', minimumBranchCoverage: '80', sourcePattern: '**/src'])  

try {  
 dir(BUILD_DIR) {  
 sh './gradlew sonar'  
}  

但 xxx.yyy.zzz 仍然是在 Jenkins 的覆盖报告中生成的!

【问题讨论】:

  • 为什么要反斜杠你的 * ?只需设置**xxx/yyy/zzz/**
  • 对不起,在我添加代码样式之前需要反斜杠。我的代码中有反斜杠。我现在更新了问题。
  • @Dezso Gabos 我在链接中看到了解决方案,但我认为它与我所拥有的相同。 Jenkins/Jacoco 仍然不会排除这个包。
  • sonar.coverage.exclusion 删除特殊课程的覆盖范围?

标签: java jenkins gradle sonarqube jacoco


【解决方案1】:

终于搞定了!关键是 JacocoPuplisher。

step([$class: 'JacocoPublisher', changeBuildStatus: false, exclusionPattern: 
'**/xxx/yyy/zzz/**/*.class, **/*Test*.class', inclusionPattern: '**/*.class', 
minimumBranchCoverage: '80', sourcePattern: '**/src'])

这是我让它与 Jenkins 一起工作的唯一方法。

设置 sonar.coverage.exclusion 或使用上面的 afterEvalueate 东西没有效果。

【讨论】:

  • 你能把你的整个文件内容分享到你把这个 JacocoPublisher 的 sn-p 放在哪里吗? @user1578293
  • 哈,伙计...我浪费了很多天来寻找解决方案。这段 sht 真的无法与内部配置一起使用。但是您的代码正在运行!非常感谢!
【解决方案2】:

只需像这样直接添加到插件调用参数中,我就能够从 jacoco() Jenkins 管道插件(在我们的标准 Jenkinsfile 中调用 pipeline { ... post { ... always { )完成文件/包排除:

...
    post {
        always {
            ...
            // Change the exclusion for the jacoco() jenkins plugin to exclude testutils package. 
            jacoco(exclusionPattern: '**/testutils/**,**/*Test*.class')

似乎整个主题中最大的困惑之一是有一个jacocoTestReport gradle 目标,它有自己的排除语法,然后这个jacoco() Jenkins 管道任务似乎完全独立。声纳覆盖排除看起来可能是第三件事?

【讨论】:

    猜你喜欢
    • 2016-03-21
    • 2018-07-27
    • 2021-07-10
    • 2016-03-29
    • 2016-06-08
    • 2013-05-10
    • 1970-01-01
    • 2018-04-05
    • 2016-02-25
    相关资源
    最近更新 更多