我有一个 Jenkins 管道,它将执行一个 python 文件并获取其返回值,并将其存储在 Jenkins 变量中以供后续阶段使用。我看过很多帖子使用shstage来捕获python文件的打印输出,但我想要的是存储最后的返回值,而不是打印值。我什至不确定这可能吗?
假设我的 python 文件如下所示:
def test():
print ("Line 1")
print ("Line 2")
return false
test()
我的詹金斯舞台看起来像这样:
stage("run") {
steps {
script {
result = sh (returnStdout: true,
script: "python ${python_file_location} "
).trim()
echo "result: ${result}"
}
}
}
这样我就可以捕获第一个打印语句“Line 1”,但不能捕获返回值false。
另一个替代 Jenkins 管道是:
stage("run") {
steps {
script {
result = sh (returnStatus: true,
script: "python ${python_file_location} "
).trim()
echo "result: ${result}"
}
}
}
通过这个管道,我能够捕获python文件执行状态(成功与否),但仍然无法捕获返回值。
是的,
sh
步骤在返回内容方面提供的选项非常有限。 Jenkins 没有特定的方法来捕获 sh
不返回的内容,只有 shell 已经提供的内容 - I/O 重定向到文件。从 sh
返回什么以及保存什么并稍后阅读由您决定。一些注意事项:
如果您返回状态(也称为退出代码或返回代码),您的步骤将始终成功。由您来检查状态并抛出错误,但该错误不会附加到
sh
步骤,因此管道流可视化看起来会有些混乱。如果脚本返回非零代码,我建议让该步骤失败,并用 catchError
步骤包围它。
如果返回标准输出 (
returnStdout: true
),则不会将任何内容打印到日志中。如果这是一个快速命令,那么可能没问题,但如果需要花费一定的时间,您可能希望在日志中看到一些进度。在这种情况下,我建议将输出通过管道传输到 tee
并保存到文件中以供稍后读取 (blah | tee capture_out.txt
)
returnStdout: true
负责处理 stdout
,而不是 stderr
,它仍然会记录到日志中。如果您需要捕获它,请使用 2>&1
将其重定向到标准输出或重定向到文件。
所有这些都适用于 bash、zsh 和 dash。如果您使用不同的 shell,您需要弄清楚如何处理那里的 I/O 重定向。