清单 14. 编译 RFT 测试脚本
<stafcmd>
<location>'%s' % machine </location>
<service>'process'</service>
<request>'start command "c:/apache-ant-1.6.5/bin/ant.bat -buildfile %s/buildRFT.xml
-DRFTDriver=%s > %s/build.log" username "Administrator" password "password"
workdir %s wait' % (sourceLocation, RFTDriver, sourceLocation, sourceLocation)
</request>
</stafcmd>
复制 WAR 到部署机器上并部署
编译完成后,需要将编译生成的 WAR 文件到部署机器上并且通过部署机器来远程部署所有的WAS 服务器。
清单 15.部署 WAR
<stafcmd>
<location>'%s' % machine </location>
<service>'process'</service>
<request>'start command "/root/script/deploywar.sh" username "root"
password "password" workdir "/root/script/work" wait
stdout /root/script/deploy.log STDERRTOSTDOUT'
</request>
</stafcmd>
我们选择通过一台部署机器来部署 WAR 的原因是这样做维护比较简单,如果 WAS 服务器IP 改变或者增加时,只需要更改部署服务器的部署脚本即可,甚至对 STAX 脚本也不用更改。当然也可以选择每台 WAS 分别对自己部署 WAR,这样当 WAS 服务器增加时,需要对 STAX 脚本做一点更改,添加相应的 WAS 服务器。
在编译机器上调用测试代码
部署完成后,在编译机器上调用测试代码(包括 RFT 代码)来测试示例 Web Service 程序。
调用代码有两种方式:
STAX 直接调用远程机器上的 Java 命令来执行
STAX 调用远程机器上的 Ant 脚本来执行
为了演示这两种方式的用法,我们使用 Ant 脚本来调用 JUnit 测试代码,使用 Java 命令来调用 RFT 代码。但在实际使用过程中,我们推荐使用 Ant 脚本来调用。
清单 16. 调用测试代码
<stafcmd>
<location>'%s' % machine </location>
<service>'process'</service>
<request>'start command "c:/apache-ant-1.6.5/bin/ant.bat -buildfile %s/runTest.xml
> %s/runTest.log" username "Administrator" password "password" workdir %s wait'
% (sourceLocation, sourceLocation, sourceLocation)
</request>
</stafcmd>
<stafcmd>
<location>'%s' % machine </location>
<service>'process'</service>
<request>'start command "java -cp "%s\bin\rational_ft.jar" -Drational_ft.install.dir
="%s\bin" com.rational.test.ft.rational_ft -datastore "%s" -rt.log_format "html"
-rt.bring_up_logviewer false -playback testscript.VerifyWebService
>%s/runRFTTest.log" username "Administrator" password "password" workdir %s wait'
% (RFTLocation, RFTLocation, sourceLocation, sourceLocation, sourceLocation)
</request>
</stafcmd>
第一个 STAFCMD 使用 Ant 来调用 Junit 测试代码,可以看出命令比较简单。而第二个STAFCMD 使用 Java 来调用 RFT 测试脚本,命令要复杂得多,这样会给维护带来一定的困难,因此推荐使用 Ant 来编译和调用。
收集产生的日志文件
在部署和测试完成后,控制机器需要遍历每个 WAS 服务器(包括编译机和部署机)来收集日志文件,也就是复制文件到控制机器上。这与清单 7 类似。
至此,我们已经完成了这个 STAX 脚本的编写。需要指出的是,所有的 STAX 脚本只需要在控制机器上执行即可,部署机、编译机以及测试机器完成不知道这些代码的存在,它们只需要安装 STAF 并且信任控制机器即可。
配置 CruiseControl
安装 CruiseControl
CruiseControl 是一个非常容易使用的持续集成工具。读者可以从它的官方网站下载最新版的CruiseControl 2.7 安装包进行安装。由于安装十分简单,本文略过其安装过程。
验证 CVS 配置
在 Dos 命令行窗口中运行如下命令来验证你可以从 CVS 检出源代码 (假定我们使用 cygwin来连接 CVS )
cd <build_home>
set CVS_RSH=c:\cygwin\bin\ssh.exe
\progra~1\cvs\cvs -d :ext:user@cvshostname:/cvsroot/sampleproject/ \
checkout -d <build_home> Build
配置完成 CVS 后,在 build.xml 中添加如下任务:
清单17. 检出 CVS 上测试源代码的 ant 脚本
<target name="getSrc">
<echo message="Extracing source from CVS in to ${build.src.dir}" />
<cvs
cvsRoot=":ext:user@cvshostname:/cvsroot/sampleproject/"
command="checkout -P"
cvsRsh="c:\cygwin\bin\ssh.exe"
package="src/test"
dest="${cvs.dir}"/>
<copy todir="${src.dir}">
<fileset dir="${cvs.dir}/src/test>
<exclude name="**/CVS/**"/>
</fileset>
</copy>
</target>
注意:用户也可以直接通过配置使用 CruiseControl 来检出和编译源代码。但是由于在本文的场景中,编译这些测试代码需要有特定的类库支持,而 CruiseControl 所处的控制机没有安装这些类库。因此在本文中我们使用一个 ant 脚本来将代码从 CVS 检出并在后面的步骤中将其发布到编译机上进行编译。