热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

持续集成之“分支策略”​

现代版本控制系统(SCM)的作用已不仅仅是保存历史版本,它还是各软件开发组织利用其分支功能实现多人并行开发,提高生产效率的一

现代版本控制系统(SCM)的作用已不仅仅是保存历史版本,它还是各软件开发组织利用其分支功能实现多人并行开发,提高生产效率的一种工具。对于稍有历史的软件产品来说,一般都会有代码分支的出现,也常常见到一些历史悠久的产品其错综复杂的分支版本树甚至将产品交付团队拖入“无尽维护”的泥潭。分支的目的是希望“分而治之”,而持续集成的目的是“频繁集成”,这二者之间又有哪些联系呢?

\u0026#xD;\n

在《测试三角形与分段构建策略原则》一文中,咱们说到:由于自动化测试时间较长,Joe的团队实施了分阶段的持续集成。虽然这么做引入了一些风险(比如因提交阶段构建中的测试覆盖面小而不能尽早发现代码中问题),但提高了整个团队的开发效率。而且,Joe会根据实际运行情况,在提交构建和次级构建之间不断调整自动化测试用例集来缓解分阶段构建带来的风险。

\u0026#xD;\n

现在,这个软件游戏平台的第一个版本已经接近完成,马上就要进行内测了。团队面临的问题是:“如何做分支管理?持续集成该怎么做?”

\u0026#xD;\n

一、短周期发布分支策略

\u0026#xD;\n

今天是星期五。下班后,Joe和Alice等主要开发人员并没有马上回家,而是在一个小酒吧里聊天呢。

\u0026#xD;\n

Alice说道:“现在我们一直使用主干开发方式,团队所有人都工作在Trunk上,与之对应的只有一个持续集成环境。下星期就要做内测了,我们是不是应该拉一个测试分支,用于修复测试中发现的缺陷,在主干继续开发新功能呢?一旦修复完内测缺陷的话,我们就可以在这个分支上进行发布,再把这个测试分支的代码变更合并回主干。就像这样。”她拿了一张纸画了出来(如图1所示)。

\u0026#xD;\n

d117cc7b457ea98022a0228b39e96c29.jpg\

\u0026#xD;\n

“好啊,好啊。我们分成两个团队,一个在测试分支上工作,修复内测过程中发现的缺陷;另一个在主干上工作,开发新的功能。”Bob回应道。

\u0026#xD;\n

“对于拉分支做测试这件事,我没有疑问。但是,我不同意最后再把代码合并到主干上。”Joe说道。“我们一直在使用持续集成实践,目的就是尽早集成。为什么要等到发布以后再将测试分支的代码合并回主干,而不是每次修复一个缺陷就合并回来呢?每次缺陷修复的代码变更不会太多,所以合并起来很容易。等到最后再合并,首先是容易漏掉一些代码,其次是一次合并代码太多,容易出错。所以,我建议下星期拉分支时,为测试分支也建立一个持续集成环境。每次发现缺陷时,都为它写一个测试,加到测试套件中。修复代码提交后,就会触发测试分支对应的持续集成构建。一旦构建成功,就将其合并回主干。”说完之后,他在Alice画的那张图上修改了一下(如图2所示)。

\u0026#xD;\n

12202be8692cb6bc3b27d17954b9aa7b.jpg\

\u0026#xD;\n
  1. 拉分支之后,开发团队可以继续开发新的功能。而测试团队可以单独对分支进行测试、部署,不受开发团队的影响。\u0026#xD;\n
  2. 一旦测试中发现问题,载发人员要在该分支上修复。\u0026#xD;\n
  3. 在分支发布之后,一旦发现了严重问题,仅在该发布分支上修复后即可发布补丁版本。\u0026#xD;\n
  4. 在分支上做修改后,就要根据实际情况进行分析,是否要合并回主干。如果需要合并,应该立即进行。\u0026#xD;\n

“那由谁来负责把发布分支中的Bugfix合并回主干呢?”

\u0026#xD;\n

“当然是由Bugfix的人来负责了,他是确保合并正确性的关键。如果Trunk上的代码已被修改,无法合并,Bug负责人就要与主干开发人员交流,这个Bug在主干的有效性,然后再决定是否修改,在哪里修改的问题。”

