持续集成工具选型报告
持续集成工具选型报告
1 引言
1.1 什么是持续集成
随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题。尤其是近些年来,敏捷(Agile) 在软件工程领域越来越红火,如何能再不断变化的需求中快速适应和保证软件的质量也显得尤其的重要。
持续集成(Continuous integration)正是针对这一类问题的一种软件开发实践。它倡导团队开发成员必须经常集成他们的工作,甚至每天都可能发生多次集成。而每次的集成都是通过自动化的构建来验证,包括自动编译、发布和测试,从而尽快地发现集成错误,让团队能够更快的开发内聚的软件。
1.2 持续集成的价值
1) 持续集成中的任何一个环节都是自动完成的,无需太多的人工干预,有利于减少重复过程以节
省时间、费用和工作量;
2) 持续集成保障了每个时间点上团队成员提交的代码是能成功集成的。换言之,任何时间点都能
第一时间发现软件的集成问题,使任意时间发布可部署的软件成为了可能;
3) 持续集成还能利于软件本身的发展趋势,这点在需求不明确或是频繁性变更的情景中尤其重
要,持续集成的质量能帮助团队进行有效决策,同时建立团队对开发产品的信心。
持续集成属于集成测试中的一部分。持续集成的目的不是为了发现更多的BUG,而是为了更早的发现BUG。持续集成是高频度的集成,集成过程是不断的将新增的代码纳入集成中,及时发现新增的代码是否对现有的代码产生冲突(编译冲突:编译链接是否存在问题;运行冲突:原有的单元测试是否存在问题等等)。并采用一系列措施和规范,确保冲突尽早的将影响消除,高效快捷的保证系统的稳步前进。
1.3 持续集成的原则
业界普遍认同的持续集成的原则包括:
1) 需要版本控制软件保障团队成员提交的代码不会导致集成失败。常用的版本控制软件有 IBM
Rational ClearCase、CVS、Subversion 等;
2) 开发人员必须及时向版本控制库中提交代码,也必须经常性地从版本控制库中更新代码到本
地;
3) 需要有专门的集成服务器来执行集成构建。根据项目的具体实际,集成构建可以被软件的修改
来直接触发,也可以定时启动,如每半个小时构建一次;
4) 必须保证构建的成功。如果构建失败,修复构建过程中的错误是优先级最高的工作。一旦修复,(Rev.B-20080829) 2013-04-171(12)
持续集成工具选型报告
需要手动启动一次构建。
1.4 持续集成系统的组成
一个完整的构建系统必须包括:
1) 一个自动构建过程,包括自动编译、分发、部署和测试等。 我们已先期搭建了自动编译环境,
针对试点项目编写了自动编译脚本。
2) 一个代码存储库,即需要版本控制软件来保障代码的可维护性,同时作为构建过程的素材库。
对于宽带产品部来说,目前我们使用subversion来管理代码库,并先期已要求所有源代码需上传到代码库中。
3) 一个持续集成服务器。我们本次选型的对象正是持续集成服务器软件。
1.5 持续集成系统的工作原理
持续集成由于要求高频度以及自动化,所以一般采用持续集成服务器软件来实现。持续集成服务器软件的工作原理比较简单。它就像一个监视着源代码配置库的监视器,每次源代码配置库中有新的提交,服务器就会自动检出源代码并启动一次构建任务,并且把构建任务的结果记录下来并通知相关人员。简明扼要的说,持续集成软件本质就是一个定时调度器。
(Rev.B-20080829) 2013-04-172(12)
持续集成工具选型报告
2 持续集成工具介绍
CI Server在本质上就是一个定时调度器。我们配置一系列的项目,然后设定一个定时器,让它(Rev.B-20080829) 2013-04-173(12)
持续集成工具选型报告
干一些活,然后通知大家。而我们除了基本的编译和通知功能以外,我们还有很多其它的需求,在我们公司里,选择CI Server主要考虑以下几点:
?
?
?
?
?
?
?
? 首选免费和开源的,便于功能扩展和二次开发 需要同时兼容Windows和Linux两种操作系统 支持基于bat和shell脚本的集成 必须与现行的配置管理工具subversion无缝集成 具有一定的安全性和可靠性,要能进行权限配置 便于与其他工具的集成,如单元测试、自动测试工具 能够对历史数据进行统计和分析,并出具分析报告 便于安装、部署与维护
针对以上几点要求,我们对目前主流的CI Server进行了初步筛选,圈定了Cruise Control、Jenkins和
2.1 Cruise Control
CruiseControl是CI Server的老者,诞生已是多年,在许多方面,CruiseControl服务器已经成为持续集成实践的同义词。而现在,CruiseControl已发展成为一个家族式系统,包括CruiseControl.java、CruiseControl.net、CruiseControl.ruby等适应不同语言环境的实现。但可惜的是目前没有专门针对嵌入式C语言的版本。
官方地址:/
2.2 Jenkins(Hundson)
Jenkins原名Hudson,是CI Server的后起之秀,目前恐怕是使用最多的一个CI Server了。Jenkins 是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上。同时 Jenkins 能实施监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性。
官方地址:http://jenkins-ci.org/
2.3 Apache Continuum
Continuum 是最新的 CI 服务器之一,也是值得关注的一个新进入者。Continuum 的安装和配置很简单:只要下载和释放 ZIP 文件,运行命令行程序,就可以运行了。基于 Web 的界面使得配置项目很容易。而且,还不需要安装 Web 服务器,因为 Continuum 内置了 Jetty Web 服务器。并且,Continuum 可以作为 Windows 服务运行,还在应用程序的某些部分嵌入了上下文敏感的文档,从而提供了很多帮助。
官方地址:/
(Rev.B-20080829) 2013-04-174(12)
持续集成工具选型报告
3 三种持续集成工具对比
通过以上的对比,可以发现Jenkins从中脱颖而出,其各方面指标均达到了我们的要求。接下来需要下载、安装和部署Jenkins来进行试用。
4 Jenkins试用
4.1 下载
通过如下地址,可下载到Jenkins最新的版本和源代码。 Windows版:/windows/latest Opensuse Linux版:/opensuse/ 源代码:https://github.com/jenkinsci/jenkins/
4.2 安装和部署
在Windows编译服务器上,安装Jenkins有两种方式:
1. 自行安装JDK和Java Web服务器(如Tomcat),然后下载打包后的.war文件,并将war
包部署到Web服务器下。
2. 直接下载windows安装版本,通过安装程序安装完成后,Jenkins会自动以windows服务
的形式启动并运行。
两种安装方式均很方便,安装完成后打开浏览器地址,我们看到了Jenkins的主页面:
(Rev.B-20080829) 2013-04-175(12)
持续集成工具选型报告
可以看到,Jenkins已经进行了部分本地化的工作,对中文的支持很好。
4.3 新建项目
接下来新建项目:
源代码管理,选择subversion,在Jenkins默认安装下已经自动安装了subversion的访问插件。 (Rev.B-20080829) 2013-04-176(12)
持续集成工具选型报告
接下来设置触发器,“Poll SCM”表示对SCM进行定期轮询,我们设置每隔1小时自动对SVN进行一次轮询,如有有代码更新,则执行构建。
由于GPON OLT线卡部分目前已有一套完备的代码及自动编译脚本,因此我们选择使用该项目进行试用。这里的构建,我们需要Jenkins自动执行bat批处理文件,选择第一项“Excute Windows Batch command”即可。同时我们可以看到,Jenkins还支持Linux下的shell脚本、Ant脚本和Maven脚本。
最后,在构建后操作选择中勾选“E-mail Notification”,可使Jenkins在编译失败后发生不稳定的编译时向特定的地址发送邮件通知。
4.4 参数配置
进入Jenkins的系统管理,可以看到其所有的可配置选项:
(Rev.B-20080829) 2013-04-177(12)
持续集成工具选型报告
进入“系统配置”,可对Jenkins进行全局参数的设置。
如权限设置,我们可通过如下的设置完成:
通过以上设置后,匿名用户将只能查看轮询和编译结果,只有系统管理员admin才能进行配置、(Rev.B-20080829) 2013-04-178(12)
持续集成工具选型报告
维护等操作。
4.5 插件管理
通过Jenkins强大的插件管理功能,可以使其适应多种不同的执行环境。Jenkins的插件安装可以采用自动下载安装和手动下载,因自动编译服务器无法直接访问外网,我们采用手工下载方式,安装了针对邮件发送和批处理执行的两个插件。
插件安装后我们可以发现,在系统配置中可以编辑邮件的内容:
插件资源地址:https:///display/JENKINS/Plugins
4.6 运行监控
接下来,我们对GPON OLT线卡项目进行了为期三天的运行监控,结果如下:
在采用每小时轮询的情况下,该项目在20xx年12月21日至23日的三天时间里,持续集成编(Rev.B-20080829) 2013-04-179(12)
持续集成工具选型报告
译得到了 12个版本。每个版本的SVN日志记录可以在“变更集”中查看到。
4.7 Linux下的部署和试用
接下来在OpenSuse Linux环境下部署和试用Jenkins。
这次我们直接使用war包的方式,手动部署。需要安装如下内容:
?
? JDK,我们找到对应的64位的JDK,下载后安装(jdk-6u30-linux-x64.bin); 运行容器,我们选择Apache Tomcat,下载后解压(apache-tomcat-6.0.35.tar.gz); 安装和部署完毕后,将jenkins.war拷贝到Tomcat的webapps目录下,然后启动tomcat。
至此,我们完成了Linux下Jenkins的安装和部署。
接下来我们使用AN5516-01-b项目作为测试项目,对其进行持续集成的试用。
访问地址如下: http://10.90.25.18:8080/jenkins/
5 试用结果
经过Windows和OpenSuse Linux下的使用,对照之前提出的选型原则,我们得到如下结果: ? 首选免费和开源的,便于功能扩展和二次开发
Jenkins为免费和开源系统,可从其官方提供的地址下载到源代码。
? 需要同时兼容Windows和Linux两种操作系统
经过WindowsServer2008和OpenSuse Linux下的试用,可确认Jenkins对这两种操作系统均可兼容。
? 支持基于bat和shell脚本的集成
通过试用,我们分别在两个项目中使用bat和shell脚本进行集成,均和正常执行。
(Rev.B-20080829) 2013-04-1710(12)
持续集成工具选型报告
? 必须与现行的配置管理工具subversion无缝集成
Jenkins默认配置下,以通过SVNkit接口提供了对subversion的无缝集成,并支持对subversion的定时轮询检查、日志抓取等功能。
? 具有一定的安全性和可靠性,要能进行权限配置
通过配置,Jenkins可对访问用户进行权限控制,使匿名用户只能查看,而只有管理员才具有配置的权限。
如果需要更复杂的用户权限配置,可通过安装相应的用户管理插件来实现。
? 便于与其他工具的集成,如单元测试、自动测试工具
目前Jenkins支持主流的Ant和Maven的集成,而对于嵌入式开发,由于本身的测试和集成工具比较少,Jenkins无法直接提供集成的接口。而其他持续集成工具也大多只能与这两种工具进行集成。
但我们仍然可以通过bat和shell脚本,来调用其他工具。如:与代码工具的集成。有两种方案:
1. 将代码检查的功能制作命令行模式,然后使用subversion的钩子技术在开发人员每次
提交时自动检查代码,如存在不符合项,可阻止其提交代码;
2. 将代码检查和统计工具制作成命令行模式,然后在编译脚本中调用该工具,进行代码
检查和统计,并将检查和统计结果以文件的形式输出。
? 能够对历史数据进行统计和分析,并出具分析报告
Jenkins默认安装后提供的统计和分析功能比较少,但可通过安装适合的插件来使用各种统计和分析:
? 便于安装、部署与维护
(Rev.B-20080829) 2013-04-1711(12)
持续集成工具选型报告
通过试用,我们发现Jenkins的安装和部署相当方便,同时可通过web界面进行维护。
6 试用中发现的问题
我们暂时只在Windows下对Jenkins进行了试用,Linux的版本将在后续跟进。在试用过程中,发现的问题主要有如下几点:
1.调用bat批处理文件执行编译时,如果执行过程中因代码或其他原因造成异常退出,编译异常中止时,Jenkins无法准确获知执行结果,仍然显示构建成功。需要探索其他方式来确定编译结果,如让Jenkins检查bin文件是否生成等。
2.在Windows中部署的Jenkins执行bat批处理文件的耗时明显偏长,如直接执行bat耗时5分钟,在Jenkins中调用执行则需要耗费大概30分钟。而Linux下部署的Jenkins确很正常。经过分析,我们认为可能与window版本的Jenkins采用windows服务方式运行有关。后续我们正式搭建Jenkins时,可统一采用JDK+Tomcat+Jenkins.war的方式。
3.为了便于Jenkins对代码库进行轮询检查,应将代码集中管理。如果代码分散在SVN的各个不同路径下,将难以进行配置。
4.和shell脚本中要使用相对路径。
7 选型结论
综上所述,经过短期的试用,Jenkins在安全性、扩展性、稳定性和兼容性方面均满足了我们的要求,且Jenkins是全免费的开源软件,还提供大量插件对其功能进行扩展,为后续的二次开发和功能扩展提供了良好的基础。因此推荐采用 Jenkins作为部门的持续集成服务器。但在使用过程中我们仍然发现了一些小的问题,还需要继续摸索和解决。
欲了解Jankins的更多内容,请访问如下地址: http://10.90.25.17:8080 (Windows) http://10.90.25.18:8080/jenkins (Linux)
(Rev.B-20080829) 2013-04-1712(12)