You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多阶段Dockerfile替换Jenkins多Groovy脚本时Sonar扫描报错如何解决

问题根因

你遇到的报错本质原因是:改造为多阶段Docker构建后,Java代码的编译过程完全在Docker容器内部执行,编译生成的.class字节码文件、target目录都仅存在于你构建出来的BUILD镜像内部,Jenkins Agent当前工作目录下没有对应的编译产物,原有sonar.groovy是直接在Jenkins Agent本地执行mvn sonar命令,找不到字节码文件就抛出了要求配置sonar.java.binaries的错误。

原buildJava.groovy中-v参数的作用

-v $HOME:/var/maven是将Jenkins Agent宿主节点的当前用户家目录,挂载到Maven容器内部的/var/maven路径,配合MAVEN_CONFIG环境变量,实现Maven依赖包的本地缓存:每次构建下载的Jar包都会存在宿主的家目录下,下次构建启动新的Maven容器时直接复用已下载的依赖,避免每次构建都重新拉取所有依赖,大幅提升构建速度。

解决方案

前置调整:修改Dockerfile无效配置

你当前Dockerfile里的VOLUME $HOME:/var/maven是无效配置,Dockerfile的VOLUME指令只支持指定容器内的路径,不支持绑定宿主路径,直接删除这行即可。

以下两种方案可按需选择:

方案A:修改量最小,无需改动原有sonar.groovy

在构建完BUILD镜像后,先把镜像内的编译产物复制到Jenkins Agent本地工作目录,再执行Sonar扫描即可,修改后的Jenkinsfile逻辑如下:

buildImage = buildDocker(projectName, gitVersionString, deploymentEnvironment, ' --target BUILD ')
// 新增:将BUILD镜像内的编译产物同步到Jenkins本地工作目录
sh "docker run --rm -v ${WORKSPACE}:/host ${buildImage.id} cp -r /usr/src/app/target /host/target"
sonar()
// 可选:扫描完成后删除本地target文件节省磁盘空间
sh "rm -rf target"
image = buildDocker(projectName, gitVersionString, deploymentEnvironment, ' --target DEPLOY ')

方案B:符合要求在BUILD容器内运行Sonar,仅需微调sonar.groovy

修改sonar.groovy支持传入Docker镜像对象,在镜像内部执行扫描命令,环境一致性更高:

  1. 修改后的sonar.groovy代码
def call(dockerImage = null) {

stage("SonarQube Analysis") {
    withSonarQubeEnv('SonarQube') {
        if(dockerImage){
            // 传入镜像则在容器内部执行扫描
            dockerImage.inside {
                sh 'mvn -f /usr/src/app/pom.xml org.sonarsource.scanner.maven:sonar-maven-plugin:3.2:sonar'
            }
        }else{
            // 兼容原有逻辑,本地执行
            sh 'mvn org.sonarsource.scanner.maven:sonar-maven-plugin:3.2:sonar'
        }
    }
}

stage("Quality Gate") {
    timeout(time: 10, unit: 'MINUTES') {
        sleep(10)
        def qg = waitForQualityGate()
        if (qg.status != 'OK') {
            error "Pipeline aborted due to quality gate failure: ${qg.status}"
        }
    }
}
}
  1. 修改Jenkinsfile调用逻辑,传入构建好的BUILD镜像即可
buildImage = buildDocker(projectName, gitVersionString, deploymentEnvironment, ' --target BUILD ')
sonar(buildImage)
image = buildDocker(projectName, gitVersionString, deploymentEnvironment, ' --target DEPLOY ')

内容的提问来源于stack exchange,提问作者BLWedge09

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 17:45:03