Jenkins 您如何在持续集成/交付中管理多个环境中的多个版本?

Jenkins 您如何在持续集成/交付中管理多个环境中的多个版本?,jenkins,continuous-integration,continuous-deployment,Jenkins,Continuous Integration,Continuous Deployment,我正试着把我的头绕在这上面。大多数CI/CD示例/项目都有一个始终发布的主版本,并且有一些变体,例如git flow,以拥有一个开发分支。一旦贴上标签,它就会被送到主人那里 无论哪种方式,master总是发布到生产中 但在我看来,在现实世界中,发布到生产环境和其他环境中有人类的大门。您使用什么机制来管理不同版本的部署 例如: v1.5是当前的生产版本 v1.6已通过所有测试,工件已准备就绪,标记为有效,但业务部门决定仅将其部署到暂存,等待适当的部署时机 v1.5已部署到演示环境中 v2.0也通

我正试着把我的头绕在这上面。大多数CI/CD示例/项目都有一个始终发布的主版本,并且有一些变体,例如git flow,以拥有一个开发分支。一旦贴上标签,它就会被送到主人那里

无论哪种方式,
master
总是发布到生产中

但在我看来,在现实世界中,发布到生产环境和其他环境中有人类的大门。您使用什么机制来管理不同版本的部署

例如:

  • v1.5是当前的生产版本
  • v1.6已通过所有测试,工件已准备就绪,标记为有效,但业务部门决定仅将其部署到暂存,等待适当的部署时机
  • v1.5已部署到演示环境中
  • v2.0也通过了所有测试,但处于UAT中,这取决于客户是否满意,因为它是一个主要版本
可能还有更多这样的环境——生产、登台、UAT、演示、演示2等等


您使用什么机制来处理特定环境中特定版本的标记及其实际部署?

尽管可能有几种方法可以做到这一点,但我使用构建管道插件和复制工件插件

有了这些,您可以为环境的每一部分创建单独的工作,并将它们全部链接起来。 因此,在您的示例中,管道将如下所示:

构建->测试并部署到UAT(2.0)->部署到登台(1.6)->演示(1.5)->产品(1.5)

每件作品都代表了詹金斯不同的建筑风格。持续集成背后的理念是,您只需创建一次二进制文件,然后就可以将其传送到管道中,只需在此过程中更改配置部分。在构建作业中,创建并归档工件。在之后的任何作业中,从上游作业中提取工件,完成一些工作,然后将其重新归档以用于下一个下游作业。因此,deploytostaging将进入测试并部署到Uat作业以获取其二进制文件。持续交付的整个概念可以归结为构建管道。(是的,我只是引用了维基百科)

至于为特定环境标记单个二进制文件,根据定义,这不是持续集成。假设二进制文件的创建方式可以轻松地从一个环境传播到下一个环境。因此,不幸的是,针对特定环境的单个构建永远无法持续交付。您可以随心所欲地将jenkins用作CI服务器,但如果您的流程不匹配,您将永远无法实现真正的持续集成

当涉及到持续集成时,分支、合并和签入似乎总是一个敏感的话题,所以我不会太深入。但很多人都有这样的想法:“如果团队中的不同成员在不同的分支上工作,那么根据定义,他们不会参与持续集成过程。”

编辑
对于标记特定的构建,听起来您希望使用此功能:。。。它可以有效地完成工作,为您提供任何单个工件的整个生命。更复杂的解决方案是artifactory,它本质上是工件源代码控制

我在上面解释了部署过程的概念,如果没有关于您的特定环境的信息,就很难再进一步了。但对我来说,对于部署到tomcat容器中的java应用程序,部署插件非常有效


您不必担心选择要部署的工件。管道应设置为始终部署在其相应上游作业中存档的最新工件。

也许Docker可以帮助您解决此问题。它能够将项目的映像部署到特定环境。如果该环境具有docker客户端或docker deamon,则可以请求有关该环境和(将)部署在其上的项目的特定信息

Jenkins仍然可以在集成部分的管道中扮演重要角色,您可以让docker来完成交付部分

码头工人:

jenkins的Docker插件:


Docker还支持windows机器和.NET。

Hey@Cole9350感谢您提供详细的答案。因此,我在管道方面做得很好,最终的结果不是每个环境都有特定的二进制文件。相反,我将有3个不同的工件:v2.0、v1.6、v1.5。我应该使用什么机制来实际标记不同的工件并将其部署到每个环境中?我是100%对同一工件可以使用在任何一个;这是我正在努力处理的环境进程的标记/选择/部署OK,因此要为特定环境添加:EC2实例,高度可处置。一个实例弹出,抓取最新的工件(Docker图像以保持简单),然后运行。但每个人都需要知道该抓哪一个。我不想在应用服务器上放太多逻辑,但某种形式的“嘿,我是env X,所以我请求并被告知获取工件版本Y,这里就是”是从jenkins内部对实例进行理想控制,将每个实例标记为一个特定的实例、Dev、UAT、Demo等。将它们全部链接起来,以便构建指向dev的点,dev指向Uat等。这是构建管道,我不能有任何不同。每个人都不知道他们要打哪场战争,他们只知道如何成功地通过管道的最后阶段。有趣的是,碰巧,我在几周前重读了这本书!它确实很好地解决了这个问题。但我没有发现任何关于同时管理多个环境的信息,基本上,服务器X得到版本A,服务器Y得到版本C,等等。我不明白?为什么具有不同版本的多个环境不符合CI?实际上,正是转换为Docker映像引发了这个问题。转向更好的技术往往会引发一场革命