使用 Sonarrunner 和 Gradle 从 Jacoco 报告中排除包

Posted

技术标签:

【中文标题】使用 Sonarrunner 和 Gradle 从 Jacoco 报告中排除包【英文标题】:Exclude packages from Jacoco report using Sonarrunner and Gradle 【发布时间】:2015-01-17 23:16:09 【问题描述】:

有没有办法从 SonarQube(由 gradle + sonar-runner 检测)覆盖率报告(由 jacoco 生成)中排除包而不将它们完全排除在项目之外?

以下是我目前尝试过的:

版本信息

SonarQube 4.5.1 Gradle 2.2。

Jacoco 配置

// JaCoCo test coverage configuration
tasks.withType(Test)  task ->
    jacoco 
        append = false

        // excluded classes from coverage defined in above configuration
        excludes = excludedClasses()
    

    jacocoTestReport 
        doFirst 
            classDirectories = fileTree(dir: "$buildDir/classes/main/").exclude(excludedClasses())
        
    


Sonarrunner 配置

从声纳分析中排除包的属性设置。将此添加到我的配置中会导致软件包在 Sonar 中根本不显示。

property 'sonar.exclusions', excludedClasses().join(',')

从 jacoco 中排除包的属性设置。设置此选项会导致包被排除在覆盖率分析之外,但显示为 0%,这会导致总分不佳。

property 'sonar.jacoco.exclusions', excludedClasses().join(',')

【问题讨论】:

【参考方案1】:

通过使用 sonar-project.properties 中的 sonar.coverage.exclusions 属性,我已设法从覆盖率报告中排除特定包。属性描述在官方documentation

【讨论】:

Gradle 配置:sonarqube properties property 'sonar.coverage.exclusions', "**/com/some/package/*,**/com/other/package/Class*" 正确的工作模式是:sonarqube properties property 'sonar.coverage.exclusions', '*/model/, */commons/ , */exception/, */controller/, */utils/, **/Test.java' 链接已损坏@Mikalai-Parafeniuk【参考方案2】:

将@Mikalai 的答案和@pavel 的评论组合成更易于复制和粘贴的内容:

要从所有声纳检查(覆盖率、代码异味、错误等)中排除包或类,请将以下内容添加到build.gradle

sonarqube 
    properties 
        property 'sonar.exclusions', "**/com/some/package/**"
    

要仅从 Sonar 代码覆盖率检查中排除包或类,请将以下内容添加到 build.gradle

sonarqube 
    properties 
        property 'sonar.coverage.exclusions', "**/com/some/package/**"
    

【讨论】:

我正在运行声纳 v7.9 并在我的 build.gradle 中进行了相同的配置。仍然声纳仪表板将这些类显示为 0% 覆盖率。是否需要任何其他配置/设置?【参考方案3】:

android 项目的声纳代码覆盖范围中排除资源、资产、自定义包和自动生成的类。

如下创建排除列表

exclusionList = [
            //Res and Assets
            "src/main/res/**/*.*",
            "src/main/assets/**/*.*",

            //Auto-Generated
            '**/R.class',
            '**/R$*.class',
            '**/BuildConfig.*',
            '**/*Manifest.*',
            'android/**/*.*',
            'androidx/**/*.*',

            // excluded packages
            **/com/<your-package-path>/**/*]

为声纳覆盖属性提供排除列表

property 'sonar.coverage.exclusions', exclusionList

注意:

保留完整路径以排除完整目录 **/* 包含父目录Refer Here下的所有文件和子目录 *Bean 包括所有包含“Bean”的类名。 **/ 以它开头,涵盖特定包的父目录。

执行上述更改后,运行 Jacoco 命令并检查声纳门户的覆盖部分。

【讨论】:

【参考方案4】:

如果您使用带有 Kotlin DSL 的 Gradle 5+,您可以像这样从覆盖范围中排除文件:

// configure the SonarQube plugin
sonarqube 
    val exclusions = listOf(
        "**/com/some/package/**",
        "**/all/files/under/package/*",
        "**/com/some/package/OneClass.kt"
    )

    // exclude the directories only from coverage (but not from other analysis)
    // https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-gradle/
    properties 
        property("sonar.coverage.exclusions", exclusions)
    

【讨论】:

【参考方案5】:

从 Sonarqube 中排除多个模块或类。将以下代码添加到 build.gradle:

示例: 包名= com.student.result.detail , com.customer.order , com.student

  sonarqube 
    properties 
        property 'sonar.exclusions', "**/com/student/result/details/**",
                                     "**/com/customer/order/**",
                                     "**/com/student/**";
        
    

【讨论】:

【参考方案6】:

这对我来说适用于 gradle 6,sonarqube 插件 2.8

property "sonar.coverage.exclusions" , "**/com/some/package/entity/**/*," + "**/com/some/package/config/**/*,**/com/some/package/dto/**/*,**/com/some/package/dao/**/*"

注意:包以逗号分隔,但在单个字符串中

【讨论】:

【参考方案7】:

我在这里看到的大部分答案都对我不起作用,导致以下错误:

Execution failed for task ':sonarqube'.
> Could not find method property() for arguments [sonar.coverage.exclusions, **/package/path/Class1**, **/package/path/Class2**, **/package/path/Class3**, **/package/path/Class4**] on object of type org.sonarqube.gradle.SonarQubeProperties.

原因是声纳要求一个字符串而不是几个逗号分隔的字符串作为属性值。所以而不是:

  sonarqube 
    properties 
        property 'sonar.exclusions', "**/com/student/result/details/**",
                                     "**/com/customer/order/**",
                                     "**/com/student/**";
        
    

我的解决方案是:

  sonarqube 
    properties 
        property 'sonar.exclusions', "**/com/student/result/details/**,"+
                                     "**/com/customer/order/**,"+
                                     "**/com/student/**";
        
    

【讨论】:

以上是关于使用 Sonarrunner 和 Gradle 从 Jacoco 报告中排除包的主要内容,如果未能解决你的问题,请参考以下文章

使 Sonar Runner Gradle 任务依赖于我的一项任务

Sonar Runner 执行错误

SonarQube Runner 与扫描仪

如何使用 gradle 从 WSDL 和 XSD 生成类,相当于 maven-jaxb2-plugin

Gradle从入门到放弃

Jenkins Perforce 插件未从 Perforce 签出代码