繁体   English   中英

Jenkins 执行 shell 表现不同

[英]Jenkins Execute shell behaving differently

我正在创建一个 Jenkins 项目,它在构建时执行 shell。 在执行 shell 中,我正在运行一个 python 脚本,例如`python3 pythonScriptFile.py "${arg1}" "${arg2}" "${arg3}"

python 文件内部调用 shell 脚本。

python -> shell1 -> shell2 -> 返回python文件继续执行。

当我在终端中执行带有 arguments 的 python 文件时,执行是一个接一个地同步进行。

但是当我在 Jenkins 中运行相同的程序时,首先执行 shell,然后执行 python 文件。

`print("SCRIPT Started")
 process = os.system("""sh script.sh -t {arg1} -e {arg2}""")
 process.wait()
 if process.returncode != 0:
     sys.exit()
     print("Error executing build script")

 print("SCRIPT COMPLETED")`

Output:

Script executed (which is a echo inside shell)
SCRIPT Started
SCRIPT COMPLETED`

预计 Output:

SCRIPT Started
Script executed (which is a echo inside shell)
SCRIPT COMPLETED`

【为什么会这样? ]

一个标准 output stream 的缓冲取决于环境和程序设置。

在 Jenking 中,python 程序的 output stream 是完全缓冲的,而连接到终端的交互式程序是行缓冲的。

【怎么修? ]

禁用 output 缓冲

问题似乎出在您在 python 脚本中运行 shell 脚本的方式上。 os.system() function 运行在 shell 中指定为字符串的命令,并返回该命令的退出状态。 但是,在继续执行 python 脚本之前,它不会等待命令完成。

要使 python 脚本在继续之前等待 shell 脚本完成,您可以使用子进程模块而不是 os.system()。 subprocess.run() function 允许您运行命令并等待它完成,还可以让您访问 output 和命令的返回码。

以下是如何修改代码以使用 subprocess.run() 的示例:

import subprocess

print("SCRIPT STARTED")
process = subprocess.run(["sh", "script.sh", "-t", arg1, "-e", arg2])
if process.returncode != 0:
    sys.exit("Error executing build script")

print("SCRIPT COMPLETED")

这应该运行 shell 脚本并等待它完成,然后再继续执行 python 脚本,您将看到预期的 output。

您遇到的问题是因为 os.system 异步运行 shell 脚本,因此在继续下一行代码之前不会等待它完成。 要解决这个问题,您可以改用 subprocess 模块。 您可以使用 subprocess.run function 来运行 shell 脚本并等待它完成,然后再继续下一行代码。 这是您的代码的更新版本:

print("SCRIPT Started")
process = subprocess.run(["sh", "script.sh", "-t", arg1, "-e", arg2])
if process.returncode != 0:
    sys.exit()
    print("Error executing build script")

print("SCRIPT COMPLETED")

这将运行 shell 脚本并等待它完成,然后再打印“SCRIPT COMPLETED”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM