如何使用新的 Gradle SonarQube 插件向 Sonar 报告 Jacoco Groovy 代码覆盖率?

How to report Jacoco Groovy code coverage to Sonar using new Gradle SonarQube plugin?

我有一个使用 Gradle 的多模块 Groovy 项目。我应用了 jacoco、sonarqube 插件。

我能够

  1. 查找build/jacoco/test.exec。 Jenkins 能够正确渲染它。
  2. 浏览包含所有代码覆盖详细信息的 jacocoHtml
  3. 在 SonarQube 上查找单元测试结果和源代码

但是 Code Coverage 没有被报告给 SonarQube。

这是我的 build.gradle

plugins {
    id "org.sonarqube" version "2.0.1"
}

allprojects {
    group = 'my'
    version = '1.0-SNAPSHOT'
}

subprojects {
    apply plugin: 'groovy'
    apply plugin: "jacoco"

    dependencies {
        compile group: 'org.codehaus.groovy', name: 'groovy-all', version: '2.4.1'
        testCompile group: 'org.spockframework', name: 'spock-core', version: '1.0-groovy-2.4'
        testCompile group: 'org.assertj', name: 'assertj-core', version: '2.4.1'
    }
}

我在构建过程中观察到以下日志语句。

No binary directories defined for project core.
Project coverage is set to 0% since there is no directories with classes.

然后我尝试将以下内容添加到子项目或所有项目,但仍然没有向 SonarQube 报告覆盖率。

sonarqube {
    properties {
        property "sonar.groovy.jacoco.reportPath", "${project.buildDir}/jacoco/test.exec"
        property "sonar.jacoco.reportPath", "${project.buildDir}/jacoco/test.exec"
        property "sonar.binaries", "${project.buildDir}/classes"
        property "sonar.groovy.binaries", "${project.buildDir}/classes"
    }
}

如何启用向 SonarQube 报告 Jacoco Groovy 代码覆盖率?

当我遇到同样的问题时,您可能已经看到了我的评论。

我找到了 groovy 插件的站点,其中报告的问题如下:

sonar.groovy.binaries is resolved only once for the root project. In a multi-module project where the property is not defined on the root module but only on leaf modules this cause missing coverage information.

https://github.com/SonarQubeCommunity/sonar-groovy/issues/52

所以即使它是为您的模块设置的:

":myspecialsubmodule.sonar.groovy.binaries" -> "/home/user/Projects/root-project/myspecialsubmodule/build/classes/main"

它不会工作,直到它被设置为根。

在 root 上专门设置配置后(现在,直到问题解决)使它对我有用。

property "sonar.groovy.binaries", "${project.buildDir.name}${File.separator}classes"

我会跟踪 github 问题以了解何时可以删除此解决方法。