[原创]如何用CruiseControl.Net来进行持续化集成

注:本文属jillzhang  原创,转载请注明出处 ,欢迎访问http://jillzhang.cnblogs.com/来获取最新更新

  1. 本文的目的:

本文总结了过去一年中使用CruiseControl.Net来对工作流程进行持续化集成的经验教训,详细地讲述安装,配置,使用CruiseControl.Net的具体步骤,希望通过阅读本文,能理解和掌握使用CruiseControl.Net的基本使用技巧,用工具来改善工作流程和提高工作效率。

  1. 什么是持续化集成

首先,我们先搞清楚什么是持续化集成?它对我们的日常工作有什么样的帮助?在过去几年中,敏捷已经是一个非常热门的话题,它高效的工作方式和快速的需求应对能力,赢得了很多中小软件厂商的关注。那么敏捷除了一些经常谈论到编程思维和迭代的开发模式等,其实还部分依赖于好的改善工作流程的工具。持续化集成工具便是服务于敏捷软件开发的一个系列。它主要将原本分散,无序的工作流程,通过工具软件有机的组织起来,并且在组织的过程中,参与开发设计测试的各个部门的人员都能从中获取到自动化方面的优惠。使得团队的工作效率大大提升。

  1. CruiseControl.Net是什么?

上面讲解了什么是持续化集成,那CruiseControl.Net就是一款由ThoughtWorks公司提供给我们的轻量级的持续化集成工具。它能够将代码版本控制,单元测试,代码规范检查,项目的发布部署等工作步骤有机的组织起来,并且利用其调度性可作自动化处理,它还有强大的日志记录功能,能将集成结果及时地反馈给项目管理人员和项目开发人员。在下文中凡是用到CruiseControl.Net均用CC.Net来代替。下面是CC.Net的工作流程图

 

注:本文属jillzhang  原创,转载请注明出处 ,欢迎访问http://jillzhang.cnblogs.com/来获取最新更新

  1. 如何安装CC.Net

CC.Net是一款开源软件,它的官方主页是: http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET

打开它的主页,便能看出他的官方采用另外一款非常出色的团队协作平台:Confluence,用它结合jira Bug管理系统,也能极大限度的提高团队协作能力,有关他们的介绍请访问:http://www.jira.com/ 。好了,返回来继续介绍CC.Net,当前官方已经发布了最新的CruiseControl.NET-1.3.0.2918,在首页的release栏中,便可以找到下载最新版CC.Net的连接,它是一款开源软件,你也可以在http://www.sf.net中找到它的源码和安装文件。如果你就是想使用CC.Net直接下载exe文件即可。下载后,在本地的安装过程如下:

  1. 双击CruiseControl.NET-1.3-Setup.exe程序,打开软件安装界面,如下:

  2. 一直点击Next,选择软件安装路径,等待软件安装完成,界面如下:

  3. 软件安装完成之后,在系统windows服务中将增加名为CruiseControl.Net Server的系统服务,如下:

    注意,默认情况该服务是出于未启动状态的。

     

因为CC.Net是一个集成持续工具在部署CC.Net之前,单独靠它自己是没有实际意义的,所以在部署配置CC.Net之前,您需要事先准备好并且安装下述 软件:

  1. 代码版本管理工具如VSS
  2. 代码构建工具,如果您是vs.net的用户,强烈建议不要使用NAnt,配置起来比较麻烦,建议使用MsBuild来做构建工具。MsBuild是随.Net FrameWork 2.0一起安装的,所您需要在CC.Net服务器上安装.Net FrameWork 2.0或者以上版本。
  3. 代码规范检查工具,.Net用户推荐使用FxCop.exe,下载地址:http://www.microsoft.com/downloads/details.aspx?FamilyID=3389f7e4-0e55-4a4d-bc74-4aeabb17997b&displaylang=en,很不幸的是,它原来的官方主页 http://code.msdn.microsoft.com/GotDotNet.aspx 关闭了,在新的站点中,我没有搜索到它。
  4. 单元测试工具:Nunit,官方主页:http://sourceforge.net/projects/nunit
  5. 发布部署工具,如果是asp.net网站,可以使用ASP.NET 编译工具 (Aspnet_compiler.exe),但我感觉它不好用,于是我自己实现了一系列的代码发布,FTP上传,XCopy安装等组件,在后面会提到。

