程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Rational >> 基於Rational Team Concert和Maven的自動化構建和部署最佳實踐

基於Rational Team Concert和Maven的自動化構建和部署最佳實踐

編輯:Rational

簡介:越來越多的項目,特別是 Agile 項目開始使用 Rational Team Concert (RTC) 來管理需求、缺陷和源碼。面對多版本、多套環境、多服務器的復雜環境,本文介紹和探討了如何結合使用 RTC 和 Maven,在 RTC 中統一管理屬性配置信息,由 RTC 單點或定時觸發,高效地完成 Build 自動化構建和部署實踐。

引言

在軟件開發中,協調的開發步調和默契的團隊協作是提高軟件生產效率的關鍵。IBM Rational 推出的 Jazz 技術就是一個創新的團隊協作平台,它集成了整個軟件生命周期中的各項任務,提供了下一代軟件開發平台的基本框架。而 Rational Team Concert (RTC) 則是第一個基於 Jazz 平台的產品,提供了包括代碼管理、項目計劃、項目 build、工作任務、工作報表等的支持,讓開發團隊、測試團隊在同一個平台上進行工作,極大地提升項目管理和開發效率,特別適合采用敏捷開發模式的項目。

Maven 是一個開源的項目管理工具,它將注意力從作業層轉移到項目管理層。使用 Maven 可以方便地構建和捆綁代碼,運行測試,生成文檔,並充分利用項目之間的相關性信息。

面對多版本,多套環境,多服務器的復雜環境,構建和部署往往是一件煩瑣和復雜的工作,特別是在采用 Daily Build 的項目中。Build 的構建和部署脫離分開,導致混亂以及需要手工干預。手工操作常常忙中出錯,混淆目標環境和服務器。

為了應對這些挑戰,我們充分利用 RTC 的項目 Build 功能和 Maven 易用、功能強大的特性,設計出具有如下特性的架構:

RTC 單點觸發和管理 Build 的自動化構建和部署

RTC 統一管理所有屬性文件和命令文件

通過配置指定和切換目標部署環境

通過配置分離 Build 構建和部署

利用 Maven 輕松編寫 Build 腳本

充分利用 Maven 發掘利用項目的相關性信息

構建架構

整個架構的前端為 RTC Client, 可以是 Web Browser, 也可以是基於 Eclipse 的 Plugin. 在 RTC Client 上配置屬性,比如定義 Build Label 的前綴,指定部署的目標環境,是否執行自動化部署的標志等等。這些屬性將被保存在 RTC Server 中。Build Request 可以在 Build Definition 中定義成自動觸發,也可以在 RTC Client 中手動觸發

RTC Server 對源文件進行管理,接收變更並注入到 Repository 中。Build Definition 必須關聯到一個 Build Engine. 一旦用戶發起一個 Build Request,該請求就會傳至 RTC Server 的 Build Engine。

Build Server 則包含 Jazz build engine (JBE) 和 Maven 兩個組件。前者負責與 RTC Server 通信 , 後者用於執行 POM 文件。JBE 不斷輪詢指定 RTC Server 中的 Build Engine,一旦接收到 Request, 其即從 RTC Server 中取出源代碼,拷貝到目標目錄,並調用 Maven 來執行工程中的 POM 文件。

POM 的體系結構因工程的復雜度而異。其首先調用各子模塊 POM 來編譯源碼,打包項目,然後將生成的包文件拷貝到目標目錄,最後調用自動化部署腳本(deploy.sh)來執行自動化部署。

在 Build Definition 中我們需要定義兩個屬性,自動化構建觸發標志 (DeploymentEnabled) 和目標環境(DesEnv)。

Deploy.sh 根據自動化構建觸發標志來判斷是否執行自動化部署。如果進行自動化部署,則根據屬性目標環境的值 , 如 Dev1,找到對應的屬性文件,如 Dev1.properties。在屬性文件中我們詳細定義了目標環境的服務器信息以及與部署相關的屬性。Deploy.sh 根據這些屬性信息訪問目標環境,在目標環境上完成自動化部署任務。為了將自動化腳本文件也納入 RTC 管理中,我們將 Deploy.sh 和屬性文件上傳到 RTC Server 中,由 JBE 下載到 Build Server 上然後調用和加載。整體的構建架構拓撲圖如圖 1 所示。

