You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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'
                    }
                }
            }
        }
    }
}

关键说明

  1. 精准捕获超时异常
    Jenkins的timeout步骤超时后会抛出FlowInterruptedException,且其cause为TimeoutExceeded类型。通过判断这个类型,可以避免把手动终止构建等其他中断操作误判为超时。

  2. 用error步骤标记构建失败
    Pipeline内置的error步骤会直接将构建状态设置为FAILED,同时在控制台输出自定义的错误信息,这比单纯打印日志更规范,Jenkins能正确识别构建结果。

  3. 区分不同错误场景
    新增的第二个catch块用于处理非超时的错误(比如SSH连接失败、脚本执行报错),同样用error标记失败,保证所有异常场景都能正确反馈构建状态。

如果不需要区分错误类型,你的原始脚本也能让构建失败,但会把所有异常都提示为“Timeout reached”,可能造成排查混淆,建议按上面的方式优化。

内容的提问来源于stack exchange,提问作者Dion Munk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 11:12:41