持续集成之戏说Check-in Dance(转)

add by zhj: 先说一下持续集成的定义,这是ThoughtWorks首席科学家Martin Fowler在《持续集成》第二版中给出的,“持续集成是一种软件开发实践。在持续集成中,团队成员频繁集成他们的工作成果,一般每人每天至少集成一次,也可以多次。每次集成会经过自动构建(包括自动测试)的验证,以尽快发现集成错误。许多团队发现这种方法可以显著减少集成引起的问题,并可以加快团队合作软件开发的速度。”

这里是《持续集成》第二版的一些简单介绍:http://www.infoq.com/cn/articles/ci-theory-practice

原文:http://www.infoq.com/cn/news/2011/01/ci-check-in-dance

众所周知,敏捷软件开发方法中有多种最佳实践,既有管理方面的,也有技术方面的。在尝试敏捷之初,并不是每个团队都能使用全部最佳实践,也不是每个实践都能在短时间内见效。但其中有一种最佳实践却是团队的必选,那就是持续集成,但这并不表示持续集成非常容易。



尽管Thoughtworks的首席科学家Martion folwer 为“持续集成 ”下了定义,但由于自身背景与经历的不同,每个人对其都有不同的理解。从狭义上讲,持续集成可以认为是一种基于某种或者某些变化对软件系统进行的经常性的构建活动(注:这里的构建活动不仅指编译打包工作,还包含各类自动化测试、部署及发布活动)。然而,它忽视了一点,即:任何实践中都应该包含“与人的交互”这一因素。因此,从广意上讲,持续集成应该是软件开发团队在上述活动的约束下所采用的整个开发流程及活动。它强调开发团队与持续集成系统之间的互动性。我们既见过持续集成做得非常成功的团队,也见过效果不佳的持续集成,甚至失败的案例。

那么,到底如何从持续集成中得到最大的收益呢?这要从持续集成所涉及的诸多方面进行分析,并根据团队具体情况(比如团队规模、人员组成以及是否为分布式团队 等)及所开发软件自身的特点(是企业应用软件,还是中间件?是嵌入式软件,还是互联网产品等)制定实践策略与实现步骤。本专栏将与大家共同探讨与持续集成、持续部署及持续交付相关的方法、工具与经验。作者本人在Thoughtworks公司曾参与的一款持续集成与发布管理产品Go的交付和对外咨询服务为专栏提供了很有素材,同时感谢肖鹏 、 李彦辉 、胡凯 、李剑等对栏目内容的支持和帮助。

在软件开发中,持续集成实践能够解决的问题是尽早的集成和尽早的反馈。因此,尽管目前流行的所有版本控制工具都提供了分支/合并功能,但在少于20人的团队中实现持续集成的话,推荐使用Single Branch开发策略。这样会减少多分支开如在合并时的开销。另外,由于理想情况下,每个分支都需要有专属的持续集成环境(包括持续集成服务器、构建环境和测试环境等),所以Single Branch也减少了对持续集成环境的需求量(当编译时间较长或测试用例较多时,这个因素的影响尤其重要)。

当团队完成最初搭建持续集成服务器,编写好一键式编译和测试脚本工作后,就需要考虑如何利用持续集成环境高效地进行团队协作开发了。一定有人会问:

“多人同时在一个分支上开发的话,每个人提交时都要合并代码,不是更浪费时间吗?”

这个问题也正是持续集成期望解决的问题。每当开发人员提交代码时,就是其与其他开发人员工作成果的一次集成。如果每个人都能够频繁提交代码,那么代码集成的频率就会提高,在持续集成的有力支持下,代码中潜在的问题就会更早地暴露出来(比如代码编译链接问题,自动化测试失败反映出来的代码功能问题,或需求理解不一致等问题),以便团队尽早解决之。

当然,持续集成所鼓励的频繁提交并不是指那种仅将版本控制库当成备份工具,无约束的“随意”提交,还需要团队开发流程约束的。下面我们来一同探讨“持续集成环境中的团队开发流程是什么样的”。

让我们先设想一个软件开发场景。

一、使用版本管理工具做备份

故事的主人公叫Joe,他打算写一个游戏,所以用Subversion建立了一个版本控制库用于保存代码,然后就动手写代码了。Joe的开发流程是这样的。

  1. 从代码库中检出一份代码;
  2. 为增加某个功能修改一些代码;
  3. 在本地运行了一下自动化测试;
  4. 测试通过之后,提交代码到版本控制库;
  5. 重复前面的步骤。

如图1所示。

二、搭建持续集成服务器做自动构建

“每次在本地手工运行自动化测试太麻烦了,”Joe想到,“这种重复的工作为什么不让机器来做呢”。

