【AICon】AI 基础设施、LLM运维、大模型训练与推理,一场会议,全方位涵盖! >>> 了解详情
写点什么

提升软件交付效能——初探“按需发布”

  • 2021-04-07
  • 本文字数:2828 字

    阅读完需:约 9 分钟

提升软件交付效能——初探“按需发布”

在精益思想的指导下,团队寻找开发流程中的阻碍点,并从各个层面做出调整策略。在业务侧,分析哪些需求可以做到按需发布,哪些需求无法做到,设定适合团队的按需发布标准,并调整迭代工作量。在开发侧,考虑数据的兼容性,部署方式,以及高频率部署所带来的环境准备问题。在测试侧,提高自动化测试的运行速度和主流程的覆盖范围,并利用平台自身的自动化测试覆盖率统计功能,查缺补漏。


按需发布可以有效缩短变更前置时间,提高部署频率,进而产生强有力的业务影响,同时也是《The 2019 Accelerate State of DevOps : Elite performance , productivity , and scaling》中推荐的提高软件交付效能的实践之一。精英效能组织已将按需发布作为一项基础能力,例如: CapitalOne 每天部署 50 次,或者例如 Amazon、Google 以及 Netflix 每天部署几千次。尽早的将业务推向市场,不仅可以抢占先机,也可以充分发挥调研的价值。


本文中的 DevOps 持续交付流水线平台项目,已经经过 3 年多的持续演进,功能逐步完善,当前平台为 1000 多个团队提供状态可视化和即时反馈。团队希望借助按需发布,尽早推出新功能,更快的为客户带来价值。


在之前 3 年多的演进过程中,平台以 2 周为一个迭代进行交付。在一个迭代中,大部分同学进行本迭代的功能开发,小部分同学梳理新需求,为下个迭代做准备。平台以蓝绿部署策略进行上线,在上线前准备预生产环境,为 QA 同学提供与生产环境相似的环境进行测试。在上线中,进行环境的切换,每次切换需要 10-30 分钟的维护时间。这段时间内,团队需要进行数据迁移、消息迁移、切换流量等动作。这样的交付节奏持续了两年的时间,有效的保证了平台的代码质量和迭代的平稳推进。

流水线平台蓝绿部署示意图

动力来源

  1. 随着平台功能的逐步趋于稳定、用户数量逐渐增加,项目的关注点也有所转移,团队希望缩短从需求确认到上线的时间,做到按需发布;

  2. 恰巧公司内部也在进行研发效能的治理;

  3. 团队也希望借此机会,提高平台自身的软件交付效能,随后将研发效能的度量集成在本平台,对外提供服务;

实践探索

借助精益思想,我们团队开始寻找从需求确认到上线过程中所有阻碍用户的环节。希望从各个层面上消除浪费,来提升整体的价值流动效率,助力需求的顺畅交付。


首先,我们使用“影响地图”对按需发布这个目标进行分析,发现问题,并找出对应的解决方案。然后,根据这个分析结果,制定了团队的 OKR(Objectives and Key Results)。



影响地图



团队 OKR

为了实现按需发布,团队分别从业务侧,开发侧和测试侧做了如下调整。


业务侧,BA 针对需求分析,做了如下调整:

1、识别可以独立交付的功能

  • 除日常两周一次上线外,分析需要按需交付的功能,和团队同学(TL/QA)一起确认这些功能是否能做到独立交付;


2、迭代计划中考虑按需发布的工作量

  • 将能独立交付的部分功能,拆分为单独的故事卡,打上标签,并放入迭代计划中一起考虑(主要考虑额外产生的工作量)。理想情况可以分别制定按需交付和按迭代交付两种计划,但由于目前能做到按需交付的功能有限,还不够成熟,暂时未分开;


