持续集成之“分支策略”(续)

前文中,咱们谈到生命周期长短不同的两种分支策略。对于不超过二十人的小团队来说,推荐使用短生命周期的分支策略。Joe的团队在首次发布之前,也一直使用这种方式。然而,首次发布之后,因市场反响非常好,公司决定加大开发投入,希望更快地推出升级平台,以及更多基于平台的游戏。

一、按特性分支的持续集成策略

现在,Joe的团队中,开发人员快速增加,已接近30人了。由于首次发布后的市场压力,大家一直在赶进度,持续集成的失败频率越来越高,修复构建的时间也越来越长,排队等待提交的代码也越积越多。“这种状况不能再持续下去了,需要想个办法解决它。”Joe决定下午召集主要人员开会,分析一下原因和对策。

“现在我们还在使用提交令牌(参见《Checkin
Dance》一文
的最后一节),可我们的开发人数已经翻了一倍。而且,我们自动化测试用例的数量也激增。”Joe说道,“有时候我想提交代码都要排队等很长时间。”

“嗯,每天等待提交的人也挺多的。”Alice说道,“现在看来,虽然持续集成让我们每次提交的质量都更有保证,但是在同一个主干上开发的人数太多,它就成了一个提高开发效率的瓶颈了。”

“要不这样吧:我们把大家分成小组,每个小组从主干上拉出一个分支,完成一组相近特性的开发后,再合并回主干。”Bob边说边在白板上画了出来(如图1所示)。

“对应的持续集成方案也需要调整。包括:

  • 保留现有主干对应的持续集成平台,但不许在主干上直接开发代码;

  • 每个分支增加一个相对应的持续集成平台;

  • 每个分支的持续集成平台构建中需要包括该分支对应特性的单元测试、功能测试;

  • 每次向主干合并时,都会触发主干上的持续集成,构建中应包含整个系统的单元测试、功能测试等。

这样,每个小组的人数不会太多,提交时需要等待他们提交完成的概率应该不会太大。另外,每个分支的持续集成上只运行自己分支对应特性的单元测试和功能测试,这样,构建时间也会缩短。”

“听上去是个好办法,”Alice答道,“可是,我对这个方案有几个疑问。比如说,这几个小组在什么时候做同步?每个小组什么时候向主干合并代码?”

“嗯,好问题。我还没有想到这么多呢。”Bob皱了皱眉,感到很沮丧。

Joe笑了笑,说道:“的确是不错的方案。只要加一点同步与合并规则,改进一下。”然后,他拿起白板笔,在图上加了几笔(所图2所示)。

“规则如下:

  • 每个小功能在尽可能短的时间里开发且测试完成,最好是在一周之内。

  • 每组做完一个小功能后,一旦该分支上的持续集成构建通过,而且手工验证没有问题,就可以向主干合并代码。

  • 合并后,与主干对应的持续集成平台会立即验证这些代码。

  • 如果主干持续集成平台的构建失败,那么是哪个小组提交导致的,就由哪个小组负责修复。

  • 每天各组在开始工作之前,都要将主干上那个最新且通过主干持续集成构建成功的代码检出,并与各自分支的代码进行合并。

其实,这就是小组级别的“Checkin
Dance
”。目的还是要持续集成,即尽要将各小组的工作成果集成在一起。如果每个小组能够做到频繁与主干代码同步的”

Alice问道:“由于每个分支上都是多人开发,那么当某个功能完成后,并需要合并回主干时,该分支上可能已经有一些代码是属于尚未完成功能的代码。我们需要把属于该功能的代码修改挑选出来后提交到主干吗?”

“你是说Cherry Picking吧。只要我们能够通过技术手段确保用户无法访问到未完成的功能,就不需要Cherry
Picking了。比如通过配置项或功能开关的方式。”Joe说道。

“这样做,听起来挺好的,但还有一个问题需要解决,那就是:现在大家的代码耦合度太高啦。每增加一个小功能,都要修改很多个位置的代码。”?Bob说道,“如果这么做的话,各组之间的代码冲突会很多,合并可能带来很多问题。”

“的确是这样的,目前的持续集成方案只能缓解合并问题,但无法解决合并中的代码冲突问题,只有通过对代码的结构进行调整才能够解决。”Job说道。“而且,对于我们这样的软件系统来说,对架构进行调整带来的益处更大。”

二、模块化应用程序的持续集成

“啊哈!架构调整?”Bob笑道,“架构这个词让人用得太滥了,还是不要提的好。一提到架构调整,我就想起在前一雇主公司干的活了——每次架构调整都是重写代码。”

