Discuz!NT持续集成实战
摘要:本文记述Discuz!NT项目实施持续集成的实施过程,并把过程中遇到的问题原样展现,并提供解决方法,以供后来者参考。
关键字:CruiseControl.net 持续集成(Continuous Integration) 每日构建 (DailyBuild) Discuz!NT SVN
操作系统: win2003
版本控制: Subversion
程序编译: MSBuild
代码规范检查:Fxcop
-
目标:从 SVN 中取出源代码到 e:\source ,编译后发布项目到 e:\publish ,可直接在 IIS 中运行。
编译状态发送email通知相关人员。 -
软件环境 :(以下软件的安装过程非常简单,基本上一路 Next 就可以了。)
- CruiseControl.net
下载:ccnet.thoughtworks.com
安装目录:c:\C:\Program Files\ - Fxcop
下载:http://www.microsoft.com/downloads/details.aspx?FamilyID=3389f7e4-0e55-4a4d-bc74-4aeabb17997b&DisplayLang=en
安装目录: c:\Program Files\Microsoft FxCop 1.36 - Subversion (SVN) 下载:http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91
安装目录:c:\Program Files\
-
环境配置
主要的配置文件有三个分别是:
配置文件 说明 文件位置 生成方式 ccnet.config 配置CruiseControl.net 已经存在 DailyBuild.msbuild 配置MSBuild编译目标项目 手动生成 DiscuzNT.DailyBuild.FxCop 配置Fxcop的检查目标 E:\DailyBuild\DiscuzNT.DailyBuild.FxCop Fxcop工具生成 publish.bat 用户发布的批处理 手动生成 filelist.txt 对publish.bat的配置 手动生成
-
配置CruiseControl.net (编辑CruiseControl.net的配置文件 ccnet.config,其内容如下)
<cruisecontrol>
<project name="Discuz!NT3" webURL="http://10.0.3.4/ccnet/server/local/project/Discuz!NT3/ViewLatestBuildReport.aspx">
<workingDirectory >e:\source</workingDirectory>
<artifactDirectory>E:\DailyBuild\Log\3</artifactDirectory> <!-- 编译日志生成路径 -->
<labeller type="dateLabeller"></labeller>
<sourcecontrol type="svn"> <!-- 版本控制系统的类型 -->
<trunkUrl>https://code.comsenz.com/</trunkUrl> <!-- SVN的地址 -->
<workingDirectory>e:\source</workingDirectory> <!-- 把源代码检出到该目录 -->
<executable>c:\Program Files\Subversion\bin\svn.exe</executable> <!-- svn.exe所在路径 -->
<username>svnuser</username> <!-- 登录svn的用户名和密码 -->
<password>123</password>
</sourcecontrol>
<tasks>
<exec>
<executable>C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe</executable> <!-- MSBuild.exe 文件所在路径 -->
<baseDirectory>e:\source</baseDirectory> <!-- 对 e:\source 目录下的内容进行编译,实际上是解决方案文件或者msbuild文件所在目录-->
<buildArgs>DailyBuild.msbuild /p:Configuration=Debug /v:q</buildArgs> <!-- 编译参数 不懂的查MSBuild的帮助 -->
<buildTimeoutSeconds>1200</buildTimeoutSeconds> <!-- 编译超时时间 -->
</exec >
<exec executable="E:\DailyBuild\publish.bat"/> <!-- 编译后执行的批处理文件路径,该批处理文件用于项目发布 -->
<merge> <!-- 此节用于合并Fxcop生成的日志 到 编译日志里,最终作为Build Report -->
<files>
<file>E:\DailyBuild\log\3\DailyBuild.FxCop.xml</file> <!-- 该文件的名字是在 publish.bat 中 FxCopCmd命令的参数中指定的 -->
</files>
</merge>
</tasks>
<publishers>
<xmllogger logDir="E:\DailyBuild\Log\3\buildlogs" /> <!-- 编译日志存放路径 -->
<!-- 下面设置编译报告通过email通知相关人员 详细信息参考cc.net的帮助-->
<email from="admin@163.com" mailhost="smtp.163.com" mailhostUsername="admin" mailhostPassword="123" includeDetails="true">
<users>
<user name="dachuan" group="buildmaster" address="dachuan@163.com"/>
</users>
<groups>
<group name="buildmaster" notification="always"/>
</groups>
</email>
</publishers>
<triggers> <!-- 该触发器控制周一到周五的23点到0点的时间段内进行编译,每900秒检查一次svn有无更新 ,如果有就取出并编译-->
<filterTrigger startTime="08:00" endTime="23:00">
<trigger type="filterTrigger" startTime="23:00:00" endTime="23:59:59">
<trigger type="intervalTrigger" name="continuous" seconds="900" />
<weekDays>
<weekDay>Saturday</weekDay>
<weekDay>Sunday</weekDay>
</weekDays>
</trigger>
</filterTrigger>
</triggers>
</project>
</cruisecontrol>
-
配置MSBuild (将MSBuild的配置文件DailyBuild.msbuild 放到和VS解决方案文件同级目录中,其内容如下)
<!-- 该文件与VS解决方案文件在同一目录 -->
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="Build">
<MSBuild Projects="Discuz_vs08.sln" Targets="Clean;Rebuild"/>
</Target>
</Project>
-
配置DiscuzNT.DailyBuild.FxCop
FxCop的配置文件DiscuzNT.DailyBuild.FxCop可以通过FxCop的GUI工具生成,保存到E:\DailyBuild目录下。主要是选择检查目标然后选择配置文件保存位置,这个在此不详述。
-
编写发布批处理 publish.bat 内容如下:
xcopy e:\source e:\publish /E /y /D /EXCLUDE:E:\DailyBuild\filelist.txt
cd c:\Program Files\Microsoft FxCop 1.36
c:
FxCopCmd /project:E:\DailyBuild\DiscuzNT.DailyBuild.FxCop /out:E:\DailyBuild\log\3\DailyBuild.FxCop.xml
其中xcopy的参数 /D 指定了不复制修改日期相同的文件,这样就只把原时间比目标文件新的文件复制过来,减少了复制压力。 /EXCLUDE参数中指定的filelist.txt文件中记录的是不需要复制的目录或文件,具体用法网上有很多资料。 其内容如下:
.cs\
\_svn
\.svn
.csproj\
.sln\
.pdb\
.bat\
filelist.txt
.bak\
.user\
obj\
dnt.config\
其中有个技巧,例如 .cs\ 这个包含一个"\" ,如果不写这个"\",那么所要文件名中包含"cs"的文件都不会被复制,因此,本来我只是想不复制.cs文件,可是却连.css文件也不复制了。 为了解决这个问题.cs后面需要一个"\"。
- 常见问题
- 编译成功能收到email通知,可是编译失败时却没有email通知
答:这个常见问题是因为 把<email>配置节写在了<tasks>配置节里面,这样当编译失败时,流程从<tasks>中跳出,导致后面的<email>根本没有执行,解决方法就是把<email> 放到 <publishers> 下。
- 生成的日志文件过大,在浏览器中查看build report的时候,浏览器就死掉了
答:注意MSBuild的编译参数 <buildArgs>DailyBuild.msbuild /p:Configuration=Debug /v:q</buildArgs> 其中 /v:q 指定了输出日志的级别,自己查看一下MSBuild的/v参数的说明就明白了。
后记:有了DailyBuild,我们可以在开发人员提交修改后,立刻生成一个可测试版本发布到IIS中,然后展示给用户看也好,开展黑盒测试也好,都非常方便,而且使用CruiseControl.net 可以把单元测试也加入进来,这样每次编译后,自动生成单元测试报告,编码规范报告,真的是非常的方便。本文并没有介绍如何加入单元测试,一是由于我自己还没有实践配置过,一是我的朋友博客园的jillzhang 同学已经写了教程。
特别感谢:jillzhang 和 紫色阴影 这两位 诲人不倦 ,古道热肠 的朋友 。
参考文献: