本系列的第1部分重点介绍了在IBM? WebSphere? Integration Developer中编写SCA业务流程之前,如何使用Cactus为SCA数据映射编写测试用例。第2部分将研究如何使用CruiseControl作为持续集成服务器,以监视CVS存储库中的SCA构件,并在每当发生更改时在IBM WebSphere Process Server上运行测试用例。
来自IBM WebSphere Developer Technical Journal。
引言
敏捷软件开发是许多软件开发方法的行业公认最佳实践,它使得持续集成变得非常流行。持续集成的主要功能是双重的:
·在单步构建过程中测试整个应用程序而不只是测试单个项目。构建过程签出所有代码,构建整个应用程序,运行所有单元测试,并向开发人员报告结果。
·按定期间隔运行的计划构建过程;例如,每当代码发生更改的时候。如果构建中发生任何问题,可以立即对其进行查找和纠正。
持续集成缩短了开发SOA应用程序所花的时间。当您做出更改时,提交更改之前您不必运行整个系统中所有服务的测试用例。您可以测试服务并提交更改,然后让持续集成服务器运行其他服务的所有测试用例。如果存在问题,您将迅速获得通知,并且可以立即处理问题。
持续集成还使得查找和修复SOA应用程序中的问题变得更加容易。当问题发生时,您只需查看在上次构建间隔期间做出的更改即可修复问题。此外,做出更改时将自动进行构建,因此如果发生问题,问题不会发展为更大的问题。
在这个有关SOA环境中的测试驱动的开发系列中,第1部分向您介绍了如何为SOA应用程序编写单元测试。本文演示如何使用持续集成服务器来测试运行于IBM WebSphere Process Server上的服务组件体系结构(Service Component Architecture,SCA)应用程序。该持续集成服务器是在以下开放源代码项目的基础上构建而成的:
·CVSNT 2.5.03用作开放源代码存储库。
·CruiseControl 2.7.3用作持续集成服务器。
·Ant 1.7.0用于构建第1部分中的SOA应用程序。
除了这些开放源代码项目以外,本文还使用第1部分中的示例应用程序来演示如何自动构建和测试SOA应用程序。该示例应用程序是使用IBM WebSphere Integration Developer V6.1(以下称为Integration Developer)来开发的。本文的其余部分将对该过程进行阐述:
·创建源代码存储库:创建一个源代码存储库来存储该示例应用程序以便进行团队开发。
·将应用程序签入存储库:将该示例应用程序签入源代码存储库,以使其对持续集成服务器可用。
·启动WebSphere Process Server:启动WebSphere Process Server V6.1,以使其能够部署该应用程序并代表持续集成服务器运行测试。
·启动持续集成服务器:启动持续集成服务器,以使其能够轮询存储库中的应用程序更改。每当检测到更改,它将构建并测试该应用程序,并向开发人员报告任何问题。
创建源代码存储库
在任何持续集成环境中,您都需要为维护WebSphere Process Server应用程序的版本控制系统建立中央服务器。该服务器必须可由所有团队成员以及持续集成服务器访问。使用此中央存储库,团队成员将签入他们的SCA组件和测试用例,然后持续集成服务器将它们签出以执行构建。
在本部分中,您将了解如何设置版本控制系统,并创建用于维护WebSphere Process Server应用程序和测试用例的存储库。请在您用作中央版本控制服务器的计算机上执行以下步骤:
·安装CVSNT。
下载CSVNT Server并按照安装向导的指示对其进行安装。选择Typical安装。完成安装后,重新启动系统以使更改生效。
·创建CVS存储库。
决定您希望存储库位于文件系统上的什么位置。存储库是CVS将在其中维护文件(文件的存档版本)的根目录。存储库目录名称不能包含空格,因此要使用诸如c:cvsrepo或类似的路径。可以使用CVSNT控制程序创建存储库:
选择“开始”=>“程序”=>“CVSNT”=>“CVSNT Control Program”。
选择About选项卡并停止CVSNT服务和锁服务。
选择Add以添加新存储库。
浏览到存储库所在的路径。如果该目录不存在,可以使用New Folder按钮为您的新存储库创建文件夹结构。创建一个存储库(例如c:cvsrepo)并选择OK以添加该存储库。
如果该存储库是新的,则会提示您对其进行创建和初始化。回答Yes以创建并初始化该新存储库。
选择About选项卡并启动CVSNT服务和锁服务。
·保护CVS存储库。
可以采用多种方式保护对CVS存储库的访问。尽管存在更安全的方法,但本文将使用pserver协议,因为它非常容易使用和配置。如果您希望使用更安全的协议,请参阅参考资料中的CVS手册。
要配置pserver协议,您必须确定该CVS存储库的管理员。为此,请在存储库下的CVSRoot目录中创建一个名为passwd的文件。例如,如果CVS存储库在c:csvrepo之下,则此文件将在c:cvsrepoCVSROOT中。此文件应该包含单个行,即当前登录用户的名称。如果当前登录用户为admin,则此文件的内容应该类似如下:
admin:
停止并重新启动CVSNT服务和锁服务。
·测试CVS连接。
打开控制台窗口并输入:
set CVSROOT=:pserver:admin@localhost:/cvsrepo
cvs login
然后系统将提示您输入密码。
将应用程序签入存储库
出于演示目的,您将使用本系列的第1部分中开发的示例应用程序。为此,您需要将Integration Developer与CVS集成,并将Integration Developer项目签入CVS。一旦将项目签入了CVS,持续集成服务器就可以在每当发生更改时签出项目,运行构建,并执行测试。
·配置Integration Developer以访问CVS存储库。
Integration Developer提供了内置的支持,允许使用CVS存储库对构成WebSphere Process Server应用程序的SCA组件和构件进行版本控制。为了将SCA构件从Integration Developer中签入CVS,您必须配置Integration Developer以访问CVS存储库:
在Integration Developer中,选择Window => Open Perspective => Other。
选择CVS Repository Exploring透视图。单击鼠标右键并选择New => Repository Location。
输入运行CVSNT服务的主计算机的名称。
输入存储库在该计算机上所在的路径。例如,如果存储库在服务器上位于c:cvsrepo,则存储库位置将为cvsrepo。
输入CVS用户ID作为用户名和密码;这应该是您的本地帐户信息。
确保选择pserver作为连接类型,并选择缺省端口。
输入此信息以后,Integration Developer将提示您输入密码,验证存储库访问权限,并且在您获得授权的情况下,允许您将SOA应用程序签入CVS,包括SCA模块、SCA库和Web测试用例。
·签入Integration Developer项目。
获得该示例应用程序的副本,它是一个可从第1部分下载的项目交换文件。将项目交换文件导入Integration Developer并通过运行单元测试来验证安装之后,您可以将Integration Developer项目签入CVS:
打开Business Integration透视图。您应该看到三个项目:
L_AddressCleansingService
T_AddressCleansingService
T_AddressCleansingServiceJUnitWeb。
右键单击某个项目并选择Team => Share Project…
选择存储库类型,在此例中为CVS,但它也可以是ClearCase。
添加可选的注释以便进行版本跟踪。
对每个项目执行步骤b至d,然后所有文件将被上载到CVS存储库,并且该示例应用程序可供持续集成服务器签出。
启动WebSphere Process Server
在设置持续集成服务器之前,确保WebSphere Process Server V6.1正在运行。需要WebSphere Process Server的实例才能按照持续集成服务器的指示部署SCA模块和运行测试用例。
就本文而言,我们将使用Integration Developer附带的WebSphere Process Server实例,因为它已经安装了。如果您愿意,也可以使用WebSphere Process Server的独立实例来运行构建,而不使用Integration Developer来实现此目的。在任一种情况下,都必须有一个WebSphere Process Server实例正在运行。只有这样,持续集成服务器才能构建和测试SCA模块。
启动持续集成服务器
存在若干可用的开放源代码持续集成服务器,例如CruiseControl、AntHill、Hudson、Luntbuild和Apache Continuum。就本文而言,这里将使用CruiseControl。
·下载并安装某个持续集成服务器。
按照下载说明获得并安装CruiseControl的二进制分发版。在本文编写之际,最新的版本为2.7.3版。在安装时,服务器文件将解压缩到某个文件夹,例如d:cruise。
·创建工作目录。
下面您需要在集成服务器计算机上创建工作目录。CruiseControl将在这些工作目录中运行构建并存储结果。应该将这些目录与CruiseControl安装目录分离。清单1显示了持续集成服务器的目录结构。本文附带的下载文件中包括了这些目录。
清单1. 目录结构
builds
contains the Cruise configuration file and a script to start the Cruise server
projects
L_AddressCleansingService
contains this project’ build.xml file and a runbuild.bat script
source
contains the inputs to the build script, e.g. SCA artifacts
target
contains the outputs from the build script, e.g. test results
artifacts
L_AddressCleansingService
contains time stamped sub-directories with published build artifacts
logs
L_AddressCleansingService
contains the status.txt file indicating the build status
您需要了解这些工作目录,这样才能编写构建脚本和配置CruiseControl以构建项目。清单1提供了简单的说明。所有集成构建将在builds目录中执行。在builds目录下,还存在三个子目录:
·projects目录包含子目录,由持续集成服务器构建的每个项目对应于一个子目录。其中每个子目录包含:
build.xml文件,将由持续集成服务器运行。
source目录,包含将从CVS签出的SCA构件。
target目录,将包含构建结果。
·artifacts目录还包含针对每个项目的子目录。其中每个子目录包含多个带时间戳的子目录,每次成功的构建对应一个子目录。带时间戳的子目录包含已发布的构建结果。在此例中,它将包含项目的target目录的内容(清单1)。
·logs目录也包含针对每个项目的子目录。该子目录中有一个status.txt文件,指示当前的构建状态;例如,某次构建是正在进行还是在等待运行。
·编写构建脚本。
最初,您需要手动将构建项目所需的CVS模块签出到项目的source目录。就本文而言,所需的CVS模块为:
L_AddressCleansingService:接受测试的SCA库。
T_AddressCleansingService:用于测试该库的SCA模块。
T_AddressCleansingServiceJUnitWeb:用于测试该库的Cactus测试用例。
将模块签出到projectsL_AddressCleansingServicesource目录中。签出模块之后,CruiseControl将监视CVS中的那些模块的更改,并根据需要计划构建。您不需要再次手动签出它们。
为了帮助您签出CVS模块,projectsL_AddressCleansingService目录中提供了一个runbuild.bat文件。请确保在runbuild.bat文件中正确地设置环境。打开控制台窗口并输入runbuild checkout。
下一步,您需要编写Ant构建脚本,CruiseControl将运行该脚本以构建您的项目。projectsL_AddressCleansingService目录中提供了一个名为build.xml的示例。每当检测到更改并且需要构建项目时,CruiseControl将调用该构建脚本。当构建运行时,它将:
目标:清理——删除source和target目录。
目标:初始化——创建source和target目录。
目标:签出——从CVS存储库获取最新源代码。
目标:构建——构建用于WebSphere Process Server的SCA模块。
目标:安装——将SCA模块安装到WebSphere Process Server。
目标:启动——在WebSphere Process Server中启动SCA模块。
目标:测试——在WebSphere Process Server中运行单元测试。
目标:停止——在WebSphere Process Server中停止SCA模块。
目标:卸载——从WebSphere Process Server卸载该SCA模块。
每次将通过销毁source和target目录然后从CVS获得模块来创建清洁的构建。这可以避免增量构建所产生的潜在问题。
以下是上面列出的构建脚本主要目标以及缺省目标(全部)的定义,缺省目标将按上述顺序调用主要目标。(Ant构建脚本可从下载文件中获得。)
目标:全部是缺省Ant目标,由CruiseControl在需要运行构建时调用。它依赖许多按以下顺序运行的其他目标:清理、初始化、签出、构建、安装、启动、停止和卸载。
清单2. 目标:所有
<target
name=”all”
depends=”clean, init, checkout, build, install, start, test,
stop, uninstall”>
</target>
目标:清理通过删除source目录和target目录清除前一次构建。这将删除前一次构建中使用的源代码和类文件。这样可以确保此次构建将从清洁状态开始。
清单3. 目标:清理
<target name=”clean”>
<delete dir=”${source.dir}”/>
<delete dir=”${target.dir}”/>
</target>
目标:初始化设置运行此构建所需要的环境。创建source目录和target目录。它建立用于此构建的工作目录
清单4. 目标:初始化
<target name=”init”>
<mkdir dir=”${source.dir}”/>
<mkdir dir=”${target.dir}”/>
</target>
目标:签出构建此项目所需要的CVS模块。也就是说,它将CVS模块的最新副本签出到source子目录中。
清单5. 目标:签出
<target name=”checkout”>
<cvs
command=”-q co -d source/${test.module.name} ${test.module.name}”>
</cvs>
<cvs
command=”-q co -d source/${test.webapp.name} ${test.webapp.name}”>
</cvs>
<cvs
command=”-q co -d source/${library.name} ${library.name}”>
</cvs>
</target>
目标:构建用于WebSphere Process Server的SCA模块。它首先创建一个.zip文件,其中包含SCA模块及其依赖项。然后它使用IBM serviceDeploy任务生成EAR文件。
清单6. 目标:构建
<target name=”build”>
<zip
destfile=”${target.dir}/${test.module.name}.zip”
basedir=”${source.dir}”
includes=”${test.module.name}/**,${test.webapp.name}/**,
${library.name}/**”>
</zip>
<serviceDeploy
scaModule=”${target.dir}/${test.module.name}.zip”
outputApplication=”${target.dir}/${test.module.name}.ear”
workingDirectory=”${target.dir}”
wasHome=”${wps.home}”>
</serviceDeploy>
</target>
目标:安装将SCA模块安装到WebSphere Process Server。
清单7. 目标:安装
<target name=”install”>
<wsInstallApp
profilename=”${profile.name}”
wasHome=”${wps.home}”
ear=”${target.dir}/${test.module.name}.ear”>
</wsInstallApp>
</target>
目标:启动在WebSphere Process Server上启动SCA模块。
清单8. 目标:启动
<target name=”start”>
<wsStartApp
profilename=”wps”
user=”admin”
password=”admin”
wasHome=”${wps.home}”
application=”${test.module.name}App” >
</wsStartApp>
</target>
目标:测试在WebSphere Process Server上运行Cactus测试用例,并将输出发送到项目的test-results目录中的XML文件,以便持续集成服务器能够显示测试结果。为此,它首先编译测试用例,然后使用JUnit来运行那些测试用例。
清单9. 目标:测试
<target name=”runTest”>
<mkdir dir=”${target.dir}/test-classes”/>
<javac
destdir=”${target.dir}/test-classes”
srcdir=”${source.dir}/${test.webapp.name}/JavaSource”>
<classpath>
<path refid=”compile.class.path”/>
</classpath>
<include name=”**/*Test.java” />
</javac>
<mkdir dir=”${target.dir}/test-results”/>
<junit fork=”yes”>
<classpath>
<path refid=”test.class.path”/>
</classpath>
<formatter type=”brief” usefile=”false” />
<formatter type=”xml” />
<batchtest todir=”${target.dir}/test-results”>
<fileset
dir=”${target.dir}/test-classes”
includes=”**/*Test.class”>
</fileset>
</batchtest>
<jvmarg
value=”-Dcactus.contextURL=${cactus.context.url}”>
</jvmarg>
</junit>
</target>
目标:停止在WebSphere Process Server上停止SCA模块。
清单10. 目标:停止
<target name=”stop”>
<wsStopApp
profilename=”${profile.name}”
wasHome=”${wps.home}”
application=”${test.module.name}App” >
</wsStopApp>
</target>
目标:卸载从WebSphere Process Server卸载该SCA模块。
清单11. 目标:卸载
<target name=”uninstall”>
<wsUninstallApp
profilename=”${profile.name}”
wasHome=”${wps.home}”
application=”${test.module.name}App” >
</wsUninstallApp>
</target>
配置CruiseControl以构建项目。
可以通过配置XML文件对Cruise Control进行配置。此文件控制构建循环,并告诉CruiseControl如何以及何时应该运行构建。用于此示例的配置文件为config.xml文件,包含在builds目录中,并将在下面逐个部分地对其进行描述。可以从本文附带的下载文件中获得config.xml的副本。
定义项目。
config.xml文件的前几行定义项目:
清单12. config.xml
<cruisecontrol>
<project name=”L_AddressCleansingService” buildafterfailed=”false”>
<project>元素定义CruiseControl负责构建的项目。此文件中可能有多个project元素,每个元素分别具有唯一的名称。在此<project>元素中,buildafterfailed的值设置为Fasle,以便在构建失败后,如果自从该构建以来CVS中没有对源文件做出更改,则不再重新尝试该构建。
侦听构建事件
下一步,定义在构建过程中接受事件通知的侦听器:
清单13. 定义侦听器
<listeners>
<currentbuildstatuslistener
file=”./logs/${project.name}/status.txt”>
</currentbuildstatuslistener>
</listeners>
在此配置文件中,<currentbuildstatuslistener>元素被指定将构建的当前状态写到logsL_AddressCleansingServicestatus.txt文件。此状态指示CruiseControl是正在尝试某个构建还是在等待尝试某个构建。采用这种方式,可以通过CruiseControl Web应用程序获得当前构建状态。
检查更改。
定义CruiseControl如何检查更改以确定是否需要某个构建:
清单14. 检查更改
<modificationset quietperiod=”30″>
<cvs localworkingcopy=”${source.dir}/${test.module.name}”/>
<cvs localworkingcopy=”${source.dir}/${test.webapp.name}”/>
<cvs localworkingcopy=”${source.dir}/${library.name}”/>
</modificationset>
<modificationset>元素指定要检查什么CVS模块的更改以确定是否需要某个构建。在上面的<modificationset>元素中,值为30的quietperiod指示CVS存储库在尝试某个构建之前必须静默30秒钟。这为开发人员提供了在尝试构建之前签入所有更改的机会。
三个带localworkingcopy属性的<cvs>元素指向构建项目所必需的CVS模块的本地副本。<cvs>元素使CruiseControl能够定位CVS存储库并检查更改。它不执行签出;签出是由构建脚本执行的。
除了CVS以外,还有一个针对ClearCase用户的<clearcase>元素。
定义构建间隔。
定义构建间隔和要调用的构建脚本:
清单15. 定义构建间隔
<schedule interval=”60″>
<ant anthome=”${ant.home}”
buildfile=”${projects.dir}/${project.name}/build.xml”
target=”all”/>
</schedule>
<schedule>元素指定构建间隔。在此示例中,构建间隔设置为60秒。这告诉CruiseControl每隔60秒检查一次CVS存储库中的文件更改。如果存在更改,则将会进行构建;如果不存在更改,则CruiseControl将在60秒后再次检查。<ant>元素将Ant脚本的位置和每当运行构建时要调用的目标告诉CruiseControl。在此例中,CruiseControl将运行projectsL_AddressCleansingServicebuild.xml文件中的所有目标。
定义日志目录
定义CruiseControl日志的位置并记录JUnit测试结果:
清单16定义日志位置
<log dir=”${logs.dir}/${project.name}”>
<merge dir=”${target.dir}/test-results”/>
</log>
<log>元素指定日志文件的位置。CruiseControl在每次尝试某个构建时在logsL_AddressCleansingService目录中创建一个日志文件。
除了CruiseControl创建的日志文件条目以外,您还可能希望记录JUnit测试用例产生的测试结果。为此,可以使用<merge>元素,并将其目录属性指向构建脚本以将JUnit测试结果作为XML来写入的位置。
发布构建构件。
发布您希望保留的构建构件,如EAR文件:
清单17. 发布构建构件
<publishers>
<onsuccess>
<artifactspublisher
dir= “${target.dir}”
dest=”${artifacts.dir}/${project.name}”>
</artifactspublisher>
</onsuccess>
</publishers>
</project>
</cruisecontrol>
<artifactspublisher>元素指定如何发布某些构建构件,例如所生成的EAR文件。在此例中,您在将从target目录中找到的所有项发布到artifacts目录。这实际上是在artifacts目录下创建一个与构建时间戳具有相同名称的子目录。这使得CruiseControl能够提供对历史构建构件的访问。
启动构建循环。
最后,您可以启动CruiseControl构建循环。为此,builds目录中提供了一个runcruise.bat文件。在运行该文件之前,请确保在其中正确设置环境。然后您可以通过在控制台窗口中输入runcruise.bat来启动构建循环。
当CruiseControl启动时,它将读取配置文件,尝试运行某个构建,然后检查CVS存储库中的修改。在第一次尝试构建您的项目时,它可能不检测修改,但它仍然会强制进行构建。在第一次构建之后,仅当存在修改时,它才会计划进行一次构建。您应该在控制台中看到类似如下的消息:
清单18. 构建中产生的消息
projectName = [L_AddressCleansingService]
using settings from config file [D:buildsconfig.xml]
No previously serialized project found [D:buildsL_AddressCleansingService.ser]
forcing a build.
Project L_AddressCleansingService starting
Project L_AddressCleansingService: checking for modifications
Project L_AddressCleansingService: No modifications found, build not necessary.
Project L_AddressCleansingService: Building anyway, since build was explicitly
forced.
下一步,CruiseControl将调用Ant build.xml文件中的所有目标。Ant目标具有对其他目标的依赖关系,例如清理、初始化、签出等等。所依赖的目标将按指定的顺序运行,然后将运行全部目标。您应该在控制台中看到类似如下的输出。请确保您的单元测试已正确运行。
清单19. 目标依赖关系
Project L_AddressCleansingService: now building
Buildfile: .projectsL_AddressCleansingServicebuild.xml
ccAntProgress — clean
[delete] Deleting directory D:buildsprojectsL_AddressCleansingServicesource
[delete] Deleting directory D:buildsprojectsL_AddressCleansingServicetarget
ccAntProgress — init
[mkdir] Created dir: D:buildsprojectsL_AddressCleansingServicesource
[mkdir] Created dir: D:buildsprojectsL_AddressCleansingServicetarget
ccAntProgress — checkout
[cvs] U source/T_AddressCleansingService/.classpath
[cvs] U source/T_AddressCleansingService/.project
[cvs] U source/T_AddressCleansingService/.runtime
[cvs] U source/T_AddressCleansingService/sca.module
…
ccAntProgress — build
[zip] Building zip: D:buildsprojectsL_AddressCleansingServicetarget
T_AddressCleansingService.zip
[servicedeploy] Initializing workspace
[servicedeploy] Building project L_AddressCleansingService
[servicedeploy] Building project T_AddressCleansingServiceEJB
[servicedeploy] Building project T_AddressCleansingServiceJUnitWeb
[servicedeploy] Building project T_AddressCleansingServiceApp
[servicedeploy] Exporting application D:buildsprojects
L_AddressCleansingServicetargetT_AddressCleansingService.ear
[servicedeploy] Deployment has completed
[servicedeploy] Waiting for background jobs
[servicedeploy] Deleting workspace
ccAntProgress — install
[wsInstallApp] Installing Application [D:buildsprojects
L_AddressCleansingServicetargetT_AddressCleansingService.ear]…
[wsInstallApp] Installed Application [D:buildsprojects
L_AddressCleansingServicetargetT_AddressCleansingService.ear]
ccAntProgress — start
[wsStartApp] Starting Application [T_AddressCleansingServiceApp]…
[wsStartApp] Started Application [T_AddressCleansingServiceApp]
ccAntProgress — test
[mkdir] Created dir: D:buildsprojectsL_AddressCleansingServicetarget
test-classes
[javac] Compiling 1 source file to
D:buildsprojectsL_AddressCleansingServicetargettest-classes
[mkdir] Created dir: D:buildsprojectsL_AddressCleansingServicetarget
test-results
[junit] Testsuite:
com.ibm.issw.service.addresscleansing.test.AddressCleansingServiceTest
[junit] Tests run: 2, Failures: 0, Errors: 0, Time elapsed: 1.578 sec
ccAntProgress — stop
[wsStopApp] Stopping Application [T_AddressCleansingServiceApp]…
[wsStopApp] Stopped Application [T_AddressCleansingServiceApp]
ccAntProgress — uninstall
[wsUninstallApp] Uninstalling Application [T_AddressCleansingServiceApp]…
[wsUninstallApp] Uninstalled Application [T_AddressCleansingServiceApp]
ccAntProgress — all
BUILD SUCCESSFUL
CruiseControl在运行构建以后,它将合并日志文件中的测试结果并发布构建构件。然后它将进入睡眠状态,并等待下一次构建时间。当它醒来时,将检查CVS存储库中的修该,如果发现任何修改,则运行另一次构建;否则,它将进入睡眠状态并等待下一次构建时间。
清单20. 运行构建
Project L_AddressCleansingService: merging accumulated log files
Project L_AddressCleansingService: publishing build results
Project L_AddressCleansingService: idle
Project L_AddressCleansingService: next build in 1 minutes
Project L_AddressCleansingService: waiting for next time to build
…
Project L_AddressCleansingService: No modifications found, build not necessary.
Project L_AddressCleansingService: idle
Project L_AddressCleansingService: next build in 1 minutes
Project L_AddressCleansingService: waiting for next time to build
跟踪构建状态
CruiseControl启动一个可用于跟踪构建状态的Jetty实例和一个Web应用程序。该Web应用程序的URL为http://<host>:8080/cruisecontrol,其中<host>是运行CruiseControl的计算机。因此,若要查看构建的当前状态,您所需做的就是打开浏览器并导航到该URL。一个网页将显示您的项目的构建状态,以及所有其他项目的构建状态。单击项目名称可以查看类似于图1所示的构建结果页面。
图1. 查看构建状态
另一种查看构建状态的方法是接收电子邮件。这可以通过向config.xml文件中的<publishers>集添加<email>元素来实现。
清单21. 电子邮件通知
<email
mailhost=”IBM-F4A849C57A0″
returnaddress=dhvines@us.ibm.com
buildresultsurl=”${buildresults.url}”
skipusers=”true”
spamwhilebroken=”true”>
<always address=”dhvines@us.ibm.com”/>
<failure address=”dhvines@us.ibm.com”/>
</email>
在此例中,一个地址始终接收构建状态电子邮件,另一个电子邮件地址将仅接收有关失败情况的电子邮件。电子邮件含有指向构建结果页面(请参见图1)的链接。通过使用<htmlemail>发布器,您甚至可以向提交更改的用户发送通知。
总结
这个包括两部分的文章系列讨论了SOA环境中的测试驱动的开发。在第1部分中,您了解了如何在使用WebSphere Integration Developer开发SCA业务流程之前为SCA数据映射编写测试用例,在第2部分中,您了解了如何设置持续集成服务器来测试WebSphere Process Server上的SOA应用程序。
使用此持续集成服务器,您了解了如何轮询CVS存储库中的SOA应用程序更改。如果检测到更改,则持续集成服务器将从CVS中签出所有代码,构建SCA模块,将它们安装到WebSphere Process Server,运行单元测试,并记录构建结果。
通过访问指向CruiseControl Web应用程序的URL或者接收电子邮件通知,您可以在任何时候查看构建结果。如果在SOA应用程序中发现错误,可以通过电子邮件向提交更改的团队成员发送错误报告,以便他们能够立即采取行动。
持续集成服务器可以确保您的服务(以及依赖您的服务的所有服务)在每当发生更改时得到测试。如果出现测试错误,您可以迅速修复错误,因为您只需调查自从上次构建以来所做出的更改。这使您可以将SOA应用程序始终保持可发布状态。
关于作者
Donald Vines是IBM的一名执行IT架构师,他负责北美范围的WebSphere迁移实践。他目前从事的工作是为IBM主要客户创建解决方案体系结构,并在开发SOA和企业现代化项目过程中指导设计师和软件开发人员。他曾是对象管理组织(Object Management Group, OMG)的一位技术代表,在该组织中和其他人一同创立在Internet中广泛使用的Internet Inter-ORB Protocol(IIOP)。Don还是Sun认证的企业架构师、Sun认证的Java程序员和OMG认证的UML2专业人员。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
作者
相关推荐
-
持续集成:敏捷最佳实践
持续交付方法开始于专注敏捷开发和完善持续集成实践。让我们谈谈持续集成,是“持续集成”,而不是“持续交付”。
-
如何确保持续集成引领持续改进?
忘记持续集成、忘记持续交付,甚至要忘记持续部署,这是为什么?因为软件开发中的新一个浪潮是持续改进。
-
AWS性能维护出奇招——预部署测试
预部署测试是维护性能的关键。开发者可以使用AWS CloudWatch或者其他的工具确保KPI并管理性能。
-
云计算究竟是否威胁到了硬件业?
虚拟化和云计算是目前存储、服务器和网络行业的关键的方面。许多企业正在提供虚拟化的环境或者鼓励人们采用云计算以便 […]