除了上述,CC.Net还支持NCover,Simian和Fitness,我没有具体应用,便不多讲。 

 注:本文属jillzhang  原创,转载请注明出处 ,欢迎访问http://jillzhang.cnblogs.com/来获取最新更新

  1. 如何配置和部署  

假定上述的几个工具已经成功安装,下面就用一个项目来演示一下如何实现自动化构建,单元测试,代码规范检测,自动发布部署。并且可以演示项目管理和开发人员通过什么样的手段能及时了解持续集成化的结果。

在演示制作之前,我们先来看一下当前的持续集成环境。

工具

地址和路径

Visual Studio SouceSafe

本局域网下一台服务器,IP地址192.168.1.200,共享目录:VSS,所以其根路径为: \\192.168.1.200\\VSS ,用户名user,密码pwd

CC.Net

CC.Net安装在IP地址为:192.168.1.10的服务器上。

单元测试工具NUnit

和CC.Net安装在同一主机

代码规范工具FxCop

和CC.Net安装在同一主机

发布服务器

位于公网的一台服务器,IP假设为200.100.11.15

 

首先,我们创建用于演示的解决方案Jillzhang.DailyBuild,其中包括四个项目:

项目

项目描述

Jillzhang.DailyBuild.Core

这个是一个公共类库项目,目的是测试类似这样的项目也在构建范围之内。

Jillzhang.DailyBuild.Test

单元测试项目

Jillzhang.DailyBuild.Web

网站项目一

Jillzhang.DailyBuild.Web2

网站项目二

建立好解决方案之后,将其添加到VSS项目管理器中。层次结构如下:

下面我让我们看一下,如何配置CC.Net使其工作起来。

  1. 在CC.Net服务器上,点击开始菜单,在所有程序中选择CruiseControl.Net,打开CruiseControl.NET Config配置文件。
  2. CC.Net支持同时监控和集成多个解决方案,每个解决方案在CC.Net中被称为1个Project.,在CruiseControl.NET Config中1个Project被一个<project>元素来描述。当然我们还要为每个Project指定名称和工作目录和日志存放目录。阅读CC.Net的文档,你可以了解<project>元素的一些属性和子元素。这里我只讲述一些我用到的。

    name ,如<project name="Project1">表示1个名称为Project1的新工程,这个名称在日后会作为项目的标识显示给查看报告的用户。比如显示在cctray上或者在网站doashboard上进行显示。还有一个比较重要的子元素<workingDirectory>这个元素非常类似于WCF配置中的<baseAddress>,用它来指示工程的工作目录,也就是从版本管理器上下载文件的根目录。除了这些我们还需要设定子元素<artifactDirectory >它用来指示日志记录的保存位置。CC.Net为我们提供了几种版本管理方式,可以用<labeler>

    来指定使用哪种类型的版本标签,如Date Labeller,Default Labeller等,具体也可以查阅文档。我们这里使用Date Laberller,所以设置为<labeler type="dateLabeller"/>。下面可以设置源代码管理器,CC.Net支持目前绝大多数主流的版本控制工具,如CVS,VSS,Rational ClearCase,VSTS, Alienbrain等十几种。我们这里使用VSS,根据上文VSS和解决方案的配置,我们这里设置为:  

<sourcecontrol type="vss" autoGetSource="true" applyLabel="true"> 

<project>$/Jillzhang.DailyBuild.root/Jillzhang.DailyBuild</project> 

<username>user</username> 

