`
chaotian
  • 浏览: 8142 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

CruiseControl.NET持续集成实践

阅读更多

前言

团队开发需要进行集中的项目文件管理与有效的协调,我们采用源代码管理工具协助我们管理,卓有成效。限定重要文件的访问权限、使用悲观锁杜绝成员同时编辑同一份文件、不允许长时间迁出文件等规则让我们在某一时间段内非常愉快。但是慢慢的,有人抱怨“我获取了源代码怎么编译错误?”。于是增加规定:迁入之前必须获取最新,然后再一次编译,成功后方可迁入VSS。这种办法是很不错,但是工作繁琐了,尤其对大型项目,更加的苦不堪言。看来我们需要一个机器人帮我们,那就是持续集成。持续集成是一种实践,可以让团队在持续的基础上收到反馈并进行改进,不必等到开发周期后期才寻找和修复缺陷。通俗一点儿说,就是指对于开发人员的每一次代码提交,都自动地把代码仓库中所有代码获取下来,执行编译、并自动运行所有的测试用例,如出现错误则通知人员这是一个失败的提交。一个适合的集成频率非常重要,根据团队的实际情况采用灵活的集成频率,过于频繁的频率会加大持续集成的实施难度,甚至最后实施失败。接下来简单介绍一下在.NET上常用的持续集成软件CruiseControl.NET和它的使用方法。

CruiseControl.NET实际应用

 

在实验部署中,CruiseControl.NET集成了如下功能:

  1. MsBuild集成编译
  2. 电子邮件提醒功能
  3. Nunit单元测试报告
  4. 自动发布网站应用程序到指定目录

CruiseControl.NET安装

 目前CruiseControl.NET官方网站提供的最新版本为1.4.2,提供三种方式下载——源代码、zip压缩包、windows安装文件。选择windows安装文件最为方便,下载相应的exe文件,点击选择安装目录安装即可。安装完成后,我们可以选择点击ccnet.exe来启动软件也可以选择从系统服务启动。

CruiseControl.NET配置

程序配置文件ccnet.config是CruiseControl.NET Server最核心的文件,借助CCNetConfig图形化工具我们可以很方便的进行配置的修改,下面我就分别介绍每一项如何进行配置:

基础配置

配置文件为xml格式,最外层的标签为cruisecontrol,包含一个完整的配置,如下所示:

<cruisecontrol>
    <queue name="Q1" duplicates="ApplyForceBuildsReplace"/>
        ... ...
</cruisecontrol>

queue标签

queue标签允许进行集成请求序列配置,规定重复的集成请求如何被处理,一共有三种处理方式:

  • UseFirst:默认的处理方式,处理第一个添加的请求
  • ApplyForceBuildsReplace:允许强制集成替换现有的请求序列,但是不改变请求序列的位置
  • ApplyForceBuildsReAdd:允许强制集成删除即将执行的请求,同时重新添加强制集成进入序列

  配置项目

<!--name:项目名称;queue:采用何种序列处理方式;queuePriority:序列的优先级-->
<project name="Project 1" queue="Q1" queuePriority="1">
    <!--工作目录的配置,设定一个绝对路径作为集成的工作目录-->
    <workingDirectory>yourWorkingDirectory</workingDirectory>
    <!--集成结果保存路径,每个项目配置一个唯一路径-->
    <artifactDirectory>yourArtifactDirectory</artifactDirectory>
    <!--web界面集成报告的URL,这个URL一般用在邮件内容中-->
    <webURL>http://server1/ccnet/server/local/project/testProject/ViewLatestBuildReport.aspx</webURL>
    <!--源代码迁入与启动集成的最少时间间隔-->
    <modificationDelaySeconds>2</modificationDelaySeconds>
    <!--触发模式,一般采用间隔触发器-->
    <triggers>
        <!--name:触发器名称;seconds:间隔时间;BuildCondition:构建条件,有两个选项——强制集成ForceBuild和文件变动时集成IfModificationExists;initialSeconds:server启动与第一次构建的时间间隔-->
        <intervalTrigger name="continuous" seconds="30" buildCondition="ForceBuild" initialSeconds="30"/>
    </triggers>
</project>

 配置源代码管理

源代码管理为项目配置中的一个子结点,下面以VSS为例做一下详细的介绍,示例及解释如下:

<sourcecontrol type="vss">
   <!--VSS的执行文件-->
   <executable>C:\Program Files\Microsoft Visual Studio\VSS\win32\SS.EXE</executable>
   <!--源代码的VSS路径-->
   <project>$/CCNET</project>
   <!--VSS用户名-->
   <username>buildguy</username>
   <!--VSS密码-->
   <password>buildguypw</password>
   <!--VSS路径,包含SRCSAFE.INI的目录-->
   <ssdir>\\192.168.1.1\vss</ssdir>
   <!--VSS工作目录,源代码将获取到改目录中-->
   <workingDirectory>c:\myBuild</workingDirectory>
   <!--VSS操作的过期时间-->
   <timeout units="minutes">10</timeout>
</sourcecontrol>

 配置编译

源代码配置完成后,CCNet Server就能够把源代码获取到本地了,下面我们就可以配置构建节点,让CCNet为我们进行自动构建。CCNet支持NAnt、MSBuild两种构建方式,通过这两种方式我们可以方便的进行项目集成编译。NAnt是功能非常强大的开源.NET编译工具,但是需要编写build文件,该文件负责指导Nant进行编译,NAnt也可以直接编译sln文件,但是对2005支持不好。MSBuild是微软随VS2005一起发布的一个集成编译工具,和NAnt类似,可以直接编译sln文件,功能上完全可以替代NAnt,下面就以MSBuild为例介绍一下如何进行配置:

<msbuild>
  <!--MSBuild的路径-->
  <executable>C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe</executable>
  <!--工作路径-->
  <workingDirectory>C:\dev\ccnet</workingDirectory>
  <!--解决方案或项目文件-->
  <projectFile>CCNet.sln</projectFile>
  <!--MSBuild的构建参数-->
  <buildArgs>/noconsolelogger /p:Configuration=Debug /v:diag</buildArgs>
  <!--构建目标-->
  <targets>Build</targets>
  <!--超时时间-->
  <timeout>900</timeout>
  <!--日志文件处理模快-->
  <logger>C:\Program Files\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MsBuild.dll</logger>
</msbuild>
 

 通过设定msbuild的参数还可以执行很多复杂的任务,例如发布网站到指定目录。

 

配置单元测试

如果某个类库或应用程序包含单元测试,我们可以配置是的ccnet在集成过程中运行单元测试,基本配置范例与说明如下:

<nunit>
    <!--nunit的路径-->
    <path>D:\dev\ccnet\ccnet\tools\nunit\nunit-console.exe</path>
    <!--需要进行单元测试的程序集-->
    <assemblies>
        <assembly>D:\dev\Refactoring\bin\Debug\Refactoring.exe</assembly>
        <assembly>D:\dev\Refactoring\bin\Debug\Refactoring.Core.dll</assembly>
    </assemblies>
</nunit>

 配置邮件提醒

邮件提醒任务需要部署在publishers节点下面,若部署在tasks节点下面,发生构建失败将不会执行后续任务,因此无法收到失败的提醒邮件。配置的示例代码及解释如下:

<!--from:邮件发件人;mailhost:邮件服务器地址;mailport:smtp端口;includeDetail:是否包含详细报告信息;mailhostUsername:smtp用户名;mailhostPassword:smtp密码;useSSL:是否使用ssl发送邮件-->
<email from="buildmaster@mycompany.com" mailhost="smtp.mycompany.com" mailport="25" includeDetails="TRUE"
           mailhostUsername="smtpuser" mailhostPassword="smtppassword" useSSL="FALSE">
    <!--定义一组接收邮件的用户-->
    <users>
        <!--name:用户名称,必须同源代码管理系统的帐号一致;group:所属分组;address:邮件地址;-->
        <user name="BuildGuru" group="buildmaster" address="buildguru@mycompany.com"/>
        <user name="JoeDeveloper" group="developers" address="joedeveloper@thoughtworks.com"/>
    </users>
    <!--用户组-->
    <groups>
        <!--name:组名称;nitification:通知策略——Always[每次构建均发送通知]、Changed[构建结果发生改变时发送通知,例如从success变为fail]、Failed[当构建失败时发送通知]、Success[当构建成功时发送通知]、Fixed[当构建从失败到通知时发送通知]、Exception[构建发生异常时发送通知]-->
        <group name="developers" notification="change"/>
        <group name="buildmaster" notification="always"/>
    </groups>
    <!--设置提交者通知测略,当构建完成后,符合符合设置的条件将邮件通知所有此次源代码改变的参与者-->
    <modifierNotificationTypes>
       <NotificationType>Failed</NotificationType>
       <NotificationType>Fixed</NotificationType>
    </modifierNotificationTypes>
</email>

 配置范例

为节省大家时间,这里提供了一个基本的配置文件,包含单元测试、编译、网站发布、邮件通知。

<cruisecontrol>
  <project name="CI2.0" queue="Q1" queuePriority="1">
    <workingDirectory>E:\Integration\CI2.0\WorkingDirectory</workingDirectory>
    <artifactDirectory>E:\Integration\CI2.0\Artifacts</artifactDirectory>
    <webURL>http://192.168.1.1/ccnet/server/local/project/CI2.0/ViewLatestBuildReport.aspx</webURL>
    <modificationDelaySeconds>10</modificationDelaySeconds>
    <sourcecontrol type="vss">
      <project>$/CI2.0</project>
      <username>tianc</username>
      <password>password</password>
      <executable>D:\Program Files\Microsoft Visual SourceSafe\SS.EXE</executable>
      <ssdir>\\192.168.1.2\vss</ssdir>
      <autoGetSource>True</autoGetSource>
      <applyLabel>False</applyLabel>
      <workingDirectory>E:\Integration\CI2.0\WorkingDir</workingDirectory>
      <timeout units="Minutes">10</timeout>
      <culture>zh-CN</culture>
      <cleanCopy>True</cleanCopy>
    </sourcecontrol>
    <triggers>
      <intervalTrigger name="continuous" seconds="60" />
    </triggers>
    <tasks>
      <msbuild>
        <executable>C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe</executable>
        <workingDirectory>E:\Integration\CI2.0\WorkingDir</workingDirectory>
        <projectFile>E:\Integration\CI2.0\WorkingDir\Src\2.0\CI.Web\CI.Web.csproj</projectFile>
        <buildArgs>/noconsolelogger /p:Configuration=Release;OutDir=E:\Integration\CI2.0\WorkingDir\Release\2.0\ /v:diag</buildArgs>
        <targets>CLean;Build;_CopyWebApplication</targets>
        <logger>D:\Program Files\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MSBuild.dll</logger>
        <timeout>600</timeout>
      </msbuild>
      <nunit>
        <path>D:\Program Files\NUnit 2.4.8\bin\nunit-console.exe</path>
        <outputfile>E:\Integration\Bitauto.Review2.0\Artifacts\nunit-results.xml</outputfile>
        <assemblies>
        <assembly>E:\Integration\CI2.0\WorkingDir\Src\2.0\CI.Data\bin\Release\CI.Data.dll</assembly>
          <assembly>E:\Integration\CI2.0\WorkingDir\Src\2.0\CI.BLL\bin\Release\CI.BLL.dll</assembly>
        </assemblies>
      </nunit>
      <buildpublisher>
        <sourceDir>E:\Integration\CI2.0\WorkingDir\Release\2.0\_PublishedWebsites</sourceDir>
        <publishDir>E:\Integration\CI2.0\Release</publishDir>
      </buildpublisher>
    </tasks>
    <publishers>
      <xmllogger logDir="E:\Integration\CI2.0\XmlLogger" />
      <email mailhost="mail.CI.com" from="ci@CI.com">
        <mailhostUsername>tianc</mailhostUsername>
        <mailhostPassword>password</mailhostPassword>
        <includeDetails>True</includeDetails>
        <users>
          <user name="tianc" address="tianc@CI.com" group="developer" />
          <user name="lizd" address="lizd@CI.com" group="developer" />
          <user name="xiongyh" address="xiongyh@CI.com" group="developer" />
        </users>
        <groups>
          <group name="developer" notification="Always" />
        </groups>
        <converters />
        <modifierNotificationTypes>
          <NotificationType>Always</NotificationType>
        </modifierNotificationTypes>
      </email>
    </publishers>
    <state type="state" directory="E:\Integration\CI2.0\CCNetState" />
  </project>
</cruisecontrol>
  • 大小: 19.5 KB
分享到:
评论
2 楼 virusswb 2012-07-11  
我有个问题,这个东西,用起来有点慢啊,十分钟还没有搞完一次,比我们手动编译慢多了。我只是build,没有unittest,没有email。请问有什么需要注意的地方,什么地方可以提速呢?》
1 楼 kimmking 2009-02-21  
一直在做j2ee的持续集成。

呵呵 看看~~  不知道工具支持的怎么样

相关推荐

    Automatic Integration with CruiseControl.NET, NAnt, and NUnit

    ### 自动化集成CruiseControl.NET、NAnt与NUnit:构建持续集成环境 #### 概述 在软件开发过程中,回归测试是一个重要的但经常被忽视的环节。回归测试是指在对已有代码进行修改后重新运行之前的测试用例,以确保...

    CruiseControl.NET:用于.NET平台的自动化连续集成服务器-开源

    CruiseControl.NET是一个专为.NET平台设计的自动化持续集成服务器,它的出现是为了满足.NET开发者在项目构建与测试自动化方面的需求。作为CruiseControl for Java的C#版本,CruiseControl.NET继承了其核心理念,即...

    使用CruiseControl.Net进行持续集成

    **使用CruiseControl.Net进行持续集成** 持续集成(Continuous Integration,CI)是软件开发过程中的一个关键实践,它强调开发人员频繁地将代码更改合并到主分支,以便尽早发现并解决潜在的问题。CruiseControl.Net...

    CruiseControl持续集成

    CruiseControl是CI服务器的老者,诞生已是多年,在许多方面,CruiseControl服务器已经成为持续集成实践的同义词。而现在,CruiseControl已发展成为一个家族式系统,包括CruiseControl.java、CruiseControl.net、...

    cctray 1.6

    CruiseControl.NET(简称 CC.NET)是一款开源的持续集成服务器,主要用于自动化软件开发过程中的构建、测试和部署。版本1.6是其较早的一个稳定版本,提供了丰富的功能和强大的扩展性,为开发团队提供了高效的协作...

    持续集成之CruiseControl.rb

    它是由ThoughtWorks公司开发的,是CruiseControl.NET的Ruby版本,因此在Ruby社区中被广泛应用。CruiseControl.rb的核心理念是通过持续地集成代码来尽早发现并解决潜在的问题,从而提高软件质量。 ### 一、Cruise...

    ccnet每日构建--附带配置文件

    【标题】"ccnet每日构建--附带配置文件"揭示了这个压缩包是关于使用CruiseControl.NET(简称ccnet)进行持续集成实践的一个资源集合。CruiseControl.NET是一款开源的持续集成工具,用于自动化软件项目的构建、测试和...

    CCTray 项目连编

    CCTray是一款强大的持续集成工具,它主要用于监视CruiseControl.NET服务器上的项目构建状态。在软件开发过程中,尤其是在敏捷开发环境中,持续集成是至关重要的实践之一。CCTray的使用可以极大地提高团队的效率,...

    CCNET的配置使用说明

    【持续化集成与CruiseControl.Net (CCNet)】 持续化集成是一种软件开发实践,旨在频繁地将开发人员的更改合并到主分支,通常每天至少一次,以尽早发现和解决问题。这种做法有助于减少集成阶段的冲突,提高软件质量,...

    Continuous Integration

    ### 持续集成(Continuous Integration):理论与实践 #### 标题解析 - **持续集成**(Continuous Integration,简称 CI)是一种软件开发实践,...这对于希望在.NET 2.0项目中引入持续集成实践的团队来说非常有价值。

    每日构建的东西(.net)

    6. **CruiseControl.NET (CC.NET)**:CruiseControl.NET 是一个持续集成服务器,它可以持续监控源代码仓库(如VSS)的变化,一旦检测到更新,就会触发构建过程。 每日构建的工作流程大致如下: - CruiseControl...

    Cruisecontrol

    ### Cruisecontrol:持续集成平台与分布式构建实践 #### 一、CruiseControl简介 CruiseControl是一个开源的持续集成平台,旨在帮助企业实现自动化构建过程,提高软件开发效率和质量。项目采用Apache许可证发布,...

    基于 CruiseControl 和 Rational 统一变更管理实现的软件开发中的自动化持续构建.mht

    CruiseControl是一款开源的持续集成工具,它允许开发者设置自动化的构建流程,每当代码库中有新的提交时,CruiseControl会自动触发构建过程。通过这种方式,团队可以尽早发现并修复可能引入的问题,避免了在后期集成...

    CC.NET持久化集成环境1.8.0

    CC.NET(CruiseControl .NET)是一款开源的持续集成工具,专为.NET Framework环境设计。它提供了一种自动化的方式来构建、测试和部署软件项目,帮助开发团队保持代码的质量并及时发现集成问题。CC.NET 1.8.0是该工具...

    Pro .NET Best Practices .net最佳实践 英文版

    10.2.1 CruiseControl.NET 10.2.2 Jenkins 10.2.3 TeamCity 10.2.4 Team Foundation Server 10.3 CI生命周期 10.3.1 重新生成 10.3.2 单元测试 10.3.3 分析 10.3.4 打包 10.3.5 部署 10.3.6 稳定性测试 10.3.7 生成...

    DailyBuild全攻略

    CruiseControl.NET是持续集成服务器,监测代码仓库的变化并触发构建过程。NUnit2Report则将NUnit的测试结果转换为HTML报告,使得测试结果更易于阅读。 在实际操作中,首先需要安装上述所有工具。CruiseControl.NET...

    《.NET最佳实践》.((美)Stephen Ritchie)

    10.2.1 CruiseControl.NET 174 10.2.2 Jenkins 175 10.2.3 TeamCity 175 10.2.4 Team Foundation Server 176 10.3 CI生命周期 176 10.3.1 重新生成 177 10.3.2 单元测试 182 10.3.3 分析 184 10.3.4 打包 ...

Global site tag (gtag.js) - Google Analytics