Jenkins Pipeline如何捕获特定错误重试构建?替代Naginator插件方案
Jenkins Pipeline中捕获特定错误并重试的实现方案
当然可行!Jenkins Pipeline的灵活性完全能满足你捕获特定构建错误后重试的需求,甚至比Naginator插件的正则匹配更灵活可控。针对你提到的make命令因pg_config.h missing失败的场景,我给你两种实用的实现方案:
方案一:使用内置retry结合异常捕获
这是最简洁的方式,利用Pipeline内置的retry步骤配合try-catch来精准触发重试:
retry(3) { // 指定最多重试3次 try { sh 'make' // 执行你的构建命令 } catch (Exception e) { // 检查异常信息是否包含目标错误字符串 if (e.getMessage().contains('pg_config.h missing')) { echo "检测到'pg_config.h missing'错误,准备重试..." throw e // 抛出异常触发retry机制 } else { // 遇到非目标错误直接终止构建,不重试 error "遇到非预期错误,终止构建:${e.getMessage()}" } } }
逻辑说明:
retry(3)会包裹代码块,一旦代码块抛出异常就自动重试,最多3次- 在
catch块里判断异常信息是否是你要匹配的错误,只有目标错误才会触发重试,其他错误直接终止
方案二:自定义循环实现灵活重试(支持间隔等待)
如果需要更复杂的逻辑(比如重试前等待一段时间),可以用自定义循环来控制:
def maxRetries = 3 def retryCount = 0 def buildSuccess = false while (retryCount < maxRetries && !buildSuccess) { try { sh 'make' buildSuccess = true echo "构建成功!" } catch (Exception e) { retryCount++ if (e.getMessage().contains('pg_config.h missing') && retryCount < maxRetries) { echo "第${retryCount}次重试:检测到'pg_config.h missing'错误,还剩${maxRetries - retryCount}次机会" sleep(time: 30, unit: 'SECONDS') // 可选:重试前等待30秒,避免频繁重试 } else { error "重试${retryCount}次后仍失败,或遇到非预期错误:${e.getMessage()}" } } }
额外注意:
有些情况下,构建错误可能只输出在控制台日志,而不是直接包含在Exception的message里。这时候可以直接捕获命令的输出内容来判断:
retry(3) { // 执行make命令并捕获输出和返回状态 def makeResult = sh(script: 'make', returnStdout: true, returnStatus: true) if (makeResult != 0) { // 重新执行一次获取完整输出(也可以在第一次就保存) def output = sh(script: 'make', returnStdout: true) if (output.contains('pg_config.h missing')) { echo "检测到目标错误,触发重试..." error "触发重试:pg_config.h missing" } else { error "构建失败,错误信息:${output}" } } }
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