<password>pwd</password> 

<ssdir>\\192.168.1.200\vss\</ssdir> 

<cleanCopy>false</cleanCopy> 

</sourcecontrol> 

 将autoGetSource设置为true,CC.Net会通过监视VSS中代码的版本变化,自动从版本管理器中获取源代码。Project是要使用的解决方案在vss中的路径,值为如下:

 

Username为访问vss的用户名,password为访问vss的密码。ssdir是 vss代码库的共享路径,我这里为\\192.168.1.200\vss\ 。如果将cleanCopy设置为true,那么CC.Net每次获取最新文件的时候是否完全覆盖更新文件。

当前,我们的配置文件为:

<cruisecontrol> 

<project name="TestProject" webURL="http://127.0.0.1/ccnet/"> 

<workingDirectory >E:\DailyBuild</workingDirectory> 

<artifactDirectory>E:\DailyBuild\Log</artifactDirectory> 

<labeller type="dateLabeller"></labeller> 

<sourcecontrol type="vss" autoGetSource="true" applyLabel="true"> 

<project>$/Jillzhang.DailyBuild.root/Jillzhang.DailyBuild</project> 

<username>user</username> 

<password>pwd</password> 

<ssdir>\\192.168.1.200\vss\</ssdir> 

<cleanCopy>false</cleanCopy> 

</sourcecontrol> 

</project> 

</cruisecontrol> 

设置好VSS后,我们可以启动CC.Net了,方法如下,打开Services.Msc,找到CruismControl.Net Server服务,在启动之前,需要先解决一下可能最影响情绪的问题:我们知道windows services默认情况下是用本地系统账户运行的,可一般情况下我们会在当前操作用户下设置对vss共享目录的访问权限,比如当前windows运行账户为administrator,那么我们在administrator中通过net use设置对\\192.168.1.200\vss\的访问,也可以通过Source Safe Client打开该代码库,可这往往是一个烟雾弹,当我们在CC.Net中试图用服务来访问\\192.168.1.200\vss\ 的时候,系统服务账户并没有与该共享目录建立会话,所以会拒绝访问\\192.168.1.200\vss\,连访问权限都没有,更不用说获取代码了。所以首先要注意的是启动前,先设置服务的运行账户:

只有这样,我们才能进行下面的工作:

启动CruismControl.Net Server服务,重新签出,嵌入一下解决方案,稍等一段时间,我们便会在工作目录E:\DailyBuild中看到自动获取过来的文件。还要值得注意的一点是在log目录中最好事先创建好buildlogs,如果您在启动CrusimControl.Net Server服务的时候有错误出现,比如在启动的时候总是出现:

很可能得情况就是上面的配置有错误,您可以通过下面两种方式来确定服务到底出现了什么样的问题:

  1. 按照提示,在事件查看器中查看错误,如:

  2. 您还可以到CrusimControl.Net Server的应用程序目录查找名为ccnet.log的文件,里面有CC.Net详细的操作步骤。

如果没有启动错误并且在ccnet.log中没有明显的异常,可以打开监视网站来查看集成结果,监视网站的地址是在<project>元素上通过设置webURL属性来完成的,我们打开这个网址,如图:

当Last Build Status为Success的时候表示项目集成成功,此时点击项目名,可以查看具体的集成结果:

如果调用MsBuild来对代码进行生成,调用FxCop进行代码规范检查,和调用NUnit进行单元测试集成,还需要对CC.Net进行下一步的配置。

代码规范检侧工具FxCop不能被CC.Net直接使用,它必须附加到MsBuild.Exe的命令行中,有关如何使用MSBuild,可以参考msdn,不做具体介绍。为此我们创建一个用于生成并检查代码规范的任务,CC.Net支持自定义任务,方法是:使用Task中的Executable Task。

首先在工作目录,创建一个用于msbuild参数的DailyBuild.msbuild文件,文件内容如下:

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

