每日构建
最近我们的团队需要搭建一个C#项目的持续集成的环境(WEB程序),这一光荣的任务落入我手中。通过几天折腾,总算弄得基本功能可以跑通,记下来,供以后有需要的弟兄参考。
依照顺序逐一写下
基本要求:用CruiseControl.net+Nant+Nunit来构建这个可持续集成的环境,
一、先介绍下这都是些什么物件:)
CruiseControl.NET : 是.net平台下,一个开源的自动化持续集成工具(简称ccnet)。
它是一个程序套件,但其核心是一个叫做CruiseControl.NET Server的自动集成服务器. 通过直接监视源代码管理仓库,CruiseControl.NET使集成过程得以自动化。开发员每提交一组新的更新,CruiseControl.NET Server就会自动运行集成构造,以验证新的更新。当构造完成以后,Server将会通知开发员,提交的更改是否成功通过集成。服务正常启动后如下图(A-1)
(A-1)
既然是套件这里还有两个程序不得不提,就是web Dashbord和CCTray
Web Dashboard : 一个.net Web应用,为开发团队提供一个CruiseControl.NET工程的状态和详细观察视图,包括总个Build的详细历史记录。如下图:(A-2)
(A-2)
CCTray :一个客户端的托盘程序,允许你从网络中的任何一台电脑上,以“快速浏览”的方式了解CruiseControl.NET工程情况(休眠中,正在获取代码,正在编译)。如下图(A-3)
(A-3)
Nant: 是一项开源的项目,利用NAnt,你可以方便快捷地对自己.NET项目或解决方案进行自动构建。与VS中可视化化极强的项目和解决方案管理相比,NAnt只能命令行的方式操作,但是这并不影响Nant的流行。NAnt可以根据我们的需要,帮我们自动构建项目,比如创建文件夹,移动文件,运行指定的程序等等,这些都是VS无法办到的。
Nunit: .NET 框架生成的开放源代码单元测试框架。NUnit 使您可以用您喜欢的语言编写测试,从而测试应用程序的特定功能。大家都非常熟悉,不多做介绍。
二、开始搭建
似乎所有工作量都在集中在CruiseControl.NET\server\的ccnet.config文件中,稍会我们详细介绍它的配置。先简单所安装这些程序套件的参数;
1、安装各需要软件,假设版本如下:
CruiseControl.NET-1.3、CruiseControl.NET-CCTray-1.3、NUnit-2.2.7-net-2.0、svn-1.4.5、nant-0.85
安装过程中似乎没什么特别设置之处,一路Next就成,我们把它们都在D:\Program Files下然后跟上各自带的路径,那么路径分别如下
CruiseControl.NET: D:\Program Files\CruiseControl.NET\
CruiseControl.NET-CCTray: D:\Program Files\CCTray\
NUnit: D:\Program Files\NUnit-Net-2.0 2.2.7\
Svn: D:\Program Files\Subversion\
Nant: D:\Program Files\Nant\
好,完成以上步骤之后,我们进入最关键的环节,配置ccNet Server目录下的ccnet.config文件,内容如下
<cruisecontrol>
<!--为你当前项目的名称,将来在web Dashboard,CCtry中的projectName都将使用此名称,所以不可乱取。-->
<project name="XXX" >
<!--这个标签设置,格式为yyyy.mm.dd.build。以前在用VSS的代码管理中每次打包都会在每个文件中打上一个标签,这里只是标签类型不同而已,估计在SVN管理中也是这功能吧,不过我没找到(仅供参考)-->
<labeller type="dateLabeller" />
<!--下面是指定了一个工作目录,意图就是为其它block所用,及其它相关的block可以用相对路径的形式来工作-->
<workingDirectory>D:\XXX6.5.0\XXX</workingDirectory>
<!--下面是指定了一个记录日志文件的目录,和上面的block功能相似就要为日志文件的存放定义了一个当前目录
如下面的Nunit block的outPutfile属性,以及BuildLog-->
<artifactDirectory>D:\XXX6.5.0\XXX\artifactDirectory</artifactDirectory>
<category>Library Category</category>
<!--这个URL给CCTray和email用的,你添上你项目在Dashboard中的路径就可以了,主要方便查看Build的信息-->
<webURL>http://localhost/ccnet/ViewFarmReport.aspx</webURL>
<!--这个时间是控制代码last check in和开始build的时间,文档上举了个例子,比如说这个值设为10,代码7秒前check进来的,就sleep3秒后再build。文档上还说了,这个元素不用也可以,这是因为某些CVS不支持什么什么什么而存在的,默认值为0-->
<modificationDelaySeconds>20</modificationDelaySeconds>
<!--<multiTrigger operator="And">
-->
<!--<triggers>
<intervalTrigger seconds="20"/>
<filteredTrigger startTime="23:30" endTime="23:45" />
</triggers>-->
<!--触发器主要分Filter Trigger,Interval Trigger,Multiple Trigger,Project Trigger,Schedule Trigger,Url Trigger可以看出下面我们用的是scheduleTrigger-->
<triggers>
<!--一看便知,计划好在每个星期1的13:32自动获取编译一次。-->
<scheduleTrigger time="13:32" buildCondition="ForceBuild" name="Scheduled">
<weekDays>
<weekDay>Monday</weekDay>
</weekDays>
</scheduleTrigger>
</triggers>
<!--<sourcecontrol type="nullSourceControl" />-->
<!--state type="yourStateManagerType" ..=""/-->
<!--代码管理块当然可以有多种如VSS,SVN,CVS....下面用的是SVN-->
<sourcecontrol type="svn" autoGetSource="true">
<!--服务器的工作目录-->
<trunkUrl>http://cvs-server:8001/svn/projects/XXX/XXX.dev/trunk</trunkUrl>
<!--本地工作目录可以设定为".\"-->
<workingDirectory>D:\XXX6.5.0\XXX</workingDirectory>
<!--SVN的安装程序的路径,注意与前面我们安装的Subversion对应起来(这个路径知必是Subversion的程序而不是什么tortoise svn,因为有可能
我们的SVN服务器和这个CCNet并不是同一台电脑所以我们还需要安装这个SVN服务器软件,而不是客户端)-->
<executable>D:\Program Files\Subversion\bin\svn.exe</executable>
<username>username</username>
<password>password</password>
<webUrlBuilder type="websvn">
<url>http://MachineName/web/default.aspx</url>
</webUrlBuilder>
</sourcecontrol>
<!--<prebuild>
<yourFirstPrebuildTask ..=""/>
<yourOtherPrebuildTask ..=""/>
</prebuild-->
<tasks>
<!--简单的项目的Build我们就可以用Visual Studio Task来完成,如下。而更为复杂的我们则再考虑使用Nant或者是MsBuild-->
<devenv>
<solutionfile>D:\XXX6.5.0\XXX\XXX.sln</solutionfile>
<configuration>Debug</configuration>
<buildtype>Build</buildtype>
<executable>d:\Program Files\Microsoft Visual Studio 8\Common7\IDE\devenv.com</executable>
</devenv>
<!--NUnit都比较熟悉,注意路径和前面的对应-->
<nunit path="d:\Program Files\NUnit-Net-2.0 2.2.7\bin\nunit-console.exe">
<assemblies>
<assembly>D:\XXX6.5.0\XXX\Web\Bin\XXX.BLL.dll</assembly>
<assembly>D:\XXX6.5.0\XXX\Web\Bin\XXX.Common.dll</assembly>
<assembly>D:\XXX6.5.0\XXX\Web\Bin\XXX.Controls.dll</assembly>
</assemblies>
<outputfile>.\nunit-results.xml</outputfile>
</nunit>
</tasks>
<!--下面block的功能就是在Build完后,以什么形式将Build的报告发布出去当然形式也有多种像
Build Publisher,Email Publisher下面我们用的是Email Publisher,
我们定义了两组用户一组是只要Build完成就发送,另一组是只有在Build状态改变时发送(build status从
success->Faile)。
-->
<publishers>
<xmllogger logDir=".\buildlogs"/>
<email mailhost="yahoo.com.cn" from=xxx@yahoo.com.cn includeDetails="true">
<users>
<user name="BuildGuru" group="buildmaster" address="xxx@yahoo.com.cn"/>
<user name="JoeDeveloper" group="developers" address="xxx@yahoo.com.cn"/>
</users>
<groups>
<group name="developers" notification="change"/>
<group name="buildmaster" notification="always"/>
</groups>
</email>
</publishers>
<!--externalLinks就完全属于额外的友情链接了,有没有都关系啦,不过我们也可以把我们最新Build的站点
地址挂上去不是更好:)-->
<externalLinks>
<externalLink name="XXX" url="http://localhost/web/default.aspx/" />
<externalLink name=".net" url="http://www.asp.net/" />
</externalLinks>
</project>
</cruisecontrol>
保存好ccnet.config文件后,我们的工作也就完成了,试一把。点击D:\Program Files\CruiseControl.NET\server\ ccnet.exe程序启动ccnet server
启动成功的话,图(A-1)是依然存在的,且没有异常信息的显示(注意提示信息)。如果直接关闭了那肯定有问题,不要着急在我们D:\Program Files\CruiseControl.NET\server\ccnet.log 存储着运行时候的日志信息,如果有错误的话可以打开这个日志文件查看,依据情况再修改直到成功。如果图(A-1)依然屹立在那,无异常信息显示,启动 然后把当前的build server加进来,CCtray的详细设置可以参看官方文档 如得到图(A-3)OK,成功了:)。我们接着去到http://localhost/ccnet看到各次的Build情况。
好了,这个基于CCnet的每日构建平台,基本功能的框架就起来了,不过要想支持的功能更为智能,就需要去慢慢完善ccnet.config配置吧。主要参看CruiseControl.NE的官方文档
注:本文仅个人浅显理解,难免存在不妥之处,有问题欢迎一起讨论。另Nant的配置会加紧时间再跟上。