2013-03-28 20 views
0

我需要執行很多腳本,每個腳本都在單獨的機器上執行。我試圖用詹金斯來做到這一點。我有一個Python腳本,可以執行單個測試並處理測試結果的時間限制和收集,以及一些運行此Python腳本的Jenkins作業,其中包含不同的參數。當我從命令行運行這個腳本時,它工作正常。但是當我通過詹金斯運行腳本(具有完全相同的參數)時,測試超時。該腳本處理測試結果,因此控制權一直返回給Jenkins,並且所有內容都被清理乾淨。我怎樣才能調試呢? Python腳本使用subprocess.popen來啓動測試。Jenkins發佈時Shell腳本具有不同的行爲

作爲一個方面說明,我願意提供如何更好地完成這項工作的建議,無論有沒有Jenkins和我的Python腳本。我只需要在不同的機器上運行一堆腳本並收集它們的輸出。

+0

您可能會檢查Jenkins正在運行的用戶,並確保它具有與命令行相同的權限和默認環境變量。這適用於Windows和Linux設置,特別是如果Jenkins作爲服務運行。 – jwernerny

回答

1

我解決了我自己的問題,即使這是一個角落的情況下,我仍然會在這裏回答。 Jenkins啓動的腳本自己使用ThreadedTCPServer啓動了一個線程化的Python服務器,或多或少地從here中實現。那個線程服務器沒有正確退出,所以它打開了一些管道。雖然服務器進程死了,但泄漏的管道使Jenkins無法正確確定進程已結束(Jenkins等待子進程的EOF以確定進程是否已完成)。解決方案是重新實現正確退出的套接字服務器。希望這有助於未來的人!

1

要調試此:

  • 添加set -x對你的shell腳本的頂部。
  • 一套打印每行的行號時,它調用的PS4:PS4='+ $BASH_SOURCE:$FUNCNAME:$LINENO:'
  • 查找特別是在您的腳本假定當哈德森運行未設置環境變量的任何地方。

如果你的Python腳本重定向標準錯誤(其中從set -x日誌定向),不通過它傳遞給哈德森(所以不登錄的話),你可以從它在腳本中重定向到文件:exec 2>>logfile

順便說一句,除Jenkins之外還有許多工具可以在多臺機器上啓動作業; MCollective(如果你已經使用Puppet的話,效果會很好),knife ssh(如果你使用廚師,那麼你應該已經擁有這個功能了),Rundeck(它有一個時髦的網絡用戶界面,但不應該被任何人使用,直到this security bug是固定的),Fabric(這是一個非常好的選擇,如果你沒有mcollective或刀已經),還有更多。

+0

感謝您的提示,我一定會考慮這些。實際上,Python子進程正常運行並正在退出,但父進程不會收到通知,因此超時。這肯定與詹金斯分道的方式有關。有任何想法嗎? – sagargp

相關問題