如何在Gradle 4.6多模块项目中聚合SonarQube报告?
在Gradle 4.6多模块项目中聚合SonarQube与Jacoco报告的方案
我来帮你搞定这个多模块项目的Sonar报告聚合问题,结合你当前的Gradle 4.6和SonarQube 7环境,咱们一步步来:
核心思路
多模块项目的Sonar聚合需要根项目统一触发全量分析,同时要生成一个全局聚合的Jacoco测试报告——因为默认每个子项目只会生成自己的覆盖率报告,Sonar需要读取合并后的报告才能展示整体覆盖率。
1. 根项目的配置调整(关键)
把SonarQube和Jacoco的核心配置放在根项目的build.gradle中,让所有子项目继承基础规则,同时添加聚合逻辑:
// 根项目build.gradle buildscript { dependencies { // 适配Gradle 4.6和SonarQube 7的插件版本 classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.6.2' classpath 'org.jacoco:org.jacoco.core:0.7.9' } } // 给所有子项目统一配置Jacoco和Sonar基础规则 subprojects { apply plugin: 'jacoco' apply plugin: 'org.sonarqube' jacoco { toolVersion = "0.7.9" } test { jacoco { enabled = true // 固定子项目的测试执行文件路径,方便后续聚合 destinationFile = file("$buildDir/jacoco/test.exec") } } jacocoTestReport { group = "Reporting" reports { xml.enabled true xml.destination "${buildDir}/reports/jacoco/report.xml" csv.enabled false html.enabled true } } // 子项目的Sonar局部配置,确保每个模块有唯一标识 sonarqube { properties { property "sonar.moduleKey", "${rootProject.name}:${project.name}" property "sonar.sources", "src/main/java" property "sonar.tests", "src/test/java" property "sonar.jacoco.reportPaths", "${project.buildDir}/jacoco/test.exec" } } } // 根项目的全局Sonar配置,作为聚合入口 apply plugin: 'org.sonarqube' sonarqube { properties { property 'sonar.host.url', sonarHostUrl property 'sonar.projectKey', rootProject.name property 'sonar.projectName', rootProject.name property 'sonar.projectVersion', rootProject.version // 指定Sonar读取根项目生成的聚合Jacoco报告 property 'sonar.jacoco.reportPaths', "${rootProject.buildDir}/jacoco/allTests.exec" } } // 新增聚合Jacoco报告的任务,收集所有子项目的测试数据 task jacocoRootReport(type: JacocoReport) { group = "Reporting" description = "生成所有子项目的聚合Jacoco覆盖率报告" // 收集所有子项目的test.exec文件 executionData fileTree(rootDir.absolutePath).include("**/build/jacoco/test.exec") // 关联所有子项目的源码和测试代码 subprojects.each { subproject -> sourceSets subproject.sourceSets.main } reports { xml.enabled true xml.destination "${rootProject.buildDir}/reports/jacoco/aggregate.xml" csv.enabled false html.enabled true html.destination "${rootProject.buildDir}/reports/jacoco/aggregateHtml" } } // 确保先生成聚合报告,再执行Sonar分析 sonarqube.dependsOn jacocoRootReport
2. 子项目的简化配置
子项目的build.gradle不需要重复写插件和基础配置,只需要根据自身业务调整特殊属性(比如非标准的源码路径)即可,大部分规则会自动继承根项目的subprojects块配置。
3. 执行分析的命令
在根项目目录下运行以下命令,就能完成全量测试、聚合覆盖率报告、提交Sonar分析的全流程:
./gradlew clean test jacocoRootReport sonarqube
关键注意事项
- 插件版本兼容性:选用的
sonarqube-gradle-plugin:2.6.2是经过验证的、适配Gradle 4.6和SonarQube 7的稳定版本,不要随意升级,避免出现兼容性问题。 - 路径一致性:确保所有子项目的
test.exec路径统一,不然根项目的聚合任务无法收集到数据。 - 模块唯一性:每个子项目的
sonar.moduleKey必须唯一,这样Sonar才能正确识别各个子模块的独立数据。
内容的提问来源于stack exchange,提问作者Dmitry Senkovich
相关产品推荐
相关产品推荐

