将 Python 返回值(不是打印值)存储在 Jenkins 变量中

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

我有一个 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文件执行状态(成功与否),但仍然无法捕获返回值。

jenkins jenkins-pipeline
1个回答
0
投票

是的,

sh
步骤在返回内容方面提供的选项非常有限。 Jenkins 没有特定的方法来捕获
sh
不返回的内容,只有 shell 已经提供的内容 - I/O 重定向到文件。从
sh
返回什么以及保存什么并稍后阅读由您决定。一些注意事项:

  1. 如果您返回状态(也称为退出代码或返回代码),您的步骤将始终成功。由您来检查状态并抛出错误,但该错误不会附加到

    sh
    步骤,因此管道流可视化看起来会有些混乱。如果脚本返回非零代码,我建议让该步骤失败,并用
    catchError
    步骤包围它。

  2. 如果返回标准输出 (

    returnStdout: true
    ),则不会将任何内容打印到日志中。如果这是一个快速命令,那么可能没问题,但如果需要花费一定的时间,您可能希望在日志中看到一些进度。在这种情况下,我建议将输出通过管道传输到
    tee
    并保存到文件中以供稍后读取 (
    blah | tee capture_out.txt
    )

  3. returnStdout: true
    负责处理
    stdout
    ,而不是
    stderr
    ,它仍然会记录到日志中。如果您需要捕获它,请使用
    2>&1
    将其重定向到标准输出或重定向到文件。

所有这些都适用于 bash、zsh 和 dash。如果您使用不同的 shell,您需要弄清楚如何处理那里的 I/O 重定向。

© www.soinside.com 2019 - 2024. All rights reserved.