\u0026#xD;\n

“我们要对发布分支上的Bug定义修复标准,尽量在Trunk上修复Bug,除非这个Bug严重影响发布质量。这样可以避免无休止地在发布分支上做代码修改。这样,Bug数才会收敛,发布分支的活跃期才会缩短。”

\u0026#xD;\n

“嗯,相对于我们一直使用的主干开发方式来说,这种短发布分支策略的成本是:

\u0026#xD;\n
  1. 需要多套独立的持续集成环境。即每个分支在处于活跃期时,要有与之对应的一套持续集成环境,以便不受影响。\u0026#xD;\n
  2. 每次发布分支上修复缺陷后,只要分支对应的持续集成构建成功,就要将其合并回主干。\u0026#xD;\n
  3. 由于主干开发的代码可能因架构改进使原有缺陷不复存在,所以每次合并时都需要人为判断一下合并的必要性。”\u0026#xD;\n

二、长周期发布分支策略?

\u0026#xD;\n

“哦,我之前工作的一家公司,就是用这种分支策略。”Bob说道,“但情况变得非常复杂。版本满天飞,想做合并都不容易。”

\u0026#xD;\n

Joe说道:“我想,可能是因为他们的客户不想升级版本,所以必须在已发布的版本上再发小版本吧?”

\u0026#xD;\n

“的确是这样的。”Bob回答道,“他们的发布周期大约是半年。由于已发布的版本质量不佳,所以总是有紧急修复的版本上线。另外,客户比较担心新版本的稳定性,所以只要满足自己的当前需求,就会一直使用旧版本。有些大客户还会要求公司开发针对其自身的特别需求,并快速上线,结果可想而知。”

\u0026#xD;\n

Alice说道:“其实,这已经是短周期发布分支的变形,即有多个活跃分支的长周期发布分支策略(如图3所示)。这种分支策略是应该尽量避免的,它的复杂性和维护成本都很高,因为:

\u0026#xD;\n
  1. 每次都要把缺陷修复代码合并到后续的多个发布?分支上,尤其是当该缺陷发生在较老的版本,而当前已有多个活跃版本需要维护时。\u0026#xD;\n
  2. 随着时间的推移,每个分支上的自动化测试用例增多,更多的分支会对持续集成环境中的测试机数量的需求快速增加。\u0026#xD;\n
  3. 发布周期长诱使团队在已有的发布分支上再做子分支(如图3中的R1.1),这会让集成和验证工作变得更加复杂(如图3中从R1.1到R2.0的Cherry Picking操作表明:需要向多个分支上合并部分代码)。\u0026#xD;\n
  4. 由于每个活跃分支都要对应一个持续集成环境,因此,分支越多,对持续集成环境的维护成本也就越高。\u0026#xD;\n

74a1a20c16645c0bd540272e1bc4d1e6.jpg\

\u0026#xD;\n

Bob问道:“有什么办法避免这种糟糕的多活跃分支开发策略吗?”

\u0026#xD;\n

“办法当然有,但不能解决所有问题。”Joe回答道,“比方说,首先,要确保每个版本的开发质量,让客户放心升级。其次,软件产品要支持自动升级。在通常情况下,只要满足需求,用户就不会轻易升级软件。所以,要让软件具有自动发现新版本并在后台自动升级的能力。当然,在升级后要通知用户。这样,只要将新版本发布到互联网上的某个服务器上就行了。最后,也是最重要的一点,新版本发布周期要短一些,不断快速地推出新特性,这样就可以让用户对产品及研发团队有信心,让客户感觉他们的需求很快就会被满足。”

\u0026#xD;\n

“对于那些企业用户来说,这种方法可能不管用。因为,企业内网很少可以连通外网。”Alice说道。

\u0026#xD;\n

“如果是这种情况的话,除了软件本身质量好且能自动无缝升级以外,在销售时可以与客户签订协议,告知所售软件版本的生命周期(比如18个月)以及升级条款,促使企业升级该软件,比如免费的大版本升级,或者因缺陷原因可免费升级等等。”Joe回答道。

\u0026#xD;\n

“嗯,我们开发的是游戏软件平台,部署在互联网上,所以不会遇到这个问题。”Alice说道。