技术侧,团队针对现有的开发和部署策略,做了如下调整:

  • Feature Branch 开发:对于需要按需发布的代码,单独一个 feature 分支进行开发,在上线前合并到 release 分支,在预生产环境进行测试。上线成功后,合并回 master 分支。后续 DevOps 流水线平台也会支持一条流水线多分支自动构建,自动 merge 分支等功能,保证 feature 分支的持续集成和持续交付。

  • 数据库兼容性:团队采用向后兼容的方式。对于新增表和字段等操作,可以直接增加。而对于修改,重命名等操作,团队内部也讨论一套数据库变更规则。规则如下表所示


数据库向后兼容方案

  • 预生产环境自动化准备:自动化部署脚本,一键准备预生产环境,准备时间从原来需要 2 位同学花费 1 天,缩短到 1 位同学 2 个小时。

  • 部署策略:团队利用 OpenShift 滚动部署功能,进行应用的部署。修改原有生产环境流水线,构建镜像。完善平台的部署脚本,实现一键部署到生产环境。

  • 流量异常处理:采用 OpenShift 的滚动部署方式,当部分旧实例关闭后,仍然在线的旧实例,将会需要承载更多的流量。设置合适 maxUnavailable 和 maxSurge 参数可以逐步的关停旧实例,以保证在线实例数量,避免部分应用瞬时流量过大。

  • 服务优雅停:团队采用了优雅停的方式,避免旧实例直接停止,所带来的数据不一致的问题。

  • 回滚策略:对于回滚,团队采用了与部署相似的方式,以滚动发布的方式一键回滚。


测试侧,测试同学对于需要按需发布的功能,有了以下实践

1、需求 review

  • 在需求进入开发前,对其进行 review 和补充。着重考量需求的独立性,以及其影响范围,以此判定回归测试的范围。如果需求独立且影响范围可控,那么进一步思考测试工作的难易程度,是否容易获取稳定的测试数据,功能是否有涉及第三方依赖等。


2、功能快速验证

  • 需求进入开发后,同步开发自动化测试,以便在结卡时,以部分自动化测试进行验收。测试过程中,除了进行常规测试和探索性测试,还需要上线前完成相关功能的自动化测试,用于回归。


3、依托自动化方式的回归测试

平台功能不断增加,团队就更加依赖于反馈迅速和覆盖全面的自动化测试,以快速验证按需发布的功能,并且验证原有功能不受影响。

  • 反馈迅速:在自动化测试用例相互独立的前提下,利用自动化测试框架特性和流水线的并行功能,并行运行测试用例,加快自动化测试的速度,迅速获取反馈。

  • 覆盖全面:在快速反馈的前提下,尽可能的提高自动化测试覆盖率。依托平台自动化测试覆盖率统计功能,根据覆盖率补充、完善自动化测试。随着业务的扩展和测试用例的增加,后续可考虑部分精准测试以提高反馈速度。


当前,流水线项目只对部分可独立交付的业务需求,做到了按需发布。平台从一个迭代发布一次,演变为一个迭代发布 N 次。其中 N-1 次是按需发布,剩余的 1 次为按迭代交付。对于涉及开发人数较多的,模块较大的需求,团队仍以迭代进行交付。逐步扩大按需交付的范围,也是团队今后努力的方向。

经验总结

在精益思想的指导下,团队寻找开发流程中的阻碍点,并从各个层面做出调整策略。在业务侧,分析哪些需求可以做到按需发布,哪些需求无法做到,设定适合团队的按需发布标准,并调整迭代工作量。在开发侧,考虑数据的兼容性,部署方式,以及高频率部署所带来的环境准备问题。在测试侧,提高自动化测试的运行速度和主流程的覆盖范围,并利用平台自身的自动化测试覆盖率统计功能,查缺补漏。

对于初创团队,可以将按需发布作为目标,但建议还是以正常迭代节奏进行交付,待团队成熟后再进行按需发布。


