IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  WebSphere  >

使用 WebSphere Studio 和 Ant 执行无人值守的日常构建——第 2 部分

developerWorks
文档选项

未显示需要 JavaScript 的文档选项

样例代码


级别: 中级

Diane Bowker (dbowker@us.ibm.com), WebSphere System House Team, IBM RTP Lab

2004 年 4 月 01 日

本文是三篇关于在 WebSphere Studio 中自动构建的文章中的第二篇,本文向您展示在使用 CVS 作为存储库的情况下如何进行自动构建。其中包括一个样本 WebSphere Studio 项目,以及 Ant 脚本和包装器代码,可以利用它们来从命令行运行构建。

引言

本文描述了如何将 IBM® WebSphere® Studio Application Developer(以下简称为 Application Developer)和版本控制系统(Concurrent Versions System,CVS)作为源代码管理器来使用,通过这样来进行自动构建。本系列的第 1 部分讨论了以批处理或“headless”环境模式自动构建 Application Developer 项目的原因和动态,第 3 部分将会讲解如何使用 Application Developer V5、Ant 脚本和代码存储库 ClearCase 来实现构建自动化。

执行无人值守的、自动的项目构建可以通过 Ant 脚本来实现,也可以通过在 Application Developer 外运行 Application Developer 命令的一些其他 Ant 任务来实现。这些 Ant 脚本可以在 Using Ant with WebSphere Studio Application Developer 中的 antextras 包内找到。

CVS 是一个开放源代码的管理工具,它可以让多个用户通过共享目录在同一时间对同一段代码进行修改。Application Developer 包含一个插件,通过这个插件可以与现有的 CVS 存储库相连接。





回页首


先决条件

先期教育

虽然不需要创建和运行本文中的样本自动化构建,了解一些 Ant 脚本知识也是很有好处的。另外了解一些如何构建 Application Developer 项目以及如何在 Application Developer 中使用项目文件的常识也是很有帮助的。

硬件和软件配置要求

自动样本是在 Windows 2000 中进行过测试,并且适用于其他合适的 Application Developer 平台中。我们的样本使用的是 Application Developer V4.0.3、Ant V1.3.1(它与 Application Developer V4.0.3 同时发布)和 CVS V1.11.3。在我们的样本中,CVS 服务器运行在 Linux 平台上,并且所有的项目成员都有访问权限。上述 antextras 包包含我们在自动构建过程中要用到的几个任务,例如 projectBuild





回页首


使构建自动化

设置 Application Developer 环境

请根据 Using Ant with WebSphere Studio Application Developer 文章中介绍的方法来下载和安装 antextras。请确保您从 Application Developer V4 检索正确的包。我们的样本使用的是 Application Developer 指南所附带的 Temperature Conversion 样本。请使用这个指南来建立项目以待构建,确保类路径设置正确。为了保证构建能够从一台机器轻松地移到另一台机器,请使用类路径的变量设置,而不要使用硬编码位置。所有的项目文件都必须在 CVS 中登记,包括 classpath.vcm_meta data 和用于 Web 应用程序的 .websettings

请记住用于您的项目的工作区的位置,在自动构建的过程中它是很重要的。用于该工作区的元数据就是保存在这个位置中,这使得日常的构建工作更加容易。Application Developer V4 中的构建每次都是在同一个位置完成的,然后代码和构件被转到某个位置进行保存。这样做是因为在 Application Developer V4 Ant 核心任务中缺少“importProject”,并且没有将它作为额外任务。而在 Application Developer V5 中有这样的功能。

下载用于调用 Ant 构建的 Ant 脚本和命令文件

请下载本文所提供的 ZIP 文件来运行自动构建。对于此样本,可以将下载过来的包解压到 c:\Automation\buildscripts 目录下。

c:\Automation 下创建两个子目录,分别为 logsworkspacelogs 目录存储日常构建日志,这样您就进行复查以发现是否有错误。每个日志文件都是不同的,并以构建日期作为文件名。workspace 目录存储“温度转换 Web 应用程序”的所有项目。每天,构建过程都会生成一个新的目录,并以构建日期作为目录名称。所有的目录和导出构件都存储在此以供日后引用。下面是所需目录的列表:


C:\Automation
    Buildscripts
    Logs
    workspace 
    

配置 build.properties 文件

编辑如下 build.properties 文件来为构建设置特性。此文件位于 c:\Automation\buildscripts 中。设置其中的每个属性以便它们与构建发生的环境相匹配。


