第 1 章
启 程
针对每次变更
构建软件
首先,要掌握基本功。
—Larry Bird(美国职业篮球运动员)
Javaranch.com的创始人Kathy Sierra在她的blog(博客)中写道:“说‘每天吃一个苹果’和实际这么去做是两码事。”这同样适用于以下的软件项目基本实践。您几乎不会听到有人说“测试是没有效果的”、“代码复查是浪费时间”或“经常构建软件是一项不好的实践”。但是这些看起来似乎是基本实践的东西,做起来肯定比说起来要难得多,因为这些实践在实际项目中出现的比例低得可怜。
如果您希望经常进行集成构建,使之成为项目中习惯成自然的事情—包括编译、重新创建数据库、执行自动测试和审查、部署软件并接收反馈信息—那么“持续集成(Continuous Integration,CI)”就对您有所帮助。在本章中,我们将向您展示CI系统中的一些常见特征,而CI系统正是基于这些基本的软件实践。
理解CI的基本知识非常容易,您马上就会将这些软件开发的基本实践整合到您的构建中去。
1.1 针对每次变更构建软件
在看书时,我喜欢先看一个例子,然后再学习这个例子背后的“为什么”,因为我发现例子为我学习“为什么”提供了上下文背景。我们将基于一个典型的实现来描述CI场景。您在以后会看到实现CI系统可以有很多种方法,但这个例子可以让您开始了解一个典型系统中的各个部分。
什么是一次构建
一次构建不止是一次编译(或者是动态语言中的某种称谓)。一次构建可能包含编译、测试、审查和部署以及其他一些事情。一次构建是将源代码放在一起,并验证软件可以作为一个一致的单元运行的过程。
CI场景起始于开发人员向代码库提交源代码。在一个典型的项目中,许多承担不同角色的人员都可以提交变更,触发一次CI循环:开发者修改了源代码、数据库管理员(DBA)修改了表定义、构建和部署团队修改了配置文件,接口团队修改了DTD/XSD规范等。
保持例子更新
在书中包含实例有一项风险,即例子很快就会变得过时,尤其是像CI这样快速发展的领域。为了能够跟上本书出版后出现的一些变化,我们将更新本书的配套网站www.integratebutton.com,那里不仅仅包括CruiseControl和Ant的例子,还包括许多其他CI服务器和工具。
CI场景中的步骤通常是这样的:
1. 首先,一名开发者向版本控制库提交代码。同时,集成构建计算机上的CI服务器正在轮询检查版本控制库中的变更(例如,每过几分钟就检查一次)。
2. 在提交发生之后,CI服务器检测到版本控制库中发生了变更,所以CI服务器会从库中取得最新的代码副本,执行构建脚本,该脚本将对软件进行集成。
3. CI服务器向指定的项目成员发出电子邮件,提供构建结果的反馈信息。
4. CI服务器继续轮询版本控制库中的变更。
图1-1展示了CI系统中的这些组成部分。
下面几个小节将详细描述图1-1中提到的工具和参与人员。
开发人员
当一名开发者根据分配给她的任务进行了所有修改之后,她将执行一次私有构建(这次构建将集成来自项目团队的其他变更),然后将她的变更提交到版本控制库。这一步可以在任何时候发生,不会影响到CI过程的后续步骤。只有当这些变更提交到版本控制库之后,才会开始集成构建。
|
>ant integrate |
通过经常构建尽早发现问题
一旦您将构建过程自动化并可以通过一个命令执行构建之后,就准备好进行CI了。在变更提交到版本控制系统中时,就执行这个自动构建命令。通过这样做,开发团队可以回答以下这类问题:
所有软件组成部分是否能协同工作?
我的代码复杂程度如何?
开发团队是否坚持了已制定的编码标准?
自动测试覆盖了多少代码?
在最后一次变更之后,是否成功地通过了所有测试?
应用程序是否仍然满足性能需求?
最近的开发是否存在问题?
软件在最近的变更之后是否能够成功“构建”,知道这一点是很有价值的,但知道软件可以“正确”构建是无价的,因为缺陷肯定会在某个时候溜进代码之中,您之所以希望“持续”地构建,就是为了得到快速的反馈,这样就能在开发生命周期中找到并修正问题。
在成功地执行了私有构建之后,您就可以将新文件和修改后的文件签入版本控制库。大部分版本控制系统都提供了一些简单的命令来执行这些过程,代码清单1-2展示了Subversion所使用的命令。
代码清单1-2 向Subversion库提交变更
>svn commit -m "Added CRUD capabilities to DAO" |
也可以利用集成开发环境(Intergated Development Environment,IDE)执行构建脚本并向版本控制库提交变更。只是要保证您可以从命令行执行这些命令,这样不致于对IDE或版本控制系统产生不可分离的依赖关系。
版本控制库
简而言之,您必须利用一个版本控制库来执行CI。实际上,即使您不执行CI,版本控制库也应该是项目的标准配置。版本控制库的目的是通过一个受控的访问库来管理源代码和其他软件资产(如文档)的变更。这为您提供了一个“单一源代码位置”,这样所有代码都可以从一个权威渠道得到。版本控制库让您能够沿着时间回溯,取得源代码和其他文件的不同版本。
针对版本控制库中的主线版本(如CVS和Subversion这样的系统中的Head/Trunk)运行CI。您可以使用不同类型的版本控制系统。我们在这本书的大部分例子中使用Subversion,因为它的特征集不错,而且是免费的。其他软件配置管理(SCM)/版本控制工具还有CVS、Perforce、PVCS、ClearCase、MKS和Visual SourceSafe。要了解软件配置管理的有效技术,请阅读Stephen Berczuk和Brad Appleton的著作《Software Configuration Management Patterns》。
CI服务器
CI服务器在变更提交到版本控制库之后执行集成构建。通常您需要对CI服务器进行配置,让它每隔几分钟或一段时间就检查版本控制库中的变更。CI服务器将取出所有源文件并运行构建脚本。CI服务器也可以配置成按一定的频度进行构建,如每个小时进行一次(请注意,这不是CI)。另外,CI服务器通常提供一个方便的显示板,显示构建的结果。虽然我们推荐使用CI服务器,但它却不是进行持续集成所必需的。您可以编写自己定制的脚本。而且,您也可以在版本控制库发生变更时,手工执行集成构建。利用CI服务器可以减少定制脚本的数量,否则您就需要写这些脚本。许多CI服务器是免费且开源的。代码清单1-3展示了通过CriseControl的config.xml来轮询Subversion库中的变更的例子。
代码清单1-3 CruiseControl config.xml轮询Subversion库
|
|
构建脚本
构建脚本是一段简单的脚本或一组脚本,您利用它来编译、测试、审查和部署软件。您可以使用构建脚本而不实现CI系统。Ant、NAnt、make、MSBuild和Rake都是构建工具,它们可以将构建过程自动化,但它们本身并不提供CI。某些人可能利用IDE和构建软件,但是,由于CI是一个“无人执守”的过程,只使用基于IDE的构建方式不能够适应CI的要求。换句话说,只要您脱离IDE也能执行同样的构建,那么使用IDE进行构建就没有什么不妥。代码清单1-4展示了一段Ant脚本的例子,一般来说,它执行的动作是私有构建的一部分工作。
代码清单1-4 执行构建的一段Ant脚本
反馈机制
CI的一个关键目标就是要提供集成构建的反馈信息,因为您需要尽快知道最近一次构建是否存在问题。如果立即得知这些信息,您就可以很快地修复问题。图1-3展示了作为反馈机制的一封电子邮件。我们在第9章中将介绍更多的反馈机制。其他反馈机制包括“短信息服务(Short Message Service,SMS)”和“真简单同步(Really Simple Syndication,RSS)”。
代码清单1-5包含了一个使用CruiseControl CI服务器向项目成员发送电子邮件的例子。
代码清单1-5 CruiseControl config.xml配置为发送电子邮件
|
|
集成构建计算机
集成构建计算机是一台独立的计算机,它的任务就是对软件进行集成。集成构建计算机上运行着CI服务器,CI服务器对版本控制库进行轮询。
| 回书目 上一节 下一节 |
|
· 上周Linux系统命令的使.. · 上周真题冲刺测试获奖.. · 全国计算机等考四级模.. · 08年3月各大网上书店及.. · 网络工程师模拟测试获.. · 全国计算机软考考试指.. |
· 3月24日WCF聊天活动 积.. · 全国计算机等级考试四.. · 软件项目估计:第2版 · 系统分析师基础知识自.. · 构建可扩展的Web站点的.. · 2008年全国计算机等级.. |
|
||||
| · 技术人求职简历完备手册 · 华为员工自杀频频拷问.. · 视频访谈:网管员如何踏.. · 首届中国IT工程师生态.. · 思科全球CEO钱伯斯第七.. · 北漂技术人90天求职纪实 · 2007年互联网大会 · 龙芯要做中国的“奔腾” |
· IPv6协议--拓展网络无.. · 国际文档格式标准开战 · 微软出价446亿美元收购.. · 贝恩资本携手华为22亿.. · Linux——从菜鸟到高手 · SOA 面向服务架构 · 2008年4月全国计算机等.. · 微软Forefront企业安全.. |
|||
|
||||
| · SQL Server 2008/2005.. · SOA 面向服务架构 · SQL Server 2008/2005.. · iSCSI应用与发展 · RAID——磁盘阵列基础 · 中间件应用技术专题 · SQL Server入门到精通 · 病毒查杀专题 |
· 国际文档格式标准开战 · 路由器设置与口令恢复 · Linux防火墙 · 打造安全服务器 · SOA 面向服务架构 · PHP开发应用手册 · ADSL应用面面俱到 · 入侵防护系统(IPS)初探 |
|||
|
||||
| · iSCSI应用与发展 · 中间件应用技术专题 · SQL Server入门到精通 · SQL Server 2008/2005.. · SOA 面向服务架构 · iSCSI应用与发展 · RAID——磁盘阵列基础 · 病毒查杀专题 |
· 路由器设置与口令恢复 · SOA 面向服务架构 · 了解统一威胁管理(UTM).. · ADSL应用面面俱到 · ADSL应用面面俱到 · PHP开发应用手册 · 中间件应用技术专题 · Linux防火墙 |
|||