前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >聊聊持续交付这点事儿

聊聊持续交付这点事儿

作者头像
公众号: 云原生生态圈
发布于 2022-04-08 06:14:59
发布于 2022-04-08 06:14:59
5620
举报
文章被收录于专栏:云原生生态圈云原生生态圈

持续交付指的是在短周期内完成软件产品,以保证软件保持在随时可以发布的状态。让每一个变更都经过一条自动化的检验流水线,来检查每一个变更的质量,通过就进入下一个阶段。其不是一种工具,而是一种实践!

持续交付的共识和管理机制如下:

  • 不要阻塞开发人员,这是实现持续交付的本质理念
  • 为每个团队指定构建负责人或者发布工程师:优化交付流水线,提升交付效率
  • 项目状态应该对参与整个过程(包括构建、部署、测试和发布)的所有人都是可见的
  • 做好风险管理
    • 迭代增量式交付是有效风险管理的关键
    • 手工测试环境、试运行环境和生产环境总是需要严格的访问控制
    • 让风险识别成为每日例会的一部分
  • 做好审计
    • 手工测试环境、试运行环境和生产环境总是需要严格的访问控制:指定谁能够访问“特权”环境。
    • 要求每次部署都要进行审计,以确切知道到底修改了哪些内容。
    • 文档自动化、自文档

接下来先说明实现持续交付的一些基础设施和准备工作,然后从本地开发和自动化构建/部署流水线两方面说明持续交付的具体实现。

1基础设施和准备工作

基础设施和环境管理

让所有测试环境(包括持续集成环境)都要与生产环境相似:

  • 开发人员要把运维人员当做重要用户
  • 切忌吞噬错误信息
  • 使用运维团队熟悉的技术:开发人员最早负责创建部署脚本,后面移交给运维团队负责维护
  • 把创建和维护基础设施需要的所有内容都进行版本控制
  • 以自动化方式进行配置和部署!
  • 像对待生产环境一样对待测试环境!
  • 容器化技术实现不可变基础设施

配置管理

版本控制、依赖管理、软件配置管理:

  • 各个环境的手工配置 -> 自动化配置
  • 对所有内容进行版本控制
  • 指定依赖库的确切版本,不要用快照或者模式匹配版本
  • 配置文件与二进制文件分离

测试策略

  • 创建全面的自动化测试套件:单元测试、组件测试、验收测试,每一种测试的代码覆盖率都高于80%以上
  • 每次修改都能运行一次自动化测试集合
  • 分层测试

数据管理

  • 把创建和迁移数据库全部变成自动化过程,是部署流程的一个组成部分
  • 让测试自己创建它们所需的状态,并确保每个测试都独立于其他测试
  • 对数据库进行版本管理,使用DbDeploy这样的工具管理数据迁移过程的自动化。
  • 在大多数据情况下,不要在测试中使用生产数据集的副本。?
  • 数据库回滚和无停机发布
    • 蓝绿部署
    • 大多数修改应该是增加操作(比如向数据库中增加新表或字段),尽可能不修改已存在的结构
  • 测试数据
    • 测试的独立性、原子性
    • 其他类型的测试,一定不要使用生产数据库的一个dump,除非有特殊情况
  • 部署流水线中的数据管理
    • 提交测试:快速运行,避免复杂的数据准备
    • 验收测试:后续阶段可以复用
    • 容量测试:为测试提供足够的输入数据,可以看做验收测试的重复利用

主干开发

主干开发的分支模式实现持续交付最好的模式,但为了在主干模式下保持应用可发布,需要做到:

  • 每次创建分支,都要认识到它带来的成本
  • 频繁提交代码合并到主干
  • 新功能隐藏:功能开关统一管理达到特性隐藏的目的(Togglz?)
  • 增量开发:将所有的变更都变成一系列的增量式小修改,而且每次小的修改都是可发布的。
  • 抽象模拟分支(无法使用增量开发):修缮者模式,使用门面模式隔离待改造代码。
  • 使用组件,根据不同部分修改的频率对应用程序进行解耦。

2本地开发

让开发者不受阻塞、不受不必要的干扰 -> 持续开发

  • 确保自动化测试、构建部署脚本都能够在开发机上运行
  • 本地自动化测试:预测试提交pretested commit/个人构建personal build/试飞构建preflight build【保证本地开发所有验证方式与流水线上的验证方式一致,提高开发人员在本地发现问题的能力】
  • 提交前在本地运行所有的提交测试,等提交测试通过后再继续工作
  • 在可控的环境上部署开发的应用程序
  • 修复破坏应用程序的任意修改是最高优先级的任务,构建失败后不要提交新代码

