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.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>
此构建文件需要优化,在部署时仍存在各种问题,不够完善。