use*_*061 4 python batch-file jenkins
我有一个python脚本(myscript.py)如下:
#!/bin/python
import os
import optparse
import subprocess
import sys
sys.stdout.flush()
print("I can see this message on Jenkins console output")
cmd="sshpass -p 'xxx' ssh test@testmachine 'cmd /c cd C:\stage && test.bat'"
retval=subprocess.call(cmd,shell=True)
print retval
Run Code Online (Sandbox Code Playgroud)
在jenkins中,我有一个执行shell的工作如下:
#!/bin/sh
./myscript.py
Run Code Online (Sandbox Code Playgroud)
问题: Jenkins控制台只显示"我可以在Jenkins控制台输出上看到此消息".如果子进程调用有任何输出,则不会在控制台上打印出来.
如果我把putty添加到服务器A并在shell上运行相同的命令(./myscript.py),我可以看到子进程调用的输出.
如何在Jenkins控制台上打印此子进程调用输出?
仅供参考:正如您从我的命令中看到的那样,子进程调用正在Windows上运行批处理文件; Jenkins在Linux上运行; 两台机器之间有ssh设置..
编辑: 我的test.bat看起来像这样:
echo off
RMDIR /S /Q C:\Test
IF %ERRORLEVEL% NEQ 0 (
ECHO Could not delete
EXIT /b %ERRORLEVEL%
)
Run Code Online (Sandbox Code Playgroud)
如果我在Windows服务器上本地运行这个批处理文件,它返回1(因为我在Test文件夹中打开一个文件)
但是当python脚本使用子进程调用调用这个批处理文件时,我得到的只是一个Zero for retval.
这是为什么以及如何解决这个问题?如果我能捕获正确的retval,我可以让Jenkins的工作失败.
编辑12/12:Helllo !! 任何人!有人!救命!
Way*_*man 10
在我的 Jenkins 环境中,使用无缓冲参数执行 python 脚本会使输出立即出现。像这样:
python3 -u some_script.py
Run Code Online (Sandbox Code Playgroud)
更多信息来自帮助菜单 ( python3 --help):
-u : force the stdout and stderr streams to be unbuffered;
this option has no effect on stdin; also PYTHONUNBUFFERED=x
Run Code Online (Sandbox Code Playgroud)
我想知道是否必须对缓冲的stdout做任何事情你可以PYTHONUNBUFFERED在运行命令之前尝试设置吗?
export PYTHONUNBUFFERED=true
Run Code Online (Sandbox Code Playgroud)
修复方法是使用一些条件执行(||运算符)rmdir来修复返回的错误级别。
这是一个bug,有相当多的曲折!我们最初怀疑 stdout 链以某种方式被破坏,因此通过显式使用管道进行调查,Popen然后sshpass从命令中删除,然后直接使用输出ssh。
然而,这并没有解决问题,所以我们继续查看命令的返回代码。删除后sshpass,ssh应返回所运行命令的结果。然而,这对你来说始终是 0。
此时,我在 Windows 中发现了一个已知错误rmdir(与 相同rd)并不总是errorlevel正确设置。修复方法是使用一些条件执行(||运算符)rmdir来修复错误级别。
有关完整详细信息,请参阅批处理:错误时“rd”的退出代码为 0。