簡體   English   中英

Jenkins 不在控制台中打印 python 腳本的輸出

[英]Jenkins not printing output of python script in console

我有一個 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

在 jenkins 中,我有一個執行 shell 的工作,如下所示:

#!/bin/sh
./myscript.py

問題: Jenkins 控制台僅顯示“我可以在 Jenkins 控制台輸出上看到此消息”。 如果子進程調用有任何輸出,它不會在控制台上打印出來。

如果我在服務器 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%
)

如果我在 Windows 服務器上本地運行這個批處理文件,它會返回一個 1(因為我在測試文件夾中打開了一個文件)

但是當python腳本使用子進程調用調用這個批處理文件時,我得到的只是retval的零。

這是為什么以及如何解決這個問題? 如果我可以捕獲正確的 retval,我可以讓 Jenkins 工作失敗。

編輯 12/12:你好!! 任何人! 有人! 幫助!

我想知道它是否與緩沖 stdout 有什么關系,您可以在運行命令之前嘗試設置PYTHONUNBUFFERED嗎?

export PYTHONUNBUFFERED=true

當您在 shell 中執行腳本時,Python 將您的 shell 的 STDOUT 設置為子進程的 STDOUT,因此執行的所有內容都會打印到您的終端。 我不知道為什么,但是當您在 Jenkins 中執行時,子進程沒有繼承 shell 的 STDOUT,因此不會顯示其輸出。

在所有的可能性,為您解決問題的最好辦法,是PIPE標准輸出(STDERR和良好的措施),並且過程結束后打印出來。 此外,如果您使用子進程的退出代碼退出並且退出代碼不是0 ,它可能會終止您的 Jenkins 工作。

p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
                     stderr=subprocess.PIPE, shell=True)
exit_code = p.wait()  # wait for it to end
print('Got the following output from the script:\n', p.stdout.read().decode())
print('Got the following errors from the script:\n', p.stderr.read().decode())
print('Script returned exit code:', exit_code)

sys.exit(exit_code)

TL; DR

修復方法是在rmdir上使用一些條件執行( ||運算符)來修復返回的錯誤級別。

調查

這是一個錯誤的軟木塞,有相當多的曲折! 我們初步懷疑該標准輸出鏈莫名其妙地被打破,所以看着,通過明確使用管道Popen然后去除sshpass從您的指令,所以使用從輸出ssh直接。

然而,這並沒有奏效,所以我們繼續查看命令的返回碼。 刪除sshpass后, ssh應該返回運行的命令的結果。 但是,這對您來說始終是 0。

此時,我在 Windows 中發現了一個已知錯誤,即rmdir (與rd相同)並不總是正確設置錯誤errorlevel 修復方法是在rmdir上使用一些條件執行( ||運算符)來修復錯誤級別。

請參閱批處理:“rd”的退出代碼在錯誤時也0 以獲取完整詳細信息。

在我的 Jenkins 環境中,使用 unbuffered 參數執行 python 腳本會使輸出立即出現。 像這樣:

python3 -u some_script.py

更多信息來自幫助菜單( python3 --help ):

-u     : force the stdout and stderr streams to be unbuffered;
         this option has no effect on stdin; also PYTHONUNBUFFERED=x

批處理文件必須捕獲Jenkins的輸出並通過stdout(echo)將其傳遞給python腳本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM