您好,登录后才能下订单哦!
作者:Tony Qu
首先,我们先回顾下过去我们是怎么构建build server的。
大部分人最先想到的肯定是bat还有Windows系统的计划任务,确实,这两个东西在过去谁也离不开谁,bat充当脚本引擎,计划任务充当触发器。但在实际操作中我们发觉bat的能力是有限的,需要很多辅助的工具,因为它没办法像高级语言一样直接访问系统组件,比如需要用vbscript来访问adsi、访问com对象、控制IIS、访问注册表、访问wmi等。通常我们的做法是借助一些辅助命令或工具,比如iis我们可以用系统自带的iisweb.vbs, 操作ADSI也有相应的vbs脚本或者可以自己写一个,但这样以为着你要不停在各种语言中间切换,再加上vbscript和bat的调试并不容易(相对于.NET集成Visual Studio而言),这无形中增加了维护的成本和出错的可能。另外,bat本身没有任何倒退机制,我们必须花大力气构建错误处理机制,接着就是出错了如何退回到原来的状态,这些是非常费时间的。另外有个很大的问题就是bat只适合单机执行,如何及时的获取执行的结果(比如编译是否成功、编译后的版本号),目前比较通行的做法是通过脚本发邮件出来,当然这确实是可行的,但要完全搭建出来确实要费不少人力物力,这也是为什么现在很多公司设立了release engineer/manager职位。
如今越来越多的公司开始上敏捷开发,其中非常重要的一个环节就是持续集成,但事实上很多公司依然使用传统的编译模式,让release engineer专门负责编译的执行,虽然每天会有daily build,但如果是按需编译,都需要专人来完成,而不是由dev自己触发编译动作。传统的编译由于采用了bat,我们不得不登上某台dev, qa, stage server去执行编译和部署脚本,这样在有些时候会带来一些问题,比如允许登录该机器的人数不够,登不进去(通常IT只给2-3个人的上限,因为虚拟机处理能力有限);谁执行了上次编译,带来了哪些问题,没有任何log可查等一系列问题。
接下来我们要请出今天的主角:CuriseControl.NET和NAnt。
CuriseControl.NET,简称CC.NET,由ThoughtWorks公司出品,免费开源软件,主要用于分布式版本发布,这款软件的最大特点是部署方便,可以轻易搭建轻量级Daily Build Server,是中小企业做Build的首选,并且支持各种不同的第三方版本控制和build软件,如svn, vss, nant, msbuild等。同时CC.NET提供了CCTray客户端,可以在远程开发机器上触发Build,也可以实时查看Build的状态,是成功还是失败,这样就解决了Build Server上的权限分配问题,我们不需要给所有的开发Build Server的登录权限,只需要给CC.NET的访问权限就可以了,由于它提供了Windows Service的运行方式,部署就更加方便了(在调试时可以使用控制台方式)。另外,当然CC.NET还有很多细致的功能来协助你完成Build,比如你可以在Build成功或失败时发邮件,可以把build直接部署到codeplex这样的开源技术社区等。总的来说,CC.NET不仅提供了整套的Build部署方案,更多的是Build的管理。
CC.NET不仅提供了服务器端,也提供了客户端,客户端分为web和桌面两种,web版就是CC.NET自带的web dashboard,桌面版则是之前提到过的CCTray,从它的名字不难看出,它就是一个任务栏托盘程序,但有任何的编译会及时通知所有人编译的进展情况,目前最新的版本号等,对于希望部署持续集成的团队来说,绝对是首选,更何况它是免费的。CC.NET还提供了日志机制,能够方便的记录每次编译的细节,并可作为邮件附件发出来,而你要做的不是编写大段大段的脚本,只需要配置一个xml文件就可以了(ccnet.config),稍后我们来学习如何配置这个文件。
以上就是CC.NET的web界面,看起来比较清爽,其中列出了所有编译项目,当然现在我只做了NPOI一个编译项目,如果团队中有多个项目,只需要多建几个Project就行了。web dashboard默认部署在IIS默认网站的ccnet目录下面,在CC.NET安装的时候会自动创建,当然前提是IIS已经安装并能正常工作。
上面这个就是CCTray的界面,这两个界面的区别在于,web dashboard只会列出当前服务器的任务,但CCTray通过配置是可以列出多个CC.NET服务器的任务的,你可以在File->Settings->Build Projects中选择需要监控的编译/部署任务。另外CCTray还有些比较花哨的功能,比如更换不同状态的图标(successful, failed, broken)、用语音触发任务、根据不同状态执行命令、输出x10硬件信号(可接外部设备,如红绿灯)、根据状态播放音频等。
在使用CCNet时最让人头疼的莫过于配置ccnet.config文件,它位于server目录(ccnet子目录之一)下,所有的关于build项目的配置信息都是从这里面读出来的,由于是xml文件,所以首先要保证不能写错标签,其次是不能写当前版本不支持的东西。CCNet发展到现在已经有了1.1, 1.2, 1.3, 1.4, 1.5,每个版本的配置文件都会有所不同,支持的东西也不同,出于这一点有人写了个辅助的工具叫做CCNetConfig,这是一个简单的Winform程序,但是它非常有用,因为它解决了这个最棘手的问题——写ccnet.config。下面就是CCNetConfig的界面,让繁琐的xml配置工作转变成了窗口操作,非常方便,说实话,如果没有这东西让我直接写ccnet.config,这简直就是噩梦。
以上各软件的下载地址如下:
CC.Net下载地址:http://sourceforge.net/projects/ccnet/
CCTray下载地址:http://ccnetlive.thoughtworks.com/ccnet/CCTrayDownload.aspx
CCNetConfig下载地址:http://ccnetconfig.codeplex.com/
接着说NAnt,相对于CC.NET,NAnt则更注重于Build的运行,而非Build的管理。不得不提的是,NAnt是一个半移植半借鉴项目,来源于Java的Ant工具,但是NAnt的很多插件是为微软编程平台特地设计的,比如regasm,所以不能说它是一个完全移植的项目。NAnt虽然只提供了nant.exe一个可执行文件,但是它内部有很多插件,如copy, exec, cvs, zip, tar, unzip, mail, regasm等,这些都是编译时常用的,另外它的脚本引擎系统可以基于xml写执行和编译脚本,功能绝对不亚于我们平时常用的bat或powershell,还有大量的分支逻辑语句,如if, ifnot, foreach, call等,这些绝对是CC.NET目前望尘莫及的。由于使用日渐频繁,开源社区又为Nant提供了一个重要的增加组件——NAnt.Contrib,这个东西说白了其实就是一些自定义的NAnt Task的集合,但确实提供了不少有用的东西,比如支持vb6, msbuild, adsi, depends, ini, sql, svn, vss, registry等任务,在实际应用中这些任务的执行也是不可或缺的,所以在接下来的文章中我会连带介绍Nant.Contrib的使用。
NAnt下载地址:http://nant.sourceforge.net/
NAnt-contrib下载地址:http://nantcontrib.sourceforge.net/
下面是一个最简单Hello World NAnt脚本,我把它取名为helloworld.build。
<?xml version="1.0"?> <project name="NPOI"> <echo message="Hello World!" /> </project>
上面这段代码的意思是显示Hello world!,项目名称叫NPOI。运行结果如下:
C:\Documents and Settings\Administrator>nant -buildfile:c:\scm\buildfiles\hellow orld.build NAnt 0.90 (Build 0.90.3780.0; release; 2010-5-8) Copyright (C) 2001-2010 Gerry Shaw http://nant.sourceforge.net Buildfile: file:///c:/scm/buildfiles/helloworld.build Target framework: Microsoft .NET Framework 2.0 [echo] Hello World! BUILD SUCCEEDED Total time: 0 seconds.
Nant指定build文件时必须使用-buildfile标签,你会看到最后有一句BUILD SUCCESSED,这表示整个build过程中没有任何错误,一旦有错误就会出现BUILD FAILED,整个build会停止,不会继续执行下去。
当然这是最最简单的build文件,复杂的build逻辑可能需要上千行的代码,我们会在接下来的文章中慢慢讲解。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。