Jenkins声明式Pipeline中如何获取retry逻辑的当前重试次数
问题根因
原有计数器无法正常递增由两点导致:
- 执行顺序问题:当原始业务逻辑抛出异常触发重试时,块内后续代码会被直接中断,写在业务逻辑末尾的
counter = counter + 1不会执行,计数器始终停留在初始值。 - Pipeline CPS机制限制:Jenkins Pipeline的Groovy代码会经过CPS序列化转换,普通
def定义的局部变量在重试回滚执行状态时,修改后的值不会被持久化,跨重试周期读取到的永远是初始值。
可行实现方案
使用Pipeline内置的环境变量存储计数是最稳妥的方案,env变量全局持久化,不受重试状态回滚影响,同时将计数器递增逻辑放到执行块最前端,保证进入块时就能拿到正确的次数:
steps{ script{ // 初始化计数器 env.RETRY_COUNTER = "0" retry(3){ // 每进入一次执行块先递增,首次执行值为1,第一次重试值为2,第二次重试值为3 env.RETRY_COUNTER = (env.RETRY_COUNTER.toInteger() + 1).toString() // 计算当前已重试次数:首次执行为0,第一次重试为1,第二次重试为2 def currentRetryTimes = env.RETRY_COUNTER.toInteger() - 1 // 原有业务逻辑 // my original logic // 重试触发时执行附加逻辑 if (currentRetryTimes > 0){ echo "当前触发第${currentRetryTimes}次重试,执行附加处理" // my additional logic } } // 可选:执行完成后清理临时环境变量,避免污染后续步骤 env.remove('RETRY_COUNTER') } }
说明:
retry(3)代表最多总共执行3次块内代码,即首次执行失败后最多重试2次,和上述计数逻辑完全匹配。
内容的提问来源于stack exchange,提问作者Manjari
相关产品推荐
相关产品推荐

