SonarQube排除规则不生效仍扫描Gradle缓存目录问题咨询
问题原因
- SonarQube Gradle插件3.3版本与Gradle 7.x存在适配缺陷:插件会自动将Gradle Kotlin DSL生成的访问器源码目录追加到扫描源列表,该逻辑优先级高于你手动配置的
sonar.sources,导致.gradle目录下的非业务代码被纳入扫描范围。 - 排除规则生效层级问题:如果你仅在Sonar服务端配置了
**/.gradle/**排除规则,未在本地Gradle脚本或CI执行参数中同步配置,插件自动探测的源会跳过服务端规则匹配,直接纳入扫描。 - 路径匹配规则校验问题:你配置的
**/build/**规则不会影响.gradle目录的匹配,属于正常逻辑,但插件自动追加的源不会被全局排除规则覆盖是版本bug导致的异常。
排查解决步骤
步骤1:禁用插件自动源探测功能
在项目的build.gradle或build.gradle.kts中添加以下配置,强制插件仅使用你指定的源码目录,不自动追加其他探测到的源:
// Groovy格式build.gradle配置 sonar { properties { property "sonar.sources", [ "build/generated/wsdl", "build/generated-sources/xjc", "src/main/kotlin" ] // 禁用编译阶段自动探测源的逻辑 property "sonar.gradle.skipCompile", "true" property "sonar.java.binaries", "build/classes/java/main" property "sonar.kotlin.binaries", "build/classes/kotlin/main" } }
// Kotlin格式build.gradle.kts配置 sonar { properties { property("sonar.sources", listOf( "build/generated/wsdl", "build/generated-sources/xjc", "src/main/kotlin" )) property("sonar.gradle.skipCompile", "true") property("sonar.java.binaries", "build/classes/java/main") property("sonar.kotlin.binaries", "build/classes/kotlin/main") } }
步骤2:本地显式配置排除规则
将排除规则直接配置在Gradle脚本或CI执行命令中,确保优先级高于服务端配置:
// 追加到sonar.properties配置块内 property "sonar.exclusions", "**/build/**,**/.gradle/**,**/gradle/wrapper/**" property "sonar.coverage.exclusions", "**/configuration/**,**/const/**"
步骤3:验证扫描源列表
执行扫描命令时添加-Dsonar.verbose=true参数,在输出日志中搜索Loading sources for module关键字,确认实际纳入扫描的目录是否符合预期。
步骤4:版本适配升级(可选)
如果上述配置仍未生效,可将SonarQube Gradle插件升级到3.5及以上版本,该版本已修复Gradle 7.x系列自动追加Kotlin DSL源目录的bug。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