于是,Joe上网查了一下,发现持续集成工具是做这个事情的,就找来一台旧机器,用CruiseControl搭建了一个持续集成服务器。他的开发流程也变为:

  1. 从代码库中检出一份代码;
  2. 开发新功能或修改bug;
  3. 提交到版本控制库,思考下一个功能的实现;
  4. 持续集成服务器运行自动化构建和测试;
  5. 如果测试通过,转到步骤(1);
  6. 如果测试没有通过,转到步骤(2)。如图2所示。

三、多人并行开发

两周后,游戏初见原型,Joe向他的几个朋友介绍了他的游戏创建,他们都非常喜欢,因此也加入了游戏开发。麻烦很快就出现了。持续集成服务器中构建结果经常失败,所以每次检出代码后都要做问题清理工作。于是,Job与朋友们坐下来讨论如何解决这个问题。

Alice说:“我们每个人都拉一个独立分支,当每个人的功能开发完成以后,再合并到一起不就行了吗?”

Joe不同意这样的做法。“游戏的需求还不明晰,要经常合在一起看一下效果。所以还是在同一个分支上开发吧。下面,我们讨论一下如何让这种失败少一些吧。”

于是,他们花了点儿时间,发现有两个主要原因导致失败。

  1. 本地代码有问题,原本就编译不了或会导致测试失败,但还是提交了;
  2. 开始做新功能时,没有特别注意分支上的持续集成状态,直接将主分支上的代码直接就与本地代码合并了;

Joe提出,开发流程应该变成如图3所示:

  1. 每个人在开发新代码之前,只能从持续集成已成功的那个最新版本检出代码;
  2. 开发新功能或修改bug;
  3. 提交前将主分支上的代码再次取到本地合并;
  4. 运行本地测试,确保测试可以通过;
  5. 提交代码到主分支,由持续集成服务器再次运行测试。
  6. 如果测试通过,转到步骤(1);
  7. 如果测试没有通过,转到步骤(2),直到修复持续集成上的构建。

可是,Alice提出反对意见。她认为:“既然本地已经运行了测试,为什么还要在持续集成服务器上再次运行呢?”

Joe解释到:“主要是因为我们每个人的本地环境都不完全相同,很可能出现‘它在我的机器没有问题呀’的这个现象,所以还是要在独立的持续集成服务器上再运行一次。”

因此,大家就这么决定了。

四、两次本地构建的目的

四周后的一天,Joe花了很长时间完成了某个新功能后,打算提交了。于是他把分支当前的代码与其本地代码进行了一次合并。然后运行了本地测试,但测试失败了。他用了很长时间来定位该问题是在他自己修改的功能里,还是在被合入的代码中。这让他对提交流程进行了反思。

“要是在合入他人代码之前,能够先运行一次本地测试,验证一下我的代码没问题就好了,反正本地测试所花的时间也不长。”

于是,他把这个想法告诉了其他人,最后大部分人都同意这么做。于是,其提交流程就变成了这样:?

  1. 每个人在开发新代码之前,只能从持续集成完全成功的那个最新版本检出代码;
  2. 开发新功能或修改bug;
  3. 运行本地测试,如果有失败就立即修复,直至测试成本;
  4. 提交前将主分支上的代码再次取到本地合并;
  5. 运行本地测试,确保测试可以通过;
  6. 提交代码到主分支,由持续集成服务器再次运行测试。
  7. 如果测试通过,转到步骤(1);
  8. 如果测试没有通过,转到步骤(2)。

这个过程就被称为“Check-in Dance”。

Alice还说道:“我们在从主分支上检出代码时,一定是那个通过持续集成验证的最新版本。这样可以避免检出的代码就是有问题的,而影响自己本地的代码。”整个过程如图4所示。

五、持续集成令牌

过了几天,有人把大家叫到了一起,这次是Alice。她说:

“我今天遇到一个问题。我提交代码之后,正等着持续集成服务器返回结果呢,Bob就提交代码了。幸好我提交的代码通过了测试,否则的话,我就要在Bob的代码之上修复啦。所以,我建议我们需要设立一个提交令牌,只有拿到这个提交令牌的人才能提交。也就是说,当一个人做完本地测试之后,去拿这个令牌。拿到之后,再进行代码合并、本地测试和提交。提交以后当持续集成服务器返回成功通过的结果时,才能交还令牌。这样就不会出现我和Bob这种情况了。”

可Bob并不同意这样的做法,“这次没有出什么问题,为什么还要这么做呢?”

此时,Joe把话接了过来,说道:“Alice的这个建议很好,我已经遇上过一次这样的事情了,那次测试失败以后,我花了很长时间才发现问题并不在我的提交中,而是在Mary的提交中。我把它修复后,又做了一次提交。”由于大多数人都同意这么做,因此团队决定试一试。因为目前测试运行时间很短,所以提交和集成工作没有遇到什么瓶颈。提交流程如图5所示。

