写点什么

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

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

评论

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

牛掰!面试不再慌,苦刷这份2020最全的“基础-中级-高级”面试题库,已涨17k

Java架构之路

Java 程序员 架构 面试 编程语言

小程序开发-云开发技术总结

我是哪吒

小程序 程序员 大前端 28天写作 2月春节不断更

关于央行数字货币若干问题的思考 | 比较

CECBC

数字货币

一道好题!我觉得面试如果考察「双指针」的话,这题是刚刚好 ...

宫水三叶的刷题日记

面试 LeetCode 数据结构与算法

深度丨从货币历史看比特币的诞生

CECBC

比特币

简单的网站搭建

很甜回忆

网站

javascript中的内置对象和数据结构

程序那些事

JavaScript 数据结构 ES6 程序那些事

【2021海量真实校招】软件测试面试真题,(大数据整理)刷完应对各家企业面试完全没有问题!

程序员阿沐

面试 软件测试 自动化测试 黑盒测试 白盒测试

字节跳动面试官这样问消息队列:高可用、不重复消费、可靠传输、顺序消费、消息堆积,我整理了下

冰河

面试 分布式 中间件 消息队列 一起进大厂

Elasticsearch 查询结果排序

escray

elastic 七日更 28天写作 死磕Elasticsearch 60天通过Elastic认证考试 2月春节不断更

阿里粗排技术体系与最新进展

DataFunTalk

Android NativeCrash 捕获与解析

vivo互联网技术

c++ android NativeCrash

Selenium 利用 JS/JQ 操作元素、鼠标键盘事件、Cookie 操作

梦想橡皮擦

Python 28天写作 2月春节不断更 selenium

最新大厂Java面试题库,测试一下你能坚持到哪一面 “美团+字节+腾讯”三面技术问题

Java架构之路

Java 程序员 架构 面试 编程语言

性能优化知多少

圣杰

sql 性能优化 dotnet

阿里中间件团队技术官手撸笔记,全新演绎“Kafka部署实战”,已开源

Java架构之路

Java 程序员 架构 面试 编程语言

Linux入门篇 —— Shell详解

若尘

Linux 命令行 linux操作

解读云原生技术

xcbeyond

Kubernetes 云原生 服务网格 28天写作

火山翻译:工业级应用与研究

DataFunTalk

热点浅谈:低代码开发平台发展前景与市场规模!

优秀

低代码 低代码开发 低代码开发平台

区块链电子合同存证,电子合同区块链服务平台

13530558032

一口气发布十大建网利器,华为打算煲出怎样的5G味道?

脑极体

风口上的量子计算机:核聚变一样的赌局,钻石一样的骗局

脑极体

【计算机内功修炼】十:线程间到底共享了哪些进程资源

码农的荒岛求生

c c++ 线程 操作系统 进程

Kalm——基于Kubernetes的部署工具

David

开源 Kubernetes DevOps 运维 运维平台

bat文件调用cmd命令批量提取文件夹中的文件名(批量修改文件扩展名)

明金同学

构建“金融+司法”新局面:兴业消费金融区块链电子存证系统正式上线

CECBC

金融

诊所数字化:患者数字档案的价值机遇和风险

boshi

数字化医疗 七日更 28天写作

runtime笔记

Conan

ios

基于grpc手撸一个RPC框架

cloudcoder

科大讯飞发布全新一代智能办公本X2

Xue Liang

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