我在 jenkins 上有一个管道,它在一个阶段内使用 try-catch 框架来尝试运行 python 脚本。运行后,python 脚本要么打印一个好的值,要么打印一个坏的值并退出,具体取决于输入。我的目标是稍后使用它进行测试,所以我的要求是我需要能够区分 python 脚本是否成功或者它是否以退出('ERR_MESSAGE')终止。
如果 python 运行到最后,我已经让它工作了。但是,如果 python 以 exit 命令结束,jenkinsfile 会正确理解并进行捕获,但它不会存储之前由 python 脚本打印的文本,因为我需要。
你能帮忙吗?我究竟做错了什么?请看下面的 jenkinsfile stage
stage('Test branch') {
steps {
script {
test_results = 'position 1'
try {
test_results = sh (
script: "python3 \${WORKSPACE}/testingjenkinsexit.py notpass",
returnStdout: true
).trim()
echo "Test results in passed test: ${test_results}"
} catch (err) {
echo "Test results in failed test numb 1: " + test_results
echo "Test results in failed test numb 2: ${test_results}"
echo err.getMessage()
println err.dump()
}
}
}
}
在上面的代码中,我使用输入“notpass”调用脚本“testingjenkinsexit.py”,因为这是 python 脚本将终止并退出的脚本。如果我使用输入传递,那么它可以正常工作,因为 python 不会以退出结束。
和下面的python脚本
from sys import argv
def testingjenkins(desired_output):
#print relevant test results. If at least one test failed, stop execution
if desired_output == "'pass'":
print(desired_output)
else:
print('tests did not pass')
exit('Deployement interrupted by python.')
desired_output = "'" + str(argv[1]) + "'"
if __name__ == "__main__":
testingjenkins(desired_output)
非常感谢您的帮助。
我在 jenkinsfile 中使用 try - catch 来调用打印值的 python 脚本,如果输入错误,可能会以 exit('MESSAGE') 终止。我期望 try-catch 能够处理以 exit 结尾的 python(它成功的作用)并且我期望在良好的执行和糟糕的执行(以 exit 结束)中 try-catch 将是能够存储由 python 脚本打印的消息(它没有做什么)。
这是我想的预期行为。当脚本以非零退出代码退出时,将不会返回 StandardOut。如果你想得到输出而不考虑状态,你可以这样做。以下将结合 STDOUT 和 STDERR 并在退出脚本时返回,退出代码为
0
。这不会将执行移动到 catch
块。所以你必须添加一个条件并检查返回的消息。
test_results = sh (
script: "python3 \${WORKSPACE}/test.py notpass 2>&1 || echo \"status:\$?\"; exit 0",
returnStdout: true
)
# Output
Test results in passed test: tests did not pass
Deployement interrupted by python.
status:1
另一种方法是将 STDOUT 写入文件并在
catch
块中读取它。
stage('Test branch') {
steps {
script {
test_results = 'position 1'
try {
test_results = sh (
script: "python3 \${WORKSPACE}/test.py notpass > output",
returnStdout: true
)
echo "Test results in passed test: ${test_results}"
} catch (err) {
output = readFile(file: 'output')
echo "Test results in failed test numb 1: " + output
echo "Test results in failed test numb 2: ${test_results}"
echo err.getMessage()
println err.dump()
}
}
}
}