Jenkins+Gradle 如何将依赖检查报告发布至Sonar仪表板
一、修正任务执行顺序
当前命令的任务顺序错误:Sonar扫描必须在依赖检查完成后运行,否则执行Sonar时依赖扫描报告还未生成,无法关联读取。
- 原错误命令:
./gradlew clean build sonarqube dependencyCheckAnalyze - 调整后命令:
./gradlew clean build dependencyCheckAnalyze sonarqube
可在build.gradle中添加任务依赖,锁定顺序避免命令行写错:
// 强制Sonar任务在依赖检查完成后执行 tasks.named("sonarqube").configure { dependsOn "dependencyCheckAnalyze" }
二、修复package-lock.json扫描报错
该报错来自OWASP DependencyCheck插件的默认自动识别逻辑:插件会自动扫描项目内所有支持的包管理器清单文件(含npm的package-lock.json),但当前环境未执行npm install,不存在node_modules目录,按项目实际场景处理:
场景1:项目无前端代码
说明工作区残留了无关的package-lock.json,需在build.gradle中补充dependencyCheck配置,关闭无关扫描、排除残留文件:
dependencyCheck { // 仅扫描Gradle管理的Java依赖范围 scanConfigurations = [configurations.compileClasspath, configurations.runtimeClasspath] // 排除残留的package-lock.json,避免误扫描 exclusions = ["${projectDir}/package-lock.json"] // 仅指定需要扫描的路径 scanSet = [ "${projectDir}/src", "${buildDir}/libs" ] }
同时可在Jenkins任务中添加工作区清理步骤,删除项目路径下的无关package-lock.json文件。
场景2:项目包含前端模块
需先执行npm install生成依赖元数据,再触发依赖检查:
- 方式1:在Jenkins自由风格任务的执行shell中,先切换到前端目录执行
npm install,再运行gradle命令 - 方式2:在build.gradle中添加自动化任务对齐流程:
// 新增npm install执行任务,替换为实际前端代码目录 task npmInstall(type: Exec) { workingDir = file("${projectDir}/your-frontend-module-path") commandLine "npm", "install" } // 依赖检查需在npm install完成后执行 tasks.named("dependencyCheckAnalyze").configure { dependsOn "npmInstall" }
三、解决依赖扫描无有效内容的问题
当前build.gradle未配置dependencyCheck核心运行参数,易出现漏洞库下载失败、扫描范围不全的问题,补充以下配置:
dependencyCheck { // 配置NVD漏洞库下载规则,若有NVD API Key可填入避免下载限速 nvd { // apiKey = "your-nvd-api-key" } // 固定报告输出路径,和Sonar配置对齐 outputDirectory = file("${buildDir}/reports") // 扫描所有可解析的Gradle依赖范围,避免漏扫 scanConfigurations = configurations.findAll { it.canBeResolved } }
注意:首次执行会下载NVD漏洞库,需确保Jenkins节点可访问漏洞库地址,或配置内网镜像,否则会因漏洞库为空生成无有效内容的报告。
四、对齐Sonar与依赖检查的报告路径
需确保Sonar配置中指向的依赖扫描报告路径,和dependencyCheck实际生成的路径完全匹配,否则Sonar无法读取结果:
- dependencyCheck默认生成的JSON报告路径:
${buildDir}/reports/dependency-check-report.json - dependencyCheck默认生成的HTML报告路径:
${buildDir}/reports/dependency-check-report.html
修正Sonar配置的路径引用,避免使用未定义或值错误的变量:
sonarqube { properties { // 保留原有其他配置 property 'sonar.dependencyCheck.reportPath', "${buildDir}/reports/dependency-check-report.json" property 'sonar.dependencyCheck.htmlReportPath', "${buildDir}/reports/dependency-check-report.html" } }
同时需确认:SonarQube服务端已安装OWASP Dependency-Check插件,否则即使路径正确,也无法解析依赖扫描结果。
五、可选优化:升级老旧插件版本
当前使用的sonarqube-gradle-plugin:2.7、dependency-check-gradle:6.0.3版本较老,和新版SonarQube服务器可能存在兼容性问题,可按服务器版本升级到匹配的稳定版插件。
内容的提问来源于stack exchange,提问作者karthikN

