CI/CD 的大型分布式客户端服务器应用程序部分的自动化部署

Automating deployments of large distributed client server application part of CI / CD

对于我们的一个应用程序,我们正在尝试自动化部署过程。我们已经为此应用程序实施了端到端的持续集成 (Build/Test/Package/Report)。现在我们正在尝试实现自动化部署。该应用需要部署在2000台服务器上,每台服务器下50个客户端。部分组件将安装在服务器端,部分组件将安装在客户端。
用于 CI 的工具:Jenkins、Github、msbuild、nunit、specflow、wix。

我已经阅读了持续交付和持续部署之间的区别,并且了解持续交付意味着 code/change 被证明可以在任何时间点上线,而持续部署意味着被证明 code/change将自动部署到生产服务器。

网络上的大多数文章都解释了我们如何能够自动化继续交付/部署到其中一台服务器的部署部分 (DEV/Staging/Preproduction/production)。 None 文章讨论了将应用程序部署到大量服务器和客户端。

现在我的问题是 1) 将应用程序部署到 2000 多台服务器和客户端是持续部署的一部分,还是应该在 CI/CD 之外处理? 2) 如果它可以在 CI/CD 内处理,那么我如何在 Jenkins 交付管道中对此建模并从 CI 工具触发所有服务器的部署? 3) 是否有任何工具可以与 CI 工具集成以自动部署?

谢谢

  1. 持续部署的关键要求(恕我直言)是流程编排,jenkins 不是这方面的理想工具,但您可以编写自己的 groovy 脚本包装器或从另一个远程调用作业编排工具。 jenkins 的另一个问题,至少对我来说,是难以跟踪进度。
  2. 我将其建模如下:

    • 将部署过程划分为逻辑级别,例如数据中心->应用程序->池,并为每个级别创建一个包装器。它将允许您在主包装器中查看最高级别的进度,并在需要时根据需要向下钻取
    • 仅当 ALL 下游作业为 SUCCESSFUL 时,每个包装器才应完成为 SUCCESS,否则应为 UNSTABLEFAILURE。在这种情况下,您不会错过任何低级别工作。
    • 每 1 个工作 product/application/package
    • 1 个作业来控制单个序列 运行。例如,我会使用 mcollective 来 运行 在 selected 服务器
    • 上安装作业 sequentially/parallel
    • 每个逻辑级别 1 个包装作业
  3. 我会用:

    • mcollective - 如上所述
    • foreman 查询 puppet 到 select 每个序列的服务器列表 运行
    • 服务器上的 package/application/artifact 安装我更愿意使用本机 OS 软件,例如 linux 服务器上的 yum。它将允许您依赖他们的安装验证机制

我确定我错过了一些东西,但我希望它能给你一个可以接受的起点

我会将这两个方面分开:

  1. 在大量服务器上部署(要部署的工件是否来自 CI 并不重要)
  2. 将此类部署连接到 CI 以执行 CD

对于 #1 - 我确信可以使用专业的 IT 工具。请咨询您的 IT 部门。如果部署不需要超级用户权限,或者如果您拥有此类权限(和知识),您还可以编写自己的自定义 deployment/management 工具。

对于 #2 - CD 并没有真正指定您是否应该部署到单个服务器、一定比例的生产服务器或所有服务器)。您的选择应基于什么有意义或更适合您的特定环境。如果你决定走那条路,究竟是怎么做到的?这真的取决于 #1 - 你只需要从你的 CI 触发这个过程。使用自定义部署工具应该是一件轻而易举的事:)