<Target Name="Build"> 

<!-- Clean, then rebuild entire solution --> 

<MSBuild Projects="Jillzhang.DailyBuild.sln" Targets="Clean;Rebuild"/> 

<!-- Run FxCop analysis --> 

<Exec Command="exeu.bat" /> 

</Target> 

</Project> 

这个MsBuild选项会使得msbuild.exe在生成完成之后调用工作目录中的exeu.bat文件,exeu.bat中是关于使用FxCop方法的,内容如下:

cd D:\Program Files\Microsoft FxCop 1.36 

d: 

FxCopCmd /project:E:\DailyBuild\Jillzhang.DailyBuild.FxCop /out:E:\DailyBuild\log\DailyBuild.FxCop.xml 

目的就是通过调用FxCop安装目录下的FxCopCmd命令行工具,对指定的程序集进行规范性检查,上述代码中,E:\DailyBuild\Jillzhang.DailyBuild.FxCop是事先生成好的FxCop项目文件,生成办法是打开FxCop 可视化界面,添加target,并保存到此为位置即可,如图:

并保存到E:\DailyBuild\Jillzhang.DailyBuild.FxCop

添加能生成代码并且检测代码规范性的配置如下:

<tasks> 

<exec> <executable>D:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe</executable> <baseDirectory>E:\DailyBuild</baseDirectory> 

<buildArgs>DailyBuild.msbuild /p:Configuration=Release</buildArgs> 

<buildTimeoutSeconds>1200</buildTimeoutSeconds> 

</exec > 

<merge> 

<files> 

<file>E:\DailyBuild\log\Build.FxCop.xml</file> 

</files> 

</merge> 

</tasks> 

注意,buildTimeoutSeconds是生成操作的超时时间,还有最好设置/p:Configuration=Release,因为这样有利于以后发布。而Merge是将上面各个任务中生成的日志进行合并。

下面重新签出嵌入,观察集成结果:

可以看到,已经release成功。

下面就看一下生成的DailyBuild.FxCop.xml,

打开看里面的内容便可以发现代码检测结果。

 注:本文属jillzhang  原创,转载请注明出处 ,欢迎访问http://jillzhang.cnblogs.com/来获取最新更新

篇幅太长,本篇先介绍到这里,剩下来的自动化单元测试,自动化发布部署留作下篇。 

作者:jillzhang
出处:http://jillzhang.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2008-03-03 18:18 Robin Zhang 阅读(8773) 评论(38) 编辑 收藏

 回复 引用 查看   
#1楼 2008-03-03 19:05 Jeffrey Zhao      
这个话题好,呵呵。
// 最近写了好多文章。:)

 回复 引用 查看   
#2楼[楼主] 2008-03-03 19:39 jillzhang      
CC.Net工作流程下边发布与部署与发布结果之间缺少一个连线
 回复 引用 查看   
#3楼[楼主] 2008-03-03 19:40 jillzhang      
@Jeffrey Zhao
嘿嘿,最近事情不多。

 回复 引用 查看   
#4楼 2008-03-03 20:58 怪怪      
越来越佩服你了...
 回复 引用 查看   
#5楼 2008-03-03 21:07 carysun      
博主每个月都能发好多文章,并且都很有质量,真是佩服
 回复 引用 查看   
#6楼 2008-03-03 21:19 Ariel Y.      
期待继续更深入的探讨~~
 回复 引用 查看   
#7楼 2008-03-03 22:25 winzheng      
◎jillzhang 同志的文章让初学者眼前一亮,让有基础的豁然开朗,赞一个。。。
 回复 引用 查看   
#8楼 2008-03-03 22:26 floodpeak      
老兄最近好勤奋,先向你学习了
明天把你推荐的这些部署一遍,倒是用过一些,没有这么系统

 回复 引用 查看   
#9楼[楼主] 2008-03-03 23:02 jillzhang      
@winzheng
你是嬴政论坛的么?我非常喜欢上嬴政论坛

 回复 引用 查看   
