多阶段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镜像对象,在镜像内部执行扫描命令,环境一致性更高:
- 修改后的
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}" } } } }
- 修改Jenkinsfile调用逻辑,传入构建好的BUILD镜像即可
buildImage = buildDocker(projectName, gitVersionString, deploymentEnvironment, ' --target BUILD ') sonar(buildImage) image = buildDocker(projectName, gitVersionString, deploymentEnvironment, ' --target DEPLOY ')
内容的提问来源于stack exchange,提问作者BLWedge09
相关产品推荐
相关产品推荐