圖 1. 構建架構圖

構建 Build Engine

Build Engine 代表了執行構建的構建系統,引擎標識(Engine ID)可以和構建服務器名相同,以便我們更加容易的將構建引擎和構建服務器關聯起來。Build Engine 的定義如圖 2 所示:

圖 2. Build Engine 定義

構建 Build Definition

可以創建基於一系列模板的構建定義。構建定義本質上就是為後台運行的構建腳本提供參數。選擇 Maven 模板 , 在構建定義彈出的窗口中包含:概述(Overview),日程安排(Schedule),屬性(Properties),Jazz 源碼控制(Jazz Source Control), 和 Maven 這 5 個選項卡。

在概述標簽中指定構建定義的 ID, 項目組或團隊,以及這個構建定義關聯的 Build Engine。相關配置如圖 3 所示:

圖 3. 概述標簽

在“日程安排”中,可以定義 scheduled 的自動化構建,每周的一天或幾天,每天的幾時幾分,都可以在這裡定義。相關配置如圖 4 所示:

圖 4. 日程安排

在“屬性”中,我們可以定義以最終構建腳本需要用到的屬性。

在“Jazz 源碼控制”中,我們可以定義源碼存儲庫的工作空間,加載路徑(源碼在構建服務器上的存放目錄),構建的策略:是否在加載之前接受最新的代碼改動,是否只在有代碼改動的時候進行構建(這個策略將影響自動化構建的執行,即如果你應用了這個策略,且沒有代碼改動,那麼你定義的自動化部署在預定的時間將不被執行)。詳細設置可參考圖 5:

圖 5.Jazz 源碼控制

在“Maven”選項卡中,可以定義了構建目標工程的路徑,構建時執行的 Maven 命令,maven 的根目錄,Jave 的根目錄等等。詳細設置可參考圖 6:

圖 6.Maven 選項卡

構建 JBE

清單 1 中顯示了配置和啟動 JBE 的腳本。腳本將 JBE 與 RTCserver 關聯起來。

清單 1. JBE 腳本

export JAVA_HOME=<JAVA_HOME>
export ANT_HOME=<ANT_HOME>
export PATH=$JAVA_HOME/bin:$JAVA_HOME:$ANT_HOME/bin:.:$PATH
export LANG="en_US.ISO-8859-1"
export MAVEN_OPTS="-Xms256m -Xmx512m"
build_engine_path="<BUILD_INSTALL>/buildsystem/buildengine/eclipse"
pushd $build_engine_path > /dev/null
nohup ./jbe -repository <code repository> -userId <user name>
   -password <password> -engineId <engineId> &

構建 Maven 腳本

在 POM 架構中,除了各個工程本身的 pom.xml, 還有一個 ROOT pom.xml。在 Root pom.xml 中,各工程被定義為模塊。ROOT pom 首先調用各個模塊的 pom, 完成各模塊的編譯,打包,然後執行構建相關的一些其他操作,如拷貝包文件,最後將調用自動化腳本執行部署任務。模塊 pom 可以引用其它的模塊作為其 dependency, 以提高復用性。POM 結構圖如圖 7 所示,Root pom.xml 如清單 2 所示。

圖 7.POM Architecture

清單 2. Root pom.xml

# 執行各模塊 POM 
<modules>
   <module>module1</module>
   <module>module2</module>
   <module>module..</module>
# 拷貝 builD
   <module>copy..</module>
</modules>
# 使用 Maven Plugin 來調用 Deploy.sh 
<plugin>
   <groupId>org.codehaus.mojo</groupId>
   <artifactId>exec-maven-plugin</artifactId>
   <version>1.1</version>
   <executions>
    <execution>
    <phase>install</phase>
    <goals>
    <goal>exec</goal>
    </goals>
    </execution>
  </executions>
  <configuration>
    <executable>${basedir}/deploy.sh</executable>
    <workingDirectory>${basedir}</workingDirectory>
  </configuration>
</plugin>

RTC 和 Maven 消息傳遞

