首页 / 软件开发 / 数据结构与算法 / 在.NET环境中实现每日构建(Daily Build)--ccnet,MSBuild篇
        
            在.NET环境中实现每日构建(Daily Build)--ccnet,MSBuild篇2011-08-14 博客园 阿不每日构建,对我们团队来说一个全新的概念。随着项目开发的进展,在开发过程需要及时反馈一些BUG 和功能要求的处理情况。而在这种情况下每天或隔一段时间Build一个版本,工作量还是比较大的,所以 就特别有必要引入每日构建。关于每日构建,在园里有已经有很多的文章了,特别是摩诘的《在.NET环境 中实现每日构建(Daily Build)--NAnt篇》更是从概念上和实践上手把手地介绍如果在.NET环境下实现每 日构建。但很遗憾,在我实现每日构建之前没有看到这篇文章,错失了一次快速入门的机会,不过感到庆 幸的是,经过一天的研究和学习,把自己在学习配置过程中遇到的一些问题总结一下,算是对每日构建实 现方法的一个补充吧。我是在Windows 2003中做每日构建的,使用CruiseControl.Net自动从VSS服务器中检测并下载最新的 源代码,然后用MsBuild对解决方案自动编译。利用CCTray可以对每日构建的情况进行监控,了解 CruiseControl.Net的工作情况。下载安装完ccnet后,最重要的工作就是配置ccnet.config了。在安装目录下的server子目录里可以找 到这个文件。虽然有帮助文件的支持,并且在Examples目录下有一个示例的配置文件,但是要想正确地配 置这个文件也不是很容易的。在Ccnet.config里可以创建多个要监控项目的配置信息配置信息。包括:每 个版本的标识方式,使用的源码库类型和登录信息,项目状态管理,每次构建要执行的任务,执行周期。 以下是我的一个配置文件:<cruisecontrol>
     <project name="ccnetProject" webURL="Http://192.168.1.1/ccnet" publishExceptions="true">
         <!--工作目录,下载的源码将会被保存在这个目录下,如没有设置则会自被保存在安装目录下 server子目录以project name为名称的目录下-->
         <workingDirectory>e:ccnet</workingDirectory>
         <!--对这个项目的监控过程的日志记录目录-->
         <artifactDirectory>e:ccnet</artifactDirectory>
         <!--使用什么样的方式标识每一个自动生成的版本,可以有多种不同的方式。Labeller Blocks -- >
         <labeller type="dateLabeller" />
         <!--使用的源码控制器类型,我算了一下,它支持18种的源码控制器,强吧?这里使用的是VSS-- >
         <sourcecontrol type="vss" autoGetSource="true">
              <!--源码库中的项目名称-->
              <project>$/ </project>
              <!--vss用户名-->
              <username>ccnet</username>
              <!--vss密码-->
              <password>dailybuild</password>
              <!--vss服务器所在的路径-->
              <ssdir>\192.168.*.*Vss Server</ssdir>
              <!--工作目录,可以使用相对目录,以上面的workingDirectory为准-->
              <workingDirectory>e:ccnet</workingDirectory>
         </sourcecontrol>
         <!--执行周期-->
         <triggers>
              <!--定时任务,可以设置在哪天的那个时间执行构建计划-->
              <scheduleTrigger time="14:00" buildCondition="ForceBuild">
                   <!--以下配置节有指定,则会在指定的时间日期内执行,没有则每天执行-->
                   <!--<weekDays>
                       <weekDay>Monday</weekDay>
                   </weekDays>-->
              </scheduleTrigger>
              <!--每隔多少时间执行一次-->
              <!--<intervalTrigger seconds="30" buildCondition="ForceBuild"/>-->
         </triggers>
         <!--每次下载完代码后要执行的任务,可以有
         * Build Publisher
         * Email Publisher
         * Executable Task
         * File Merge Task
         * ForceBuildPublisher
         * Modification Writer Task
         * MsBuild Task
         * NAnt Task
         * Null Task
         * NUnit Task
         * Visual Studio Task
         * Xml Log Publisher
        -->
         <tasks>
              <!--msbuild 自动编译任务-->
              <msbuild>
                   <!--msbuild的路径,一般在系统目录下-->
                   <executable>C:WINDOWSMicrosoft.NETFrameworkv2.0.50727 MSBuild.exe</executable>
                   <workingDirectory></workingDirectory>
                   <!--解决方案文件,相对project 的workingDirectory,MSBuild会找到这个文件,并对它进行编译- ->
                   <projectFile>code*.sln</projectFile>
                   <!--编译参数-->
                   <buildArgs></buildArgs>
                   <!--编译的目录类型-->
                   <targets></targets>
                   <!--过期时间-->
                   <timeout>60</timeout>
                   <!--记录编译的详细日志,需要单独下载这个程序集,放在工作目录(workingDirectory)下,下载路 径 http://ccnetlive.thoughtworks.com/MSBuildXmlLogger%2DBuilds/-->
                   <logger>ThoughtWorks.CruiseControl.MsBuild.XmlLogger,ThoughtWorks.CruiseControl.MsBuil d.dll</logger>
              </msbuild>
         </tasks>
         <!--发布和部署配置-->
         <publishers>
              <!--下面的配置,会自将我源文件夹下的文件copy到指定的目录的版本标识(上面配置的labeller)的 子目录下 如:e:ccnetpublishShop1 e:ccnetpublishShop2 每一次生成都会递增-- >
              <buildpublisher>
                   <sourceDir>e:ccnetcodeShop</sourceDir>
                   <publishDir>e:ccnetpublishShop</publishDir>
              </buildpublisher>
              <buildpublisher>
                   <sourceDir>e:ccnetcodeManager</sourceDir>
                   <publishDir>e:ccnetpublishManager</publishDir>
              </buildpublisher>
         </publishers>
     </project>
</cruisecontrol>