为此,可以在以下几点做准备:

  • 发布流程自动化:使用 Jenkins 或者其他 CI/CD 平台搭建流水线,做到持续集成和持续交付。

  • 保证无状态服务:避免实例在本地存储持久化的数据。

  • 准备不停机部署策略:调研所使用发布平台的发布策略,是否支持不停机发布和回滚。

  • 测试快速验证反馈:建立回归测试,项目初期搭建自动化的回归测试,优先覆盖主流程,逐渐增加测试覆盖率。


本文转载自:ThoughtWorks 洞见(ID:TW-Insights)

原文链接:提升软件交付效能——初探“按需发布”

2021-04-07 13:001716

评论

发布
暂无评论
发现更多内容

1549页Android最新面试题含答案,成功入职腾讯

android 程序员 移动开发

2019-Android-高级面试题总结-从java语言到AIDL使用与原理

android 程序员 移动开发

2019AndroidBATJ面试题设计模式&算法专题总结,真牛

android 程序员 移动开发

Android编译器及编译工具之编译器

轻口味

android 编译器 11月日更

2019,2021我是如何拿到小米、京东、字节的offer

android 程序员 移动开发

解决报错:Couldn't create temporary file /tmp/apt.conf.IRqbCz

liuzhen007

11月日更

王者荣耀商城异地多活架构设计

Geek_db27b5

10道阿里Android岗必问题摆这儿了,你爱刷不刷!,透彻解析

android 程序员 移动开发

130-余个相见恨晚的超实用网站(建议收藏),2021年是做Android开发人员的绝佳时机

android 程序员 移动开发

2018年6月份Android上海找工作经历(1),android蓝牙开发rom

android 程序员 移动开发

架构实战营模块七 - 王者荣耀商城异地多活架构设计

Yina🌝很浪🌊

#架构实战营

【投稿赢大奖】 -- 奇思妙想+AI技术=?

百度大脑

人工智能 百度

2019最新百度、头条、小米,retrofit源码

android 程序员 移动开发

2019-年赚钱最多的-13-个技术岗位,移动开发框架对比

android 程序员 移动开发

2019-阿里、头条、腾讯,小白以及计算机类学生的福音

android 程序员 移动开发

2020 年,我这样在项目中使用 MVVM,BATJ等企业Android面试知识分享

android 程序员 移动开发

2019Android-网络编程总结篇,你想要的三次握手和四次握手

android 程序员 移动开发

2019初中级Android开发社招面试解答之性能优化(1),被面试官问的Android问题难倒了

android 程序员 移动开发

[ CloudWeGo 微服务实践 - 05 ] 服务注册(1)

baiyutang

golang 微服务 11月日更

2019年阿里Android面试必问:Java+性能优化,android编程实战

android 程序员 移动开发

10天用Flutter撸了个高仿携程App(附小技巧积累总结),小红书安卓面试题目

android 程序员 移动开发

2018年6月份Android上海找工作经历(2),面试安卓开发十大问题

android 程序员 移动开发

2018年6月份Android上海找工作经历,2021华为Android面试真题解

android 程序员 移动开发

2019(1),揭秘ARouter路由机制

android 程序员 移动开发

2019年末阿里、百度等大厂技术面试题汇总(附答案,2021年Android社招面试题精选

android 程序员 移动开发

2020-2021最新大厂面试题附答案解析【建议收藏】,android应用开发题库

android 程序员 移动开发

12年高级工程师的“飞升之路”,腾讯大牛教你自己写Android第三方库

android 程序员 移动开发

15个经典面试问题及回答思路,很多人死在了最后一个问题上

android 程序员 移动开发

2019初中级Android开发社招面试解答之性能优化,kotlin转android代码

android 程序员 移动开发

2019年Android-非科班硕士的阿里&腾讯&字节&爱奇艺&网易&华为实习面试大汇总分享(1)

android 程序员 移动开发

2019年Android-非科班硕士的阿里&腾讯&字节&爱奇艺&网易&华为实习面试大汇总分享

android 程序员 移动开发

提升软件交付效能——初探“按需发布”_架构_张凯峰_InfoQ精选文章