似乎事情到这里就结束了。然而,这个游戏被某投资公司看中,决定做更大的投入,招更多的开发人员,让它成为一个开放游戏平台。那么,接下来Joe与他的朋友们还会遇到哪些问题呢?



感谢张凯峰对本文的策划及审校。

时间: 2024-11-09 03:03:58

持续集成之戏说Check-in Dance(转)的相关文章

基于 Jenkins 快速搭建持续集成环境

持续集成是一种软件开发实践,对于提高软件开发效率并保障软件开发质量提供了理论基础.Jenkins 是一个开源软件项目,旨在提供一个开放易用的软件平台,使持续集成变成可能.本文正是从持续集成的基本概念入手,通过具体实例,介绍了如何基于 Jenkins 快速搭建持续集成环境. 持续集成概述 什么是持续集成 随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题.尤其是近些年来,敏捷(Agile) 在软件工程领域越来越红火,如何能再不断变

Jenkins持续集成学习及企业级应用

文档声明 该文档主体为去年末自主学习时总结,旨在为我司提供一套企业级持续集成解决方案.这篇文章现在看上去很稚嫩,但是当时花费了许多心血.希望将当时的学习心得拿出来与大家交流.该文档主要说明了jenkins持续集成部署的相关步骤,并着重实现了权限分组,邮件配置,插件配置的jenkins实现过程.对出现的问题进行解决,是一套持续集成的解决方案. 持续集成Continuous integration 提出 针对复杂度高的项目提出“早集成,常集成,频繁集成”来帮助项目在早期发现项目风险和质量问题 作用

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

在前文中,咱们谈到生命周期长短不同的两种分支策略.对于不超过二十人的小团队来说,推荐使用短生命周期的分支策略.Joe的团队在首次发布之前,也一直使用这种方式.然而,首次发布之后,因市场反响非常好,公司决定加大开发投入,希望更快地推出升级平台,以及更多基于平台的游戏. 一.按特性分支的持续集成策略 现在,Joe的团队中,开发人员快速增加,已接近30人了.由于首次发布后的市场压力,大家一直在赶进度,持续集成的失败频率越来越高,修复构建的时间也越来越长,排队等待提交的代码也越积越多."这种状况不能再持

3、Jenkins持续集成之持续集成

3.Jenkins持续集成之持续集成.md 配置ansible实现无密钥交互 安装阿里云YUM源码 [[email protected] ~]# cat <<EOF>>/etc/yum.repos.d/epel.repo [epel] name=epel for aliyun baseurl=https://mirrors.aliyun.com/epel/7/x86_64/ enabled=1 gpgcheck=0 [os] name=os for aliyun baseurl=h

Azure云中Web应用的持续集成实践

由于从事的工作领域关系,目前会或多或少的关注DevOps课题的相关领域,当然目前还在尝试多种适应于持续开发持续集成领域的工具和组合方式,个人粗浅的领会是DevOPS其实既不会只是开发者需要关注的,也是运维人员应该关注的领域,因为未来的IT世界其实是个"相对混合"的空间,发展之快超出想象:在开发测试领域的工具上看,Chef/Puppet/PowerShell DSC,到开源领域广泛应用Salt Stack, Ansible到 Docker生态圈等封装一系列基础架构即代码等概念的涌现,无时

jenkins+svn+android studio自动化构建(持续集成)

先到Jenkins官网的Meet Jekins中看一下Installation部分,原文如下 You have several options for downloading and installing Jenkins: *Use one of the platform-specific package/installer links on the Jenkins site to install Jenkins on your system. *You can download jenkins

建立可持续集成系统(Jenkins)

在软件工程实践中,需要将开发完成的最终产品交付给用户(或发布给测试部门),就需要我们将源代码编译为可执行文件.将各个分别开发的模块集合为一个完整的系统,这个过程成为系统集成,我们用一个系统来描述这个集成过程. 集成系统:输入指定的软件资产,输出根据软件资产生产出的软件产品以及其他副产品的系统. 对于一般系统而言(以VC开发为例),软件的生产过程包括:源码获取,源码检查,源码编译,测试,部署.经历以上几个过程之后得到一个可用的系统. 故一般而言集成系统通常会按照顺序经历以下几个模块组成: 1. 版

ci持续集成(转)

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

Jenkins持续集成实战总结

原文:https://my.oschina.net/CandyDesire/blog/341331#comment-list 持续集成 什么是持续集成 随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题.尤其是近些年来,敏捷(Agile) 在软件工程领域越来越红火,如何能再不断变化的需求中快速适应和保证软件的质量也显得尤其的重要. 持续集成正是针对这一类问题的一种软件开发实践.它倡导团队开发成员必须经常集成他们的工作,甚至每天都