如何避免Jenkins流水线跳过阶段时拉取Docker镜像?
解决Jenkins流水线跳过阶段仍拉取Docker镜像的问题
这个问题我之前也碰到过,本质是Jenkins流水线的agent执行顺序搞的鬼——stage级别的agent会在when条件判断之前就初始化,所以哪怕你的分支不是master,Jenkins还是会先把node:8镜像拉下来,之后才发现要跳过这个阶段,就造成了不必要的镜像拉取。
这里有两种靠谱的解决方法,推荐第一种:
方法1:将Docker代理逻辑移到Steps内部(推荐)
把原来stage里的agent配置去掉,改用Jenkins Docker Pipeline插件提供的docker.image().inside()方法,这样只有当when条件满足时,才会去拉取镜像并运行容器。
修改后的完整流水线代码:
pipeline { agent any stages { stage('Node') { when { branch 'master' } steps { script { // 只有分支是master时,才会拉取node:8镜像并进入容器执行命令 docker.image('node:8').inside() { sh 'node -v' } } } } stage('Maven') { agent { docker { image 'maven:3' } } steps { sh 'mvn -v' } } } }
这种方式把镜像拉取和容器运行的逻辑完全放到了steps块里,受when条件的直接控制,分支不符合要求时根本不会触发镜像拉取,完美解决你的问题。
方法2:使用条件化的Agent配置(备选)
如果你更倾向于保留stage级别的agent配置,可以通过动态设置label来实现条件化代理:
pipeline { agent any stages { stage('Node') { agent { docker { image 'node:8' // 分支是master时用正常代理,否则指定一个不存在的label让Jenkins跳过初始化 label env.BRANCH_NAME == 'master' ? '' : 'non-existent-agent-label' } } when { branch 'master' } steps { sh 'node -v' } } stage('Maven') { agent { docker { image 'maven:3' } } steps { sh 'mvn -v' } } } }
这种方法的原理是:当分支不是master时,给Docker agent指定一个不存在的label,Jenkins找不到对应的代理节点,就会跳过这个agent的初始化(包括镜像拉取),同时因为when条件不满足,整个stage也会被跳过。不过这种写法不如第一种直观,所以更推荐第一种方案。
内容的提问来源于stack exchange,提问作者Claudiu Hojda
相关产品推荐
相关产品推荐

