【问题标题】:Unable to get report from Jacoco gradle Kotlin project on SonarCloud无法从 SonarCloud 上的 Jacoco gradle Kotlin 项目获取报告
【发布时间】:2022-11-11 23:10:31
【问题描述】:

对,所以我有一个带有 SpringBoot 框架的 Kotlin Gradle 项目。该项目在 GitHub 上,我们的 CI 系统是 Circle CI。

build.gradle.kts 文件中,我们有以下配置:


sonarqube {
    properties {
        property("sonar.projectKey", "Creditas_recupera-gateway")
        property("sonar.organization", "creditas-fintech")
        property("sonar.host.url", "https://sonarcloud.io")
        property(
            "sonar.coverage.jacoco.xmlReportPaths",
            "$buildDir/reports/jacoco/jacocoTestReport/jacocoTestReport.xml"
        )
    }
}

fun ignorePackagesInJacocoReport(classDirectories: ConfigurableFileCollection) {
    classDirectories.setFrom(
        files(
            classDirectories.files.map {
                fileTree(it).apply {
                    exclude(
                        "**/company/**/*.java",
                        "**/company/**/*.kts",
                        "**/company/commons/**",
                        "**/company/**/config/**",
                        "**/company**/configuration/**",
                        "**/company/**/requests/**",
                        "**/company/**/responses/**",
                        "**/company/**/dto/**",
                        "**/company/**/infrastructure/scripts/**"
                    )
                }
            }
        )
    )
}


tasks.jacocoTestReport {
    sourceSets(sourceSets.main.get())
    executionData(fileTree(project.rootDir.absolutePath).include("**/build/jacoco/*.exec"))

    reports {
        xml.required.set(true)
        html.required.set(true)
        xml.outputLocation.set(File("$buildDir/reports/jacoco/jacocoTestReport/jacocoTestReport.xml"))
        html.outputLocation.set(layout.buildDirectory.dir("$buildDir/reports/jacoco"))
    }

    ignorePackagesInJacocoReport(classDirectories)
}

Circle CI 使用的config.yml 如下:

version: 2.1

orbs:
  docker: circleci/docker@0.5.13

jobs:
  unit_test:
   
    steps:
      - run:
          name: Run tests
          command: gradle test -i

      - run:
          name: Save test results
          command: |
            mkdir -p ~/junit/
            find . -type f -regex ".*/build/test-results/.*xml"
            find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/junit/ \;
          when: always

      - persist_to_workspace:
          root: ~/
          paths:
            - project-folder/build/jacoco

  coverage:
    steps:
      - run: ./gradlew dependencies build -x test -x detekt
      - run:
          name: Run coverage report
          command: ./gradlew jacocoTestReport

      - persist_to_workspace:
          root: ~/
          paths:
            - recupera-gateway/build/reports/jacoco

  sonarqube:
    steps:
      - restore_cache:
          keys:
            - app-dependencies-{{ checksum "build.gradle.kts" }}

      - run: ./gradlew dependencies build -x test -x detekt

      - save_cache:
          paths:
            - ~/.gradle
          key: app-dependencies-{{ checksum "build.gradle.kts" }}

      - attach_workspace:
          at: ~/

      - run:
          name: Run sonar analysis
          command: ./gradlew sonarqube


workflows:
  version: 2.1
      - unit_test
      - coverage:
          requires:
            - unit_test
      - sonarqube:
          requires:
            - coverage

在本地,运行:

./gradlew jacocoTestReport

返回:

但是,在 SonarCloud 上,如下所示:

请注意,Jacoco 中的排除文件存在,并且总覆盖范围完全不同。 在 SonarCloud 常规设置中,我将 JacocoTestReport.xml 路径传递给文件:

所以,首先,我有一个问题:SonarCloud 是否有能力自行计算覆盖范围?因为它看起来像是从其他地方获取覆盖结果。

第二:如何使 Jacoco 覆盖报告与 SonarCloud 匹配?

请注意,出于安全和隐私原因,我省略了许多信息。如果缺少任何重要信息,请询问,我会看看是否可以提供。此外,它可能听起来像重复,但是找到的其他主题没有解决该问题的方法。

【问题讨论】:

    标签: kotlin gradle code-coverage jacoco sonarcloud


    【解决方案1】:

    发生的情况是,首先,SonarCloud 无法从 Jacoco 的报告中检查文件是否被忽略,因此它假设它的覆盖率为 0%。要解决此问题,还需要将排除的文件添加到 Jacoco。

    Jacoco 的覆盖范围和 SonarCloud 的另一个区别是 Jacoco 还考虑了指令覆盖范围,这在 SonarCloud 上没有体现。

    要获得更完整的答案,我建议您在 Sonar 的论坛 here 上查看此帖子,所有内容均归功于该页面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-15
      • 1970-01-01
      • 1970-01-01
      • 2018-09-22
      • 1970-01-01
      • 2018-12-18
      相关资源
      最近更新 更多