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 工具集成以自动部署?
谢谢
- 持续部署的关键要求(恕我直言)是流程编排,jenkins 不是这方面的理想工具,但您可以编写自己的 groovy 脚本包装器或从另一个远程调用作业编排工具。 jenkins 的另一个问题,至少对我来说,是难以跟踪进度。
我将其建模如下:
- 将部署过程划分为逻辑级别,例如数据中心->应用程序->池,并为每个级别创建一个包装器。它将允许您在主包装器中查看最高级别的进度,并在需要时根据需要向下钻取
- 仅当 ALL 下游作业为
SUCCESSFUL
时,每个包装器才应完成为 SUCCESS
,否则应为 UNSTABLE
或 FAILURE
。在这种情况下,您不会错过任何低级别工作。
- 每 1 个工作 product/application/package
- 1 个作业来控制单个序列 运行。例如,我会使用 mcollective 来 运行 在 selected 服务器
上安装作业 sequentially/parallel
- 每个逻辑级别 1 个包装作业
我会用:
- mcollective - 如上所述
- foreman 查询
puppet
到 select 每个序列的服务器列表 运行
- 服务器上的 package/application/artifact 安装我更愿意使用本机 OS 软件,例如
linux
服务器上的 yum
。它将允许您依赖他们的安装验证机制
我确定我错过了一些东西,但我希望它能给你一个可以接受的起点
我会将这两个方面分开:
- 在大量服务器上部署(要部署的工件是否来自 CI 并不重要)
- 将此类部署连接到 CI 以执行 CD
对于 #1 - 我确信可以使用专业的 IT 工具。请咨询您的 IT 部门。如果部署不需要超级用户权限,或者如果您拥有此类权限(和知识),您还可以编写自己的自定义 deployment/management 工具。
对于 #2 - CD 并没有真正指定您是否应该部署到单个服务器、一定比例的生产服务器或所有服务器)。您的选择应基于什么有意义或更适合您的特定环境。如果你决定走那条路,究竟是怎么做到的?这真的取决于 #1 - 你只需要从你的 CI 触发这个过程。使用自定义部署工具应该是一件轻而易举的事:)
对于我们的一个应用程序,我们正在尝试自动化部署过程。我们已经为此应用程序实施了端到端的持续集成 (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 工具集成以自动部署?
谢谢
- 持续部署的关键要求(恕我直言)是流程编排,jenkins 不是这方面的理想工具,但您可以编写自己的 groovy 脚本包装器或从另一个远程调用作业编排工具。 jenkins 的另一个问题,至少对我来说,是难以跟踪进度。
我将其建模如下:
- 将部署过程划分为逻辑级别,例如数据中心->应用程序->池,并为每个级别创建一个包装器。它将允许您在主包装器中查看最高级别的进度,并在需要时根据需要向下钻取
- 仅当 ALL 下游作业为
SUCCESSFUL
时,每个包装器才应完成为SUCCESS
,否则应为UNSTABLE
或FAILURE
。在这种情况下,您不会错过任何低级别工作。 - 每 1 个工作 product/application/package
- 1 个作业来控制单个序列 运行。例如,我会使用 mcollective 来 运行 在 selected 服务器 上安装作业 sequentially/parallel
- 每个逻辑级别 1 个包装作业
我会用:
- mcollective - 如上所述
- foreman 查询
puppet
到 select 每个序列的服务器列表 运行 - 服务器上的 package/application/artifact 安装我更愿意使用本机 OS 软件,例如
linux
服务器上的yum
。它将允许您依赖他们的安装验证机制
我确定我错过了一些东西,但我希望它能给你一个可以接受的起点
我会将这两个方面分开:
- 在大量服务器上部署(要部署的工件是否来自 CI 并不重要)
- 将此类部署连接到 CI 以执行 CD
对于 #1 - 我确信可以使用专业的 IT 工具。请咨询您的 IT 部门。如果部署不需要超级用户权限,或者如果您拥有此类权限(和知识),您还可以编写自己的自定义 deployment/management 工具。
对于 #2 - CD 并没有真正指定您是否应该部署到单个服务器、一定比例的生产服务器或所有服务器)。您的选择应基于什么有意义或更适合您的特定环境。如果你决定走那条路,究竟是怎么做到的?这真的取决于 #1 - 你只需要从你的 CI 触发这个过程。使用自定义部署工具应该是一件轻而易举的事:)