另一种持续集成策略——延迟提交

标签: 持续集成 Git TeamCity | 发表时间:2012-10-12 17:57 | 作者:juvenxu
出处:http://www.juvenxu.com

常见的持续集成策略是这样的:开发人员修改本地,然后执行本地构建,如果本地构建通过则提交变更至源码服务器。当然提交的时候可能遇到冲突需要合并,那么合并完成后需要再次执行本地构建并确保其通过。

在这种传统的策略下,开发人员执行本地构建是必须的,这样很多问题就能在本地得到快速的反馈,并且不会干扰其他开发人员的工作。试想一下,如果每个开发人员每天提交一次破坏构建的变更到源码服务器,7个人的团队一天就是7次,那持续集成服务器一天的状态几乎都是红色了。事实上,即使所有人都执行本地构建,持续集成服务器有时候还是会出问题,这些问题主要是由开发机器和持续集成机器的环境不一致引起的,当然,一般来说出现这样问题的几率不会太高。

现在,假如因为某些原因,开发人员没有在执行本地构建就直接提交变更到源码服务器了,这时面对千疮百孔的持续集成服务器状态我们应该如何面对?

开发人员不执行本地构建的因素可以有很多,例如:

  • 构建规模太大,本地构建需要等待的时间太长。
  • 项目规模比较大,不是所有开发人员都能很好地遵守这个习惯。
  • 本地缺乏必要的构建环境。

理想情况下我们应该解决根本的问题,例如让开发机器的环境和持续集成机器的环境一致、让集成的时间变短、培训大家有持续集成的意识等等。下面我要说的是,当上述问题不能够得以简单解决的时候,可以考虑的另一种持续集成测试,那就是延迟提交。

简单来说,延迟提交就是让代码变更在被提交进源码仓库之前,先由持续集成服务器执行一次单独的构建,只有在这次构建成功之后,才让代码变更真正的进入源码仓库,进行真正的集成。

这么做相当于把本地构建的工作转移给持续集成服务器,但不论如何,变更进入源码仓库之前都需要一层构建保障。延迟构建如何实现呢?基本上有这么两种方式:

  1. 把变更集直接发送给持续集成服务器,持续集成服务器为其执行一次单独构建,构建成功后把变更集提交进源码仓库。
  2. 开发人员提交代码至一个单独的源码分支,持续集成服务器监视该分支,发现有变更则执行单独构建,构建成功后把变更合并到主干分支。(合并可以由持续集成服务器自动完成或者由开发人员手动完成)

