2011-06-14 99 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

相关问题