增量代碼的自動構建與部署框架介紹
概念和工具介紹
Agile 與 Delta Code
Agile —敏捷開發。近些年開始被人們廣泛關注。它 提倡將一個完整的軟件版本劃分為多個迭代周期。每個迭代實現不同的特性。重大的,優先級高的特性優先實 現,風險高的特性優先實現。在項目的早期就將軟件的原型開發出來,並基於這個原型在後續的迭代中不斷完 善。
Delta Code —增量代碼。在 Agile 開發模式中,開發人員基於軟件原型不斷的編寫代碼對其進 行完善和擴充。這些代碼就稱之為增量代碼。
本文介紹的自動化框架主要針對增量代碼進行構建和部 署。持續集成和每日構建能力是否足夠強大是迭代開發是否成功的一個重要基礎。本文將介紹如何在 RAD 開 發平台上實現快速的增量代碼的構建。
WebSphere Commerce Build and Deployment Tool (WCBD)
WebSphere Commerce Build and Deployment tool 是包含在 WebSphere Commerce 產品中的 , 支持 客戶定制的一種編譯和部署工具。WCBD 由 Ant 腳本文件和各種模板組成。為用戶提供了一個標准化和可控制 的自動化構建和部署流程。用戶可以根據自身需求選擇相應的模板進行定制,生成專屬的腳本包。同時用戶也 可以添加自己編寫的腳本。它主要由構建代碼和部署代碼兩部分組成,用戶可以自行定制其中的流程。該工具 為持續集成和每日構建提供了快捷的方式。本文中將主要介紹 WCBD 的部署功能以及如何通過該功能部署用戶 自定義的資源。WCBD 主要適用於使用 WAS 作為中間件的各種應用。可用於部署單文件,多文件或者整體部署 應用模塊並支持本地和遠程部署。用戶在使用時需要根據自己的環境進行相應的配置。關於 WCBD 部署的配置 將在本系列的第 3 部分中為大家介紹。
Build Utility 插件
Build Utility 是集成於 Rational Application Development Tool (RAD)產品中的一個插件。通過對 Ant 腳本語言的擴展從而實現 了在 IBM 軟件開發平台上對於各種應用的自動化構建。在工作平台中被開發的各種工程將作為 Build Utility 的輸入。Build Utility 將輸出編譯好的工程文件並按照工程類型打包成 JAR,WAR 和 EAR 文件。 Build Utility 還額外增加了支持工作平台操作的特殊任務例如: projectImport, projectBuild, workspaceBuild, ejbDeploy 和 earExport。相對於單純的 Eclipse 平台所支持的 Ant 任務要豐富很多。和 使用 Ant 工具一樣,使用 Build Utility 插件時同樣需要輸入 XML 格式的構建腳本來執行各種任務。對於 Build Utility 所使用的 Build 腳本可以由客戶自定的任務,Ant 自身包含的任務和 Build Utility 所包含 的特殊任務所組成。
Build Utility 支持在工作平台或者以命令行的方式使用。在工作平台中,使用 者只需要在構建腳本上點擊右鍵,然後執行 Run As-> Ant Build。 通過命令行有兩種方式使用 Build Utility. 使用者可以通過 RAD 安裝路徑下的 bin 目錄中的 runANT.bat 文件啟動該插件執行客戶自定義 Build 腳本,或者通過 headless 的方式通過在 Ant 腳本中啟動該插件從而實現 Ant 任務多線程的處理。以 下是對於上述兩種方式的詳細說明。
在 window 平台下執行 Build Utility 可通過如下方式。該方式 將調用 RAD 安裝目錄下的 bin 文件夾中的 runAnt,該文件用於配置環境變量並調用 application com.ibm.etools.j2ee.ant.RunAnt 啟動 Build Utility。
打開命令行窗口。
輸入 set workspace=<RAD_workspace root> 。
在命令行窗口定位到 <RAD_Install_root>\bin 目錄下。
運行命令:runAnt -buildfile myScript.xml(myScirpt.xml 為用戶自定義構建腳本)。
通過命令行的方式實現 Headless 的直接啟動 com.ibm.etools.j2ee.ant.RunAnt 的代碼示例清單 1 所示 。本文默認使用 Headless 方式啟動 Built Utility。
清單 1. Headless 方式啟動 Build Utility
<property name="classpath" value=""${developement.environment.full.path} \plugins\org.eclipse.equinox.launcher_1.0.101.R34x_v20081125.jar;""/> <exec executable="${developement.environment.full.path}/jdk/bin/java" resultproperty="returnCode" errorproperty="runantErr" output="${build.scripts.log.path}/${args}.log"> <arg line="-ms256m" /> <arg line="-mx1024m" /> <arg line="-Xj9" /> <arg line="-classpath ${classpath}" /> <arg line="org.eclipse.equinox.launcher.Main" /> <arg line="-application com.ibm.etools.j2ee.ant.RunAnt" /> <arg line="-Dosgi.adaptor=org.eclipse.core.runtime.adapter.EclipseAdaptor" /> <arg line="-Dwtp.autotest.noninteractive=true" /> <arg line="-data ${workspace.full.path}" /> <arg line="-buildfile ${buildFile}" /> <arg line="${args}" /> </exec>
構建與部署框架結構
本文介紹的自動化構建與部署框架由三部分組成: 代碼管理與抽取模塊、自 動構建模塊、自動部署模塊。Ant 腳本作為框架語言用於銜接各個模塊,代碼的自動化構建調用的是 RAD 的 Build Utility 工具,代碼的部署使用的是 WCBD 的部署功能。整個構建過程被劃分為若干子任務,每個子任 務作為 Ant 腳本的一個任務單元,由 Ant 腳本完成對對子任務的調用。Ant 作為一種腳本語言,具有很強的 "黏合"作用,因此也賦予了該框架更多的擴展空間。讀者在閱讀完本文後可以繼續將自動化測試整 合到本框架中,從而實現了代碼從構建、部署到測試的全程無需人為干預的流程中。這裡首先為讀者從整體上 介紹一下該框架的結構,在該系列的其它部分,將就每個模塊分別進行介紹。自動化構建與部署框架結構圖如 圖 1 所示。
圖 1. 自動化構建與部署框架結構圖
代碼管理和抽取模塊
目前市面上流行著多種代碼管理工具(SCM),這些工具能夠較好的管理 產品代碼之間的依賴關系,並提供了相應的功能用於支持代碼的錄入和代碼的抽取。這些管理工具能夠方便地 整合到開發平台上,便於開發人員對於代碼的管理。本文所介紹的自動化框架中同樣需要 SCM 的支持。增量 代碼需要從 SCM 工具中根據其更新時間或者相應的版本進行抽取,然後才能進入到編譯和部署環節。對於代 碼的管理和抽取是一個很開放的話題,各種版本的管理工具的做法都有一定的差別,不過這些差別在本文中並 不會帶來太大的影響,在代碼管理中 SCM 工具將與構建模塊銜接。對於代碼如何在SCM工具進行存儲和管 理並不在本文的范疇之內,因此不做過多的介紹。唯一需要進行規范的是代碼抽取出來之後,目錄的存儲結構 和每次抽取代碼後版本的管理。 這些內容將在本系列的第二部分中詳細介紹。
構建模塊
構建 模塊使用RAD作為編譯平台。並通過RAD所包含的 Build Utility 工具對 WorkSpace 中的工程進行編譯 。本文主要討論增量代碼的編譯,因此需要讀者預先將基礎代碼進行整理並導入到 WorkSpace, 並配置好工程 之間的關聯關系。自動化框架將通過 Ant 腳本以命令行的方式啟動 Build Utility 對工程進行編譯並輸出結 果。編譯過程分為兩部分,首先對基礎代碼進行編譯。然後替換增量代碼再次進行編譯。通過上述兩次編譯過 程,將產生出以二進制形式存在的增量代碼文件。通過對兩次編譯產生的文件的比較,最終產生出用於部署的 二進制代碼文件。構建模塊的核心步驟是對基礎代碼和增量代碼進行 Delta 比較。該部分可通過多種方式實 現。本文所介紹的方法是通過對文件內容進行加密,然後比較其加密值的方式。該部分內容將在本系列文章的 第 2 部分中進行介紹。當然讀者也可采用其他方式實現。
部署模塊
本文所介紹的自動化部署 框架使用的是 WCBD 的部署功能。通過預先配置好的參數,Ant 腳本將用於部署的資源存放到指定目錄,並啟 動WCBD實現部署。在本系列的第 3 部分中,將詳細介紹如何配置 WCBD 進行遠程部署,以及如何定制 WCBD 腳本從而實現部署模塊與構建模塊的整合。
構建與部署框架的准備
通過上一章的介紹, 讀者已經了解了自動化構建與部署框架組成結構。對於每一個模塊,都需要有相關的工具和平台提供支持,因 此讀者在編寫框架腳本之前需要准備好運行環境。下面就如何創建構建與部署框架,以及如何准備運行環境進 行簡單介紹。讀者在完成框架創建和環境准備之後可結合本系列文章的其他部分內容完善框架代碼,實現完整 的構建與部署框架。
Ant 安裝
本框架主要是用 Ant 作為腳本語言對整個流程進行控制。所以 在實現該框架前必須首先安裝 Ant1.7 或者以上版本。
在 Apache 官方 網站 下載安裝包解壓即可。
點擊:我的電腦 -> 右鍵點擊屬性 -> 高級 -> 點擊環境變量 添加如下環境變量:
ANT_HOME:C:\apache-ant-1.x.x
PATH:%ANT_HOME%\bin
在命令行中輸入 ant -version ,如果設置成功將會顯示 Ant 的版本信息如圖 2 所示。
圖 2 . Ant 版本檢測命令行
安裝 RAD for WebSpehere Commerce
本文是基於 WebSphere Commerece 產品的增量代碼構建和 部署,並且在本系列的第 3 部分關於 WCBD 部署的介紹中需要調用本地 WAS 的命令,因此推薦讀者安裝 RAD for WebSphere Commerce. 通過 Installation Management Tool 安裝完成開發和編譯平台(RAD for WebSphere Commerce)之後,在安裝目錄下將包含 WCBD 腳本目錄。同時 RAD for WebSphere Commerce 整合 了 WAS server,因此也節省了讀者安裝 WAS 所需要的時間。讀者需要在 IBM 網站注冊 ID ,並下載安裝 Installation Management Tool(IM1.5 版本以上),然後在 IBM 網站下載並通過 IM 安裝如下軟件:
安裝 Rational Application Developer 安裝包 (7.5 以上版本 )
安裝 WebSphere Commerce toolkit V7 ( 或者以上版本 )
獲取 WCBD 腳本
在完成本章中 RAD for WebSphere Commerce 的安裝之後,讀者可以在 <WebSphere Commerce toolkit _Install>/wcbd 目錄下找到 WCBD 腳本。在本系列的第三部分中將詳 細介紹如何配置 WCBD 腳本。
自動化 Build 框架創建
自動化框架的搭建是一個漸進的過程, 需要讀者先從框架的目錄結構開始,不斷的豐富其中的內容,並通過不斷的調試將各個環節銜接在一起。首先 讀者可按照如下步驟建立 Build 框架的雛形。在完成腳本框架的目錄結構之後,就可以逐步的按照構建流程 編寫子任務,並整合到框架腳本中。
創建自動化構建框架目錄結構
由於 RAD 提供了良好的自 定義 Ant 標簽,能夠支持大多數的構件操作。同時 Ant 腳本又是一種較好的腳本"粘合劑",廣泛 的應用於產品的構建過程中。因此整個自動化腳本采用 Ant 語言編寫。整個框架的目錄結構如下圖所示,讀 者可閱讀文件及目錄結構的介紹了解其作用。圖 3 中目錄及文件需要讀者自行建立。在本系列的其他文章中 將指導讀者對代碼構建腳本進行完善。
圖 3. 自動框架目錄結構展開圖
創建工程類型描述
由於在 RAD workspace 中進行編譯的工程的類型不同,需要為所有的工 程建立工程描述,包括工程名稱以及工程類型,從而方便自動化構建腳本的識別。該描述文件中包含了全部的 基礎工程,建立好的工程描述文件需要放在指定目錄下。本文中該文件存放在 <BuildScript>/data/xml/ProjectDescriptionFile.xml。工程描述文件內容示例如下,讀者可根據實 際情況結合示例建立自己的工程描述文件。
清單 2. 工程描述文件
<projects> <supportedProjects> <project name="SampleProject1" type="java" /> <project name="SampleProject2" type="web" /> <project name="SampleProject3" type="ejb" /> ............. </supportedProjects> </projects>
創建 build 腳本
本文中 <Build Script>/build.xml 文件將作為 主要構建腳本,用於對構建過程進行控制。在該文件中讀者可以導入其他腳本片段或者從 build.properties 屬性文件中導入相應參數。在 build.xml 文件中,主任務是"runTargets"。構建代碼的每一個步 驟都被封裝成為一個子任務。這裡給出了代碼樣例,讀者可以在閱讀完本系列第 2 部分內容後,逐個完成代 碼構建的子任務,並將這些子任務按照先後順序添加到主任務當中。這些子任務將按照順序被逐個執行。由於 每個子任務都是對獨立的運行單元,因此可以通過配置參數,並引入判斷條件的方式來判斷各步是否需要執行 。這裡給出的是主任務的部分代碼。讀者需要自己完成這個 Ant project 中其余的代碼(例如:包括屬性文 件加載、自定義標簽聲明等以及讀者自己需要的其他子任務定義)。
清單 3. 構建腳本中主任務代碼
<target name="runTargets"> <if> <istrue value="${extract_source}"/> <then> <ant target="commone.extract_files" /> </then> </if> <if> <istrue value="${generate-modified_projects_list}"/> <then> <ant target="commone.generate-modified_projects_list" /> </then> </if> ………………………………………… </target> <target name=" commone.extract_files"> ………………………………………… </target> <target name=" commone.extract_files"> ………………………………………… </target>
完成上述的環境准備和構建腳本框架的創建之後,本系列第 2 部分將對自動化代 碼構建步驟進行詳細介紹,並提供相應的代碼示例供讀者參考,讀者可根據示例完善腳本內容。並將完成的子 任務腳本整合到清單 3 中的主任務標簽中。
對於非 Agile 開發模式產品的支持
本文雖然是以 Agile 模式為基礎進行介紹,但整個框架同樣適用於非 Agile 模式,只需將增量代碼的抽取替換為產品全部 代碼的抽取,將編譯完成後的代碼比較取消,同時將 WCBD 部署模式中所介紹的增量代碼的部署改為對於整體 jar 包的部署,這樣就可以轉變成為一個很好的整體產品的自動化編譯和構建的模型。讀者在理解本框架的運 行原理後可自行修改。
結束語
本文通過該框架的整體介紹更多的是希望帶給讀者一個思路,從 而根據自身項目的實際情況實現一套完整的構建以及部署流程。讀者在了解框架的基本結構之後和運行原理之 後,可以根據自己的需求對其進行修改或者完善。在本系列中的第 2 部分和第 3 部分將就框架中的構建和部 署兩大模塊進行詳細的介紹。