automation.dir=C:/Automation
buildscripts.dir=c:/Automation/buildscripts
cvs.dir=/home/cvsowner/samples
cvs.server=tiggerbox.raleigh.ibm.com
cvs.user=devuser
log.dir=${automation.dir}/logs
workspace.dir=c:/wsad40/workspace/sample

创建 .cvspass 文件

在本示例中使用的 CVS 是一个 CVS 服务器,它对密码进行验证,这就需要在主目录中为 CVS 工作区的本地目录中的 .cvspass 文件。因为 Ant V1.3.1 中对 CVS 的支持是有限的(Ant V1.3.1 是 Application Developer V4.0.3 附带的),所以在进行构建的工作区中还必须存在一个 .cvspass 文件。如果这个文件不存在,那么在试图检索用于构建的构件时,CVS 登录就会失败。在本示例中使用 Windows CVS 客户端来创建 .cvspass 文件。

对构建脚本的修改

如果要自动构建样本项目,就需要对 ZIP 文件所提供的脚本文件做一些修改。自动构建文件包括 cvs.xml 文件和主文件 build.xml,该主文件使用在 build.properties 中设置的属性来协助自动构建。这些 xml 文件中的一些部分定义了在构建与温度转换 Web 服务相关联的项目时需要完成的任务。为了从 CVS 检索项目,build.xml 会调用 cvs.xml。无需对这些文件进行修改更新,自动构建就可正常工作。

您可以使用 build.bat 文件来调用 Application Developer 外的 Ant,这个批处理文件是主构建的调用程序,它设置合适的环境变量,然后调用 Ant,以便可以使用 antextras 包。build.bat 文件调用 SetupBuild.bat,它设置所有的变量。为了确保构建工作无误,请编辑 build.bat 并确定对 SetupBuild.bat 的调用是正确的:


@echo off
setlocal
rem The following line needs to explicitly call setupBuild.bat
call c:\Automation\buildscripts\setupBuild.bat 