六步提交法

规范开发习惯。主动提前集成;小步提交、完整代码、不影响已有功能;关注代码规范、动静态扫描问题:

  • 检出最近成功的代码
  • 修改代码
  • 第一次个人构建
  • 第二次个人构建:拉取主干代码集成后本地测试
  • 提交代码到主干
  • 提交构建

提交不影响已有功能!!

  • 增量迭代开发
  • 抽象模拟分支
  • 特性隐藏

规范化、自动化核心步骤

提高开发环境的效率:环境获取的服务化、自助化;环境的一体化、一致性:

1、本地开发环境

  • 共享机器池
  • Git提交日志插入截图:Share Bucket+Google Drive
  • 远程开发机器/Web IDE
  • 依赖的服务
    • 维护一个单独的环境,让开发环境接入
    • 服务虚拟化工具来模拟依赖的服务,Mountbank、WireMock

2、联调环境:提供机器池,确保有两套空闲环境,自助化提供给开发者使用

规范化、自动化本地检查:

  • 语法检查、规范检查、单元测试:Maven/Gradle插件

3、建设并自动化代码入库前的检查流程

  • 持续集成前的必要工作
  • 代码审查

代码审查

人工代码检查:

  • 统一并明确代码审查标准
  • 统一并明确日志提交规范
  • 传达团队的代码规则、质量基准
  • LGTM(Looks good to me)

方式:

  • 代码入库前的设计时检查:在设计阶段进行代码审查
    • 代码入库前门禁检查,需要考虑灵活性,提供绕过机制
    • 代码入库后检查
  • 工具辅助的线下异步审查:依赖于Gitlab、Gerrit、Code Climate Engines,一对一审查
  • 面对面审查:架构问题、结对编程
  • 代码增量审查/代码全量审查
  • 团队审查:适合专项讨论
  • 代码审查计入工作量和绩效考评

代码提交规范:

  • 原子提交
  • 提交日志规范

原则:

  • 互相尊重
  • 基于讨论

相关资料可见:https://github.com/google/eng-practices/blob/master/review/index.md

快速反馈、增量开发

边开发边验证

  • 提高运行静态检查和测试的方便性、灵活性:Maven/Gradle插件
  • 提供沙盒环境方便验证和测试
    • 容器
    • 小范围的增量构建和验证?
    • 测试数据:直接使用生产环境、生产数据的导出并脱敏
  • 实时检验工具:IDE实时检验、Liveload

3自动化构建/部署流水线

部署流水线就是对软件交付流程的建模。

实现部署流水线的一些共识如下:

  • 流水线建设原则
    • 测试尽量完整,保证产品质量->完备的测试机制
    • 运行速度够快->尽早反馈、提高交付速度
    • 使用的所有环境尽量和生产环境一致->复现问题
  • 所有相关角色提供构建状态可视化:持续交付流水线大屏显示
  • 存储构建结果报告
  • 只要有环节失败,就停止整个流水线!
  • 制品库是特殊的版本控制系统,不需要保存所有版本。
  • 为部署流水线的每个阶段创建脚本:脚本是系统中的一等公民
  • 增量式实现流水线:如果流程中有手工操作部分,就在流水线中为它创建一个占位符。

接下来从流水线的各个阶段分别说明。

提交阶段

从技术角度上断言整个系统是可以工作的。

  • 编译、单元测试、组装打包、代码分析
  • 少于五分钟,一定不要超过十分钟
  • 提交测试:单元测试、组件测试
  • 只有在某个错误让提交阶段的其他任务无法执行时,才停下来否则就直至提交阶段全部运行完后,汇总所有的错误和失败报告
  • 此阶段的结果:结果报告、二进制包、元数据

自动化验收测试

验证一个用户故事或需求的验收条件是否被满足。针对业务!

  • 配置环境、部署二进制文件、冒烟测试、验收测试
  • 令验收测试失败的构建版本不能被部署
  • 先部署再测试,重用部署脚本。
  • 类生产环境运行验收测试:大部分是功能验收测试,关注功能正确性
  • 开发人员能够在自己的开发环境中运行自动化验收测试
  • 测试的关注点在系统的行为,而非数据本身。所以抵制使用生产数据的备份做为验收测试
  • 验收测试的性能不是主要考虑问题,重点在测试的全面性。
  • 正确地做验收测试:不要幼稚地对照着验收测试条件,盲目地把所有东西都自动化。
  • 验收测试可以看作所有后续测试阶段(包括容量测试)的某种模板:从部署准备开始,然后核实环境和应用程序都已被正确配置和部署,最后执行测试。

