jenkins流水线在某个节点上执行失败
故障背景
使用的是kubesphere内置的jenkins
今天出现一个故障,在在某一台机器上流水线mvn打包执行失败,将这台机器禁止调度。流水线在其他节点正常。

排查过程
根据项目基本可以确定是某一台机器的环境有问题。
jenkins的流水线在实行过程中,是拉起新的pod作为jenkins-slave进行流水线工作。所以一旦流水线失败,pod会被删除。导致我们无法进入容器内部进行排查。
我们可以在jenkinsfile中,加上sleep,停住容器,以便我们进行排查。
1 | container('maven') { |
注意,pod里会有两个container
1 | [root@t-paas-k8s-0-master-0 ~]# kubectl -n kubesphere-devops-system get pod maven-pbxgv -o jsonpath={.spec.containers[*].name} |
应该进入maven容器,这是真正执行mvn命令的容器。
进去执行mvn,果然也是一样的报错。
猜测是不是下载的依赖包有问题。
删除了容器里的依赖,本地仓库位置如果没有改,默认是~/.m2下
重新执行mvn编译。
mvn重新下载依赖,果然好了。
那就是说明确实是之前下载的依赖包损坏的问题。
解决方案
原因是第一次下载依赖有错误,后续不会再重复下载,导致编译出错。
所以想出三种解决办法,都可以解决。
1,修改JenkinsFile,sleep住然后进入maven容器,删除依赖。重新执行流水线
2,使用maven强制更新依赖的命令
1 | mvn dependency:purge-local-repository |
3,k8s的jenkins slave会把依赖下载到宿主机,启动的每个slave容器都使用这一份依赖,不会每次都重新下载。
路径是 /var/lib/docker/volumes/jenkins_maven_cache/_data/
所以,也可以直接把这个路径下的有问题的依赖删了,让maven重新下
和在容器里删除效果一样,但是操作更方便。