2012-11-02 13 views
0

之前訪問我SVN庫,我需要先創建一個tunnel這樣的:我們可以在連接到svn存儲庫之前使用jenkins中的隧道嗎?

ssh -L 9898:some_server.com:9898 [email protected]_server.com 

在那之後,我能夠在我的localhost的端口9898訪問存儲庫。在創建Jenkins作業時,我可以提供SVN url作爲localhost,Jenkins能夠訪問該回購,但我仍然需要在服務器上手動創建隧道。有沒有什麼辦法可以讓Jenkins實現自動化,這樣如果對隧道的訪問失敗了,那麼它可以執行隧道操作,然後再試一次?

我使用Jenkins 1.487

回答

1

你需要一個像pre-scm-buildstep

插件這使您可以執行建立SVN結帳之前的步驟。
使用此功能,您可以配置一個步驟,在SVN結帳開始之前爲您打開隧道。

但是,我懷疑SVN輪詢會在這種情況下工作。

更新: 繼OP的問題,這裏是另一種可能的解決方案:
https://wiki.jenkins-ci.org/display/JENKINS/ScriptTrigger+Plugin
我沒有用它自己,但它可以被執行,而不是規則輪詢一個自定義的shell腳本。您可以使用此自定義腳本首先建立隧道,然後輪詢SVN更改。但是,您必須編寫自己的腳本才能進行實際的SVN輪詢。就像檢查工作區修訂版(svn info <LocalCheckOut>|grep Revision)一樣簡單,並根據存儲庫(svn info <URL>|grep Revision)進行檢查。該插件將允許您以cron格式安排民意測驗的頻率。

另一種懶惰的方式是使用這個插件,建立隧道,做SVN更新(不管有沒有變化),然後讓作業構建它。然後,您可以定期執行構建操作,在真正的構建步驟之前,可以檢測是否實際上有新的結帳。

+0

是的...在這種情況下投票不起作用 – Daud

+0

謝謝..這一個似乎很有前途.. – Daud

0

我加入由Slav在上面的回答中指定的插件,並在部分Run buildstep before SCM runs寫了下面的腳本:

instance_count=`ps x | grep -c 'ssh -L 9898:some_server.com:9898 [email protected]_server.com'` 
if test $instance_count -lt 2 #two instances mean that one is of grep and other is the tunnel 
then 
    ssh -L 9898:some_server.com:9898 -t -t [email protected]_server.com& 
fi 

就這樣,每當我在「Build now」點擊,隧道首次創建,更新簽入,並建立完成。但不幸的是,在這種情況下輪詢不起作用

1

當您的腳本啓動並且Jenkins作業結束時,您的隧道是否在服務器上保持打開狀態?

如果是這樣,和SVN輪詢是必需的,你有2個可能的解決方案我能想到的:

  1. 創建一個單獨的作業,其唯一目的是運行上述腳本。安排它每2-3分鐘運行一次(或者隧道上的任何常規超時)。這樣希望你的服務器總是會打開一個隧道。

  2. 在你原來的工作,請使用這個插件有條件的生成後步驟:
    https://wiki.jenkins-ci.org/display/JENKINS/Post+build+task
    解析日誌SVN失敗檢查,如果發現:
    2.1運行腳本建立隧道
    2.2與捲曲
    2.3再次重新啓動你的工作,你可以選擇使用文本取景器插件標記等建立的「不穩定」,而不是失敗
    https://wiki.jenkins-ci.org/display/JENKINS/Text-finder+Plugin

+0

隧道保持打開,直到工作的持續時間。所以,如果我創建一個工作來打開它,那麼隧道將在工作結束時關閉(我假設因爲父shell關閉) – Daud

+0

對不起,但我不認爲你所要求的是可能的。要使輪詢正常工作,您需要在進行輪詢的機器上建立持久連接。我不知道有任何插件允許修改輪詢行爲本身。也許你的解決方案是編寫一個定期檢查隧道並打開它的cron作業。這將不得不在詹金斯以外 – Slav

+1

沒關係,找到了一個插件。我已經更新了我以前的回覆 – Slav

相關問題