2011-06-14 141 views
4

最近我們一直在尋找Mercurial的一些工作流程,因爲我們將其用於Web開發。我們需要一種自動的方式將推送到測試和實例的更改傳播到多個端點。這裏的想法的示意圖:使用Mercurial在多臺服務器上自動部署網絡

  +-------+ 
     |Dev | 
     |  | 
     +-------+ 
      | Push 
      +--------+ 
         | 
         V 
+-------+ Push +-------+ 
|Live |<--------|Test | 
|server |   |server | 
+-------+   +-------+ 
    | +-------+ | +-------+ 
    +--->|Live 1 | +--->|Test 1 | 
    | |  | | |  | 
    | +-------+ | +-------+ 
    |     | 
    | +-------+ | +-------+ 
    +--->|Live 2 | +--->|Test 2 | 
    | |  | | |  | 
    | +-------+ | +-------+ 
    |     | 
    | +-------+ | +-------+ 
    +--->|Live 3 | +--->|Test 3 | 
     |  |   |  | 
     +-------+   +-------+ 

基本上,這個想法是,所有我們的開發者需要做的是,一旦發展已經達到一個穩定的水平,發出推命令(沒有按」不一定只是一個hg push)到測試服務器,並從那裏它會自動傳播出去。然後,一旦測試完成,我們會將它從測試推到現場(或者,如果更容易,我們可以從開發推到現場),並且這也會傳播到每個不同的實例。

如果我們可以相當容易地添加新的測試和活動實例(例如,如果IP被存儲在可以被腳本讀取的數據庫中等等),那將是很好的。

完成此操作的最佳方法是什麼?我知道Mercurial鉤子。也許是一個鉤子將運行的進程內腳本?我也研究過Fabric,這會是一個不錯的選擇嗎?

另外,每個端點需要什麼樣的支持軟件?如果每個服務器上都存在一個Mercurial存儲庫,它會是最簡單的嗎? SSH訪問會有好處嗎?等等......

回答

3

我使用水銀,Fabric做過這樣的事情,並Jenkins

+-------+ 
    | Devs | 
    +-------+ 
     | hg push 
     V 
    +-------+ 
    | hg | "central" (by convention) hg repo 
    +-------+\ 
    |  \ 
    |   +--------------+ 
    | Jenkins job   | Jenkins job 
    | pull stable   | pulls test 
    | branch & compile  | branch & compile 
    |  +-------+  | 
    | +----|Jenkins|-----+ | 
    | | +-------+  | | 
    V |     | V 
    +-------+   +-------+ 
    | "live"|   | "test"| shared workspaces ("live", "test") 
    +-------+   +-------+ 
    | Jenkins job   | Jenkins job  <-- jobs triggered 
    | calls fabric  | calls fabric  manually in 
    | +-------+  | +-------+  Jenkins UI 
    |--> | live1 |  |--> | test1 | 
ssh | +-------+ ssh | +-------+ 
    | +-------+  | +-------+ 
    |--> | live2 |  |--> | test2 | 
    | +-------+  | +-------+ 
    | ...    | ... 
    | +-------+  | +-------+ 
    +--> | liveN |  +--> | testN | 
      +-------+    +-------+ 
  • 我沒有每個Web服務器上的回購;我使用fabric來部署只有必要的部分。
  • 我有一個包含所有部署邏輯的fabfile.py(在回購中)
  • 要部署到的服務器(IP)集合作爲命令行arg給予結構(它是Jenkins作業的一部分)配置)
  • 我用詹金斯共享的工作空間,所以我可以分開拉動和從實際部署編制的任務(這樣我就可以重新部署如有必要)
  • 相同的代碼。如果你可以逃脫一個詹金斯作業拉 - 編譯 - 部署,你會更開心。共享工作區的東西是我必須使用我的設置,並有缺點。

直接解決您的一些問題:

  • 離散事件上的測試分支工作可以在空閒時間推,並集體決定何時運行詹金斯作業來更新測試環境
  • 當測試很高興,將它合併到stable並運行Jenkins作業來更新實況環境
  • 添加一個新的web box只是添加另一個IP到用於調用fabric的命令行(即在Jenkins的配置中工作)
  • 所有服務器將需要從詹金斯盒子ssh訪問
+0

感謝提詹金斯,我不知道它。無論如何,它看起來像SSH可能是要走的路。 – voithos 2011-06-16 18:16:13

+0

@overthink - 非常有趣的感謝。你認爲使用面料的好處是什麼,比如做什麼?另外 - 通過命令行參數傳遞IP - 當你有兩套IP(例如兩種類型的服務器)時,這種方式是否有效? – UpTheCreek 2013-01-17 11:29:07

+0

@UpTheCreek我想你可以用make來做,但是fabric是專門爲此構建的,並且通過ssh在遠程機器上內置了主機,角色和運行命令的概念。所以你最終得到的任務定義非常簡短,並且不需要很多機器來維護。對於多種服務器類型,我使用[結構角色](http://docs.fabfile.org/en/1.5/usage/execution.html#roles)。 – overthink 2013-01-17 14:27:26

相關問題