每日构建(二)
上一篇文章是简单的介绍了ccnet的部分设置,已经完成的设置有:
1:获取源代码 ,sourcecontrol 节点有所体现。推荐使用svn,感觉它在DOS下面调用会简单些。
2:编译工程。tasks/msbuild,主要是让msbuilder来完成,其实msbuilder远不止这个编译功能,像网站的发布功能它都有。
3:部署文件。tasks/nant。这正是这篇需要重点介绍的内容。
nant工具功能非常全,也能获取完成获取源码和编译的工作,但这里我只应用它的部署文件功能。因为nant虽然功能强大,但均是DOS命令操作,用作主流程对普通用户来说有难度。
nant最核心的就是它的build脚本文件了,这里简单的介绍下文件结构。
1:build:XML格式,每个build文件包含一个project,project有若干target,每个target包含若干task 。但每个具体的task并不是包含在target标签中,而是平级关系。
2:Projects:工程节点,相关属性如下:
1>:name:工程名称。
2>:default:指定默认的target。
3>:basedir:设置build文件的父目录。
3:Targets:目标、对象,target是nant脚本具体执行动作的最小单位,包含一系列的task。相关属性如下:
1>:name,任务名称。
2>:depends,当前targets所依赖的target,支持多个,中间用","分开。
3>:if,判断语句,如成立则执行此target。
4>:unless,如果条件不成立则路过target。
5>:description,相关描述。
4:Properties:属性。一个project可能有多个属性。主要是用来定义一些全局变量。例如:
<property name="deploy.dir" value="../../deploy/web" />
5:Task:具体任务,即执行的具体代码块。例如:意思是把一个目录下的所有后缀为dll的文件复制到另外一个目录中。
<fileset basedir="${base.dir}/Hotel/bin/">
<include name="*.dll" />
</fileset>
</copy>
之前已经说明过,我利用nant只用了它部署文件的功能,nant有一个非常好用的命令"copy",它只会复制比参考版本文件新的或者是不存在的文件。支持单个文件复制和文件夹的复制。这里正旧利用它的部署功能,可能把有修改的文件分别复制到你指定的目录中,目前有很多公司都喜欢把图片单独分开,形成一个独有域名,例如:image.a.com,图片文件和工程文件并不在一个目录下面,这里nant就能轻松胜任。
<fileset basedir="${base.dir}/Flights/Images/">
<include name="*.jpg" />
<include name="*.jpeg" />
<include name="*.gif" />
</fileset>
</copy>
copy相关属性说明:
1>:todir:复制到的目标文件夹路径。
2>:fileset:源文件目录相关设置。
3>:include:指包含某种规则的,例如包含所有.html的文件。
4>:exclude:排除指定规则,例如不包含.cs的文件。
如何运行nant, nant唯一的缺点就是它没有可操作的界面,需要通过dos命令来完成。在命令提示框中,进入到nant应用程序的目录,然后执行类似如下命令:
Nant -buildfile:\bin\DeployScripts\Hotels\default.build
nant如何和ccnet结合:上面都是介绍nant的用法,但ccnet中如何应用呢?ccnet很好的支持了nant的应用。具体体现了tasks/nant节点中。ccnet在编译完工程后就会调用nant应用程序,nant/buildFile是最好的体现。
到此为此,我们已经实现了自动获取源码,自动编译,打包,但nant生成的包是一个包含了所有应用程序内容的包,当然cs之类的代码是不会有的,直接点就是只包含网站所需要的文件。我们部署时并不需要这么多的文件,因为有的文件根本就没有修改过,我们需要的只是有这一阶段有修改过的内容。这里我们需要利用ccnet配置中的publishers节点了,exec能执行相关脚本来完成后面的打包部署工作,我们来写一个批处理文件,通过调用win.rar来完成压缩。相关win.rar相关命令可以网上搜索下,这里为了实现增量包,利用了ta这个参数,即只关心这个时间之后修改过的文件。
if exist "E:\deploy\Web_auto.rar" del /F E:\deploy\Web_auto.rar
"D:\Program Files\WinRAR\rar.exe" A -r -ep1 -ta20090925000000 E:\deploy\Web_auto.rar -AD
E:\deploy\web
至此,我们利用ccnet+svn+msbuilder+nant+winrar实现了获取源码,编译,打包自动化的工作,通过ccnet的管理平台,我们非常方面直接的进行打包的跟踪和管理。这里为了大家实现方便,我把我做的ccnet的配置文件贴出来供大家参考。
<!-- This is your CruiseControl.NET Server Configuration file. Add your projects below! -->
<!--
<project name="MyFirstProject" />
-->
<project name="20091030_NationalDay" queue="Q2" queuePriority="2">
<webURL>http://localhost/ccnet/ViewProjectReport.aspx</webURL>
<workingDirectory>E:\20091030_NationalDay</workingDirectory>
<artifactDirectory>E:\20091030_NationalDay\log</artifactDirectory>
<modificationDelaySeconds>10</modificationDelaySeconds>
<sourcecontrol type="svn">
<trunkUrl>svn路径</trunkUrl>
<workingDirectory>E:\20091030_NationalDay</workingDirectory>
<executable>D:\Program Files\VisualSVN\bin\svn.exe</executable>
<username>svn用户名</username>
<password>svn用户密码</password>
<timeout units="hours">1</timeout>
<cleanUp>true</cleanUp>
</sourcecontrol>
<triggers>
<intervalTrigger name="continuous" seconds="6000" />
</triggers>
<tasks>
<modificationWriter>
<filename>svnchangelist.xml</filename>
<path>E:\20091030_NationalDay</path>
<appendTimeStamp>True</appendTimeStamp>
</modificationWriter>
<modificationReader>
<filename>svnchangelist.xml</filename>
<path>E:\20091030_NationalDay</path>
</modificationReader>
<msbuild>
<executable>C:\Windows\Microsoft.NET\Framework\v3.5\MSBuild.exe</executable>
<workingDirectory>解决方案所在目录</workingDirectory>
<projectFile>Hotel.sln</projectFile>
<buildArgs>/noconsolelogger /p:Configuration=Release /v:diag</buildArgs>
<timeout>900</timeout>
<logger>D:\Program Files\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MsBuild.dll</logger>
</msbuild>
<nant>
<executable>E:\bin\nant.exe</executable>
<baseDirectory>E:\20091030_NationalDay</baseDirectory>
<buildArgs>-D:cvs.executable=E:\bin\DeployScripts\deploy.bat</buildArgs>
<nologo>false</nologo>
<buildFile>E:\bin\DeployScripts\Hotels\default.build</buildFile>
<targetList>
<target>run</target>
</targetList>
<buildTimeoutSeconds>1200</buildTimeoutSeconds>
</nant>
</tasks>
<publishers>
<exec>
<executable>deploy.bat</executable>
<baseDirectory>D:\Program Files\CruiseControl.NET\</baseDirectory>
<buildArgs>EL_Online_V36_03.01_200910</buildArgs>
</exec>
<modificationHistory onlyLogWhenChangesFound="true" />
<rss items="30" />
<statistics />
<xmllogger logDir="E:\20091030_NationalDay\buildlogs\ " />
<email from="CcErr@com.cn" includeDetails="TRUE" mailhost="邮件服务器地址">
<users>
<user address="接收邮件地址" group="buildmaster" name="min.jiang" />
</users>
<groups>
<group name="developers" notification="always" />
<group name="buildmaster" notification="always" />
</groups>
<modifierNotificationTypes>
<NotificationType>Failed</NotificationType>
<NotificationType>Fixed</NotificationType>
</modifierNotificationTypes>
<subjectSettings>
<subject buildResult="StillBroken" value="Build is still broken for 20091030_NationalDay" />
</subjectSettings>
</email>
</publishers>
</project>
</cruisecontrol>