Jenkins groovy 管道使用 try catch 和来自 python exit 的变量

问题描述 投票:0回答:1

我在 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 脚本打印的消息(它没有做什么)。

python jenkins groovy jenkins-pipeline try-catch
1个回答
0
投票

这是我想的预期行为。当脚本以非零退出代码退出时,将不会返回 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()
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.