持续集成的工具已经是铺天盖地,有商业化的软件,也有开源的软件。覆盖的CI功能也是多种多样。
从功能角度分,就笔者的学习经验而言,最关键的是三类:版本控制工具、构建工具、CI(Continuous integration)服务器。而其中最核心的又是构建工具。其他开源的、与持续集成相关的工具也有很多,但大多数是辅助性的工具。
笔者学习持续集成时所选择的工具为:SVN、Maven、Jenkins。
一、主要工具
(一)、版本控制工具
有时,版本控制又称为配置管理(SCM),所以版本控制工具同时也是配置管理工具。在各类版本控制的开源软件中,最著名的莫过于CVS、SVN(Subversion)、GIT三个了。
这三个工具各有千秋。其中,GIT支持离线工作,更适合开源软件或者开发人员不能集中办公情况下的版本管理工作。同时,SVN和GIT可以配合使用。
SCM工具 |
江湖地位 |
控制方式 |
原子提交 |
并发冲突解决 |
权限管理 |
支持变更范围 |
CVS |
资格最老,但逐渐衰退 |
集中式 |
NO |
排它锁 |
方法有限 |
文件 |
SVN(Subversion) |
CVS的升级,目前较为主流 |
集中式 |
YES |
合并模式(通知冲突) |
支持目录级。通过工具可支持文件级 |
文件、目录 |
GIT |
Eclipse.org上使用最多 |
分布式 |
YES |
合并模式 |
权限配置较为困难 |
文件、目录 |
(二)、构建工具
构建工具是持续集成的核心,它对源代码进行自动化编译、测试、代码检查,以及打包程序、部署(发布)到应用服务器上。从配置管理工具上下载最新源代码后,所有的后续工作几乎都可以通过构建工具完成。
在java开发中,比较有名的构建工具就是Ant、Maven。在PHP开发中,Phing(基于Ant)也比较有名。同样的,Maven也可通过相关的PHP-Maven插件完成对PHP开发构建的支持。
构建工具 |
江湖地位 |
主要特点/优势 |
主要劣势 |
Ant |
老牌的构建工具,目前仍有很强生命力 |
l 自由、灵活 l 应对复杂项目时很有利 l 用法符合一般人的思维习惯 |
l 引入第三方软件框架时, jar包管理比较困难 |
Maven |
与Ant势均力敌 |
l 约定优于配置; l 第三方jar包管理方便 |
l 用法不太符合一般人的思维习惯 l 需要搞懂许多默认约定(比如默认的目录结构) |
(三)、CI服务器
CI服务器的主要作用就是提供一个平台,用于整合版本控制和构建工作,并管理、控制自动化的持续集成。
开源软件中,比较有名的CI服务器包括Jenkins、CruiseControl、Continuum。而比较有名的商业化CI服务器是TeamCity、Bamboo、Pulse等。
CI服务器 |
江湖地位 |
主要优、劣势 |
支持的SCM工具 |
支持的构建工具 |
Jenkins(即原来的Hudson) |
目前最为主流 |
l 基于WEB,操作方便 l 插件众多,支持多种高级功能 |
主要专注于CVS、SVN… |
Maven、ant、shell… |
CruiseControl |
成熟健壮,使用人员较多 |
l 通知技术一流 l 配置、维护较为困难 |
CVS、SVN、VSS、CM Synergy… |
Maven、ant、make、命令行脚本(shell)… |
Continuum |
轻量级CI平台,现在使用较少 |
l 基于WEB,易于安装 l 功能相对不够丰富 l 用户界面难以使用 |
SVN/CVS/Starteam/Clearcase/Perforce… |
Maven、ant、shell… |
二、其他工具
很多工具可以通过与构建工具、CI工具相结合(当然,其中有很多工具也可以单独工作),来完成更多的自动测试、报告生成等工作。根据工具不同,其具体的结合方法也不同,但大体都是通过插件形式进行结合的。例如:
l Maven中通过依赖和plugin方式引入第三方工具
l Jenkins主要通过各类插件引入第三方工具
这些工具种类实在太多,可以根据实际工作需要进行选择。
工具种类 |
主要工具(主要用于java开发) |
单元测试 |
Juint,PHPUnit(for PHP) |
静态代码检查 |
Findbugs、Checkstyle、PMD、 |
测试覆盖统计 |
Cobertura、clover |
负载和性能测试 |
Jmeter |
记录代码质量度量 |
violations |
…… |
…… |