后续测试

  • 手工测试:探索性测试、易用性测试
  • 非功能测试:性能、安全、可维护、可扩展

部署发布

此阶段的触发不需要自动,测试或者运维人员可以做到自服务即可。

  • 对不同环境采用同一部署方式:使用同样的脚本向所有环境部署,包括开发机器
  • 一键式部署是对环境进行修改的唯一途径。
  • 部署测试:对部署进行冒烟测试,验证部署是否成功,证明其部署的可靠性
  • 确保部署流程是幂等的
  • 只有通过了自动化构建、测试和部署的那些修改才能发布!
  • 明确每个环境的部署和发布都是由谁负责
  • 发布计划:第一次发布,产出一些文档、自动化脚本或其他形式的流程步骤
  • 首次部署:首个迭代的主要目标之一就是在迭代结束时,让部署流水线的前几个阶段可以运行,实现部署流水线的“抽水泵”。
    • 部署流水线的提交阶段。
    • 一个用于部署的类生产环境。
    • 通过一个自动化过程获取在提交阶段中生成的二进制包,并将其部署到这个类生产环境中。
    • 一个简单的冒烟测试,用于验证本次部署是正确的,并且应用程序正在运行。
  • 对发布过程进行建模并让构建晋级
    • 为了达到发布质量,一个构建版本要通过哪些测试阶段
    • 每个阶段需要设置什么样的晋级门槛或需要什么样的签字许可。
    • 对于每个晋级门槛来说,谁有权批准让某个构建通过该阶段。
  • 将每次已通过验收测试的变更版本部署在试运行环境中
  • 紧急修复:紧急修复版本也要走完标准的部署流水线,与其他代码变更没什么区别。
    • 结对做!
    • 有时候回滚比部署新的修复版本更划算。
  • 持续部署:每当有版本通过自动化测试之后,就将其部署到生产环境中。【需要依赖强大的自动化测试机制】

度量

每次提交后都产生关于这些度量的报告和可视化效果并保存起来。

  • 周期时间(cycle time),从决定要做某个特性开始,直到把这个特性交付给用户的这段时间
  • 自动化测试覆盖率
  • 代码库特征
  • 缺陷数量
  • 交付速度
  • 提交版本库次数
  • 构建次数
  • 构建失败次数
  • 构建所花时间

4其他

DevOps

DevOps是这些年很流行的一个概念,其目的就是打通研发和运维环节,以达到全员目标一致,保障软件高效交付。

  • 职能团队提供平台和工具,让全栈工程师能够自己处理端到端的工作,实现DevOps。
  • 全栈开发:工程师不再只是对某一个单一职能负责,而是对最终产品负责。

信息溯源

打通研发流程中流动的多种标识信息,以方便相关人员快速获取需要的信息,提高工作效率。包括任务工单、代码提交号、版本号、代码审查ID、测试用例ID、Bug ID。

  • 制品与源代码版本管理:放置在制品包中的元数据,体现源代码版本号。
  • 源代码与需求/Bug的版本关联:提交代码时需要在注释里注明需求ID、测试用例ID等。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云原生生态圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
