如何从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
相关产品推荐
相关产品推荐

