使用 Mercurial 在多个服务器上自动进行 Web 部署

2024-01-06

最近,当我们开始使用 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(使用前将#替换为@)

使用 Mercurial 在多个服务器上自动进行 Web 部署 的相关文章

随机推荐

  • 如何减少 SORT 操作中的 CPU 占用

    我正在使用 DFSORT 将磁带数据集复制到临时文件 并处理大约 80000000 条记录 仅复制数据集就需要 3 个小时 有没有其他方法可以减少CPU时间 建议将会非常有帮助 谢谢 STEP40 EXEC SORTD SORTIN DD
  • AWS - IAM 角色和信任关系

    我是 AWS 和 IAM 的新手 正在尝试了解角色和信任关系 我完全理解为什么使用角色 如何创建它们以及它们的用例 我不明白的是信任关系步骤 在我见过的几乎所有案例中 都是一对一的关系 EC2 需要与 EC2 建立信任 为什么会有额外的步骤
  • 如何在 .env 文件中定义数组/对象?

    以下是我的 Javascript 对象 window options VAR1 VAL1 VAR2 VAL2 VA31 VAL3 我希望它 对象或数组 定义在 env文件 我怎样才能做到这一点 值在 env值只能是字符串 简单的解决方法是将
  • 在 directx 11 中渲染 h264 视频帧

    我是新来的DirectX 我正在尝试编写一个自定义 IP 摄像机视频播放器 并且我正在使用它DirectX11使用 Wpf Gui 作为前端渲染解码图像 I am a 时间 2019 03 17 标签 c developer并使用了托管的d
  • 使用 Backbone.js 和 Underscore,如何从模型中获取项目数?

    我有一个用于通知的通知模型 MODEL NotificationModel App BB Model extend defaults COLLECTION NotificationCollection App BB Collection e
  • Django 管理员登录返回 Forbidden 403 CSRF 验证失败。请求已中止

    对 Django 来说还很陌生 按照 Django 网站上的民意调查教程完成第二个项目 之前的努力虽然简单 但进展顺利 这次访问管理员登录时遇到问题 当我尝试登录时 我已经创建了一个超级用户并使用这些凭据http 127 0 0 1 800
  • Android - OnClick Listener 在一个单独的类中

    是否可以创建一个辅助类来保存 OnClick 侦听器 意思是不是在 Activity 类中创建的 我只是发现将 OnClick 侦听器放在主活动类中很混乱 我宁愿将它们放在单独的类中 谢谢 当然 这是可能的 只需创建一个实现的类View O
  • 在android中创建水平和垂直的虚线

    我想在android中使用形状绘制水平和垂直的虚线 我想画成这样 对于水平线
  • 更新 Heroku 上的堆栈

    我有一个小应用程序在那里运行 使用heroku buildpack perl https github com miyagawa heroku buildpack perl构建包 这只是一个小Plack http p3rl org Plac
  • 调用析构函数后访问对象

    在下面的代码中我调用 destructor 明确地 但是该对象仍然可以访问 我怎样才能删除它 让它消失 class Queue public node top NULL points to the top of the queue meth
  • DbContext 不返回本地对象

    我正在使用工作单元模式 在 webapi 请求上执行所有操作后调用 dbcontext SaveChanges 在请求的一部分中 我将一个新客户添加到 dbcontext dbContext Customers Add new Custom
  • 未找到 com.google.android.gms.internal.zzaja 的类文件

    我正在使用 Fragment 来设计 Firebase 简单登录注册 我收到错误OnCreateView 初始化方法 auth FirebaseAuth getInstance 错误 错误 58 28 错误 无法访问 zzaja 未找到 c
  • 如何将 C# 变量添加到 html 模态

    In my ASP Net应用程序 我有一个启动模式的按钮 这onClick事件触发启动模式的 C 后台代码 然后 我调用数据表并使用数据表中的值填充字符串变量 protected void uxTicketHistoryButton Cl
  • SQL Server 2008:多语句UDF可以返回UDT吗? [复制]

    这个问题在这里已经有答案了 多语句 UDF 是否有可能返回用户定义的表类型 而不是在其返回参数中定义的表 所以而不是 CREATE FUNCTION MyFunc p1 int p2 char RETURNS SomeVar TABLE c
  • 从用户定义的设置中设置 Info.plist 中的布尔属性

    通过用户定义的设置在 Info plist 文件中设置属性非常简单 只需使用 YOUR SETTING NAME 作为值即可 但是 是否可以对布尔属性执行此操作 布尔值的 plist 文件中的结构是
  • 从 Android 上的 Gmail 应用程序下载附件的意图过滤器

    我有带有意图过滤器 ACTION VIEW 的Android应用程序来打开文件并将其导入到我的应用程序中 我希望将文件附件从 Gmail 应用程序下载到我的应用程序中 某些文件类型 即 jpg png txt 可以正确保存 但有些文件类型则
  • 浮点数输出中的“%!s”是什么?

    我得到的坐标 位置 是 2 个 float64 数字的输出 它看起来像这样 s float64 42 539679 s float64 42 601339 这是我第一次看到这样的东西 那么 s 是什么 TypeOf 表示 s float64
  • 如何在 Spring Boot 中从 application.yml 读取具有特殊字符的属性

    应用程序 yml mobile type mobile codes BlackBerry BBSS Samsung SAMS Samsung Vodafone SAMSVV 从应用程序 yml 文件中读取 三星 沃达丰 密钥时 我们得到了
  • 如何替换 SwiftUI 中已弃用的 .animation() ?

    The animation 修饰符在 iOS 15 中已被弃用 但我不确定我是否理解 Xcode 建议的等效项 animation value works animation easeInOut duration 2 animation w
  • 使用 Mercurial 在多个服务器上自动进行 Web 部署

    最近 当我们开始使用 Mercurial 进行 Web 开发时 我一直在研究 Mercurial 的一些工作流程 我们需要一种自动化的方法来将推送到测试和实时实例的更改传播到多个端点 这是这个想法的示意图 Dev Push V Push L