在構建和部署的過程中,需要把 RTC 的一些信息傳遞到 Maven 腳本中,比如 Build Label, Stream 等。另外也有一些自定義的屬性,比如 Build Label 的前綴,也同樣需要傳遞到 Maven 腳本中,這個是在 Build Definition 中的 Properties 標簽中的 Properties 表格中進行定義的,如圖 8 所示:

圖 8. 自定義屬性

在 Build Definition 的 Maven 標簽中,有一個 Properties file 屬性(如圖 9 所示)。在其定義文件路徑及文件名後,RTC 會在 Build 時將把屬性輸入到此文件中。輸出文件如清單 3 所示:

圖 9. 定義屬性文件路徑

清單 3. RTC 屬性文件

#Tue May 18 21:51:04 CDT 2010 
team.scm.includeComponents=false
repositoryAddress=<code repository>
team.scm.fetchDestination=/build/example_builD
buildDefinitionId=example iD
Pref=D
team.scm.loadComponents=
DesEnv=Dev1
DeploymentEnabled=ture
com.ibm.team.build.internal.template.id=com.ibm.team.build.maven
team.scm.buildOnlyIfChanges=true
team.scm.workspaceUUID=_vvZwcDjXEd-iTowXX9SHhQ
buildLabel=20100518-2148 
requestUUID=_Dmf6oWLxEd-AEoTR5rUeYg
buildResultUUID=_DmghsGLxEd-AEoTR5rUeYg
team.scm.acceptBeforeFetch=true
team.scm.deleteDestinationBeforeFetch=false
team.scm.componentLoadRules=
com.ibm.team.build.internal.engine.monitoring.threshold=3 
team.scm.snapshotUUID=_EvgKEGLxEd-AEoTR5rUeYg

Maven 將此 rtc_cfg.properties 拷貝到 Build 中

清單 4. 拷貝屬性文件

<copy file=" /build/example_build/export/rtc_cfg.properties"
  todir="${basedir}/target/images/" />

Deploy.sh 工作流

自動化腳本首先會讀取 RTC Server 的屬性文件,獲取自動化構建觸發標志,如果標志為 true, 則根據目標屬性的值來獲取相應環境的部署參數(如清單 5 所示)進行自動化部署。否則推出自動化腳本。這一過程的流程圖如圖 10 所示:

圖 10. 自動化腳本流程圖

清單 5. 部署參數屬性文件清單

#common properties
uiServerName=<ui server host name>
ramServerName=<ram server host name>
wdpServerName=<wdp server host name>

#Build properties
earPath=/build/example_dev/latest
jarZipName=Example_Web_jar.zip
wdpZipName=BSS_example.zip
clientJarName=client.exapmle.jar

#webSphere properties
wpsPath=/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/ 
dmgrPath=/opt/IBM/WebSphere/AppServer/profiles/Dmgr01
cellName=<was cell name>
nodeName=<was node name>
serverName=server1
userName=<username>
password=<password>

webEarName=Example_Web_EAr
webWarName=Example_Web_WEb
EAIName=Example_EAI_EAr
APIEarName=Example_API_EAr
abstractionName=Example_Abstraction_EAr
searchEarName=Example_Search_EAr

contextRootEAI=EAIExample
contextRootWEB=example/web
contextRootAPI1=example/api
contextRootAPI2=exmaple/api/soap/20100403
contextRootAbstraction1=exmaple/services
contextRootAbstraction2=exmaple/admin
contextRootSearch=exmaple_Search_WEb

#deploy module flags
deployBSS=no
deployEai=no
deployApi=no
deploySearch=yes
deployAbstraction=no
deployWeb=yes


#service provider and service client
policySet=LTPA
providerType=provider
providerBind=Server LTPA
clientType=client
clientBind=LTPA Client

小結

通過本文的介紹,相信您對結合使用 RTC 和 Maven,通過在 RTC 上配置屬性和定義配置文件,實現多版本 , 多環境,多服務器的自動化構建和部署有了進一步的了解。本文的最終實現效果達到:所有文件都納入到 RTC 的管理中,所有需求均通過 RTC 來進行,從而實現了單點觸發構建 Build 和實現 Build 自動部署。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved