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

developerWorks 中国  >  Rational  >

利用 Rational Build Forge 对基于 WebSphere Application Server 的应用进行自动化构建

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


崔 伟, 软件工程师, IBM
朱 彬, 软件工程师, IBM
段 家钦, 软件工程师, IBM

2009 年 10 月 19 日

IBM Rational Build Forge(RBF)是基于 Client/Server 模式的流程执行框架,提供了任务调度以及自定义运行步骤等功能。本文将描述如何使用 RBF 来自动化构建基于 WebSphere Application Server(WAS)的应用,并详细介绍涉及到的 RBF 各功能模块。通过本文,您也可以了解关于 Ant 和 WebSphere Java Management Extensions(JMX)的一些知识。
知识准备

为了更好的理解本文,您需要掌握以下内容:

  1. J2EE 应用程序开发平台 IBM Rational Application Developer(RAD)的使用。
  2. 用于构建 J2EE 应用的 ANT 工具。
  3. WebSphere 应用服务器的部署以及 JMX 编程。
  4. Rational Build Forge 的基本使用。

1. 应用场景

我们遇到复杂问题的时候,需要对问题进行细化并逐步实现。例如我们可以把一个复杂任务分解成若干简单任务来完成。在软件开发,构建和测试中也有很多工作可以通过一系列执行流程来自动化运行。Rational Build Forge 支持灵活的流程定制,通过它可以把复杂问题简单化和流程化,在这些方面大有用武之地。

迭代式增量开发过程中,开发和测试交替进行。新的代码植入应用之后,需要将其移植到测试环境进行测试。以开发和测试 B/S 架构的 J2EE 应用为例,我们现在有两个相同版本的 Windows 系统,一个是开发人员使用的开发环境,另外一个是测试环境。两台 Windows 系统上都安装了相同版本的 WebSphere 服务器,当开发完成之后,通过一系列的任务调度,将开发环境中的应用打包然后部署到测试机上,部署完成之后,通知测试人员进行测试工作。传统的工作方式如下图所示:


图 1. 传统工作方式
传统工作方式

传统工作方式中,开发人员除了开发任务之外,还负责应用打包,上传可部署包和测试任务的通知提醒。测试人员在测试工作开始之前,需等待开发人员的通知提醒,然后安装部署包。此过程中我们来考虑以下问题:

  • 应用构建的过程往往是个漫长的等待过程,可否将应用构建的过程自动化以节省开发人员的精力。
  • 应用构建完之后,如果是支持多平台,如何将应用部署到不同的测试平台。
  • 如何节省测试人员被动等待时间。只有当测试环境准备好之后,测试人员才开始测试工作,期间测试人员可以进行其他工作。

针对这些问题,我们需定义一系列有序的,可执行的任务来解决。如何管理及定制这些任务?此时我们就需要引入 Rational Build Forge,如下图所示:


图 2. 改进后的工作方式
改进后的工作方式

如图 2 所示,Build Forge Server将自动完成应用打包等一系列以前由手动完成的任务,使得开发和测试人员的精力集中在各自的主要任务上。本文将用一个实例来描述如何利用 RBF 把这部分流程进行自动化整合,整个过程的逻辑如下图所示:


图 3. 整体逻辑图
整体逻辑图

实例将描述如何用 RAD 开发一个简单的 J2EE 应用 HelloWorld,然后用 Ant 将此应用打包成 EAR 可部署文件,通过 JMX 部署到测试环境,最后通过邮件的形式告之测试人员环境部署完毕。涉及到以下的功能模块:

开发环境:应用程序的开发环境,包括:

  • 用于开发的应用服务器 WebSphere 和开发工具 RAD。
  • 部署包构建工具 ANT 及相关执行脚本。
  • JMX 环境及相关执行脚本。
  • 已安装的 Build Forge 客户端的 Windows 2003 32 位操作系统。

Build Forge Server:提供任务调度,管理和定制 , 功能包括:

  • 将各执行脚本进行有序的整合。
  • 获取开发环境中的应用。
  • 将应用部署到测试环境中的 WebSphere。
  • 以邮件的形式提醒测试人员测试环境已经部署完毕。

测试环境:应用测试的系统环境,包括:

  • 用来测试应用的 WebSphere。
  • 已安装的 Build Forge 客户端的 Windows2k3 32 位操作系统。

开发人员:开发应用,根据测试人员的反馈修改代码。

测试人员:测试应用各功能,根据测试结果将存在的问题反馈给开发人员。





回页首


2. 使用 Rational Application Developer(RAD)创建应用

2.1 创建动态 Web 项目

Rational Application Developer(RAD)是基于 Eclipse 的 J2EE 的开发平台 , 其对 WebSphere 进行了特别定制。RAD 能更好的和 IBM 产品相结合,相关信息可查阅 IBM 在线技术文档(参见参考资料)。

启动 RAD 之后,点击 " 文件 ",选择项目,然后在项目创建向导中选择动态 Web 项目:


图 4. 创建动态 Web 项目
创建动态 Web 项目

项目名称 "HelloWorld",其他选项用默认就可以了,创建之后的项目结构在 RAD 中如下所示:


图 5. RAD 项目结构
RAD 项目结构

其中 src 是放 Java 源代码的目录,WebContext 是放 JSP,XML 等文件的目录。

2.2 添加 Java Bean

点击 "src" 目录,选择新建 " 包 ",创建 "demo" 包。然后在此之下新建一个类 HelloWorld:

package demo;
public class HelloWorld {
private String name;
public void setName(String name){
this.name=name;
}
 public String getName(){
 return name;
 }
}

HelloWorld 是一个 Java Bean,其有一个属性 "name",通过 setName 方法可为其赋值,通过 getName 方法返回当前属性的值。

2.3 添加 JSP

点击 "WebContent",然后右键选择新建 "JSP",创建一个名为 HelloWorld 的 jsp 文件,并在 <body> 标签之内添加以下代码:

<jsp:useBean id="demo" class="demo.HelloWorld"/>
<jsp:setProperty name="demo" property="name" value="HelloWorld"/>
<jsp:getProperty name="demo" property="name"/>

jsp:useBean id="demo" class="demo.HelloWorld":将 HelloWorld 实例化并以 "demo" 为名引用。

jsp:setProperty:将 HelloWorld 中 name 属性设置为 "HelloWorld"。

jsp:getProperty:返回 HelloWorld 中 name 属性值,也就是刚刚被赋值的 "HelloWorld"。

创建完 Java Bean 和 JSP 之后,保存所有工作,接下来我们将对此项目进行构建。





回页首


3. 用 ANT 构建 EAR 包

J2EE 应用程序的资源,如 EJB,Java Bean,JSP 以及 XML 等配置文件可以被打成 WAR 或者 EAR 包进行发布。Ant 作为 Apache 的一个项目,是一个基于 Java 的 build 工具。通过 Ant 可以拷贝文件,构建项目或生成一些特定代码。很多 IDE 都集成了 Ant 工具,本文将演示手动构建 EAR 的过程,更多关于 Ant 的信息可以查阅 Ant 网站(参见参考资料)。

3.1 搭建 ANT 运行环境

ANT 运行环境的安装很简单,下载安装文件之后,创建 "ANT_HOME" 的系统变量指向 ANT 的根目录,并将 <ANT_HOME>/bin 添加到系统路径。在命令行行中运行 ant 就可以测试是否安装成功。

3.2 将项目打包成 EAR

将项目打包需要一个 build.xml 文件来告诉 ANT 所有的配置信息。项目 HelloWorld 的目标任务是 "deploy",为了完成此任务,首先需要完成任务 "compile",然后完成任务 "web-war", 最后完成任务 "ear",配置如下:

<project name="HelloWorld" default="deploy" basedir=".">
<property name="src.dir" value="src"/>
<property name="WebContent.dir" value="WebContent"/>
<property name="WEB-INF.dir" value="${WebContent.dir}/WEB-INF"/>
<property name="META-INF" value="${WebContent.dir}/META-INF"/>
<property name="build.dir" value="build"/>
<property name="dist.dir" value="dist"/>
…………………………………………………
<target name="web-war" depends="compile"> 
 <war destfile="${dist.dir}/${ant.project.name}.war"
 basedir="${WebContent.dir}" webxml="${WEB-INF.dir}/web.xml"/>
