Jenkins如何判定Pipeline阶段执行完成以运行下一阶段?
Jenkins 示例中阻塞执行逻辑的实现原理
你贴的这段声明式Jenkinsfile里,阶段串行、命令阻塞等待的逻辑是Jenkins Pipeline默认机制实现的,不需要额外写判断规则,核心判定逻辑如下:
- 所有不带特殊后台标记的
sh步骤天生是同步阻塞模式:执行sh "git clone xxx"时,Jenkins会在当前调度到的构建节点上启动一个独立的shell子进程,把命令传入这个子进程运行,同时当前Pipeline的执行线程会直接挂起,停在当前步骤位置不会向下推进。 - Jenkins判定命令执行完成的唯一标准是对应的shell子进程退出并返回退出码:执行
git clone时,只要拉取代码、写入本地文件的操作没做完,git进程就不会终止,外层的shell子进程也会一直处于运行状态,Jenkins监听到子进程没退出,就会一直等待,不会触发后续步骤。 - 等git clone全流程执行完毕,git进程正常退出,shell子进程拿到退出码(成功为0,失败为非0)交回给Jenkins的sh步骤,这个步骤才会被标记为执行完成;等当前
Clone Repo阶段下所有步骤都标记完成,Pipeline才会自动调度下一个Build阶段开始运行,不存在跨阶段抢跑的可能。
注意:如果你在sh的命令末尾手动加了
&这类让进程后台运行的标记,shell会把命令丢到后台后自己先退出,这时候Jenkins会误判命令已经执行完,直接往下走,就会出现不阻塞的异常情况,你给出的示例里没有这类写法,所以全程是按顺序阻塞执行的。
内容的提问来源于stack exchange,提问作者cluster1
相关产品推荐
相关产品推荐

