IBM Rational Build Forge(RBF)是基于 Client/Server
模式的流程执行框架,提供了任务调度以及自定义运行步骤等功能。本文将描述如何使用 RBF 来自动化构建基于
WebSphere Application Server(WAS)的应用,并详细介绍涉及到的 RBF 各功能模块。通过本文,您也可以了解关于
Ant 和 WebSphere Java Management Extensions(JMX)的一些知识。
我们遇到复杂问题的时候,需要对问题进行细化并逐步实现。例如我们可以把一个复杂任务分解成若干简单任务来完成。在软件开发,构建和测试中也有很多工作可以通过一系列执行流程来自动化运行。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.1 创建动态
Web 项目
Rational Application Developer(RAD)是基于 Eclipse 的 J2EE
的开发平台 , 其对 WebSphere 进行了特别定制。RAD 能更好的和 IBM 产品相结合,相关信息可查阅
IBM 在线技术文档(参见参考资料)。
启动 RAD 之后,点击 " 文件 ",选择项目,然后在项目创建向导中选择动态 Web
项目:
图 4. 创建动态 Web 项目
项目名称 "HelloWorld",其他选项用默认就可以了,创建之后的项目结构在
RAD 中如下所示:
图 5. 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 之后,保存所有工作,接下来我们将对此项目进行构建。
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 可部署包。
有两种方式可向 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 需相应的设置为实际测试环境的值。
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,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 所在安装服务器上获得,需要首先调校好服务器上的时间。然后进入管理,点击用户,将用户下面的时区选择为正确的时区。
调度创建好之后,自动化构建过程就不再需要人工干预。
在软件开发过程中,有一些工作的流程变化小且需要频繁的进行维护。将这些工作抽取并细化成可执行的自动化步骤能够节省工作量,Build
Forge 提供了自定义流程方面的支持,通过它还可以对所有的执行脚本和步骤进行统一的维护。
本文用 HelloWorld 实例展现了一个 J2EE 应用从开发到部署的全过程,重点描述如何把构建和部署两部分进行自动化实现,对涉及的关键技术给出了相应的解决方案。从中可以看到
Build Forge Server 起到了管理和衔接的重要作用,其良好的任务定制框架使得日后的迁移工作变得简单。假如我们需要从
WebSphere 切换到 TomCat 应用服务器的话,只需要修改部署部分的代码,其他业务的执行过程可以重用。如果我们需要对现有执行步骤的顺序进行调整的话,通过
Build Forge Server 就可方便的完成,减少编程维护的工作量。
免责声明
本文仅代表本人观点,并非代表 IBM 的立场、策略和观点。IBM 并不保证这些信息的正确、完整或充分性。IBM
不会对本文所包含信息中的错误、遗漏或不充分性承担责任并为此做出解释。
为了运行本文附录中的 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 自带的用户库。
学习
获得产品和技术
|