带你了解敏捷和DevOps的发布策略
摘要:随着数字化、信息化、网络化和智能化的普及和发展,企业对软件服务的质量和上线速度要求越来越高。传统研发模式难以满足要求,企业的开发运维模式逐渐向敏捷和DevOps 转型,敏捷和DevOps理念正被广泛认可并加速落地实践。
本文分享自华为云社区《一文读懂敏捷开发的发布策略》,作者:敏捷的小智。
随着数字化、信息化、网络化和智能化的普及和发展,企业对软件服务的质量和上线速度要求越来越高。传统研发模式难以满足要求,企业的开发运维模式逐渐向敏捷和DevOps 转型,敏捷和DevOps理念正被广泛认可并加速落地实践。本文主要阐述基于敏捷和DevOps的发布策略相关内容。
什么是发布策略
发布策略是不是发布方案、发布计划、发布方法?我们常听到的蓝绿发布、滚动发布、灰度发布是不是就是发布策略呢?下面我们就一起看一下。
发布
关于“发布”的含义,我们先看下它在整个软件开发生命周期中的位置,如图所示,发布是软件开发全生命周期中的最后一环,直接面向最终用户。

图1 软件研发流程
为了更好的理解交付,我们将各个环节逐一来看一下。
• 持续集成是开发人员提交了新代码之后,就对整个应用进行构建,目的是让正在开发的软件始终处于可工作状态;
• 持续交付是持续集成的延伸,将集成后的代码部署到类生产环境,确保可以以可持续的方式快速向客户发布新的更改;
• 持续部署是在持续交付的基础上,将代码尽早部署到生产环境,以确保可以小批次发布。持续部署是把部署到生产环境的过程自动化;
• 持续发布是把一个/组特性提供给(部分或全部)客户的过程,在对用户可见的这个过程称为发布。持续发布是以持续部署为基础。
• 持续测试是贯穿整个研发流程始终的,从持续集成到持续部署,都有自动化测试的存在。
更多相关的内容可以点击持续交付与持续部署概念解读进行学习。
策略
根据百度百科,“策略”是为了实现某一个目标,首先预先根据可能出现的问题制定的若干对应的方案,并且,在实现目标的过程中,根据形势的发展和变化来制定出新的方案,或者根据形势的发展和变化来选择相应的方案,最终实现目标。简单来说,策略就是解决问题。详细的说,策略就是为企业实现商业目标提供问题解决方案。
我们看几个关键词:目标、方案、形式的发展变化,即策略是动态变化的,一直以实现目标为核心。
发布策略
基于上面的解释,在制定发布策略时,首先需要有目标。敏捷软件开发理念的核心是敏捷宣言和敏捷原则,其中可以用来指导发布的有2条原则:
a) 我们最重要的目标,是通过及早和持续不断地交付有价值的软件使客户满意。
b) 经常地交付可工作的软件,相隔几星期或一两个月,倾向于采取较短的周期。
从大方向上来讲,所有企业的发布都是为了创造价值,也就是对应到上面敏捷原则a)中的最重要目标——尽早交付可工作的软件。“尽早交付”就是要缩短周期,减少时间,关于周期的长度,在敏捷原则b)中指出可以相隔几星期或者一两个月;“可工作”需要保证发布的质量,做好发布的风险控制。由此可见,发布策略的具体化目标应该是实现产品的高频低风险的发布。
其次,发布策略不是在即将发布的时候才制定,应该是项目计划阶段的一部分。由产品从研发到上线过程中的所有相关团队负责人共同讨论制定,内容是整个产品生命周期中的发布相关事宜,包括发布前、发布中和发布后三个阶段。发布前最重要的是发布计划,发布过程中监控和日志管理、问题应对方案,发布后的维护方案,整个内容要形成一份文档记录下来。
最后,在整个生命周期中,随着需求的变化,发布策略也会动态的随着项目同时改变,文档要做好同步进行更新和维护。
高频低风险的发布
理解了发布策略之后,下面我们主要介绍实现高频低风险发布目标的核心要素,发布分支和发布方法。
发布分支的选择
使用合适的发布分支,可以减少执行发布所需的时间,是高频发布的前提。团队要根据产品的类型、业务的发布周期要求、企业的自动化程度和团队的能力及特点来选择不同的分支策略。发布分支主要有主干发布和分支发布两种。
主干发布
主干发布就是用主干代码进行软件发布,所有新特性的开发,都提交到主干上,当需要发布的时候,直接把主干上的代码部署到生产环境。这样可以一直保持主干代码处于随时可发布的状态。
基于主干发布,团队可以选择主干开发和分支开发两种对应的模式。不论是那种开发模式,都要做到两点:一是早提交,要将代码尽早提交到主干,缩短开发分支的生存周期。因为分支周期越长,积累的代码数量就越多,在提交到主干分支的时候产生冲突的机会就越大,这样就会增加合并的时间。关于开发分支生存周期多短算是合适,业界说法不统一,在《持续交付2.0》中给出的意见是控制在3天以下,可以结合自己的业务情况做参考。实现短周期需要在最初需求拆分的时候做好规划,控制好需求的颗粒度;二是早同步,每个开发分支在工作过程中,要及时和主干代码进行同步,至少每天1次,这样可以减少最后合并过程中的代码冲突问题。
分支发布
分支发布是专门从主干上拉出一个发布分支,用于对外发布。这样可以在发布的同时,主干持续进行开发,不会受到版本发布的影响。新版本发布后出现缺陷,可以在发布分支修改后同步到主干,也可以在主干上修改后合并到发布分支。
使用分支发布的时候也要注意两点:一个是分支的存在周期不要过长,如果在发布分支上修改了缺陷,要及时同步到主干分支;二是不要从发布分支创建新的分支,所有的分支都应该来源于主干分支,保证代码源的唯一性。
综上所述,我们看到不论是主干发布还是分支发布,如果想实现高频低风险,重要的就是要做好三个控制:
一是控制分支数,越少越好,最好只有主干分支。
二是控制分支生存周期,越短越好。
三是控制发布周期,越短越好。软件发布频率越高,发布周期就越短。当达到了一定的发布频率时,就不需要发布分支了,主干发布即可。
常用的发布方法
开篇提到的蓝绿发布、滚动发布、灰度发布都是发布策略中常用的发布方法,可以降低发布风险,实现零停机发布,是发布策略中的核心内容。
蓝绿发布
蓝绿发布,是一种可以保证系统在不间断提供服务的情况下上线的部署方式。“蓝”和“绿”代表两套独立的环境,使用完全相同的主机集群,有两种使用策略:
• 一种是一套环境在线提供服务,一套环境闲置,准备用于下个版本的发布。
• 另一种是将两套环境都在线提供服务,可互为容灾。此时蓝绿两组主机工作方式如下:
1、无新版本发布时,蓝主机组和绿主机组同时对外提供服务;
2、当需要升级版本时,首先把蓝主机组从负载列表中摘除,进行升级,绿主机组依然对外提供服务;
3、蓝主机组升级完成,则将流量切换到绿主机组,同时将绿主机组从负载列表中删除,进行升级;
4、当蓝绿主机均完成升级,将绿主机组重新恢复至负载列表,两组主机重新同时对外提供新版本的服务。