“哦,事实上,我们系统的架构基本上是模块化的,比如平台与具体游戏之间的边界还算清晰。”Joe回应道,“现在我们所要做的是强化模块化。因为,新加入的开发人员对系统了解不够深入,有些功能的耦合度开始增高了。我希望每个游戏就作为一个独立模块,进行开发与测试。而它所依赖的游戏平台需要提供稳定的对外接口。”

Alice说道:“那我们就可以不用前面提到的特性分支策略了,只要把每个模块做为一个独立的代码库进行开发,将它所依赖的游戏平台作为外部依赖进行集成就行了。”

“的确是这样的。”Joe肯定的回答道。“如果每个模块对外都有某种形式的接口(比如API,接口定义文件),而所有外部依赖都通过这些接口与其进行交互的话,就可以这样做。”如图3所示。

“如果这么做的话,我们的持续集成方案应该是什么样的呢?”Bob问道。

“那不是一样嘛,即然都是独立的,各模块做各自的持续集成不就行了嘛。”Alice说道。

“当然不行,因为这些模块之间仍旧需要通过彼此交互才能正常运行起来,尤其是对于那些有信息交换的游戏模块,集成测试就更加重要。”Joe回答道,“既然需要集成,就要做持续集成。”

Alice问:“那我们有这么多个游戏,每个游戏都要与基础游戏平台进行持续集成,到底应该怎么做呢?”

“我们可以这么做。”Bob拿起笔在白板上画了起来(如图4所示)。“为每个模块的代码库建立对应的持续集成环境,包括每个游戏和基础平台。无论哪个模块代码库修改了代码,都会触发对应的持续集成构建,一旦该模块的持续集成构建成功以后,就会触发一个包含所有游戏和平台的集成构建。”

“这样不错,但是现在每个模块都对应独立的代码库了,那么在最后各模块集成构建时,到底用各模块的哪个版本呢?”Alice问道。

Joe说道,“Alice的问题非常好。在最后各模块集成构建时,除了那个主动触发构建的模块使用最新版本外,其它模块都使用最后一次令该集成构建成功的那个对应版本。”Joe边说边在白板上画了一个例子。

“比如,对于我们目前的系统来说,一共有四个游戏模块和一个基础平台。假如最后一次成功的集成构建中,各模块对应的版本分别是123,245,212,467
和12387。当我们对游戏模块A进行了一次提交,其版本变为124,并且通过了它自己的持续集成构建以后,就会触发最后的集成构建。这次集成构建所对应的各模块版本分别为124,245,212,467和12387。如果这次构建成功,则下次最后集成构建就以这些版本为基础;如果这次构建失败了,则标记游戏模块A的124版本是可疑版本,尽管它通过了其自身模块的构建。同时需要有人对这次集成构建进行分析,进行问题定位并修复。”如图5所示。

“那么,我们的基础游戏平台也是由多个模块组成的。我们是否也需要把这些模块独立成库,使用同样的方式进行持续集成呢?”Bob问道。

Joe回答道:“我认为现在还不需要。平台内部模块化是应该的,但因为它自身的构建时间并不长,还没有必要独立成库。”

Alice此时说道:“这样看来,我们的持续集成问题可以按这种方案来解决。让我们试试吧。”

那么,Joe的团队使用这种持续集成方案以后,还会遇到什么情况呢?比如,基础平台的构建时间变长,会怎么样呢?

需要注意的是,无论采用哪种方法,我建议都不要让同一组人一直工作在一个模块上(虽然这是在各组织中经常见到的),而是让一组人工作在一组模块或功能上,并让小组成员在各组间流动。这样有利于组间的知道共享,对保持架构的一致性也会起到积极作用。

持续集成之“分支策略”(续),布布扣,bubuko.com

时间: 2024-10-12 00:05:57

持续集成之“分支策略”(续)的相关文章

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

现代版本控制系统(SCM)的作用已不仅仅是保存历史版本,它还是各软件开发组织利用其分支功能实现多人并行开发,提高生产效率的一种工具.对于稍有历史的软件产品来说,一般都会有代码分支的出现,也常常见到一些历史悠久的产品其错综复杂的分支版本树甚至将产品交付团队拖入"无尽维护"的泥潭.分支的目的是希望"分而治之",而持续集成的目的是"频繁集成",这二者之间又有哪些联系呢? 在<测试三角形与分段构建策略原则>一文中,咱们说到:由于自动化测试时间

持续集成之“依赖管理”

