Shell 脚本退出码非零导致 Jenkins 构建失败怎么处理?

文章导读
Jenkins 构建失败通常是因为 Shell 命令返回了非零退出码。处理的核心原则是:区分“预期内的失败”与“真实错误”,优先使用 Pipeline 原生参数控制行为,避免全局屏蔽错误检查。
📋 目录
  1. 推荐方案:Pipeline returnStatus
  2. 备选方案:catchError 捕获异常
  3. Freestyle 项目处理
A A

Jenkins 构建失败通常是因为 Shell 命令返回了非零退出码。处理的核心原则是:区分“预期内的失败”与“真实错误”,优先使用 Pipeline 原生参数控制行为,避免全局屏蔽错误检查。

先说结论:不要盲目使用set +e,优先使用 Pipeline 的returnStatus: true参数或catchError块。

  • 预期错误:使用sh script: '...', returnStatus: true获取退出码自行判断。
  • 容错步骤:使用catchError包裹步骤,注意构建状态可能变为UNSTABLE
  • 验证方法:构建后检查控制台输出及构建状态图标,确认是否符合预期。

推荐方案:Pipeline returnStatus

在 Declarative 或 Scripted Pipeline 中,sh步骤默认在命令失败时抛出异常。若需要忽略错误并继续执行,推荐使用returnStatus: true参数。

stage('Check Service') {
    steps {
        script {
            // 返回退出码给变量,不会导致构建失败
            def status = sh script: 'curl -s http://localhost:8080/health', returnStatus: true
            if (status != 0) {
                echo 'Service check failed, but continuing...'
            }
        }
    }
}

此方法比set +e更安全,因为它只影响当前命令,且显式获取了状态码。

Shell 脚本退出码非零导致 Jenkins 构建失败怎么处理?

备选方案:catchError 捕获异常

如果需要包裹整个脚本块,可以使用catchError。注意默认会将构建状态标记为UNSTABLE

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
                    sh 'make build'
                }
            }
        }
    }
}

上述配置中,即使sh失败,构建结果仍为SUCCESS,但阶段结果为FAILURE。若不指定buildResult,默认为UNSTABLE

Freestyle 项目处理

在 Freestyle 项目的“执行 Shell