</target> 
<target name="ear" depends="web-war" description="create EAR">
 <ear destfile="${dist.dir}/HelloWorld.ear"
 appxml="${META-INF}/application.xml">
 <fileset dir="${dist.dir}/">
 <include name="HelloWorld.war"/>
 </fileset>
 </ear>
</target>

<project name="HelloWorld" default="deploy" basedir=".">: 设置项目名为 "HelloWorld",默认需要执行的任务是 "deploy",基本路径是 build.xml 所在的当前目录。

<property name="src" value="src"/>:设置属性 src.dir 的值为当前路径 src。

<target name="web-war" depends="compile">:目标 web-war 的任务是将 basedir 指向的文件打包到 desfile 所指向的文件中去。

<target name="ear" depends="web-war" description="create EAR">:目标 ear 完成的任务是将 HelloWorld.war 加上 application.xml 打包至 HelloWorld.ear。

运行 ANT 命令:ant -buildfile <build.xml location>,完成之后,会在项目所在路径的 dist 文件夹下面创建 HelloWorld.ear 可部署包。





回页首


4. 使用 JMX 来部署应用

有两种方式可向 WebSphere 部署 EAR 包:手动方式和编程方式。手动方式是通过 WebSphere 的管理控制台提供的应用程序添加向导来完成,编程方式需要了解 WebSphere 对于 jython 或者 JMX 的支持,由于后者具有更大的适用范围,文章将集中讨论 JMX。

4.1 JMX 简介

JMX 是 Application Server 的核心管理功能。应用服务器包含有一个 JMX 代理。所有系统组件都被当作 MBean 受到监控。WebSphere Application Server 的 JMX 代理支持两类连接器,分别是 RMI/IIOP 和 SOAP/HTTP(S),该代理提供对服务器的资源的远程访问。Application Server 所含的所有管理工具都使用这些 JMX 工具来实现其功能。

4.2 安装 EAR 应用

更多基于 JMX 的 WebSphere 编程可查阅 IBM 的 WebSphere 在线文档(参见参考资料)。下面用一个实例来说明如何使用 JMX 的接口来安装一个 EAR 应用 , 相关代码可在本文的最后下载。

初始化 EAR 部署包:

package connection;
public class Install {
 public static void main (String [] args) {
try {
 String earFile = "C:/HelloWorld.ear";
 String appName = "HelloWorld";
 Hashtable prefs = new Hashtable();
 prefs.put(AppConstants.APPDEPL_LOCALE, Locale.getDefault());

earFile:EAR 部署包的全路径,必须是部署目标机的本地可寻址路径。

appName:J2EE 应用程序的上下文名称,以 http://localhost:9080/HelloWorld 为例,"/HelloWorld" 就是一个上下文。

prefs:用来放置部署描述信息,例如,系统 locale 信息。

创建客户连接信息:

String host = "XXXXX";
String port = "8880";
String target="WebSphere:cell=WIN2K3264Node01Cell,node=WIN2K3264Node01,server=server1";
Properties config = new Properties();
config.put (AdminClient.CONNECTOR_HOST, host);
config.put (AdminClient.CONNECTOR_PORT, port);
config.put (AdminClient.CONNECTOR_TYPE, AdminClient.CONNECTOR_TYPE_SOAP);
System.out.println ("Config: " + config);
AdminClient _soapClient = AdminClientFactory.createAdminClient(config);
AppManagement proxy = AppManagementProxy. getJMXProxyForClient (_soapClient);

Host: WebSphere 服务器所在的主机 IP 或者机器名。

Prot: 基础版本 WebSphere 的 JMX 监听端口是 8880。

Target: 目标 WebSphere 的节点信息和服务名称,在 WebSphere 的管理页面可以看到。

AdminClient.CONNECTOR_TYPE_SOAP:设置客户端代理的连接方式。此处采用 SOAP 的方式。

AppManagementProxy :程序管理代理,它是 AppManagement 接口的实现。我们用这个类来进行 WebSphere 应用的安装,修改,删除等操作。

安装应用:

Hashtable module2server = new Hashtable();
 module2server.put("HelloWorld.war,WEB-INF/web.xml", target);
 module2server.put ("*", target);
 options.put (AppConstants.APPDEPL_MODULE_TO_SERVER, module2server);
 proxy.installApplication (earFile, appName, options, null);

module2server: 存放部署描述与对应的 WebSphere 节点之间的信息。

Proxy.installApplication: 通过代理安装应用。安装之后的应用默认是不启动的。

注意:实例中的 WebSphere 都没有进行安全设置,如果启动了 WebSphere 安全设置,那么必须在初始化 WebSphere 客户端连接的时候添加对应的管理用户及密码。EAR 需放置在目标测试机的可访问路径。Host, appName 和 Target 需相应的设置为实际测试环境的值。





回页首


5. 利用 Build Forge 进行自动化构建

IBM Rational Build Forge 是一个流程执行框架,简单来说,它有以下功能:

1:Build Forge Server 能够有序管理各执行脚本,根据执行结果进行各种定制化的后续步骤。

2:它能够动态添加或删除接入的系统。

3:强大的日志管理以及历史数据记录信息。

此外,RBF 还有以下优点:

  • 支持多平台,例如 Windows, Linux, AIX, HP-UX, Solaris, System I, System Z。
  • 易于管理,通过 RBF 提供的管理页面可以方便的定制和共享执行脚本。
  • 支持并发,RBF 支持并行运行 , 可以将多个任务同时分配到不同的机器上运行。
  • 定时执行,RBF 可以定时运行指定的任务,例如我们可以指定中国时间每个工作日凌晨 5 点运行某个任务。
  • 资源消耗少,RBF 客户端很小,可以设定为在后台运行,所占的系统资源也很少。

5.1 目标任务

通过前面章节的铺垫,至此,我们拥有以下功能组件:

  • 开发环境里及项目工作区,包含 HelloWorld 的 Java 代码以及 JSP 等文件。
  • Ant 构建代码,可将 HelloWorld 应用打包成 EAR 可部署包。
  • 基于 JMX 的远程 WebSphere 部署代码。

自动化构建需要完成以下任务:

  • 将开发环境中的 HelloWorld 项目用 Ant 进行构建,得到应用部署文件 HelloWorld.ear。
  • 上传 HelloWorld.ear 至测试环境的本地路径。
  • 执行 JMX 远程部署代码,由于远程部署容易扩展成一对多的关系,并且为了简单起见,文章就以开发环境作为远程部署代码的执行机。在实际开发过程中,应减少对开发环境的干扰。
  • 邮件提醒通知。

5.2 Build Forge 工作过程

Build Forge Server 中的最小执行单元是项目,其目的是完成业务逻辑。每个项目可以包含若干有序或并行的执行步骤。


图 6. 项目和步骤之间的关系
项目和步骤之间的关系

图 5 所示的步骤序列代表了其运行的先后,展示了业务逻辑执行的过程

5.3 在 Build Forge Server 中添加服务器

RBF Server 中以服务器的概念来描述其接入的系统 :


图 7. Build Forge Server 中的服务器
Build Forge Server 中的服务器

我们需要将开发环境和测试环境作为服务器添加到 Build forge Server,RBF Server 的安装过程和设置可以参考其相关文档,本文不再描述,添加服务器的设置如下:


图 8. 添加服务器
添加服务器

Name:测试机的名称。此处我们命名为 "HelloWorld_Test"。

Path:Build Forge 客户端初始化的路径,建议选择 "/" 作为路径。

host:测试机的 IP 地址。

Authentication:由于 Build Forge 需要访问测试机资源,所以必需提供测试机的认证用户和密

码,认证设置错误会导致连接失败。认证的创建是点击 " 服务器 ",然后选择 " 服务器认证 "。

访问:采用默认的值,此处涉及到 RBF Server 的权限。

保存之后,我们可以进行连接测试,如果连接通过则表明测试机和 Server 之间已经能够通信,如果提示连接错误,需根据相应的提示信息进行调试。同样,我们也为开发环境创建服务器 "HelloWorld_Dev"。

把服务器加入到 Build Forge Server 之后,我们需要设置一个 " 选择器 " 供项目查找所有符合条件的测试机。点击 " 服务器 ",选择 " 添加选择器 ",基本信息如下:


图 9. 添加选择器
添加选择器

Name:选择器的名称,不能重复。

Access:采用默认的 Build Engineer。

创建完之后,点击进入选择器设置:


图 10. 设置选择器
设置选择器

Name:选择器可以有多个名称,每一个名称都对应于服务器的某个属性。例如 BF_NAME 指的是在 RBF 里面添加的服务器的名称。

Operator:"==" 指的是 Name 需要匹配后面的 Value。

选择器创建之后,在项目中就可被引用,项目在运行开始之前,会根据选择器的信息查找符合条件的服务器,然后在这些服务器上执行。

5.4 在 Build Forge Server 中添加项目

项目是执行单元,所以在创建项目之前,我们需要搞清楚此项目在哪台目标机上执行。就本文而言,创建的项目将在开发环境中运行。RBF 中的项目创建如下图所示:


图 11. 创建项目
创建项目

Name:项目的名称,必须填写。

Selector:项目对应的选择器,此处采用图 8 创建的 "Selector_HelloWorld_Test"。

简单起见,其他选项可采用默认值,然后保存项目。

5.5 为项目添加步骤

点击创建好的项目,进入步骤编辑页面。每一个步骤需要对应一个执行过程来完成自动化构建的任务,根据章节 7.1,我们添加以下有序步骤:

步骤 1:将开发环境中的 HelloWorld 项目用 Ant 进行构建,得到应用部署文件 HelloWorld.ear。

步骤 2:上传 HelloWorld.ear 至测试环境的本地路径。

步骤 3:执行 JMX 远程部署代码。

步骤 4:邮件提醒通知。

每一个步骤都需要一个入口,我们可以用 bat/shell 脚本来运行对应的 Java 代码,例如对于步骤 4,我们有一个 SendReport 的类。我们可以在 bat 脚本中用以下方法调用:

set jre_bin=C:\jdk1602\jre\bin
set JavaDir=C:\Report
cd /d %jre_bin%
%jre_bin%\Java.exe -classpath .;C:\Java_mail\mail.jar;%JavaDir%\ mail.SendReport

SendReport:邮件发送应用程序,处于包 mail 下面。

Jre_bin:JRE 的运行 bin 目录。在此目录中可以运行 Java.exe, Javac.exe 等命令。

JavaDir:SendReport 类所处路径。

Java.exe -claspath:Java 执行命令,classpath 指定了运行所需的 jar 文件,用;隔开。

将此 bat 文件命名为 mail.bat,放在 "C:\scripts" 目录下。然后创建此 bat 对应的步骤如下所示:


图 12. 创建步骤
创建步骤

Name:步骤的名称。

Active:默认 " 已启用 ",表示此步骤会被运行到。

Directory:Build Forge 客户端起始执行目录,会在此目录下创建一些临时文件。

Path:推荐使用 " 绝对 ",默认是相对路径。

Command:步骤执行的命令。此例中,首先切换到执行脚本所在的目录,然后运行上述邮件发送的执行脚本。

Timeout:单位时间是秒,超过这个时间段,命令执行将结束并执行下一个步骤。所以对于某些运行时间比较长的命令需设置较长的等待时间。

Result:判断步骤是否正确执行的标准。这个是很重要的设置,步骤执行失败有两种情况,第一种是 Build Forge 本身系统出错,例如脚本运行失败。另一种是用户自定义的错误,可以在项目下面的日志过滤器中设置。

类似的我们可以为其他任务创建相应的运行脚本和步骤,在实际运行环境中,请根据实际情况可以增加和修改项目中的步骤。

5.6 创建定时任务

自动化构建如果是定时进行,例如每个工作日的上午八点,那么采用 RBF Server 提供的调度机制能够省去手动执行项目的麻烦。点击 RBF Server 主页面上的 "Schedules",然后选择 "Add Scheduled Run",基本信息如下:


图 13. 创建定时任务
创建定时任务

Description:描述信息,最好和被调度的项目名称一致。

Project:选择需要调度的项目。

Method:" 活动 " 指的是运行此调度,还有两个选项,一个是 " 非活动 " 和 " 一次 ",分别表示禁止调度和只运行一次。

Minutes:范围是 0 到 59,* 代表任意分钟,/ 代表间隔的分钟数。

Hours:范围是 0 到 23,* 代表任意小时,/ 代表间隔的小时数。

Dates:指月份的天数,范围是 1 到 31,* 代表任意天数,/ 代表月间隔的天数。

Months:一年中的月份,范围是 1 到 12。* 代表任意月份,/ 代表间隔的月数。

Days:一周的天数,范围是 0 到 6,周日是 0。* 代表任意天,/ 代表周间隔的天数。

例如以下参数指代的是从周一到周五,每天早上 5 点运行项目调度。

分钟 小时 日期 月份
* 5 * * 1-5

以下参数指代的是从周一到周五,每隔 30 分钟运行项目调度。

分钟 小时 日期 月份
*/30 * * * 1-5

注意,项目调度的时间是从 Build Forge Server 所在安装服务器上获得,需要首先调校好服务器上的时间。然后进入管理,点击用户,将用户下面的时区选择为正确的时区。

调度创建好之后,自动化构建过程就不再需要人工干预。





回页首


6. 总结

在软件开发过程中,有一些工作的流程变化小且需要频繁的进行维护。将这些工作抽取并细化成可执行的自动化步骤能够节省工作量,Build Forge 提供了自定义流程方面的支持,通过它还可以对所有的执行脚本和步骤进行统一的维护。

本文用 HelloWorld 实例展现了一个 J2EE 应用从开发到部署的全过程,重点描述如何把构建和部署两部分进行自动化实现,对涉及的关键技术给出了相应的解决方案。从中可以看到 Build Forge Server 起到了管理和衔接的重要作用,其良好的任务定制框架使得日后的迁移工作变得简单。假如我们需要从 WebSphere 切换到 TomCat 应用服务器的话,只需要修改部署部分的代码,其他业务的执行过程可以重用。如果我们需要对现有执行步骤的顺序进行调整的话,通过 Build Forge Server 就可方便的完成,减少编程维护的工作量。

免责声明

本文仅代表本人观点,并非代表 IBM 的立场、策略和观点。IBM 并不保证这些信息的正确、完整或充分性。IBM 不会对本文所包含信息中的错误、遗漏或不充分性承担责任并为此做出解释。





回页首


附录 A

为了运行本文附录中的 Java 代码,您需要安装以下 IBM 产品:

RAD 版本:7.5。

WebSphere 版本:7.0。

运行时需要引入的 Eclipse 插件(在 Eclipse 插件目录可以找到):

  • org.eclipse.equinox.common_3.3.0.v20070426.jar
  • org.eclipse.osgi_3.3.0.v20070530.jar

WebSphere 运行时支持:

  • <WAS_Install>\WebSphere\AppServer\runtimes 路径下的所有 jar 文件。
  • WebSphere 7.0 运行存根,RAD 自带的用户库。


参考资料

学习

获得产品和技术


作者简介

崔伟是 IBM 中国研发中心(IBM CDL)的软件工程师,于 2007 年加入 IBM CDL,现服务于 SAAS 部门。对自动化测试的构建以及 Software as Service 具有浓厚的兴趣。


朱彬于 2007 年加入IBM 中国软件开发中心(IBM CDL),现服务于 SAAS 部门,目前正在对云计算进行兴趣研究。


段家钦是 IBM 中国研发中心(IBM CDL)的软件开发工程师,于 2007 年加入 IBM CDL,致力于IBM产品多平台的集成化安装程序的开发。




对本文的评价










回页首


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