Discuz!NT持续集成实战

摘要:本文记述Discuz!NT项目实施持续集成的实施过程,并把过程中遇到的问题原样展现,并提供解决方法,以供后来者参考。

关键字:CruiseControl.net  持续集成(Continuous Integration)  每日构建 (DailyBuild) Discuz!NT  SVN

操作系统: win2003 

版本控制: Subversion

程序编译:  MSBuild

代码规范检查:Fxcop

 

  • 目标:从 SVN 中取出源代码到 e:\source ,编译后发布项目到 e:\publish ,可直接在 IIS 中运行。
              编译状态发送email通知相关人员。
  • 软件环境 :(以下软件的安装过程非常简单,基本上一路 Next 就可以了。)
    1.  CruiseControl.net  
      下载:ccnet.thoughtworks.com
      安装目录:c:\C:\Program Files\
    2. Fxcop
      下载:http://www.microsoft.com/downloads/details.aspx?FamilyID=3389f7e4-0e55-4a4d-bc74-4aeabb17997b&DisplayLang=en
      安装目录: c:\Program Files\Microsoft FxCop 1.36
    3. 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后面需要一个"\"。
  • 常见问题
    1. 编译成功能收到email通知,可是编译失败时却没有email通知

      答:这个常见问题是因为 把<email>配置节写在了<tasks>配置节里面,这样当编译失败时,流程从<tasks>中跳出,导致后面的<email>根本没有执行,解决方法就是把<email> 放到 <publishers> 下。
    2. 生成的日志文件过大,在浏览器中查看build report的时候,浏览器就死掉了

      答:注意MSBuild的编译参数 <buildArgs>DailyBuild.msbuild /p:Configuration=Debug /v:q</buildArgs>  其中 /v:q 指定了输出日志的级别,自己查看一下MSBuild的/v参数的说明就明白了。

 

后记:有了DailyBuild,我们可以在开发人员提交修改后,立刻生成一个可测试版本发布到IIS中,然后展示给用户看也好,开展黑盒测试也好,都非常方便,而且使用CruiseControl.net 可以把单元测试也加入进来,这样每次编译后,自动生成单元测试报告,编码规范报告,真的是非常的方便。本文并没有介绍如何加入单元测试,一是由于我自己还没有实践配置过,一是我的朋友博客园的jillzhang 同学已经写了教程。

 

特别感谢:jillzhang  和 紫色阴影  这两位 诲人不倦 ,古道热肠 的朋友 。

参考文献:

如何用CruiseControl.Net来进行持续化集成

持续集成简介

posted @ 2008-05-18 23:10  戏水  阅读(6139)  评论(21编辑  收藏  举报