图2 蓝绿发布
蓝绿发布的好处是可以实现零停机发布,可以实时升级和回退。不足是需要双倍的主机资源,而且切换是全量的,如果新版本有问题,则对用户体验有很大的影响。
滚动发布
滚动发布,是在发布的过程中先将一台或者几台主机停止服务,进行版本升级后重新提供服务。然后再选择下一批升级的主机同样操作,直到所有的主机都升级完成。
滚动发布的好处是用户体验影响小,体验较平滑。不足是版本在缓慢替换,发布和回退都比较缓慢;滚动升级期间,新老版本共存,如果发现问题,难以定位到底是新版本还是老版本的问题;滚动升级期间的流量控制对资源的要求比较高。
灰度发布
灰度发布是让一部分用户继续用版本A,一部分用户开始用版本B,如果用户对版本B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到版本B上面来。灰度发布是金丝雀发布的延伸,金丝雀发布是灰度发布的初始阶段。对于需要划分多少阶段,每个阶段的用户数量是多少,根据业务和产品具体情况进行制定。在下图中的内部用户可以看做是金丝雀用户。

图3 灰度发布
灰度发布的好处不需要进行停机,同时只有部分用户获取新版本,如果新版本出现问题,用户体验影响比较小,可以保证整体系统的稳定。不足是发布的时间会比较长;升级期间的流量控制对资源要求比较高。
其实,不论是哪种发布方法,降低发布风险的最佳方法就是真正地做发布演练,越频繁的将应用程序发布到不同的测试环境越好。这样就说明测试环境越可靠,从而在生产环境中发布时遇到问题的可能性就越小。
国内现状
高频低风险的发布已经成为了企业的主要趋势,根据云计算开源产业联盟发布的2021年《中国DevOps 现状调查报告》,国内企业部署频率为1周—1个月的占比超六成,相比2020年增长近一成。

图4部署频率现状分布
调查显示,仅有16.21%的企业能够每天多次在生产环境进行部署;此外,6.19%的企业平均1天到1周在生产环境部署一次;28.25%的企业平均1周到2周在生产环境部署一次;32.90%的企业平均2周到1个月在生产环境部署一次;部署频率超过1个月的企业占9.33%。
参考附录
1、Jez Humble. David Farley.持续交付:发布可靠软件的系统方法北京:人民邮电出版社。
2、乔梁.持续交付2.0:业务引领的DevOps精要.北京:人民邮电出版社。
3、《中国DevOps 现状调查报告(2021)》. 云计算开源产业联盟发布。
带你了解敏捷和DevOps的发布策略的更多相关文章
- 「产品经理全连接系列2」企业如何开展敏捷或DevOps的研发变革
大家好,我是华为云的产品经理 恒少: 作为布道师和产品经理,出差各地接触客户是常态,经常和华为云的客户交流.布道.技术沙龙,但是线下交流,覆盖的用户总还是少数. 我希望可以借线上的平台,和用户持续交流 ...
- 敏捷和DevOps:是敌是友?
DevOps是敏捷在软件开发团队的另一应用.那么相比之下,哪个更胜一筹? 一边,有业界认可的scrum master,它的朋友极限编程者,以及由其衍生的 LeSS.SAFe.DAD等,是敏捷. 另一边 ...
- 【华为敏捷/DevOps实践】7. 敏捷,DevOps,傻傻不分清楚【华为云技术分享】
文:姚冬(华为云DevCloud首席技术布道师,资深DevOps与精益/敏捷专家,金融解决方案技术Leader,中国DevOpsDays社区核心组织者) 前言 敏捷是什么?DevOps是什么?两者有什 ...
- 成熟度模型:企业规模化推广敏捷和DevOps利器
摘要: 本文介绍了成熟度模型在软件开发行业的应用,重点阐述了成熟度模型对于敏捷和DevOps在企业中进行规模化推广的价值,探讨了成熟度模型的设计原则,并对于如何明智使用成熟度模型给出了建议. 导言 在 ...
- 数字化转型:敏捷和DevOps如何降低风险,提高速度
进行数字化转型就意味着团队需要应对经常发生冲突的挑战--例如,要应对在复杂的相互依赖环境中快速变化的需求.对软件开发人员来说,这是一个熟悉的困境. 如果使用传统的瀑布方法来应对这些挑战,就会发现,在线 ...
- webpack-高级-发布策略
webpack的发布策略 在实际开发中,一般会有两套项目方案: 一套是开发期间的项目,包含了测试文件.测试数据.开发工具.测试工具等相关配置,有利于项目的开发和测试,但是这些文件仅用于开发,发布项目时 ...
- K8S发布策略,无损发布
大家好,相信大部分公司都已经使用K8S进行容器管理和编排了,但是关于K8S的发布策略,还有很多同学不太清楚,通过这篇文章的介绍,相信大家对目前K8S的发布情况有一个概括的认识.总结下来,共有如下几种: ...
- 瀑布 敏捷 精益 devops
敏捷: 分工角色 大项目分小项目 每个节点时间设置里程碑 Scrum实施的核心可以概括为“化繁为简”,从几个维度解释下: 团队角色的定义,将团队人员定义为三个角色,Scrum Master(主 ...
- [Agile][Scrum][敏捷开发][DevOps中的持续性测试]一些相关流程的梳理
结合相关资料,做一下梳理 1. 所有的计划任务都是从任务看板(backlog)开始 从backlog中可以看到燃尽图(burndown Chart)来监控项目的进度情况 一个好的看板能够清晰的观测到当 ...
- 华为敏捷/DevOps实践:产品经理如何开好迭代计划会议
大家好,我是华为云DevCloud项目管理服务的产品经理恒少,作为布道师和产品经理,出差各地接触客户是常态,线下和华为云的客户交流.布道.技术沙龙. 但是线下交流,覆盖的用户总还是少数.我希望借助线上 ...
随机推荐
- 未能添加SSL证书,错误1312
1.win+r打开运行,输入mmc 2.在控制台1[控制台根节点]->文件->添加/删除....->选择证书->添加-选择计算机账户->完成->确认 3.找到证书文 ...
- shell脚本之规范与变量
shell编程规范与变量 名词简述 面向过程语言 按照顺序执行程序 第一件事干什么->第二件事干什么......(C,shell...) 面向对象语言 把程序看成一个整体(java,python ...
- 3款免费又好用的 Docker 可视化管理工具
前言 Docker提供了命令行工具(Docker CLI)来管理Docker容器.镜像.网络和数据卷等Docker组件.我们也可以使用可视化管理工具来更方便地查看和管理Docker容器.镜像.网络和数 ...
- 1. 手动移植FreeRTOS V9.00到 Stm32F103C8T6
记录移植过程,以便以后查看: 附上FreeRTOS源码和 测试文件: 链接:https://pan.baidu.com/s/1v6nvDOk4-2NILYqN3njGjQ 提取码:1234 1.使用 ...
- jmeter工具中vars与props命令的区别和使用
话不多说直接干活!!!!! vars 和 props命令存在于"jsr223 预处理器"."BeanShell 预处理程序"."JSR223 后置处理 ...
- [ABC278G] Generalized Subtraction Game
Problem Statement This is an interactive task (where your program interacts with the judge's program ...
- [ABC235G] Gardens
Problem Statement Takahashi has $A$ apple seedlings, $B$ banana seedlings, and $C$ cherry seedlings. ...
- 解决URLEncoder.encode 编码空格变 + 号
jdk自带的URL编码工具类 URLEncoder 在对字符串进行URI编码的时候,会把空格编码为 + 号. 空格的URI编码其实是:%20 解决办法:对编码后的字符串,进行 + 号替换为 %20.总 ...
- SpringBoot整合EasyExcel
1.Excel导入导出的应用场景 在做项目中很多时候都会用到Excel的导入和导出 2.解决方案 POI:操作比较繁琐 EasyExcel:正如其名,'Easy'Excel相对于POI使用起来还是比较 ...
- 劫持最新版 QQNT / QQ / TIM 客户端 ClientKeys
针对 腾讯官网 最新发布的 QQNT 9.9.6 与 QQ 9.7.21 新版本客户端全面更新截取代码 大伙应该都知道自从 QQ 9.7.20 版本起就已经不能通过模拟网页快捷登录来截取 Uin 跟 ...