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

2009-12-24 作者:崔伟,朱彬,段家钦 来源:IBM

 
本文内容包括:
1. 应用场景
2. 使用 RAD 创建应用
3. 用 ANT 构建 EAR 包
4. 使用 JMX 来部署应用
5. 利用 Build Forge 进行自动化构建
6. 总结
附录 A
参考资料
IBM Rational Build Forge(RBF)是基于 Client/Server 模式的流程执行框架,提供了任务调度以及自定义运行步骤等功能。本文将描述如何使用 RBF 来自动化构建基于 WebSphere Application Server(WAS)的应用,并详细介绍涉及到的 RBF 各功能模块。通过本文,您也可以了解关于 Ant 和 WebSphere Java Management Extensions(JMX)的一些知识。

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 自带的用户库。

参考资料

学习 获得产品和技术

火龙果软件/UML软件工程组织致力于提高您的软件工程实践能力,我们不断地吸取业界的宝贵经验,向您提供经过数百家企业验证的有效的工程技术实践经验,同时关注最新的理论进展,帮助您“领跑您所在行业的软件世界”。
资源网站: UML软件工程组织