\u0026#xD;\n

Joe微笑着说道:“我们将会面临另外一种问题,即多个小团队开发不同的游戏组件问题。”

\u0026#xD;\n

“哦,对了!现在我们的游戏平台中虽然仅有几个游戏,目前还一起在主干上开发。但在下一版本中,我们会增加大量的游戏组件,那应该如何应对?我们的持续集成环境应该是什么样的呢?”Alice大声地问道。

\u0026#xD;\n

“嗯,是个好问题!”Joe回答道。“我已经有了一些想法。我们内测结束后,再详细讨论吧!时间也不早啦,大家回去休息吧,周末愉快!”


推荐阅读
  • 本文探讨了服务器系统架构的性能评估方法,包括性能评估的目的、步骤以及如何选择合适的度量标准。文章还介绍了几种常用的基准测试程序及其应用,并详细说明了Web服务器性能评估的关键指标与测试方法。 ... [详细]
  • Java虚拟机及其发展历程
    Java虚拟机(JVM)是每个Java开发者日常工作中不可或缺的一部分,但其背后的运作机制却往往显得神秘莫测。本文将探讨Java及其虚拟机的发展历程,帮助读者深入了解这一关键技术。 ... [详细]
  • 服务器虚拟化存储设计,完美规划储存与资源,部署高性能虚拟化桌面
    规划部署虚拟桌面环境前,必须先估算目前所使用实体桌面环境的工作负载与IOPS性能,并慎选储存设备。唯有谨慎估算贴近实际的IOPS性能,才能 ... [详细]
  • Asynchronous JavaScript and XML (AJAX) 的流行很大程度上得益于 Google 在其产品如 Google Suggest 和 Google Maps 中的应用。本文将深入探讨 AJAX 在 .NET 环境下的工作原理及其实现方法。 ... [详细]
  • 本文提供了一个详尽的前端开发资源列表,涵盖了从基础入门到高级应用的各个方面,包括HTML5、CSS3、JavaScript框架及库、移动开发、API接口、工具与插件等。 ... [详细]
  • 笔记说明重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系& ... [详细]
  • 本文基于Java官方文档进行了适当修改,旨在介绍如何实现一个能够同时处理多个客户端请求的服务端程序。在前文中,我们探讨了单客户端访问的服务端实现,而本篇将深入讲解多客户端环境下的服务端设计与实现。 ... [详细]
  • 本文回顾了作者在求职阿里和腾讯实习生过程中,从最初的迷茫到最后成功获得Offer的心路历程。文中不仅分享了个人的面试经历,还提供了宝贵的面试准备建议和技巧。 ... [详细]
  • 随着Linux操作系统的广泛使用,确保用户账户及系统安全变得尤为重要。用户密码的复杂性直接关系到系统的整体安全性。本文将详细介绍如何在CentOS服务器上自定义密码规则,以增强系统的安全性。 ... [详细]
  • 本文介绍了如何使用Node.js通过两种不同的方法连接MongoDB数据库,包括使用MongoClient对象和连接字符串的方法。每种方法都有其特点和适用场景,适合不同需求的开发者。 ... [详细]
  • 本文详细介绍如何安装和配置DedeCMS的移动端站点,包括新版本安装、老版本升级、模板适配以及必要的代码修改,以确保移动站点的正常运行。 ... [详细]
  • JavaScript 跨域解决方案详解
    本文详细介绍了JavaScript在不同域之间进行数据传输或通信的技术,包括使用JSONP、修改document.domain、利用window.name以及HTML5的postMessage方法等跨域解决方案。 ... [详细]
  • 本文提供了多种有效的方法来解决RPC(远程过程调用)服务器不可用的问题,包括通过修改注册表、使用SC命令以及利用故障恢复控制台等技术手段。 ... [详细]
  • 问题概述:在本地环境中代码运行正常,但部署到服务器后出现错误。具体表现为NCManager和SAXBuilder无法解析为类型。 ... [详细]
  • 本文详细介绍了如何在CentOS 6.5系统上安装和配置Redis 3.0.6,包括必要的环境准备、软件包下载、编译安装及基本功能测试。 ... [详细]
author-avatar
王意之
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有