最近,当我们开始使用 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 Hooks。也许是挂钩将运行的进程内脚本?我也研究过Fabric http://docs.fabfile.org/en/1.0.1/index.html,这是一个不错的选择吗?
此外,每个端点需要什么样的支持软件?如果每台服务器上都存在 Mercurial 存储库,是不是最简单? SSH 访问会有好处吗? ETC...
我用 Mercurial 做过类似的事情,Fabric http://fabfile.org, and Jenkins http://jenkins-ci.org/:
+-------+
| 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 |
+-------+ +-------+
- 我没有在每个网络服务器上都有一个存储库;我使用 Fabric 仅部署必要的内容。
- 我有一个 fabfile.py (在存储库中),其中包含所有部署逻辑
- 要部署到的服务器 (IP) 集作为 Fabric 的命令行参数给出(它是 Jenkins 作业配置的一部分)
- 我使用 Jenkins 共享工作区,因此我可以将拉取和编译的任务与实际部署分开(这样我可以在必要时重新部署相同的代码)
- 如果您能够完成一项拉取、编译、部署的 Jenkins 工作,您会更高兴。共享工作空间是我必须在设置中使用的一种技巧,并且有缺点。
直接回答您的一些问题:
- 在测试分支上工作的开发人员可以在闲暇时进行推送,并共同决定何时运行 Jenkins 作业来更新测试环境
- 当测试顺利时,将其合并到稳定版本并运行 Jenkins 作业来更新实时环境
- 添加新的 Web 框只需将另一个 IP 添加到用于调用 Fabric 的命令行(即在 Jenkins 作业的配置中)
- 所有服务器都需要从 Jenkins 盒子进行 ssh 访问
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)