如何让Jenkins在超时后抛出错误并将构建设为失败状态?
Jenkins Pipeline超时后将构建设置为FAILED的实现方法
你的脚本已经用到了timeout步骤和异常捕获,但可以优化异常判断逻辑,确保只有超时触发时才输出对应提示,同时让Jenkins正确将构建状态标记为FAILED。
修正后的脚本
pipeline { agent { label 'importer' } stages { stage('Import') { steps { script { try { timeout(time: 8, unit: 'MINUTES') { sh label: 'import', script: ''' ssh user@server <<'ENDSSH' cd job/folder bash job.sh ENDSSH''' } } catch (FlowInterruptedException e) { // 仅处理超时导致的中断异常 if (e.cause instanceof hudson.plugins.timeout.TimeoutStepExecution.TimeoutExceeded) { println "超时错误详情: ${e.getMessage()}" error '构建超时,标记为FAILED' } else { // 其他中断类型(如手动终止),重新抛出异常 throw e } } catch (Exception e) { // 处理非超时的执行错误(如SSH失败、脚本报错) println "执行错误详情: ${e.getMessage()}" error '任务执行失败,标记为FAILED' } } } } } }
关键说明
精准捕获超时异常
Jenkins的timeout步骤超时后会抛出FlowInterruptedException,且其cause为TimeoutExceeded类型。通过判断这个类型,可以避免把手动终止构建等其他中断操作误判为超时。用
error步骤标记构建失败
Pipeline内置的error步骤会直接将构建状态设置为FAILED,同时在控制台输出自定义的错误信息,这比单纯打印日志更规范,Jenkins能正确识别构建结果。区分不同错误场景
新增的第二个catch块用于处理非超时的错误(比如SSH连接失败、脚本执行报错),同样用error标记失败,保证所有异常场景都能正确反馈构建状态。
如果不需要区分错误类型,你的原始脚本也能让构建失败,但会把所有异常都提示为“Timeout reached”,可能造成排查混淆,建议按上面的方式优化。
内容的提问来源于stack exchange,提问作者Dion Munk
相关产品推荐
相关产品推荐

