Jenkins groovy管道使用try catch和python出口变量

syqv5f0l  于 2022-12-03  发布在  Jenkins
关注(0)|答案(1)|浏览(159)

我在jenkins上有一个管道,它在一个stage中使用try-catch框架来尝试运行python脚本。一旦运行,python脚本要么打印一个好的值,要么打印一个坏的值并退出,这取决于输入。我的目标是稍后用它来做一个测试。因此我的要求是我需要能够区分python脚本是成功的还是使用exit('ERR_MESSAGE')终止的。
如果python运行到最后,我已经让它工作了。但是,如果python以exit命令结束,jenkinsfile正确地理解了这一点,它会跟随catch,但是它不会存储python脚本之前打印的文本,这是我所需要的。
你能帮忙吗?我做错了什么?请看下面的jenkinsfile阶段

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脚本将以exit结束的时候。如果我使用输入pass,那么它将正常工作,因为python不会以exit结束。
和下面的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脚本打印的消息(它不做的事情)。

jm81lzqq

jm81lzqq1#

我想这是预期的行为。当脚本以非零退出代码退出时,将不会返回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()
            }
        }
    }
}

相关问题