如何在Jenkins流水线Options块中用条件语句配置超时
Jenkins声明式流水线条件超时配置实现方案
声明式流水线的options块不支持直接编写if条件逻辑,可通过以下两种方案实现按变量控制超时规则的需求:
方案1:动态赋值给timeout参数(推荐,配置最简洁)
timeout配置支持传入动态计算的参数值,当条件不满足时,将超时时间设置为远大于任务正常运行时长的阈值,即可等效于不触发该6小时超时规则。
如果timerCause是流水线启动时即可确定的变量(如构建参数、启动时即可判断的触发原因等),优先用该方案:
pipeline { agent any options { // timerCause为true时超时为6小时,否则设置为7天超时,常规场景下不会触发 timeout(time: timerCause ? 6 : 7*24, unit: 'HOURS') } stages { stage('任务执行') { steps { echo "当前timerCause值: ${timerCause}" // 其余业务逻辑 } } } }
如果timerCause的逻辑本身是判断任务是否为定时触发,可以直接在options块内判断触发原因,无需提前定义变量:
pipeline { agent any options { timeout(time: currentBuild.getBuildCauses('hudson.triggers.TimerTrigger$TimerTriggerCause').size() > 0 ? 6 : 7*24, unit: 'HOURS') } // 其余流水线逻辑 }
方案2:脚本式timeout包裹业务逻辑
如果timerCause是流水线运行到执行阶段才能计算得到的变量(比如需要执行某个步骤后才能拿到判断值),或者不想设置超长默认超时,可以在script块内用脚本式语法的timeout步骤按需包裹核心逻辑,效果和options层面的全局超时一致:
pipeline { agent any stages { stage('核心任务') { steps { script { // 定义核心业务逻辑闭包 def runTask = { echo "开始执行业务步骤" // 所有业务步骤写在这里,也可以调用其他封装好的逻辑 } // 按条件判断是否加超时限制 if (timerCause) { timeout(time: 6, unit: 'HOURS', runTask) } else { runTask.call() } } } } } }
注意:
options块的逻辑在流水线启动初始化阶段就会执行,比所有stage的执行时机都早,如果判断条件依赖阶段执行的输出结果,不要使用方案1,会出现变量找不到的报错。
内容的提问来源于stack exchange,提问作者Dami Emmanuel
相关产品推荐
相关产品推荐

