使用WebSphere Process Server进行持续集成

日期: 2009-06-07 作者:Donald Vines 来源:TechTarget中国 英文

  本系列的第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

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