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

如何从Jenkins Pipeline的sh步骤同时返回stdout、stderr及执行状态

Jenkins Pipeline单次执行sh步骤同时捕获stdout、stderr与状态码方案

原生Jenkins Pipeline的sh步骤仅支持returnStdout和returnStatus两个参数二选一,无法同时启用,若要避免重复执行脚本,可通过shell层封装实现单次执行返回全部所需结果。

封装实现代码

def runShell(String cmd) {
    def result = sh(
        script: """
            # 临时存储输出的文件
            temp_stdout=\$(mktemp)
            temp_stderr=\$(mktemp)
            exit_code=0
            # 执行目标命令,分别重定向输出
            $cmd > \$temp_stdout 2> \$temp_stderr || exit_code=\$?
            # 按唯一分隔符拼接三类结果返回
            cat \$temp_stdout
            echo "=====SH_RESULT_SEPARATOR====="
            cat \$temp_stderr
            echo "=====SH_RESULT_SEPARATOR====="
            echo \$exit_code
            # 清理临时文件
            rm -f \$temp_stdout \$temp_stderr
        """,
        returnStdout: true
    ).trim().split("=====SH_RESULT_SEPARATOR=====")

    return [
        stdout: result[0].trim(),
        stderr: result[1].trim(),
        exitCode: result[2].toInteger()
    ]
}

使用示例

  • 调用封装方法后即可直接读取三类结果:
def shellRes = runShell("ls /tmp/testdir")

// 获取标准输出
println "标准输出:${shellRes.stdout}"
// 获取标准错误
println "标准错误:${shellRes.stderr}"
// 获取执行状态码,0为执行成功,非0为执行失败
println "执行状态码:${shellRes.exitCode}"

注意事项

  • 代码中的=====SH_RESULT_SEPARATOR=====为自定义分隔符,可修改为任意不会出现在目标命令输出内容中的字符串,避免拆分结果出现错误
  • 若命令输出为空,对应返回的stdout或stderr会是空字符串,不会出现空指针异常
  • 临时文件会在脚本执行完成后自动删除,不会在Jenkins节点上残留冗余文件

内容的提问来源于stack exchange,提问作者Gerold Broser

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 16:15:01