【问题标题】:How do you manage multiple releases in multiple environments in continuous integration/delivery?您如何在持续集成/交付中管理多个环境中的多个版本?
【发布时间】:2014-09-19 18:34:08
【问题描述】:

我正在努力解决这个问题。大多数 CI/CD 示例/项目都有一个始终发布的主控,并且有一些变体,例如git-flow,有一个开发分支。标记后,它会转到 master。

不管怎样,master 总是发布到生产环境中。

但在我所见的现实世界中,存在用于发布到生产环境和其他环境的人工闸门。您使用什么机制管理不同版本的部署?

例如:

  • v1.5 是当前的生产版本
  • v1.6 已通过所有测试,工件已准备就绪,被标记为有效,但业务决定仅将其部署到暂存,等待部署的合适时机
  • v1.5 部署到演示环境
  • v2.0 也通过了所有测试,但在 UAT 中,以客户满意为前提,因为它是一个主要版本

可能还有更多这样的环境 - 生产、登台、UAT、演示、demo2 等。

你使用什么机制来处理特定环境的特定版本的标记,以及它的实际部署?

【问题讨论】:

    标签: jenkins continuous-integration continuous-deployment


    【解决方案1】:

    虽然可能有几种方法可以做到,但我使用构建管道插件https://wiki.jenkins-ci.org/display/JENKINS/Build+Pipeline+Plugin 以及复制工件插件https://wiki.jenkins-ci.org/display/JENKINS/Copy+Artifact+Plugin

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

    构建 -> 测试并部署到 UAT (2.0) -> 部署到 staging(1.6) -> 演示(1.5) -> prod (1.5)

    每个部分都代表 jenkins 中的不同构建。持续集成背后的想法是您创建一次二进制文件,然后将其沿管道传输,只在此过程中更改配置部分。在构建作业中,工件被创建然后存档。在之后的任何作业中,从上游作业中提取工件,完成一些工作,然后将其重新存档以用于下一个下游作业。因此,部署到登台将转到测试和部署到 Uat 作业以获取其二进制文件。持续交付的整个概念归结为构建管道。 http://en.wikipedia.org/wiki/Continuous_delivery(是的,我只是引用了维基百科)。

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

    在涉及持续集成时,分支、合并和签入似乎总是一个敏感的主题,所以我不会过多讨论。但是很多人都有这样的想法:“如果团队的不同成员在不同的分支上工作,那么根据定义,他们就不会参与持续集成过程。” http://eugenedvorkin.com/continuous-integration-strategies-for-branching-and-merging/

    编辑
    对于标记特定构建,听起来您希望使用此功能:https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint ... 它可以有效地完成工作,为您提供任何单个工件的整个生命周期。更复杂一点的解决方案是工件,它本质上是工件源代码控制。

    我在上面解释了部署过程的概念,如果没有有关您的特定环境的信息,很难更进一步。但对我来说,对于部署到 tomcat 容器的 java 应用程序,deploy 插件效果很好https://wiki.jenkins-ci.org/display/JENKINS/Deploy+Plugin

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

    【讨论】:

    • 嘿@Co​​le9350 感谢您的详细回答。所以我擅长管道,最终结果不是每个环境的特定二进制文件。相反,我将拥有,例如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 条件?
    【解决方案2】:

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

    Jenkins 仍然可以在集成部分的管道中发挥重要作用,您可以让 docker 完成交付部分。

    码头工人:https://www.docker.com

    jenkins 的 Docker 插件:https://wiki.jenkins-ci.org/display/JENKINS/Docker+build+step+plugin

    Docker 还支持 windows 机器和 .NET。

    【讨论】:

    • 其实是转换为 Docker 镜像引起了这个问题。改用更好的技术通常会引发对当前状态的重新评估(也就是“我们到底在做什么那个是为了???”)。 :-)
    • 是的,我可以看到问题所在。目前,我正在撰写关于向多个环境持续交付的论文,目标是为与您类似的问题找到解决方案。六月我应该有我的结论。
    • 我很想看到它,当你完成时。
    • 如果你能把你的email或者其他联系方式发给我,我会在论文完成后发给我。
    • 我的所有联系信息都在我的公司联系页面上。 blog.atomicinc.com/contact 祝你好运...谢谢!
    猜你喜欢
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 2011-08-02
    • 2015-01-19
    • 2020-12-23
    • 2010-10-10
    • 2017-08-14
    • 1970-01-01
    相关资源
    最近更新 更多