作者: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。
上面这段代码的意思是显示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逻辑可能需要上千行的代码,我们会在接下来的文章中慢慢讲解。