#10楼[楼主] 2008-03-03 23:03 jillzhang      
@怪怪
@floodpeak
@Ariel Y.
@carysun
多谢你们的支持

 回复 引用 查看   
#11楼 2008-03-03 23:03 flyingchen      
这么巧。。。目前项目正在尝试CC
感觉有点小困难:
1.起步收益不多。持续集成开始启动并不会立即产生很多益处,甚至是浪费时间。毕竟这玩意资料不多。一不小心nunit,nuit2搞了半天:(
2.对单元测试的要求高。CC重要的收获源于单元测试的支持。而单元测试在项目中能否有效开展,成了重点,也是难点。这样就要求首先对单元测试重视起来,而这点似乎又可以讨论一翻
3.团队成员对于nant脚本不熟悉(这个好搞定些)

国内这方面资料不多,继续关注博主大作!

 回复 引用 查看   
#12楼 2008-03-03 23:09 TerryLee      
支持老张,你可是最近发帖频率最高的啊:)
 回复 引用 查看   
#13楼 2008-03-03 23:16 flyingchen      
CCTray是个好东西
 回复 引用 查看   
#14楼 2008-03-04 01:14 lexus      
狂顶
 回复 引用 查看   
#15楼 2008-03-04 09:18 毁于随      
很强大呀.真不错.
 回复 引用 查看   
#16楼 2008-03-04 09:20 winzheng      
◎jillzhang
俺名字和winzheng的音译相同,并且本人喜欢这个论坛,故而。。。

 回复 引用 查看   
#17楼 2008-03-04 10:27 Clark Zheng      
好象到现在cc在生成带打包项目的解决方案时依然不能使msbuild,只能是装一个vs,然后直接编译解决方案。。。不过这也不算是cc的问题,而是msbuild不支持生成打包项目,呵呵
 回复 引用 查看   
#18楼 2008-03-04 11:29 kiler      
好文,顶一个
 回复 引用 查看   
#19楼[楼主] 2008-03-04 11:54 jillzhang      
@Clark Zheng
我一般喜欢XCopy的方式部署,所以写的XCopy方式的组件

 回复 引用 查看   
#20楼 2008-03-04 13:09 紫色阴影      
我觉得还是nant好用,利用msbuild来编译
而且路径最好用变量方式声明,另存一个xml保存

 回复 引用 查看   
#21楼 2008-03-04 14:25 Clark Zheng      
@jillzhang
嗯,我的网站项目也基本上是这样,可惜有一个项目有windows service必须做打包项目,唉。。。

 回复 引用 查看   
#22楼[楼主] 2008-03-04 14:30 jillzhang      
@Clark Zheng
windows service是非常适合XCopy部署的,我目前主要负责的就是winservice,网站的倒不多。

 回复 引用 查看   
#23楼[楼主] 2008-03-04 14:35 jillzhang      
@Clark Zheng
当然我结合了自己开发的自动升级工具,我在windows服务主机上跑一个自动升级的服务,该服务能判断windows服务运行状态,升级的时候,自动关闭服务,然后XCopy过去,再自动打开。中间有备份
第一次安装,我喜欢使用installutility.exe

 回复 引用 查看   
#24楼 2008-03-04 22:21 airwolf2026      
好文章,期待单元测试那块的...收藏先.
 回复 引用   
#25楼 2008-03-05 09:01 GPS监控[未注册用户]
作者有才
 回复 引用 查看   
#27楼 2008-03-13 13:39 PCJIM      
看过朋友这么系统的介绍,确实觉得CC.Net功能很强大,学习…
 回复 引用 查看   
#28楼 2008-04-15 18:28 戏水      
http://www.cnblogs.com/images/cnblogs_com/jillzhang/030308_1005_CruiseContr13.png

为什么我无论如何也没有您这图上的左侧的部分 里面的build report及其下面的东西。???

 回复 引用 查看   