在前文<分支策略(续)>中,我们讨论了多组件应用程序的持续集成策略,即:为相对独立的组件创建自己专属的代码库,然后通过现代持续集成工具进行组件间的持续集成.Joe的团队在首次发布之后,开始使用这种方式.然而,没有多久,他们就遇到了一个问题:一次提交构建所花费的时间太长. 一天,Joe就早早地来到了办公室.因为他前一天下班前,他开发的用户故事还有一小点就完事儿了.他想利用早上这点儿时间把它搞完,交给测试人员进行测试.他修改了某个模块的一段代码,在本地构建测试通过以后,就提交了, 然后起身去楼下买

[转] 基于Gitlab CI搭建持续集成环境

[From] https://blog.csdn.net/wGL3k77y9fR1k61T1aS/article/details/78798577 前言 本文是在12月12号迅雷@赵兵在前端早读课第三期Live中提到的关于CI构建的,可能这部分在不同公司由不同的岗位负责,刚好如果你没遇到你可以看看. @赵兵,来自迅雷前端团队.是一个热爱前端技术,喜欢造轮子,爱折腾的人,也是一个奉行"懒惰使人进步"的懒人工程师. 正文从这开始- 本文简单介绍了持续集成的概念并着重介绍了如何基于 Gitl

Jenkins持续集成 之 git分支

Jenkins持续集成 之 git分支 什么是分支 软件项目中启动一套单独的开发线的方法 为什么使用git 1.可以很好的避免版本兼容开发的问题,避免不同版本之间的相互影响. 2.封装一个开发阶段. 3.解决bug的时候新建分支,用于对该bug的研究. git中跟分支相关的命令 git branch 分支名---创建一个新的分支 git branch ---不加任何参数,列出所有的分支,分支前面有*号,代表该分支为当前所在分支 * 创建分支的时候,分支名不能使用特殊符号 git branch -

「Jenkins+Git+Maven+Shell+Tomcat持续集成」经典教程

Jenkins 是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变得可能.现在软件开发追求的是效率以及质量,Jenkins使得自动化成为可能! 亮点 采用shell自定义脚本,控制集成部署环境更加方便灵活 精简war包中的lib包,常驻tomcat里,减少war包传输时间 Jenkins 用户权限管理,不让淘气鬼乱动 构建失败发邮件通知相关人员解决 自动按天备份war包,Jenkins配置备份以及版本控制化 环境 Ubuntu 14.10 (GNU/Linux 3.16.0-

持续集成方案

大纲 构建 版本控制 部署 单元测试 架构文档化 命名约定 数据库伸缩性 自动化 反馈 实践 引言: 持续集成的前身: 在使用持续集成之前,很多开发团队都是用每日构建(nightly build).当时,微软使用这个实践很多年了.谁破坏了构建,就要负责监视后续的构建构成,直至发现下一个破坏了构建的人. 为什么要使用持续集成? 对于大多数项目来说,采纳持续集成实践是向高效率和高质量迈进的一大步.它保证那些创建大型复杂系统的团队具有高度的自信心和控制力.一旦代码提交引入了问题,持续集成就能为我们提供

[转] 持续集成与持续交付备忘录

URL  :   http://blog.csdn.net/hunterno4/article/details/22525667 一本好书使您改变.它将改变您的思想,您看待问题的角度和方式,最终,它将改改您的行为.然而,所有具有重要意义的改变都不会是在一夜之间发生的,如果您相信这种变革必会发生,不妨朝着这个方向去努力,经常改变,每次改变一点点. ——<持续集成:软件质量改进和风险降低之道> CI的价值: 减少风险:缺陷的检测与修复变得更快:通过持续测试与持续审查,软件的健康程度可以测量:可以减

通过静态分析和持续集成 保证代码的质量 (PRQA )2

续上.... 第二章 部署示例:Jenkins and PRQA 工具 第一节 Jenkins 作为持续集成系统 现在有很多持续集成工具,既有免费的,也有商业的.最近的研究显示,Jenkins正发展成为最受欢迎的持续集成工具.Jenkins是Hudson持续集成系统的一个分支,但是Jenkins拥有最活跃的生态系统. 在MIT许可下,Jenkins是免费的,但是和一些开源软件一样,Jenkins也有付费版本,并会提供技术支持.虽然Jenkins是一个开源项目,但是对核心代码所作的所有修改,都由核

ci持续集成(转)

1.持续集成的组成 用 Ant 或 Maven 等工具建立的自动构建过程 一个代码存储库,比如 CVS 或 Subversion 一个 CI 服务器,比如 Hudson,但是 cron 作业也可以满足需要 们来详细讨论这些组件. 自动的构建 CI 过程会经常集成软件,这需要通过构建来完成.在 Java 环境中,Ant 是常用的构建平台.可以使用 Ant 可靠地自动执行编译.测试等任务,甚至可以执行软件检查和部署.在掌握了 CI 的所有组件之后,您会发现构建策略是成功的 CI 过程最重要的方面.如