写点什么

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

  • 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:002012

评论

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

web前端培训如何使用CSS自定义属性实现骨架屏

@零度

CSS 前端开发

手机怎样控制led显示屏发视频?

Dylan

ipad 手机 wifi LED LED显示屏

IM即时通讯如何让企业远程办公更简单高效?

WorkPlus

RocketMQ系列一:入门级使用演示

hum建应用专家

云计算 RocketMQ

技术分享| HTTP 代理

anyRTC开发者

https 音视频 网络协议 HTTP

Python 入门指南之交互式输入行编辑历史回溯

海拥(haiyong.site)

Python 7月月更

爱奇艺加入龙蜥社区,携手打造多元化视频生态底座

OpenAnolis小助手

开源 爱奇艺 龙蜥社区 CLA 社区建设

昇腾AI创新大赛两大赛道怎么选?拿好这篇攻略就够了!

科技热闻

想要白嫖正则是吧?这一次给你个够!

掘金安东尼

前端 正则 7月月更

一图看懂:国企数字化转型4个方向3个战略

融云 RongCloud

企业数字化

一加10 Pro拍照如何?随手一拍都是大片

Geek_8a195c

CRMEB Pro v1.4,让用户体验更出彩!

CRMEB

龙蜥社区招募推广大使&体验官啦!| 人人都可以参与开源

OpenAnolis小助手

开源 龙蜥社区 社区建设 官网 体验官

【福利活动】给你的代码叠个 Buff!点击“茶”收好礼

亚马逊云科技 (Amazon Web Services)

Lambda Code

Python基础详解(二)

五分钟学大数据

Python 7月月更

「开源摘星计划」Harbor高可用集群设计及部署(实操+视频),基于离线安装方式

腾源会

Harbor 腾源会 开源摘星计划

Spring Boot Event 观察者模式,轻松带你实现业务解耦

了不起的程序猿

Java java程序员 spring event

软件研发效能需求价值流分析专题

思码逸研发效能

研发效能 软件研发

泛云桌面关键技术分析

A池伟

云桌面 算力网络

SpringBoot自动装配原理

急需上岸的小谢

7月月更

【LeetCode】最长的斐波那契子序列的长度Java题解

Albert

LeetCode 7月月更

Room:又要写业务代码了?看看我吧,给你飞一般的感觉!

编程的平行世界

数据库 Android; android jetpack

微信内H5页面唤起小程序&App

南城FE

前端 微信开发 7月月更

DBPack 读写分离功能发布公告

峨嵋闲散人

分布式事务 分库分表 读写分离 dbmesh Database Mesh

送你的代码上太空,与华为云一起开发"最伟大的作品"

华为云开发者联盟

云计算 代码

蛋糕可以一刀切,研发需求可以吗? | 敏捷实践

LigaAI

程序员 敏捷 产品经理 需求分析 敏捷管理

许式伟:Go+ 演进之路

七牛云

golang 编程语言 go+

JAVA编程规范之集合处理

源字节1号

软件开发 后端开发

【招募】2022向光奖|年度ESG影响力投资奖正式启动!

创业邦

Spring Cloud之配置管理

Damon

7月月更

基于eTS高效开发HarmonyOS课程类应用

HarmonyOS开发者

HarmonyOS

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