#29楼 2008-04-29 16:32 Silent Void      
请教下博主,怎样自动发布Web的?
用MSBuild还是aspnet_compiler.exe?

 回复 引用 查看   
#30楼 2008-05-18 11:08 戏水      
张兄:

小弟参考你的文章,结合自己的实践 也写了一篇关于持续集成的文章 ,请您指正

Discuz!NT持续集成实战http://www.cnblogs.com/zjneter/archive/2008/05/18/1202235.html

 回复 引用   
#31楼 2008-09-08 17:04 fqx666[未注册用户]
博主,您好!阅读你的文章后收获不少,但在后来的实践过程中碰到了如下问题,不知博主能否替我解答一下?谢谢!

No VSS database (srcsafe.ini) found. Set the SSDIR environment variable to the path of srcsafe.ini for your VSS database.

本地通过CruiseControl始终无法获取Vss上的代码,我的ccnet.conif配置如下:
<sourcecontrol type="vss" autoGetSource="true" applyLabel="true">

<executable>C:\Program Files\Microsoft Visual SourceSafe\SS.exe</executable>
<!--源码库中的项目名称-->

<project>$/DDSBusiness/DDS.Web.DDSWeb </project>

<!--vss用户名-->

<username>fy</username>

<!--vss密码-->

<password>fy</password>

<!--vss服务器所在的路径-->

<ssdir>\\192.168.20.89\vss\</ssdir>

<!--工作目录,可以使用相对目录,以上面的workingDirectory为准-->

<workingDirectory>e:\ccnet</workingDirectory>

<cleanCopy>false</cleanCopy>


</sourcecontrol>

 回复 引用 查看   
#32楼[楼主] 2008-09-09 10:17 jillzhang      
@fqx666 [未注册用户]

cc.net服务用的是system的系统服务帐户,这个帐户可能没有访问共享文件夹的权限,将cc的服务登陆帐户更改为admin看看可否

 回复 引用   
#33楼 2008-09-10 15:56 fqx666[未注册用户]
@jillzhang
谢谢博主,我的问题解决了,是服务器上VSS文件夹的共享和安全里面的权限设置问题!谢谢!

 回复 引用 查看   
#34楼 2008-10-24 09:50 shihwei      
您好,請教您一下,是不是只能在把CC.Net架在有開發環境的機器上才能Compile ?
如果該台機器沒有裝VS2003 or VS2005,要如何去 Compile 呢 ?

謝謝。

 回复 引用 查看   
#35楼 2009-01-08 10:25 冰碟      
你好,我在用CC.NET获取VSS代码时出错,错误提示:No VSS database (srcsafe.ini) found. Use the SSDIR environment variable or run netsetup
我感觉问题就在CC.NET的登陆账号那里。我对设置账户这块不是很理解,楼主能否详细的帮我解释一下。我的问题描述:http://www.cnblogs.com/icebutterfly/archive/2009/01/08/1371631.html

 回复 引用 查看   
#36楼 2010-09-07 16:43 virus      
<sourcecontrol type="vss" autoGetSource="true" applyLabel="false">
<executable>C:Program Files\Microsoft Visual SourceSafe\ss.exe</executable>
<project>$/通用类库/SimpleLib.root</project>
<username>swb</username>
<password>swb</password>
<ssdir>\\192.168.0.5\common\</ssdir>
<alwaysGetLatest>false</alwaysGetLatest>
<workingDirectory>D:\shiwenbin\公司文件\VSS\通用类库\SimpleLib.root\project</workingDirectory>
<culture>en-US</culture>
<cleanCopy>false</cleanCopy>
<timeout units="minutes">10</timeout>
</sourcecontrol>


这个配置有问题吗

 回复 引用 查看   
#37楼 2012-02-06 11:42 wliping      
请问各位高手,CruiseControl.NET如何配置每个月执行一次?