Jenkins定时Cron任务如何按同节点前次任务状态控制执行?
问题描述
场景概况
我有一个名为comp01的节点,以及一个名为Compatibility的Jenkins任务。该任务的Cron调度规则如下:
0 12 * * 1 %IntegrationNode=Software_1 0 17 * * 1 %IntegrationNode=Software_2 0 22 * * 1 %IntegrationNode=Software_3 0 2 * * 2 %IntegrationNode=Software_4 0 7 * * 2 %IntegrationNode=Software_5
核心问题
任务会按计划启动,但有时因验证失败导致前次任务超时,下一次同节点的任务会在前次任务完成前启动。需要实现:当某节点(对应IntegrationNode参数值)上的任务启动后,针对该节点的其他定时任务需等待当前任务完成后再执行,同时允许不同节点的任务并发运行。
已尝试无效的方案
- 限制任务的执行器数量:队列中有多个任务时无法实现按节点的互斥;
- 创建资源组并添加多个节点:队列中有任务时仍无法达到按节点排队的效果。
补充限制
无法使用options { disableConcurrentBuilds() },因为该配置会禁止所有任务的并发,不符合不同节点任务可并行的需求。
解决方案
方法1:使用Lockable Resources插件(推荐)
这是实现按参数维度互斥最便捷的方案:
- 安装Jenkins的Lockable Resources Plugin插件;
- 进入Jenkins全局配置,找到「Lockable Resources」模块,添加与
IntegrationNode参数值一一对应的资源,即创建Software_1、Software_2、Software_3、Software_4、Software_5这5个独立资源; - 在
Compatibility任务的配置页,找到「Build Environment」区域,勾选「Lock resources」,选择「Use parameter to select resource」并指定参数为IntegrationNode; - 保存配置后,同一
IntegrationNode值的任务触发时,后续任务会进入队列等待前次任务释放对应资源后再执行,不同IntegrationNode值的任务可正常并发。
方法2:Pipeline脚本内置锁逻辑
如果任务是Pipeline类型,可直接通过lock步骤实现按参数值的互斥,无需额外插件:
pipeline { agent { // 根据IntegrationNode参数绑定对应节点 label "${IntegrationNode}" } parameters { string(name: 'IntegrationNode', defaultValue: 'Software_1', description: '目标节点标识') } stages { stage('任务执行') { steps { // 以IntegrationNode参数值作为锁名称,实现同参数任务互斥 lock(resource: "${IntegrationNode}", inversePrecedence: false) { // 此处编写任务的具体执行逻辑,如验证步骤等 echo "开始执行${IntegrationNode}的兼容性验证" // ... 你的任务操作代码 } } } } }
该逻辑会让相同IntegrationNode参数的任务排队执行,不同参数的任务不受限制,完全匹配需求。
方法3:中转任务+节点标签(备选)
若无法使用插件或Pipeline,可通过中转任务实现,但维护成本较高:
- 为每个
IntegrationNode对应的节点创建专属标签,如sw1-node、sw2-node; - 为每个
IntegrationNode值创建一个中转任务,中转任务绑定对应节点标签,并开启「Disable concurrent builds」; - 将原有的Cron调度配置到对应中转任务,中转任务触发主
Compatibility任务并传递IntegrationNode参数。
此方式需维护多个中转任务,仅在无法使用前两种方案时考虑。
内容的提问来源于stack exchange,提问作者Vineet Bhat
相关产品推荐
相关产品推荐

