-
Daily Build Using CC and MSBuild
2010-05-25 15:14:27
在上一篇项目管理实践教程二、源代码控制【Source Control Using VisualSVN Server and TortoiseSVN】中我们已经讲解了如何使用TortoiseSVN和VisualSVN Server来做简单的版本控制,这一篇我们将会讲解使用CruiseControl.NET和MSBuild来搭建每日构建系统。
在第一篇项目管理实践教程一、工欲善其事,必先利其器【Basic Tools】 中我们已经安装了CruiseControl.NET 1.4,因为我们还要用到MSBuild,所以如果你的系统没有安装Visual Studio,那么你需要首先安装Visual Studio 2005/2008,我们在这里使用的是Visual Studio 2008,准备好这些了吗?OK,我们正式开始今天的课程!
首先,我们要配置CruiseControl.NET【下面简写为CCNET】,配置完成后,我们每次提交源代码到SVN服务器后,CCNET就可以自动从SVN服务器上签出源代码,并调用MSBuild自动进行编译。我们以昨天的教程中创建的StartKit项目为实例,先看看下面的配置文件:
CCNET配置文件代码
1 <cruisecontrol xmlns:cb="urn:ccnet.config.builder">
2 <!--项目名称-->
3 <name>StartKit</name>
4 <!--标示类型,有多种类型。下面为默认标示,作为每次编译时生成的日志文件的名称-->
5 <labeller type="defaultlabeller">
6 <!--前缀-->
7 <prefix>StartKit-1-</prefix>
8 <!--编译失败时是否增加-->
9 <incrementOnFailure>false</incrementOnFailure>
10 <!--格式-->
11 <labelFormat>00000</labelFormat>
12 </labeller>
13 <!--项目的WebDashboard地址,CruiseControl.NET包括二部分,一是Server用来配置项目和监视文件修改,二是WebDashboard,是一个显示项目信息及编译信息的Website-->
14 <webURL>http://202.196.96.55:8080/server/local/project/StartKit/ViewProjectReport.aspx</webURL>
15 <!--触发器,包含多种,有兴趣可以查看官方文档-->
16 <triggers>
17 <!--时间间隔触发器,下面是60秒触发一次-->
18 <intervalTrigger seconds="60" />
19 </triggers>
20 <!--如果发现修改,延迟多久开始编译,下面是2秒-->
21 <modificationDelaySeconds>2</modificationDelaySeconds>
22 <!--源代码控制系统,支持多种,有兴趣可以查看官方文档,下面采用svn-->
23 <sourcecontrol type="svn">
24 <!--源代码在SVN服务器上的路径-->
25 <trunkUrl>http://zt.net.henu.edu.cn/svn/StartKit/StartKit/</trunkUrl>
26 <!--svn服务器所在路径,在这里就是VisualSVN Server安装目录中的bin目录下的svn.exe -->
27 <executable>C:/Program Files/VisualSVN Server/bin/svn.exe</executable>
28 <!--用来迁出源代码的用户名,svn服务器进行验证-->
29 <username>starter</username>
30 <!--用来迁出源代码的用户名对应的密码-->
31 <password>123456</password>
32 <!--web获取源代码的地址,类似于开源网站上浏览代码的那部分功能,这里的类型是trac-->
33 <!--<webUrlBuilder type="trac">
34 <!--trac中对应项目的地址¬-->
35 <tracProjectUrl>http://svn.net.henu.edu.cn/pojects/StartKit/</tracProjectUrl>
36 <!--trac中对应项目的源代码库地址,相对于上面的路径-->
37 <tracRepositoryRoot>/StartKit</tracRepositoryRoot>
38 </webUrlBuilder>-->
39 </sourcecontrol>
40 <!--该节点用来配置具体执行那些任务-->
41 <tasks>
42 <!--msbuild任务配置,用来编译项目-->
43 <msbuild>
44 <!--MSBuild.exe的路径-->
45 <executable>C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe</executable>
46 <!--从SVN迁出的源代码的存放位置,可以不配置,下面的即为默认值 -->
47 <!--我这里的CruiseControl.NET 安装在D盘,你们使用时候,改成自己的安装路径即可-->
48 <workingDirectory>D:\Program Files\CruiseControl.NET\server\StartKit\WorkingDirectory</workingDirectory>
49 <!--对这个项目的监控过程的日志记录目录,可以不配置,下面的即为默认值-->
50 <!--我这里的CruiseControl.NET 安装在D盘,你们使用时候,改成自己的安装路径即可-->
51 <artifactDirectory> D:\Program Files\CruiseControl.NET\server\StartKit\ Artifacts</artifactDirectory>
52 <!--要编译的项目名称 -->
53 <projectFile>StartKit.sln</projectFile>
54 <!-- MSBuild编译时的参数,具体参数信息可以查看MSDN上的说明-->
55 <buildArgs>/p:configuration=debug</buildArgs>
56 <!--指定日志记录模块-->
57 <!--我这里的CruiseControl.NET 安装在D盘,你们使用时候,改成自己的安装路径即可-->
58 <logger>ThoughtWorks.CruiseControl.MsBuild.XmlLogger,D:\Program Files\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MsBuild.dll</logger>
59 <!--编译目标-->
60 <targets />
61 </msbuild>
62 <!--在这里还可以添加其他的程序,比如运行测试、部署项目等等-->
63 </tasks>
64 <!--项目编译状态信息的保存位置-->
65 <!--我这里的CruiseControl.NET 安装在D盘,你们使用时候,改成自己的安装路径即可-->
66 <state type="state" directory="D:\Program Files\CruiseControl.NET\server\CCState" />
67 <!--发布和部署配置-->
68 <publishers>
69 <!--如果编译成功,那么下面的配置,会将源代码复制到指定目录HistoryVersion下,名称为版本标识(自动增长,labeller配置)的子目录下-->
70 <buildpublisher>
71 <!--源代码路径-->
72 <!--我这里的CruiseControl.NET 安装在D盘,你们使用时候,改成自己的安装路径即可-->
73 <sourceDir> D:\Program Files\CruiseControl.NET\server\StartKit\WorkingDirectory </sourceDir>
74 <!--编译成功后保存源代码到该目录下名称为版本标示labeller的目录中-->
75 <!--我这里的CruiseControl.NET 安装在D盘,你们使用时候,改成自己的安装路径即可-->
76 <publishDir> D:\Program Files\CruiseControl.NET\server\StartKit\HistoryVersion </publishDir>
77 </buildpublisher>
78 <!--该节点用来配置合并多个文件,当时有外部插件时,要把他们分别产生的输出文件合并-->
79 <merge>
80 <!--要合并的文件,合并后的信息可以显示在Web Dashboard和邮件通知里-->
81 <files>
82 <!--我这里的CruiseControl.NET 安装在D盘,你们使用时候,改成自己的安装路径即可-->
83 <file>D:\Program Files\CruiseControl.NET\server\StartKit\WorkingDirectory\results.xml</file>
84 </files>
85 </merge>
86 <!--源代码路径-->
87 <xmllogger />
88 <!--显示历史修改记录列表, 在Web Dashboard中可以查看-->
89 <modificationHistory />
90 <!--所有编译信息的统计, 在Web Dashboard中可以查看-->
91 <statistics />
92 <!--邮件通知配置,每次编译后,都会邮件通知下面配置中添加的用户-->
93 <!-- mailhost是发送邮件的主机,mailport是邮件发送端口,mailhostUsername发送邮件的邮箱用户名,mailhostPassword发送邮件的邮箱密码,from希望显示在发件人中的邮箱地址, includeDetails邮件内容是否包含详细的编译信息 -->
94 <email mailhost="smtp.qq.com" mailport="25"
95 mailhostUsername="******" mailhostPassword="******" from="******@qq.com" includeDetails="true">
96 <!--接收邮件通知的用户 -->
97 <users>
98 <!--name是SVN服务器上存在的用户名,group是SVN服务器上存在的组,address是该用户的邮箱地址 -->
99 <user name="zt" group="StartKit" address="******1@qq.com" />
100 <user name="***" group="StartKit" address="******2@qq.com" />
101 <user name="***" group="StartKit" address="******3@qq.com" />
102 </users>
103 <!--接收邮件通知的组-->
104 <groups>
105 <!--name必须是SVN服务器上存在的组,notification是什么时候发送通知,可选有Always/Success/Change/Fixed/Failed --> 106 <group name="StartKit " notification="always" /> 107 </groups>
108 </email>
109 </publishers>
110 </project>
111 <!--可以同时添加多个项目
112 <project >
113 <name>test</name>
114 ……
115 </project>
116 -->
117 </cruisecontrol
好了,我们已经对CCNET的配置文件有了大致的了解,接下来,你打开CCNET的安装路径,找到子目录server下的ccnet.config文件,把上面的配置信息Copy到ccnet.config文件中,记得把配置文件中的一些路径修改为自己的实际路径啊,修改好后,保存。这时候,检查Windows服务CruiseControl.NET Server是否启动,如果没有则启动它,启动该服务后,打开浏览在地址栏输入上面配置文件中的webUrl地址:http://202.196.96.55:8080/server/local/project/StartKit/ViewProjectReport.aspx 也可以直接输入http://202.196.96.55:8080/server/ ,这里是演示地址,要根据自己的实际情况修改为正确的地址,OK,看到类似下图的效果,好了,搞定!如果你遇到了什么麻烦,请在下面留言,我一定会及时回复!
点击StartKit,转入下图所示的页面:
OK,到这里,我们提交更新到SVN服务器后,CCNET就会根据我们配置自动编译项目,而且我们也可以通过Web Dashboard来查看具体的编译信息了,提示如果配置了邮件发送,那么我们还可以通过邮件收到详细的编译信息,怎么样?够方便吧!
其实,CCNET的功能是相当强大的,上面只是最常用的配置,其他还有很多非常好的功能。你想知道吗?那你可以在这里查看CCNET官方文档 ,实际上,你安装CCNET后,文档也已经安装到你的电脑了,在CCNET的安装目录下的webdashboard的子目录doc中就是。
好了,我们今天的教程就到这里,本来我应该把如何使用CruiseControl.NET Tray来监视每次更新后的编译状态,但是今天真的太晚了,明天还要做项目,所以我明天补上,请大家见谅!
补充部分:
下面我简单讲一下,如何使用CruiseControl.NET Tray【以下简称CCTray】来监视每次提交后的编译状态。
安装好打开CCTray后,运行CCTray程序,点击左上角的菜单File下的Settings…,如下图:
点击Settings…会弹出下面的窗体:
切换到Build Projects选项卡,如下图:
点击Add…按钮,添加我们的CCNET服务器,如下图:
输入我们的CCNET服务器后,CCNET服务器上的项目就会在右侧显示出来,如下图:
选中右侧的项目后,点击OK按钮,返回CCTray打开时的界面,我们的二个项目已经添加进来了,如下图:
我们在桌面的右下角的任务栏,可以看到如下图所示的图标:
绿色的那个标示就是CCTray的标示,绿色表示所有的项目都通过了编译,紫红色表示至少有一个项目没有通过编译,橘黄色表示有项目正在编译,橘红色表示有项目被强制编译,显示为灰色则说明和CCNET服务器失去了链接。
OK,大家可以使用CCTray实时监视提交更新后项目的编译状态了。 -
cruisecontrol下载地址
2010-05-25 12:06:56
http://cruisecontrol.sourceforge.net/download.html
-
如何用CruiseControl.Net来进行持续化集成
2010-05-25 12:02:47
本文总结了过去一年中使用CruiseControl.Net来对工作流程进行持续化集成的经验教训,详细地讲述安装,配置,使用CruiseControl.Net的具体步骤,希望通过阅读本文,能理解和掌握使用CruiseControl.Net的基本使用技巧,用工具来改善工作流程和提高工作效率。
什么是持续化集成
首先,我们先搞清楚什么是持续化集成?它对我们的日常工作有什么样的帮助?在过去几年中,敏捷已经是一个非常热门的话题,它高效的工作方式和快速的需求应对能力,赢得了很多中小软件厂商的关注。那么敏捷除了一些经常谈论到编程思维和迭代的开发模式等,其实还部分依赖于好的改善工作流程的工具。持续化集成工具便是服务于敏捷软件开发的一个系列。它主要将原本分散,无序的工作流程,通过工具软件有机的组织起来,并且在组织的过程中,参与开发设计测试的各个部门的人员都能从中获取到自动化方面的优惠。使得团队的工作效率大大提升。
CruiseControl.Net是什么?
上面讲解了什么是持续化集成,那CruiseControl.Net就是一款由ThoughtWorks公司提供给我们的轻量级的持续化集成工具。它能够将代码版本控制,单元测试,代码规范检查,项目的发布部署等工作步骤有机的组织起来,并且利用其调度性可作自动化处理,它还有强大的日志记录功能,能将集成结果及时地反馈给项目管理人员和项目开发人员。在下文中凡是用到CruiseControl.Net均用CC.Net来代替。下面是CC.Net的工作流程图
附件: 030308_1005_CruiseContr1.png
如何安装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文件即可。下载后,在本地的安装过程如下:- 双击CruiseControl.NET-1.3-Setup.exe程序,打开软件安装界面,如下:
附件: 030308_1005_CruiseContr2.png
- 一直点击Next,选择软件安装路径,等待软件安装完成,界面如下:
附件: 030308_1005_CruiseContr3.png
- 软件安装完成之后,在系统windows服务中将增加名为CruiseControl.Net Server的系统服务,如下:
附件: 030308_1005_CruiseContr4.png
注意,默认情况该服务是出于未启动状态的。
- 代码版本管理工具如VSS
- 代码构建工具,如果您是vs.net的用户,强烈建议不要使用NAnt,配置起来比较麻烦,建议使用MsBuild来做构建工具。MsBuild是随.Net FrameWork 2.0一起安装的,所您需要在CC.Net服务器上安装.Net FrameWork 2.0或者以上版本。
- 代码规范检查工具,.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 关闭了,在新的站点中,我没有搜索到它。
- 单元测试工具:Nunit,官方主页:http://sourceforge.net/projects/nunit
- 发布部署工具,如果是asp.net网站,可以使用ASP.NET 编译工具 (Aspnet_compiler.exe),但我感觉它不好用,于是我自己实现了一系列的代码发布,FTP上传,XCopy安装等组件,在后面会提到。
如何配置和部署
假定上述的几个工具已经成功安装,下面就用一个项目来演示一下如何实现自动化构建,单元测试,代码规范检测,自动发布部署。并且可以演示项目管理和开发人员通过什么样的手段能及时了解持续集成化的结果。
在演示制作之前,我们先来看一下当前的持续集成环境。
工具 地址和路径 Visual Studio SouceSafe 本局域网下一台服务器,IP地址192.168.1.200,共享目录:VSS,所以其根路径为: [url=file://192.168.1.200//VSS]\\192.168.1.200\\VSS[/url] ,用户名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项目管理器中。层次结构如下:
附件: 030308_1005_CruiseContr5.png
下面我让我们看一下,如何配置CC.Net使其工作起来。- 在CC.Net服务器上,点击开始菜单,在所有程序中选择CruiseControl.Net,打开CruiseControl.NET Config配置文件。
- 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中的路径,值为如下:
附件: 030308_1005_CruiseContr6.png
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>
附件: 030308_1005_CruiseContr7.png
只有这样,我们才能进行下面的工作:
启动CruismControl.Net Server服务,重新签出,嵌入一下解决方案,稍等一段时间,我们便会在工作目录E:\DailyBuild中看到自动获取过来的文件。还要值得注意的一点是在log目录中最好事先创建好buildlogs,如果您在启动CrusimControl.Net Server服务的时候有错误出现,比如在启动的时候总是出现:
附件: 030308_1005_CruiseContr8.png
很可能得情况就是上面的配置有错误,您可以通过下面两种方式来确定服务到底出现了什么样的问题:
- 按照提示,在事件查看器中查看错误,如:
附件: 030308_1005_CruiseContr9.png
- 您还可以到CrusimControl.Net Server的应用程序目录查找名为ccnet.log的文件,里面有CC.Net详细的操作步骤。
附件: 030308_1005_CruiseContr10.png
当Last Build Status为Success的时候表示项目集成成功,此时点击项目名,可以查看具体的集成结果:
附件: 030308_1005_CruiseContr11.png
如果调用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>
cd D:\Program Files\Microsoft FxCop 1.36
目的就是通过调用FxCop安装目录下的FxCopCmd命令行工具,对指定的程序集进行规范性检查,上述代码中,E:\DailyBuild\Jillzhang.DailyBuild.FxCop是事先生成好的FxCop项目文件,生成办法是打开FxCop 可视化界面,添加target,并保存到此为位置即可,如图:
d:
FxCopCmd /project:E:\DailyBuild\Jillzhang.DailyBuild.FxCop /out:E:\DailyBuild\log\DailyBuild.FxCop.xml
附件: 030308_1005_CruiseContr12.png
并保存到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>
下面重新签出嵌入,观察集成结果:
附件: 030308_1005_CruiseContr13.png可以看到,已经release成功。
下面就看一下生成的DailyBuild.FxCop.xml,
附件: 030308_1005_CruiseContr14.png
打开看里面的内容便可以发现代码检测结果。 - 双击CruiseControl.NET-1.3-Setup.exe程序,打开软件安装界面,如下:
-
CruiseControl 配置
2010-05-25 12:00:17
CruiseControl 的概念和好处,我就不在复诉,下面是我的配置环境与配置文件。
配置环境:
CruiseControl : cruisecontrol-bin-2.7.zip
Apache-Ant : 1.7.0
Junit : 4.0
JRE : 5.0_12
Eclipse :
在此环境中,要保持Ant与Junit的版本协调,最初使用Cruisecontrol-2.7随包发布的apache-ant-1.6.5进行单元测试时,会报 No tests found in .... ,Ant1.7是支持JUnit4的,所以将Ant升级为1.7.0的版本,问题解决。
1、设置环境变量
由于使用ZIP的版本,所以需要设置 JAVA_HOME 的路径。注意由ANT的版本已升级为1.7.0,所以在config.xm中应该指定ant_home的路径。2、CruiseControl 的config.xml
1<?xml version='1.0' encoding='gb2312'?>
2<cruisecontrol>
3 <project name="projectName">
4
5 <!-- 用于处理一些项目有关的事件 -->
6 <listeners>
7 <!-- 用来访问项目当前创建的状态 file: 指定了状态文件的位置 -->
8 <currentbuildstatuslistener file="logs/${project.name}/status.txt"/>
9 </listeners>
10
11 <!-- 在 CC 进行创建之前运行,是创建前的准备工作 -->
12 <bootstrappers>
13 <!-- 从源码控制系统更新本地文件: cvsbootstrappers、vssbootstrappers、svnbootstrapper -->
14 <svnbootstrapper localWorkingCopy="projects/${project.name}" />
15 </bootstrappers>
16
17 <!-- 检查各个源码控制系统中是否发生变化;quietperiod: 单位为秒 设定等待的时间 -->
18 <!-- 第一次的取出工作为手动执行 -->
19 <modificationset quietperiod="600">
20 <svn localWorkingCopy="projects/${project.name}"/>
21 </modificationset>
22
23 <!-- 指定了构建的时间间隔 单位为秒-->
24 <schedule interval="60">
25 <ant anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml"/>
26 </schedule>
27
28 <!-- 指定项目日志保存的地点 -->
29 <log>
30 <!-- 通常是指定 CC 的合并日志的目录 -->
31 <merge dir="projects/${project.name}/test-reports"/>
32 </log>
33
34 <!-- 在 build loop 结束之后运行,发布 build 的结果 -->
35 <publishers>
36 <!--onsuccess-->
37 <!--用于对创建过程中产生的人工制品进行发布-->
38 <!--artifactspublisher dest="artifacts/${project.name}" file="projects/${project.name}/target/${project.name}.jar"/>
39 </onsuccess-->
40
41 <!--
42 mailhost=邮件主机
43 returnname=发件人
44 returnaddress=发件地址
defaultsuffix=默认邮件后缀
45 -->
46 <htmlemail
47 charset="UTF-8"
48 mailhost="smtp.163.com"
49 defaultsuffix="@xxx.com"
50 username="xxx@163.com"
51 password="xxx"
52 returnname="CruiseControl"
53 returnaddress="xxx@163.com"
54 subjectprefix="构建日志"
55 xsldir="webapps/cruisecontrol/xsl"
56 css="webapps/cruisecontrol/css/cruisecontrol.css">
57 <always address="xxx@xxx.com.cn"/>
58 <failure address="xxx@xxx,yyy@yyy.com.cn"/>
59
60 </htmlemail>
61
62 </publishers>
63
64 </project>
65</cruisecontrol>
2、build.xml的特性文件1
2projcet.path=xxx
3
4projcet.name=xxx
5
6catalina.home=xxx
7
8catalina.port=xxx
9
10catalina.username=xxx
11
12catalina.password=xxx
3、工程的build.xml1<?xml version="1.0" encoding="UTF-8" ?>
2
3<!-- Continuous Integration 工程名称 Gms 默认任务 CI -->
4<project default="CI" name="xxx" basedir=".">
5
6
7 <!-- 特性文件 在特性文件中 注意路径的正反斜杠问题 -->
8 <property file="build.properties"/>
9
10 <!-- ================================ 工程参数 ================================ -->
11
12 <!-- 工程中文名称 -->
13 <property name="projectName_CN" value="xxx"/>
14 <!-- 工程目录 -->
15 <property name="projectFolder" value="${projcet.path}/${projcet.name}"/>
16
17 <!-- 源程序目录 -->
18 <property name="sourceFolder" value="${projectFolder}/src/main/java"/>
19 <!-- 配置文件目录 -->
20 <property name="configFolder" value="${projectFolder}/src/main/config"/>
21 <!-- 测试程序目录 -->
22 <property name="testFolder" value="${projectFolder}/src/test/java"/>
23 <!-- lib目录 -->
24 <property name="libFolder" value="${projectFolder}/WebRoot/WEB-INF/lib"/>
25 <!-- 编译程序目录 -->
26 <property name="classFolder" value="${projectFolder}/WebRoot/WEB-INF/classes"/>
27
28 <!-- 单元测试报告目录 -->
29 <property name="reportFolder" value="${projectFolder}/test-reports"/>
30 <!-- 单元测试报告文件名 -->
31 <property name="reportFileName" value="junit-noframes.html"/>
32
33 <!-- ================================ 发布设置 ================================ -->
34
35 <!-- 生成war文件 -->
36 <property name="warFile" value="${projectFolder}/${projcet.name}.war"/>
37 <!-- web.xml文件 -->
38 <property name="webFile" value="${projectFolder}/WebRoot/WEB-INF/web.xml"/>
39 <!-- 生成war文件的基础路径 -->
40 <property name="warSource" value="${projectFolder}/target/classes"/>
41
42 <!-- ================================ 路径设置 ================================ -->
43
44 <!-- 编译过程中用到的路径 -->
45 <path id="compilePath">
46 <!-- 编译程序目录 -->
47 <pathelement path="${classFolder}" />
48 <!-- 编译时lib路径 -->
49 <path refid="libPath" />
50 </path>
51
52 <!-- 单元测试时用到的路径 -->
53 <path id="jUnitPath">
54 <!-- 编译程序目录 -->
55 <pathelement path="${classFolder}" />
56 <!-- 编译时lib路径 -->
57 <path refid="libPath" />
58 </path>
59
60 <!-- 编译时lib路径 -->
61 <path id="libPath">
62 <!-- lib目录 -->
63 <fileset dir="${libFolder}">
64 <include name="**/*.jar" />
65 </fileset>
66 </path>
67
68 <!-- ================================ 持续集成 ================================ -->
69
70 <!-- 集成流程 暂时没有加入 Test -->
71 <target name="CI" depends="init,compile,test,makewar,deploy-catalina" description="持续集成"/>
72
73 <!-- 1.初始化目标目录, class ; report -->
74 <target name="init" description="初始化">
75
76 <echo>正在删除编译程序目录</echo>
77 <delete dir="${classFolder}" />
78 <echo>正在创建编译程序目录</echo>
79 <mkdir dir="${classFolder}" />
80
81 <echo>正在删除单元测试报告目录</echo>
82 <delete dir="${reportFolder}" />
83 <echo>正在创建单元测试报告目录</echo>
84 <mkdir dir="${reportFolder}" />
85 </target>
86
87 <!-- 2.编译程序生成目标类 -->
88 <target name="compile" depends="init" description="编译">
89 <echo>编译源程序</echo>
90 <!-- classpathref="编译路径" destdir="${编译程序目录}" -->
91 <javac classpathref="compilePath" fork="true" memorymaximumsize="128m"
92 destdir="${classFolder}" debug="true" deprecation="false"
93 failonerror="false" verbose
标题搜索
我的存档
数据统计
- 访问量: 57250
- 日志数: 55
- 建立时间: 2009-02-11
- 更新时间: 2010-12-01