利用Rational Build Forge對基於WebSphere Application Server的應用進行自動化構建
IBM Rational Build Forge(RBF)是基於 Client/Server 模式的流程執行框架,提供了任務調度以 及自定義運行步驟等功能。本文將描述如何使用 RBF 來自動化構建基於 WebSphere Application Server (WAS)的應用,並詳細介紹涉及到的 RBF 各功能模塊。通過本文,您也可以了解關於 Ant 和 WebSphere Java Management Extensions(JMX)的一些知識。
知識准備
為了更好的理解 本文,您需要掌握以下內容:
J2EE 應用程序開發平台 IBM Rational Application Developer (RAD)的使用。
用於構建 J2EE 應用的 ANT 工具。
WebSphere 應用服務器的部署以及 JMX 編程。
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 項目
項目名稱 "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 之後,保存所有 工作,接下來我們將對此項目進行構建。
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"/>
……………………………&h ellip;…………………
<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,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 自帶的用戶庫。