编辑 SetupBuild.bat 并确保 WSAD_HOMEJAVA_HOMEAUTOMATION_HOME 设置正确。


	
rem -----------------------------------------------------------------------------------------
rem This file is used to set up the necessary variables to run build automation.
rem Run build.bat from the same directory.
rem -----------------------------------------------------------------------------------------
rem WSAD 4.0 installation directory - use back slashes (Set to the top level install directory for WSAD
SET WSAD_HOME=c:\wsad40
rem Directory where the automation code is located -- build.bat, setupBuild.bat, and build.xml -- 
rem        usually c:\Automation (use backslashes).
SET AUTOMATION_HOME=c:\Automation\buildscripts
rem -----------------------------------------------------------------------------------------
rem You shouldn't have to change any of the following environment variables
rem -----------------------------------------------------------------------------------------
rem We want a date in the format YYYYMMDD
SET TODAYS_DATE=%DATE:~10%%DATE:~4,2%%DATE:~7,2%
rem The directory where the log files will be written - use back slashes
SET LOGDIR=%AUTOMATION_HOME%\logs
rem WSAD workspace directory for the Temperature Conversion Web application
SET WORKSPACE=%WSAD_HOME%\workspace\sample
SET HOME=%WORKSPACE%
Rem Point to the correct location of java shipped with WSAD
SET JAVA_HOME=%WSAD_HOME%\plugins\com.ibm.etools.server.jdk\bin  

运行整体构建

为了运行整体构建(full build),在下载的 ZIP 包中提供了 fullbuild.bat。这个脚本建立环境并以恰当的参数调用 build.bat


@echo on
setlocal
call setupBuild.bat
SET TODAYS_DATE=%DATE:~10%%DATE:~4,2%%DATE:~7,2%
set LOGFILE=%LOGDIR%\%TODAYS_DATE%.log
echo Output will be written to %LOGFILE%
call build.bat init clean getCVSproject buildAll copyFilesToWorkspace >> %LOGFILE% 2>&1
:done
endlocal

build.bat 的调用时用到的每个参数都等同于 build.xml 中的 Ant 目标名称。为了检验这是否是一个无差错的构建,所有来自构建的输出都被重定向到 %LOGFILE%

设置日常构建

为了完整地使用整体构建概念,在 Windows 2000 中设置预定的任务是有意义的,这样就可以在需要时经常性地进行构建。这个样本建立了一个每周一次的构建,它发生在每个星期一早晨 7 点。我们调用 Start => Programs => Accessories => System Tools => Scheduled Tasks 中的调度程序。右键单击 Scheduled Tasks,然后选择 New 来安排自动化的构建。

图 1. 安排一个新的任务
图 1. 按排一个新的任务

图 2. 设置特性
图 2. 设置特性

图 3. 设置任务以供运行,并指定从何处启动
图 3. 设置任务以供运行,并指定从何处启动

图 4. 为每周一次的构建设置日期和时间
图 4. 为每周一次的构建设置日期和时间





回页首


理解 Ant 目标定义

这一部分详细解释了由可下载的 ZIP 文件提供的 Ant 脚本。

build.xml 文件展示了了温度转换 Web 应用程序如何进行自动构建。其中调用了五个主要的目标,每个主要目标都是构建的一部分,它们都可调用 build.xml 中的其他目标、调用包含所调用的任务的另一个 XML 文件,或者直接调用 Ant 任务。这五个主要目标是:initcleangetCVSprojectgetCVSprojectcopyFilesToWorkspace。在这一构建中,顺序是很重要的,因为每个任务执行的操作是它下一个目标所需要的。下面描述了每个目标:

init

通过设置目录和属性来初始化构建:


<target name="init" unless="build.time">
    <tstamp><format property="build.time" pattern="yyyy-MM-dd.HH.mm.ss"/></tstamp>
    <tstamp><format property="today.date" pattern="yyyyMMdd"/></tstamp>
    <echo>Build of ${ant.project.name} started at ${build.time}...</echo>
    <!-The following line specifies the build properties file  -->
    <property file="${build.properties}"/>
    <!-The final location of the project files -->
    <property name="endworkspace.dir" value="${automation.dir}/workspace/${today.date}"/>
    <property name="logfile" value="${log.dir}/${today.date}.log"/>
    <!-The location of the exported build artifacts -->
      <property name="export.dir" value="${workspace.dir}/export"/>
     <!-Create the necessary subdirectories   -->
      <mkdir dir="${export.dir}"/>
      <mkdir dir="${endworkspace.dir}"/>
    <echo>
    ----------------------------------------------
    Usage: build.bat <release> <target> ...
    Available targets:
      init - Displays the currently set variables and displays this help message.
      clean - Removes the old build from the workspace.
      getCVSproject - Extracts the contents of a CVS package into workspace.dir (${workspace.dir}) 
      buildAll - Builds each of the projects. This target will run build.xml (using the default target)
           in each of the project directories.  In turn, these Ant scripts should do whatever compiling 
           is necessary as well as package any needed artifacts (EAR, WAR, JAR files, etc.) to the 
           ${endworkspace.dir} directory.
      copyFilesToWorkspace - Copies the files to ${endworkspace.dir}
    To run a full build:
      c:\Automation\buildscripts> build init clean getCVSproject buildAll copyFilesToWorkspace
    If you get ERRORLEVEL 23, simply rerun. The problem seems to be that Application Developer gets
    confused when there is no metadata in the workspace.  After the first run, even though the build fails, 
    the metadata has been created and subsequent builds will succeed.
    ----------------------------------------------
    <!-A good debugging technique, echo the properties -->
    Using properties from ${build.properties}
    workspace.dir    = ${workspace.dir}
    buildscripts.dir = ${buildscripts.dir}
    log.dir          = ${log.dir}
    cvs.user         = ${cvs.user}
    cvs.server       = ${cvs.server}
    cvs.password     = ********
    cvs.dir          = ${cvs.dir}
    ----------------------------------------------
    </echo>
 </target> 

clean

删除 Application Developer 工作区中以前的构建,并确保没有删除额外文件:


<!-This target depends on init -->
<target name="clean" depends="init">
      <!-For each subdirectory, we will delete from the workspace prior to a new build  -->
      <echo>Cleaning out ${workspace.dir} for today's build</echo>
      <delete dir="${workspace.dir}/EJBProject" />
      <delete dir="${workspace.dir}/EJBWebProject" />
      <delete dir="${workspace.dir}/TemperatureEARProject" />
      <delete dir="${workspace.dir}/export" />
  </target> 

getCVSproject

对于每个您要构建的项目,它调用 cvs.xml 来检索该项目:


<target name="getCVSproject" depends="init">
      <echo>Getting CVS projects</echo>
      <ant antfile="/cvs.xml"><property name="project.name" value="EJBProject"/></ant>
      <ant antfile="/cvs.xml"><property name="project.name" value="EJBWebProject"/></ant>
      <ant antfile="/cvs.xml"><property name="project.name" value="TemperatureEARProject"/></ant>
  </target>  

cvs.xml 依次调用 CVS 任务来检索每个项目。


<?xml version="1.0" encoding="UTF-8"?>
<project name="getCVSproject" default="getProject" basedir=".">
  <target name="init">
    <tstamp><format property="build.time" pattern="yyyy-MM-dd.HH.mm.ss"/></tstamp>
    <echo>Build of ${project.name} started at ${build.time}...</echo>
  </target>
  <target name="getProject" depends="init">
    <echo>Extracting project ${project.name}...</echo>
     <!-The specific Ant task to retrieve the project
     <cvs cvsRoot=":pserver:${cvs.user}@${cvs.server}:${cvs.dir}"
          package="${project.name}"
          dest="${workspace.dir}"/>
    <echo>Finished extracting project ${project.name}...</echo>
  </target>
</project> 

buildAll

对于列表中的每个项目,都会调用另一个目标来构建该项目:


<target name="buildAll" depends="init">
    <!--Each project has own build target -->
    <antcall target="_buildEJBProject"/>
    <antcall target="_buildEJBWebProject"/>
    <antcall target="_buildTemperatureEARProject"/>
  </target>
  <target name="_buildEJBProject" depends="init">
    <!--This is a basic build with no exportable artifact -->
    <echo>
	Building EJBProject...
    </echo>
   <!--projectBuild is an Antextras task  -->
   <projectBuild ProjectName="EJBProject" DebugCompilation="false" BuildType="full" />
   <getJavacErrorCount ProjectName="EJBProject" PropertyName="JavacErrorCount" />
   <echo>Number of javac errors for EJBProject built at ${build.time}: ${JavacErrorCount}</echo>
    <echo>Finished building EJBProject!</echo>
  </target>
<target name="_buildTemperatureEARProject" depends="init">
    <echo>
	Building TemperatureEARProject...
    </echo>
   <projectBuild ProjectName="TemperatureEARProject" DebugCompilation="false" BuildType="full" />
   <getJavacErrorCount ProjectName="TemperatureEARProject" PropertyName="JavacErrorCount" />
   <echo>Number of javac errors for TemperatureEARProject built at ${build.time}: 
        ${JavacErrorCount}</echo>
   <!-- Build the EAR file for export -->
   <earExport EARProjectName="TemperatureEARProject" 
        EARExportFile="${export.dir}/TemperatureEARProject.ear"/>
    <echo>Finished building TemperatureEARProject!</echo>
  </target> 

copyFilesToWorkspace

为了保存日常构建,所有的项目文件都保存在 build 目录中:


	
	<target name="copyFilesToWorkspace" depends="init">
    <antcall target="_copyFiles"><param name="project.name" value="EJBProject"/></antcall>
    <antcall target="_copyFiles"><param name="project.name" value="EJBWebProject"/></antcall>
    <antcall target="_copyFiles"><param name="project.name" value="TemperatureEARProject"/></antcall>
    <antcall target="_copyFiles"><param name="project.name" value="export"/></antcall>
  </target>
  <target name="_copyFiles">
     <mkdir dir="${endworkspace.dir}/${project.name}"/>
     <copy todir="${endworkspace.dir}/${project.name}">
         <fileset dir="${workspace.dir}/${project.name}"/>
     </copy>
  </target>   





回页首


结束语

本文向您展示了如何建立一个自动化构建,其中使用了 Ant 脚本,并将 CVS 作为代码存储库。它使用 Application Developer V4 所附带的温度转换 Web 应用程序作为示例,通过这个示例,我们说明了如何使项目构建自动化。本文包括一个对 build.xml 文件的使用方法的小指南,并讲解了几个目标,这些目标是为创建一个使用核心 Ant 任务和 antextras 所提供的额外任务的自动构建而编写的。最后,本文向您展示了如何在 Windows 2000 中设置预定的任务。本文所使用的方法应该有助于您对 Application Developer 项目进行自动构建,这样您就可以重用它们而不会出现错误。






回页首


下载

名字大小下载方法
buildauto_part2.zip4 KB  FTP|HTTP
关于下载方法的信息


参考资料



关于作者

Diane Bowker 在位于 NC,Durham 的 IBM RTP Lab 中的 WebSphere System House Team 工作,他是 IT 服务器和应用程序支持项目的一名负责人。您可以通过dbowker@us.ibm.com与 Diane 取得联系。




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

建议?







回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款