2009-08-20 79 views
0

我爲jetbrains工具團隊編寫了一個插件。它幾乎只是一個服務器監聽器,用於監聽正在觸發的構建,並輸出一些文本文件,其中包含關於不同構建的信息,如觸發它的內容,其中存在多少變化等等。完成後,我編寫了一個可以輸入當服務器正在運行並踢出構建時,將信息輸入teamcity。我希望能夠在構建運行後獲得構建的構件,但問題是我不知道每個構建運行需要多長時間。有時30分鐘是30秒。關於服務器監聽器的Python問題

所以我在python中用這條線開始構建。

urllib.urlopen('http://'+username+':'+password+'@localhost/httpAuth/action.html?add2Queue='+btid+'&system.name=<btid>&system.value=<'+btid+'>&system.name=<buildNumber>&system.value=<'+buildNumber+'>') 

構建運行後(某些不確定的時間)我想用這行來獲取我的文本文件。

urllib.urlopen('http://'+username+':'+password+'@localhost/httpAuth/action.html?add2Queue='+btid+'&system.name=<btid>&system.value=<'+btid+'>&system.name=<buildNumber>&system.value=<'+buildNumber+'>') 

問題再次出現,我不知道在執行第二行之前要等多久。通常在Java中,我會做第二個線程的睡眠一段時間,並等待構建完成。我不知道如何在Python中做到這一點。因此,如果任何人有一個想法,要麼如何做到這一點在Python或更好的方式來做到這一點,我將不勝感激。如果我需要更好地解釋我自己,請讓我知道。

Grant-

+1

如果構建沒有完成並且您打電話給第二塊,會發生什麼? – Christopher 2009-08-20 17:04:17

+0

它會返回一個http 404錯誤。這與訪問不存在的html頁面相同,因爲一旦構建完成,文本文件將只存在於服務器上的該位置。 – cozmokramer8 2009-08-20 17:21:24

回答

2

除非你得到由具有堆積服務器聯繫,這樣做是唯一的出路通知投票。您可以按照其他註釋中的說明產生線程,只需讓主腳本進入休眠狀態並進行輪詢即可。

喜歡的東西:

wait=True 
while wait: 
    url=urllib.urlopen('http://'+username+':'+password+'@localhost/httpAuth/action.html?add2Queue='+btid+'&system.name=<btid>&system.value=<'+btid+'>&system.name=<buildNumber>&system.value=<'+buildNumber+'>') 
    if url.getcode()!=404: 
    wait=False 
    else: 
    time.sleep(60) 

作爲替代方案,你可以使用CherryPy。然後,構建完成後,可以將curl或wget連接到正在聆聽的CherryPy服務器,並觸發您的應用程序下載該url。

你也可以使用xmlrpclib來做類似的事情。

+0

我想我將不得不輪詢。我喜歡你的選擇建議,但我有點受限,因爲我只能使用服務器上當前安裝的內容。這是一個相當大的公司,我沒有選擇甚至安裝額外的Python庫:( 感謝您的代碼,但只有好奇的是這被認爲是不好的編碼習慣這樣做?它似乎是醜陋的我但顯然它必須經常發生。 再次感謝 格蘭特 – cozmokramer8 2009-08-20 17:58:55

+0

的問題中斷驅動或調查爲基礎的通知是一個大的。有時候輪詢效率更高,有時事件通知是更有效的。我一般喜歡*不*進行輪詢,但是有時候更大的體系結構決定會否定使用通知的可能性,在這種情況下,唯一的選擇是輪詢。關於輪詢的一件事情,通常最好使輪詢間隔可配置爲b/c,而不存在一個真實的民意調查間隔 – Christopher 2009-08-20 18:30:18

+0

再次感謝Christophe你是一個很大的幫助。也感謝關於使其可配置的提示,這是一個好主意。另外,如果其他人在將來閱讀這些提示,我也會在25分鐘嘗試後將循環打破。我這樣做是因爲有人開始構建然後中斷它的機會,所以不會輸出文本文件。然後,如果我運行這個腳本,它將處於連續循環。 Grant- – cozmokramer8 2009-08-20 19:40:10

0

的Python實際上有一個threading system是非常相似的Java,所以你應該能夠使用沒有太多的麻煩。

但是,如果你需要做的就是等待一些時間預定量,使用

import time 
time.sleep(300) # sleep for 300 seconds 
+0

這有點像我在想什麼,但我只是不知道那是多少時間。我最初的想法是做同樣的time.sleep()命令幾秒鐘,並嘗試找到文件。如果它返回http 404錯誤,然後再睡幾秒鐘,然後重試。這看起來像是和醜陋的方法,我希望有一個更優雅的解決方案。 – cozmokramer8 2009-08-20 17:23:14

+0

哦,謝謝你的鏈接,我現在正在閱讀。 :) – cozmokramer8 2009-08-20 17:24:16

+0

@ cozmokramer8:它被稱爲「投票」或「忙等待」,這是你在這種情況下唯一的選擇。 – 2009-08-20 17:38:10