hello云胜

技术与生活

0%

jenkins流水线在某个节点上执行失败

故障背景

使用的是kubesphere内置的jenkins

今天出现一个故障,在在某一台机器上流水线mvn打包执行失败,将这台机器禁止调度。流水线在其他节点正常。

image-20230913110815903

排查过程

根据项目基本可以确定是某一台机器的环境有问题。

jenkins的流水线在实行过程中,是拉起新的pod作为jenkins-slave进行流水线工作。所以一旦流水线失败,pod会被删除。导致我们无法进入容器内部进行排查。

我们可以在jenkinsfile中,加上sleep,停住容器,以便我们进行排查。

1
2
3
4
5
container('maven') {
sh 'sleep 9999999'
sh 'mvn clean package -Dmaven.test.skip=true -Ptest'
}

注意,pod里会有两个container

1
2
[root@t-paas-k8s-0-master-0 ~]# kubectl -n kubesphere-devops-system get pod maven-pbxgv -o jsonpath={.spec.containers[*].name}
jnlp maven

应该进入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重新下

和在容器里删除效果一样,但是操作更方便。