如何在Jenkins流水线中针对非基础设施相关错误重试代码块?
问题描述
Jenkins 流水线提供了retry步骤,可在发生错误时重新执行代码。可选的conditions参数支持agent值,会重新执行那些「大概率由基础设施而非构建行为导致」的错误。
我需要处理完全相反的情况:只针对由构建行为导致、非基础设施相关的错误进行重试,有没有简便的实现方式?
我已经尝试过两种方法,但都没成功:
- 对条件取反,比如
retry(conditions: [!agent()], count: 3),但retry步骤要求的是org.jenkinsci.plugins.workflow.flow.ErrorCondition类的对象,不是布尔值。 - 实现一个继承自
ErrorCondition的自定义类,在测试方法中委托给AgentErrorCondition对象并返回取反结果,但没达到预期效果——难道只能通过开发插件实现?
解决方案
方法1:脚本式异常判断结合retry
不需要自定义类,直接在retry块内捕获异常,通过异常特征判断是否重试:
retry(count: 3) { try { // 你的构建逻辑代码 runBuildTasks() } catch (Exception e) { // 根据异常类名、消息判断是否为基础设施相关错误 def isInfraError = e.class.name.contains('Agent') || e.message =~ /node|agent|连接超时/ if (isInfraError) { // 基础设施错误,不重试,直接抛出终止流程 throw e } // 构建行为导致的错误,不抛出异常,触发retry自动重试 echo "捕获到构建错误,触发重试:${e.message}" } }
这种方式无需额外插件,直接在流水线脚本中实现,可根据实际异常特征调整判断逻辑,灵活度高。
方法2:自定义ErrorCondition(需插件开发)
如果一定要复用retry的conditions参数,确实需要开发自定义插件:
- 创建继承自
ErrorCondition的类,比如NonInfraErrorCondition - 在
test方法中调用AgentErrorCondition的test方法,返回取反结果 - 将类打包为Jenkins插件并安装后,即可在流水线中使用:
retry(conditions: [NonInfraErrorCondition()], count: 3) { // 你的构建逻辑 }
该方式适合需要跨流水线复用该条件的场景,但需要具备Jenkins插件开发能力。
方法3:循环+条件判断实现重试
用基础循环逻辑替代retry步骤,逻辑更直观:
def maxRetries = 3 def retryCount = 0 def buildSuccess = false while (!buildSuccess && retryCount < maxRetries) { try { // 构建逻辑 runBuildTasks() buildSuccess = true } catch (Exception e) { retryCount++ def isInfraError = e.class.name.contains('Agent') || e.message =~ /node|agent/ // 基础设施错误或重试次数耗尽时,终止流程 if (isInfraError || retryCount >= maxRetries) { throw e } echo "第${retryCount}次重试,原因:${e.message}" } }
这种写法对新手友好,无需依赖retry步骤的复杂参数,调试更方便。
内容的提问来源于stack exchange,提问作者mkiesner
相关产品推荐
相关产品推荐

