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
2
projcet.path=xxx
3
4
projcet.name=xxx
5
6
catalina.home=xxx
7
8
catalina.port=xxx
9
10
catalina.username=xxx
11
12
catalina.password=xxx
3、工程的build.xml
1
<?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="false">
94
<!-- 源程序目录 -->
95
<src path="${sourceFolder}" />
96
<!-- 测试程序目录 -->
97
<src path="${testFolder}" />
98
<!-- 配置文件目录 -->
99
<src path="${configFolder}" />
100
101
<include name="**/*.java" />
102
</javac>
103
<copy todir="${classFolder}">
104
<fileset dir="${configFolder}">
105
<include name="**/*.*"/>
106
</fileset>
107
<fileset dir="${sourceFolder}">
108
<include name="**/*.xml"/>
109
</fileset>
110
</copy>
111
</target>
112
113
<!-- 3.运行JUnit测试 -->
114
<target name="test" description="执行单元测试">
115
<echo>运行单元测试用例
</echo>
116
<!-- haltonfailure="true" 出现fail即终止build -->
117
<junit printsummary="true">
118
<classpath refid="jUnitPath" />
119
<!-- 指定测试结果类型 -->
120
<formatter type="xml"/>
121
<!-- 批量测试集 todir="${reportFolder}" 单元测试报告目录 -->
122
<batchtest todir="${reportFolder}">
123
<!-- dir="${classFolder}" 编译程序目录 -->
124
<fileset dir="${classFolder}">
125
<!-- 包含 -->
126
<include name="**/*Test.class"/>
127
</fileset>
128
</batchtest>
129
</junit>
130
131
<echo>生成单元测试报告
</echo>
132
<!-- XSLT格式化XML,生成HTML的报告 todir="${reportFolder}" 单元测试报告目录 -->
133
<junitreport todir="${reportFolder}" description="生成单元测试报告">
134
<fileset dir="${reportFolder}">
135
<!-- formatter生成报告文件的默认命名规范是TEST-*.xml -->
136
<include name="TEST-*.xml" />
137
</fileset>
138
<!-- format="frames" 生成有框架 noframes 无框架-->
139
<report format="frames" todir="${reportFolder}" />
140
</junitreport>
141
</target>
142
143
<!-- 4.打包成war文件 -->
144
<target name="makewar" depends="" description="发布WAR文件">
145
<echo>打包成war文件
</echo>
146
<war destfile="${warFile}" webxml="${webFile}">
147
<!-- 添加web文件,过滤web.xml与测试类 -->
148
<fileset dir="${projectFolder}/WebRoot" excludes="WEB-INF/web.xml,WEB-INF/classes/**/*Test.class"/>
149
</war>
150
</target>
151
152
<!-- ================================ 依赖TOMCAT管理部署 ================================ -->
153
154
<!--5.部署 此种部署方式有时会导致内存溢出 -->
155
<target name="deploy-catalina" depends="remove-local-catalina,deploy-local-catalina" description="部署到TOMCAT服务器">
156
157
</target>
158
159
<!-- 执行remove-local-catalina任务后,在应用中有几个jar文件无法删除
160
解决办法是在 MEAT-INF目录下 创建context.xml 内容为:
161
<?xml version="1.0" encoding="UTF-8"?>
162
<Context reloadable="true" antiResourceLocking="true"/>
163
-->
164
<target name="remove-local-catalina" depends="" description="删除TOMCAT上部署的应用">
165
<!--fail unless="env.CATALINA_HOME" message="Tomcat6 Not Found"/-->
166
<property name="deploy.local.remove.url" value="http://localhost:${catalina.port}/manager/remove"/>
167
<!-- src="${deploy.local.remove.url}?path=/${projcet.name}" 这个URL是删除命令 -->
168
<get dest="deploy-local-remove.txt"
169
src="${deploy.local.remove.url}?path=/${projcet.name}"
170
username="${catalina.username}"
171
password="${catalina.password}"/>
172
<loadfile property="deploy.local.remove.result"
173
srcfile="deploy-local-remove.txt"/>
174
<echo>${deploy.local.remove.result}</echo>
175
</target>
176
177
<target name="deploy-local-catalina" depends="" description="部署应用到TOMCAT">
178
<property name="deploy.local.urlpath" value="file:///${warFile}"/>
179
<property name="deploy.local.url.params" value="path=/${projcet.name}&war=${deploy.local.urlpath}"/>
180
<property name="deploy.local.url" value="http://localhost:${catalina.port}/manager/install"/>
181
<get src="${deploy.local.url}?${deploy.local.url.params}"
182
dest="deploy-local.txt"
183
username="${catalina.username}"
184
password="${catalina.password}"/>
185
186
<loadfile property="deploy.local.result"
187
srcfile="deploy-local.txt"/>
188
<echo>${deploy.local.result}</echo>
189
</target>
190
191
<!-- ================================ 拷贝部署:Tomcat启动后,处于运行状态,Ant始终无法获得返回状态 ================================ -->
192
193
<target name="deploy-tomcat" depends="stop-tomcat,copy-tomcat,start-tomcat" description="拷贝方式部署到TOMCAT服务器"/>
194
195
<target name="stop-tomcat" description="调用批处理停止TOMCAT">
196
<exec dir="${catalina.home}/bin"
197
executable="${catalina.home}/bin/shutdown.bat"
198
os="Windows 2003, Windows XP, Windows 2000, Windows NT" >
199
<arg line="-S" />
200
</exec>
201
<sleep seconds="5" description="Tomcat关闭后,等待使用文件的释放"/>
202
<delete dir="${catalina.home}/webapps/${projcet.name}" description="删除应用目录"/>
203
</target>
204
205
<target name="start-tomcat" description="调用批处理启动TOMCAT">
206
<exec dir="${catalina.home}/bin" resolveexecutable="true"
207
executable="cmd"
208
os="Windows 2003, Windows XP, Windows 2000, Windows NT" >
209
<arg value="/C startup.bat"/>
210
</exec>
211
</target>
212
213
<target name="copy-tomcat" description="部署WAR到TOMCAT">
214
<copy todir="${catalina.home}/webapps" file="${warFile}"/>
215
</target>
216
217
<!-- ================================ Tomcat扩展Ant部署 ================================ -->
218
219
<target name="deploy" depends="remove-local-catalina,copy-tomcat,start" description="拷贝方式部署到TOMCAT服务器"/>
220
221
<!-- 定义ant扩展的classpath -->
222
<path id="catalina.ant" location="${catalina.home}/lib/catalina-ant.jar"/>
223
224
<!-- 扩展 start 标签 -->
225
<taskdef name="start" classname="org.apache.catalina.ant.StartTask" classpathref="catalina.ant"/>
226
<!-- 扩展 stop 标签 -->
227
<taskdef name="stop" classname="org.apache.catalina.ant.StopTask" classpathref="catalina.ant"/>
228
229
<target name="start" description="Start Tomcat application">
230
<start url="http://localhost:${catalina.port}/manager/" username="${catalina.username}" password="${catalina.password}" path="/${projcet.name}" />
231
</target>
232
233
<target name="stop" description="Stop Tomcat application">
234
<stop url="http://localhost:${catalina.port}/manager/" username="${catalina.username}" password="${catalina.password}" path="/${projcet.name}" />
235
</target>
236
237
</project>
此构建文件需要优化,在部署时仍存在各种问题,不够完善。