使用 TeamCity 将 jacoco 覆盖率报告提供给 SonarQube,但它显示 0% 的覆盖率

Feed jacoco coverage report to SonarQube using TeamCity but it shows 0% coverage

我有一个 gradle 项目,其中一些代码在 src/main/java 中,一些单元测试在 src/test/java

以下是摘自 build.gradle

的片段
apply plugin: "jacoco"

sourceSets {
    main {
        java { srcDir 'src/main/java' }
    }
}

test {
    jacoco {
        append = false
        destinationFile = file("$buildDir/jacoco/jacocoTest.exec")
        classDumpDir = file("$buildDir/jacoco/classpathdumps")
    }
}

jacoco {
    toolVersion = "0.7.8"
}

jacocoTestReport {
    reports {
        xml.enabled false
        csv.enabled false
        html.destination "${buildDir}/reports/jacoco/jacocoHtml"
    }
}

在 TeamCity 上,我有 2 个步骤,第一步是 Gradle 使用命令 gradle clean jacocoTestReport build 步骤,第二步是 SonarQube runner 使用以下参数:

-Dsonar.sources=%system.teamcity.build.checkoutDir%/src
-Dsonar.java.binaries=%system.teamcity.build.checkoutDir%/build/classes
-Dsonar.branch.name=%teamcity.build.branch%
-Dsonar.jacoco.reportPaths=%system.teamcity.build.checkoutDir%/build/jacoco/jacocoTest.exec

但是,在 SonarQube 仪表板上,我的项目仍然显示 0% 的覆盖率。如果我向 SonarQube(版本 6.7)

正确提供 jacoco 覆盖率报告,请告诉我

如果您正在为 Gradle runner 使用 TeamCity JaCoCo 集成,覆盖范围应该是自动的。确保您在 SonarQube Runner 中提供了 "Binaries location:"。在这种情况下,构建日志将包含这样的行:

 # before SonarQube start:
 -Dsonar.java.coveragePlugin=jacoco
 -Dsonar.jacoco.reportPath=/.../buildAgent/temp/buildTmp/JACOCO8457480821230827929coverage/jacoco.exec

 # while SonarQube is executed:
 Sensor JaCoCoSensor
 Analysing /.../buildAgent/temp/buildTmp/JACOCO8457480821230827929coverage/jacoco.exec

如果您想在 Gradle 脚本中使用 JaCoCo 插件,您应该在 SonarQube Runner 步骤中手动设置覆盖类型和数据位置

-Dsonar.java.coveragePlugin=jacoco
-Dsonar.jacoco.reportPaths=%system.teamcity.build.checkoutDir%/build/jacoco/jacocoTest.exec

所以尝试添加 "sonar.java.coveragePlugin" 属性