谈谈企业的持续交付流水线设计
有一天,业务人员急冲冲的跑过来,对你说生产上出现了一个严重BUG,必须要尽快修复。你听完问题描述后,胸有成竹坐定并迅速定位问题,随后改动了一行代码并提交,系统开始自动编译、各个环境自动化测试、发布上线。几分钟后,生产环境上该BUG已经被修复掉。 上面所提到的场景,这是不是很美妙?但是想必不少读者要忍不住要吐槽了,这太不实际了:新功能上线测试不要时间么?新增了功能肯定要做回归测试,这都需要一定的时间。况且怎么可以随便部署上线?还得通过预发演练、走发布审批流程。其实这些过程大家也都清楚,那么不妨从另一个角度思考
yuanyi928
2018/03/30
1.6K0
谈谈企业的持续交付流水线设计
持续交付:发布可靠软件的系统方法
由于部署工作中的很多步骤根本没有在试运行环境上测试过,所以常常遇到问题。比如,文档中漏掉了一些重要的步骤,文档和脚本对目标环境的版本或配置作出错误的假设,从而使部署失败。部署团队必须猜测开发团队的意图。
用户3148308
2021/11/24
7810
3.2.2 持续交付
春节前与同事讨论CD(持续交付)的技术方案,发现主流的技术方案是软件交付最后一公里的“AD”(自动化部署)。站在本系列文章提到四个关键价值的“提升交付速度”这个运维价值看,单纯的自动化部署主要将部署/回切工作从1小时提升到5分钟的效率能力上。而在端到端的IT交付价值链中,部署是其中一个节点,所提升的55分钟只占整个IT交付链路中的一部分,更大的消耗是在节点与节点之间的协同。所以,“持续交付”应该跳出“部署”,站在整个IT交付链路,关注节点的自动化、节点与节点之间的连接线,通过标准化、流水线、自动化、相关工具链打通等工程性工作的落地,提升整个IT效能。
彭华盛
2021/03/19
9980
3.2.2 持续交付
《持续交付:发布可靠软件的系统方法》第5章 部署流水线
第5章 部署流水线 5.1 引言 持续集成的主要关注对象是开发团队。持续集成系统的输出通常作为手工测试流程和后续发布流程的输入。在软件的发布过程中,很多浪费来自于测试和运维环节。我们常常看到: 构建和运维团队的人员一直在等待说明文档或缺陷修 测试人员等待“好的”版本构建出来 在新功能开发完成几周之后,开发团队才能收到缺陷报告 开发快完成时,才发现当前的软件架构无法满足该系统的一些非功能需求。 解决方案就是采取一种更完整的端到端的方法来交付软件。我们已经解决了配置管理以及自动化大量构建、部署、测试和发布流程的
yeedomliu
2019/09/28
1.2K0
给产品经理讲讲,什么是持续交付和 DevOps
本指南适用于: 你在科技领域就职,是产品经理或者MBA。你的团队玩 A/B 测试,特性切换,你办公室里还有一条狗。 当然,你已经理解啥是功能分支,什么是 CD 以及 DevOps 文化是什么样子。对不?嗯,当然。 你已经走在敏捷的路上,工程团队现在每周都跟你的产品人员会面,讨论故事和迭代。他们协作良好,对构建的东西感觉也越来越好。 可你的客户仍然不能更快的获得这些功能。 你仍然得等着发行列车离开车站。你已经听到过像Esty, Flickr, Google 等这些公司每天能交付100次,他们咋做到的呢? 你
DevOps时代
2018/06/22
1.3K0
DevOps -测试内持续集成与持续交付
「持续集成(Continuous Integration)」、「持续交付(Continuous Delivery)」和「持续部署(Continuous Deployment)」提供了一个优秀的 DevOps 环境,持续集成(Continuous Integration)是Devops理念的一种实践过程,同时也是敏捷开发的具体表现形式。对于整个团队来说,好处与挑战并行。无论如何,频繁部署、快速交付以及开发测试流程自动化都将成为未来软件工程的重要组成部分。这里我们着重介绍持续集成过程中的测试自动化(Test Automation),如果测试没有实现自动化的话,那么整个持续集成是不完善的,同时也不是高效的。因此自动化测试是持续集成过程中的重要一环。
用户6367961
2019/09/30
1.8K0
DevOps -测试内持续集成与持续交付
微服务的部署与发布:持续交付与持续部署微服务
持续集成(Continuous Integration)与持续交付(Continuous Delivery )、持续部署(ContinuousDeployment)作为敏捷开发实践,可以及早发现、解决问题,从而更早地将产品交付给客户。及早地从客户那里得到反馈,就可以及早地对产品进行修复和完善,交付更加完美的产品给客户,最终形成了良好的可以持续的闭环。
愿天堂没有BUG
2022/10/28
1.2K0
微服务的部署与发布:持续交付与持续部署微服务
Jenkins 创始人:持续交付的 What、Why 及 How
本文主要介绍了持续交付和DevOps的概念、现状、挑战和实践,强调了持续交付和DevOps对于软件开发和运维的重要性,并通过一些实践案例和思考来加强理解。
DevOps时代
2017/07/25
5.3K0
Jenkins 创始人:持续交付的 What、Why 及 How
Serverless 微服务持续交付案例
“Serverless 风格微服务的持续交付(上):架构案例”中,我们介绍了一个无服务器风格的微服务的架构案例。这个案例中混合了各种风格的微服务
顾宇
2018/08/17
1.5K0
部署流水线解析
它保证那些创建大型复杂系统的团队具有高度的自信心和控制力。一旦代码提交引入了问题,持续集成就能为我们提供快速的反馈,从而确保我们作为一个团队所开发的软件是可以正常工作的。它主要关注于代码是否可以编译成功以及是否可通过单元测试和验收测试。
新亮
2022/05/17
5300
持续交付2.0:云原生持续交付
《持续交付》提出了一系列贯穿整个软件交付生命周期的最佳实践。但它成书的年代(2010年)云计算尚未得到广泛应用,尤其在软件开发过程中的应用非常有限。如果站在今天的技术水平和对云计算的理解水平基础上回顾
ThoughtWorks
2018/04/13
1.7K0
持续交付2.0:云原生持续交付
四要素落地持续交付
持续交付(Continuous delivery,缩写为 CD),是一种软件工程方法,让软件产品的产出过程在一个短周期内完成,以保证软件可以稳定、持续的保持在随时可以发布的状况。它的目标在于让软件的编译、测试与发布变得更快更频繁。这种方式可以减少软件开发的成本与时间,减少风险。 而我对持续交付的一个较为抽象的理解是“一套软件工程方法论和许多最佳实践的集合”。方法论和实践都需要人去总结落地,所以,要想体会到持续交付的真正含义,就要在实际工作中贯彻和使用实践工具。
宜信技术学院
2019/06/28
1.1K0
从技术雷达看DevOps十年-DevOps和持续交付
2009年底,比利时根特举办了第一届DevOpsDays。Chris-Read作为嘉宾之一,代表ThoughtWorks出席了这次活动并带来名为“持续集成,流水线和部署”的演讲。ThoughtWorks作为DevOps运动最早的见证者和奠基人,并没有意识到这个周末聚会将在接下来10年给全球IT行业带来深远影响。
ThoughtWorks
2019/05/05
6800
从技术雷达看DevOps十年-DevOps和持续交付
这是一份关于流水线的需求说明书
本文概述了流水线在软件交付过程中的关键作用,包括其能力、类别和自动化操作。流水线将代码变更自动转换为交付物,如制品包和镜像,并内嵌质量控制和合规性检查。文章还强调了流水线编排的重要性,包括可视化、原子化操作、参数管理、模板化和多种触发方式,以及环境管理和性能优化,确保高效、有序的交付流程和高质量的软件交付。
Antony
2024/05/15
1460
这是一份关于流水线的需求说明书
研发流程优化实践
代码入库之前的开发活动,主要包括编码、调测调优、静态检查、自动化测试、代码审查等。这是开发者编写代码的步骤,自然是提高研发效能的关键环节。
猿哥
2020/02/26
1.3K0
研发流程优化实践
《持续交付:发布可靠软件的系统方法》第1章 软件交付的问题
第1章 软件交付的问题 介绍 从“决定做某种修改”到“该修改结果正式上线”的这段时间称为周期时间(cycle time)。对任何项目而言,它都是一个极为重要的度量标准。1Implementing Lean Software Development 第59页 真正缺少的是一本讨论如何把各方面(包括配置管理、自动化测试、持续集成和部署、数据管理、环境管理以及发布管理)融合在一起的书 我们的目标是提供一个整体方案,并给出这个方案涉及的各种原则。我们会告诉你如何在自己的项目中使用这些实践 支持部署流水线的生态系统,
yeedomliu
2019/09/28
6770
构建高质量的持续交付体系
前面的文章,聊了软件工程的基础理论、项目管理、需求分析、架构设计、软件测试以及线上服务的质量保障。其中在架构设计和线上服务的质量保障中,我也提到了关于持续集成持续交付相关的内容。软件工程的本质是用工程化的方法去规范软件开发,让软件开发项目可以按时保质完成的同时且成本可控。
老_张
2023/03/01
5050
构建高质量的持续交付体系
国内领先!郑州银行核心业务系统 DevOps 持续交付实践之路(附PPT)
编者按:2019 年4月12日,在 GOPS 2019 · 深圳站上,郑州银行”新版核心业务系统“ 通过 DevOps 标准之持续交付能力 3 级评测,同时,郑州银行成为全国首家通过 DevOps 标准评估认证城商行,其核心业务系统的 DevOps 持续交付能力被认定为国内领先水平。
DevOps时代
2019/05/17
2.8K0
国内领先!郑州银行核心业务系统 DevOps 持续交付实践之路(附PPT)
读《持续交付2.0》
几年前看过《持续交付(发布可靠软件的系统方法)》,感触不是很深,最近看了这本书的译者乔梁编写的《持续交付2.0》,结合工作中的种种,又有一种相见恨晚的感觉。可见好书是需要经常翻阅的,每次都会带来新的收获和思考。
oec2003
2019/11/29
1.4K0
手把手教您构建自己的 DevOps 流水线
持续交付是一组能够帮助软件开发团队极大的提高其软件交付的速度和质量的模式和最佳实践组成。
DevOps时代
2018/08/01
2.6K1
手把手教您构建自己的 DevOps 流水线
相关推荐
谈谈企业的持续交付流水线设计
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文