[英]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 是完全缓冲的,而连接到终端的交互式程序是行缓冲的。
【怎么修? ]
问题似乎出在您在 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.