问题
我改了 moudule_A 和 module_B。
并且,moudule_A 依赖于 module_B。
在本地测试通过了。
但是,提交代码之后,自动 build 的 Jenkins pipeline 挂了。
报错信息提炼如下,前面是一堆 plugin job 正常跑,然后到 compile 这一步就报错: CLASS NOT FOUND。
[INFO] Scanning for projects...
[INFO]
[INFO] Building MY_APP
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ MY_APP ---
[INFO] --- buildnumber-maven-plugin:1.4:create (generate-timestamp) @ MY_APP ---
[INFO] --- buildnumber-maven-plugin:1.4:create (generate-buildnumber) @ MY_APP ---
[INFO] --- jacoco-maven-plugin:0.7.9:prepare-agent (default-prepare-agent) @ MY_APP ---
[INFO] --- buildnumber-maven-plugin:1.4:create-metadata (create-metadata) @ MY_APP ---
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ MY_APP ---
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ MY_APP ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 122 source files to /home/gdevopsc/jenkins-am/workspace/MY_APP/target/classes
[INFO] -------------------------------------------------------------
[WARNING] COMPILATION WARNING : SOME XXX CLASS NOT FOUND
解决1
我首先猜想的是,module_B 没有 upload 到 nexus 上去。
因为 pipeline 只配置了自动 build ,而不会自动 deploy 。(否则 nexus 空间很快就会爆满。)
于是,我手动 trigger 了一个单独的 module_B 的 deploy job。保证 nexus 上有最新的 module_B 。
但是,回去再跑 pipeline 还是失败。
解决2
于是,我看了一眼 moudule_A 的 Jenkinsfile,如下:
pipeline {
agent { label 'linux && jdk-8-zulu' }
tools
{
git 'Git'
maven 'Maven 3'
jdk 'Zulu JDK 8'
}
environment{
MAVEN_OPTS="-Xmx1024m -Xss512m"
}
stages{
stage('Build and test'){
steps{
script{
withMaven (maven: 'Maven') {
sh("mvn clean install")
}
}
}
}
}
问题出在 mvn build 命令。
因为服务器上 maven 的 local repo 有 module_B 的 snapshot 缓存,且 version 没有变,所以它没有下载最新的,而是直接使用了缓存。
这里,需要加一个 -U
参数,使得 maven 每次都会尝试下载最新的 snapshot versions 。
即,需要改成如下:mvn -U clean install