<!--1.初始化目标目录,将目标目录清空,创建源程序目录,测试程序目录和class目录 -->
<target name="初始化">
<echo>正在删除源程序目录...</echo>
<delete dir="${源程序目录}" />
<echo>正在创建源程序目录...</echo>
<mkdir dir="${源程序目录}" />
<echo>正在删除测试程序目录...</echo>
<delete dir="${测试程序目录}" />
<echo>正在创建测试程序目录...</echo>
<mkdir dir="${测试程序目录}" />
<echo>正在删除编译程序目录...</echo>
<delete dir="${编译程序目录}" />
<echo>正在创建编译程序目录...</echo>
<mkdir dir="${编译程序目录}" />
<echo>正在删除lib目录...</echo>
<delete dir="${lib目录}" />
<echo>正在创建lib目录...</echo>
<mkdir dir="${lib目录}" />
<echo>正在删除单元测试报告目录...</echo>
<delete dir="${单元测试报告目录}" />
<echo>正在创建单元测试报告目录...</echo>
<mkdir dir="${单元测试报告目录}" />
</target>
<!--2.从cvs中获取程序源码 -->
<target name="获取源码" depends="">
<echo>从CVS中获取源码...</echo>
<cvs cvsRoot="${CVS连接符}" command="export -f -r HEAD ${CVS模块}"
dest="${CVS检出目录}" />
</target>
<target name="获取lib">
<echo>从CVS中获取lib目录...</echo>
<cvs cvsRoot="${CVS连接符}" command="export -f -r HEAD ${CVSLib模块}"
dest="${CVS检出目录}" />
</target>
<!--3.编译程序生成目标类 -->
<target name="编译源码" depends="">
<echo>编译程序...</echo>
<javac classpathref="编译路径" fork="true" memorymaximumsize="128m"
destdir="${编译程序目录}" debug="true" deprecation="false"
failonerror="false" verbose="false">
<src path="${源程序目录}" />
<src path="${测试程序目录}" />
<include name="**/*.java" />
</javac>
</target>
<!--4.运行JUnit测试 -->
<target name="运行测试" depends="" description="执行单元测试">
<echo>运行单元测试用例...</echo>
<junit>
<classpath refid="单元测试时路径" />
<formatter type="xml" />
<batchtest todir="${单元测试报告目录}">
<fileset dir="${编译程序目录}">
<exclude name="**/TestTools.class" />
<include name="**/**Test**.class" />
</fileset>
</batchtest>
</junit>
<echo>生成单元测试报告...</echo>
<junitreport todir="${单元测试报告目录}" description="生成单元测试报告">
<fileset dir="${单元测试报告目录}">
<include name="TEST-*.xml" />
</fileset>
<report format="noframes" todir="${单元测试报告目录}" />
</junitreport>
</target>
<!--5.发邮件 -->
<target name="发送测试报告邮件" depends="">
<echo>发送测试报告邮件...</echo>
<mail mailhost="${邮件服务器地址}"
subject="单元测试报告 : ${项目中文名称} - ${DSTAMP}" user="${发送邮件用户}"
password="${发送邮件密码}" tolist="${接受报告用户邮件列表}"
messagefile="${单元测试报告目录}\${单元测试报告文件名}">
<from address="${发送用户邮箱地址}" />
<fileset file="${单元测试报告目录}\${单元测试报告文件名}" />
</mail>
</target>
<!--6.打包成jar文件 -->
<target name="生成jar" depends="">
<echo>打包成jar文件...</echo>
<jar destfile="${生成jar文件}" basedir="${生成jar文件的基础路径}" />
</target>
<!--编译过程中用到的路径 -->
<path id="编译路径">
<pathelement path="${编译程序目录}" />
<path refid="编译时lib路径" />
</path>
<path id="编译时lib路径">
<fileset dir="${lib目录}">
<include name="**/*.jar" />
</fileset>
</path>
<!--单元测试时用到的路径 -->
<path id="单元测试时路径">
<path refid="编译时lib路径" />
<pathelement path="${编译程序目录}" />
</path>
</project>
==============================================================
对config.xml设置的内容
<cruisecontrol>
<project name="hello">
<listeners>
<currentbuildstatuslistener file="logs/hello/status.txt" />
</listeners>
<bootstrappers>
<cvsbootstrapper localWorkingCopy="projects/hello" />
</bootstrappers>
<!—监控本地工作目录,如果在下面的目录中发生变化则自动执行下面的build.xml,没有变化则不再执行下面的构建工作 -->
<modificationset quietperiod="30" > <!—监控前的静默 -->
<cvs localWorkingCopy="projects/hello"/>
<cvs localWorkingCopy="projects/hello/main/src/java/com/test/qik"/>
</modificationset>
<!—计划时间间隔,单位秒 -->
<schedule interval="30" >
<ant anthome="apache-ant-1.6.3"
buildfile="projects/hello/build.xml"
target="CI"/><!—构建时执行的build.xml -->
</schedule>
<log>
<merge dir="projects/hello/test-reports"/>
</log><!—记载日志报告的位置 -->
<publishers>
<artifactspublisher dest="artifacts" file="projects/hello/target/hello.jar"/>
</publishers><!—发布jar包的位置,我都是在build.xml中将jar包打好放在这个位置 -->
</project>
</cruisecontrol>
CC_HOME/docs/main/configxml.html这个文件是config.xml的帮助内容,我们可以从这里面找到所有的配置。
5.总结
我们可以看到整个过程还是很简单的,通过CC,我们可以部分减轻CI的工作量,但可以看到核心的构建工作还是在project的build.xml中,如果CC能提供常见的模版就更好了(呵呵,我还是想偷懒)。另外CC的监控本地工作目录的功能有些弱智,比如我只写了"projects/hello",则它只认为在”project/hello”目录下的文件有更新才启动build过程,如果我们更新的是下面的子目录,则不能自动监控。