什么是持续集成 源程序量( 五 )


在这些实例的前面是调度系统,它们充当产品或应用程序的客户“网关” 。通过将调度系统指向蓝色或绿色实例,可以将客户流量引流到期望的部署环境 。通过这种方式,切换指向哪个部署实例(蓝色或绿色)对用户来说是快速,简单和透明的 。
当新版本准备好进行测试时,可以将其部署到非生产环境中 。在经过测试和批准后,可以更改调度系统设置以将传入的线上流量指向它(因此它将成为新的生产站点) 。现在,曾作为生产环境实例可供下一次候选发布使用 。
同理,如果在最新部署中发现问题并且之前的生产实例仍然可用,则简单的更改可以将客户流量引流回到之前的生产实例 —— 有效地将问题实例“下线”并且回滚到以前的版本 。然后有问题的新实例可以在其它区域中修复 。
金丝雀测试/部署在某些情况下,通过蓝/绿发布切换整个部署可能不可行或不是期望的那样 。另一种方法是为 金丝雀(canary)测试/部署 。在这种模型中,一部分客户流量被重新引流到新的版本部署中 。例如,新版本的搜索服务可以与当前服务的生产版本一起部署 。然后,可以将 10% 的搜索查询引流到新版本,以在生产环境中对其进行测试 。
如果服务那些流量的新版本没问题,那么可能会有更多的流量会被逐渐引流过去 。如果仍然没有问题出现,那么随着时间的推移,可以对新版本增量部署,直到 100% 的流量都调度到新版本 。这有效地“更替”了以前版本的服务,并让新版本对所有客户生效 。
功能开关对于可能需要轻松关掉的新功能(如果发现问题),开发人员可以添加 功能开关(feature toggles) 。这是代码中的 if-then 软件功能开关,仅在设置数据值时才激活新代码 。此数据值可以是全局可访问的位置,部署的应用程序将检查该位置是否应执行新代码 。如果设置了数据值,则执行代码;如果没有,则不执行 。
这为开发人员提供了一个远程“终止开关”,以便在部署到生产环境后发现问题时关闭新功能 。
暗箱发布在 暗箱发布(dark launch)中,代码被逐步测试/部署到生产环境中,但是用户不会看到更改(因此名称中有 暗箱(dark)一词) 。例如,在生产版本中,网页查询的某些部分可能会重定向到查询新数据源的服务 。开发人员可收集此信息进行分析,而不会将有关接口,事务或结果的任何信息暴露给用户 。
这个想法是想获取候选版本在生产环境负载下如何执行的真实信息,而不会影响用户或改变他们的经验 。随着时间的推移,可以调度更多负载,直到遇到问题或认为新功能已准备好供所有人使用 。实际上功能开关标志可用于这种暗箱发布机制 。
什么是“运维开发”?运维开发 (DevOps) 是关于如何使开发和运维团队更容易合作开发和发布软件的一系列想法和推荐的实践 。从历史上看,开发团队研发了产品,但没有像客户那样以常规、可重复的方式安装/部署它们 。在整个周期中,这组安装/部署任务(以及其它支持任务)留给运维团队负责 。这经常导致很多混乱和问题,因为运维团队在后期才开始介入,并且必须在短时间内完成他们的工作 。同样,开发团队经常处于不利地位 —— 因为他们没有充分测试产品的安装/部署功能,他们可能会对该过程中出现的问题感到惊讶 。
这往往导致开发和运维团队之间严重脱节和缺乏合作 。DevOps 理念主张是贯穿整个开发周期的开发和运维综合协作的工作方式,就像持续交付那样 。
持续交付如何与运维开发相交?持续交付管道是几个 DevOps 理念的实现 。产品开发的后期阶段(如打包和部署)始终可以在管道的每次运行中完成,而不是等待产品开发周期中的特定时间 。同样,从开发到部署过程中,开发和运维都可以清楚地看到事情何时起作用,何时不起作用 。要使持续交付管道循环成功,不仅要通过与开发相关的流程,还要通过与运维相关的流程 。

推荐阅读