下面让我们以TeamCity和Git为例来看一下如何实现第二种方式。(之所以不使用更流行的Jenkins而是用TeamCity是因为我发现TeamCity对延迟提交的支持更好,详见  http://www.jetbrains.com/teamcity/features/delayed_commit.html 。)

首先,除了Git的master分支,我们还需要一个单独的分支来做延迟提交:

delayed_commit_1.png

起名为 remote-run/exp1 是为了符合TeamCity的命名规范,TeamCity有一个名为  Branch Remote Run Trigger 的东西监视特定的 Git 分支,而它默认的模式就是 remote-run/* :

delayed_commit_2.png

当我修改 remote-run/exp1 分支的内容,例如破坏了构建,这时显然不会对 master 产生任何影响,因此一般人查看TeamCity页面的时候不会看到任何变化。然而,当我自己以用户 juven 登陆 TeamCity (我的Git提交 username 也是 juven ),就能从 MyChanges 页面看到一个失败的构建:

delayed_commit_3.png

从图中能看到这次构建是基于 exp1 分支的,点击页面中的其他链接我能得到进一步的信息,例如文件变更diff,构建日志等等,这都能帮助我分析构建失败的原因。上图中给我们还能看到另一次名为 fixed 的构建,其对应的颜色是绿色,那是我之后又在 exp1 分支进行了提交,这次提交修复了构建。

最后,在确认我的几次变更没有问题之后,我可以安心的把这些变更合并到 master 分支:

delayed_commit_4.png

这会触发 master 分支的集成,这个时候的集成当然也非常安全了。当然这样的合并大部分事件持续集成服务器应该也能完成,虽然目前 TeamCity 不支持,但也 在计划中了

整个过程其实也不复杂,当然这里有个前提,就是持续集成服务器需要提供很多能够执行单独构建的 Agent ,如何自动化管理这些 Agent ,让它们的环境保持一致,这不是简单的事情。TeamCity 服务器其实只是个调度器,具体的构建工作都交由 Agent 完成,这一点,换成 Jenkins 也是差不多的原理。

除了这种用单独分支的方式,我们也可以直接发送变更集给持续集成服务器,TeamCity 的实现方式使用 IDE 插件,具体信息可以参考 TeamCity 的维基页面

其实有了像 Git 这样创建分支特别容易的版本控制工具,在 Jenkins 上用第一种方式实现延迟提交也不会比用 TeamCity 困难到哪里去,但我还是比较惊讶于 TeamCity 的易用性,这一改了我以前对商业工具软件的偏执看法,当然,这也就是不是本文所讨论的范畴了。

最后要提的是,如果你的项目不大,代码不是特别多,人员不是特别多,基本用不到延迟提交,应该把关注点放在快速集成、保持开发环境与击穿环境一致、以及良好的开发习惯上面。

相关 [持续集成 策略 延迟] 推荐:

另一种持续集成策略——延迟提交

- - Juven Xu
常见的持续集成策略是这样的:开发人员修改本地,然后执行本地构建,如果本地构建通过则提交变更至源码服务器. 当然提交的时候可能遇到冲突需要合并,那么合并完成后需要再次执行本地构建并确保其通过. 在这种传统的策略下,开发人员执行本地构建是必须的,这样很多问题就能在本地得到快速的反馈,并且不会干扰其他开发人员的工作.

持续集成将死

- - 透明思考
在思考“ 云时代的研发环境长什么样”这个问题的时候,我逐渐意识到一件很重要的事. 2000年首次被提出、在过去十几年中我们习以为常的敏捷核心实践 持续集成,很可能正在走到它生命周期的尾声. 让我们来回顾一下Martin Fowler在他那篇 著名的文章里如何描述持续集成这个过程:. 一旦完成了修改,我就会在自己的计算机上启动一个自动化build.

基于Jenkins的持续集成

- - ITeye博客
Jenkins是一个持续集成工具,前身叫做Hudson,在实际项目应用中非常重要,本文介绍这一工具的使用方法. 首先我们访问Jenkins的网站:. Jenkins 的网址是: http://jenkins-ci.org/. 从网站下载Jenkins: http://mirrors.jenkins-ci.org/war/latest/jenkins.war.

持续集成入门实践

- - Java - 编程语言 - ITeye博客
      在软件开发过程中,团队成员需要经常性的进行集成,以便于更早的发现集成过程中的错误. 每次集成都通过自动化的构建(编译、测试、发布)来发现集成过程中的错误. 在软件开发团队中通常使用SVN作为源码管理工具(类似的有CVS),使用Ant作为自动构建工具(类似的如同Maven),可以使用Hudson作为持续集成(CI,Continuous integration)服务器.

使用 Subversion、Hudson 和 Eclipse 构建持续集成系统

- - 博客 - 伯乐在线
来源: developerWorks. 持续集成系统是指持续地编译、测试、检查和部署源代码的系统. Martin Fowler 对持续集成是这样定义的 :. 持续集成是一种软件开发实践,团队开发成员经常集成它们的工作,通常每个成员每天可能会发生多次集成. 每次集成都通过自动化的构建(包括编译、发布、自动化测试)来验证,从而尽快地发现集成错误.

Flash持续集成自动化单元测试

- - 百度泛用户体验
本文关注于宏观上的CI和单元测试技术,某些技术上的具体细节会略过,更多细节请参考最后部分的“参考资料”及文中的链接. 本文包括:持续集成、单元测试、Mock技术、Case选取策略和示例等五部分. CI是一种实践,旨在缓和和稳固软件的构建过程,能够应对如下挑战:. 持续自动的构建测试( 本篇文章的重点所在).

GitHub已将持续集成服务器Janky开源

- - InfoQ cn
GitHub已将 Janky开源,这是他们构建在 Jenkins之上的持续集成服务器,并在其中增加了聊天自动化工具 Hubot. 除了一般的Jenkins功能之外,Janky还通过 Hubot对功能进行了补充,Hubot是GitHub两个月之前开源的另一个项目. Hubot会监控聊天对话,并基于一些参与者相互交换的词语做出响应.

Jenkins: 使用Jenkins搭建持续集成(CI)环境

- - CSDN博客研发管理推荐文章
首先从官网 http://jenkins-ci.org/下载 Java Web Archive (.war). 例如我保存到 D:\jenkins\jenkins.war. 运行Jenkins需要JRE的支持Java5 or later. 默认会运行在8080端口,正常启动完成如下图. 我们可以在浏览器输入127.0.0.1:8080来查看,如图我们的Jenkins已经跑起来了.

Google App Engine通过Jenkins增加了持续集成支持

- - InfoQ cn
由于与云软件提供商CloudBees的合作关系,现在Google App Engine用户可以使用持续集成工具Jenkins来构建、测试与部署其云应用了. 该新服务(通过托管的CloudBees. DEV@Cloud产品来提供)延续了PaaS的趋势——提供了持续集成工具,可以连接到主流的源码控制仓库上.

Jenkins+Maven进行Java项目持续集成

- - CSDN博客研发管理推荐文章
最近配置了Jenkins服务器,记录下基本过程. (当然还遇到了若干小问题,兵来将挡水来土掩就是了). 从Jenkins官网下载jenkins.war文件. 官网地址:http://jenkins-ci.org/,注意选择最新版本的Long-Term Support Release. 把war文件部署到Tomcat中.