【发布时间】: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
返回:
请注意,Jacoco 中的排除文件存在,并且总覆盖范围完全不同。 在 SonarCloud 常规设置中,我将 JacocoTestReport.xml 路径传递给文件:
所以,首先,我有一个问题:SonarCloud 是否有能力自行计算覆盖范围?因为它看起来像是从其他地方获取覆盖结果。
第二:如何使 Jacoco 覆盖报告与 SonarCloud 匹配?
请注意,出于安全和隐私原因,我省略了许多信息。如果缺少任何重要信息,请询问,我会看看是否可以提供。此外,它可能听起来像重复,但是找到的其他主题没有解决该问题的方法。
【问题讨论】:
标签: kotlin gradle code-coverage jacoco sonarcloud