2004年7月8日

Web應用程式自動部署作業-使用 Tomcat 及 Ant

目前在 Tomcat 上執行遠端部署 WAR 檔的方式經整理至少有以下三種:
  1. 使用 FTP 上傳:這是透過 Tomcat 的自動部署設定機制,將 war 檔解開後重新載入相關設定的方式,應該所有的 Application Server 都可支援這種式新方式,例如 Tomcat 4/5, JRUN 4, resin 都可以。
  2. 使用 Tomcat 4 提供的 manager Servlet 界面:只要啟動 Tomcat 的遠端管理功能即可指定 Tomcat 做你想做的維護作業,包含 deploy 及 undeploy 等動作。Tomcat 5 也可以使用這種方式進行部署作業。
  3. 使用 Tomcat 5 提供的 ANT 任務:配合 Tomcat 5 提供的 catalina-ant.jar 及啟動遠端管理功能後,即可使用此方式進行部署。
  • 設定 Tomcat 啟動遠端管理功能的方式請參考:開啟 Tomcat 遠端部署功能
  • 不負責任猜測:Tomcat 5 提供的 ANT 任務服務界面應該也可以用來部署 .war 檔到 Tomcat 4 的 Server 上,但是我沒有使用 Tomcat 4… :p
以下分別介紹如何使用 ANT 達成這三種部署作業的方式:

FTP 上傳

在先前發佈的 Web應用程式ant建置檔 中就是採用這個作法,ant 的核心設定為:

<echo>Sending file(s) to ${uat.ftp.server}...</echo>
  <ftp binary="yes" depends="yes" server="${uat.ftp.server}" 
       password="${uat.deploy.passwd}"userid="${uat.deploy.name}">
  <fileset dir="${output.path}"/>
</ftp>

通常上傳後經過 10 秒後,各家的 Application Server 即可完成重新載入的動作。

使用 Tomcat 4 的遠端管理界面

Tomcat 4/5 都提供了遠端管理界面以進行安裝、啟動、關閉、移除等遠端管理界面,請參考相關說明完成設定動作:開啟 Tomcat 遠端部署功能

ANT 提供 <get.... /> 任務可以取得指定 URI ( http 支援最完整,而 https 在我的 J2SDK 1.4.2_03 上無法正確運作,據說應該要可以動才對 ) 的輸出結果,不過我不還搞不清楚怎麼將 .war 檔透過管理界面丟上 JSP Container 去… :p

<!-- 先關閉指定路徑的 Web Application,並把網頁輸出的結果寫到${uat.ftp.server}.stop.txt中  -->
<get src="http://${uat.ftp.server}/manager/stop?path=/${ant.project.name}"
     dest="${uat.ftp.server}.stop.txt"
    username="${uat.tomcat.username}" password="${uat.tomcat.password}" />
<!-- 將 get 的輸出結果載入到 uat.stop.result 屬性中 -->
<loadfile property="uat.stop.result"
           srcFile="${uat.ftp.server}.stop.txt" />
<!-- 輸出 get 的輸出結果 -->
<echo>${uat.stop.result}</echo>

<!-- 還是採用 ftp 傳檔.... --> <echo>Sending file(s) to ${uat.ftp.server}...</echo> <ftp binary="yes" depends="yes" server="${uat.ftp.server}" userid="${uat.deploy.name}" password="${uat.deploy.passwd}"> <fileset dir="${output.path}"/> </ftp>

<!-- 上傳後要留點時間給 APP Server 解開 war 檔 --> <echo>wait for 10 seconds...</echo> <sleep seconds="10" />

<!-- 重新啟動指定路徑下的 Web Application --> <get src="http://${uat.ftp.server}/manager/start?path=/${ant.project.name}" dest="${source.path}/${uat.ftp.server}.start.txt" username="${uat.tomcat.username}" password="${uat.tomcat.password}" /> <!-- 載入 Web Application 啟動情形 --> <loadfile property="uat.start.result" srcFile="${source.path}/${uat.ftp.server}.start.txt" /> <!-- 檢查 ${source.path}/${uat.ftp.server}.start.txt 是否有 'OK' 字眼 --> <!-- 有就將 deploy.uat.success 屬性設為 true --> <condition property="deploy.uat.success" value="true"> <and> <contains string="${uat.start.result}" substring="OK" /> </and> </condition> <!-- 若 deploy.uat.success 未設定時表示部署作業失敗,終止 build 程序 --> <fail message="Deploy ${uat.ftp.server} fail..." unless="deploy.uat.success"/> <!-- 不然就輸出部署成功的訊息 --> <echo>${uat.start.result}</echo>

使用 Tomcat 5 提供的 Ant 任務管理功能

設定 ant

請記得將 catalina-ant.jar 複製到 $ANT_HOME/lib 下,不然 ant 無法取得 Tomcat 5 所提供的外掛任務。

在 build.xml 中定義 ant 提供的任務項目

<!-- Configure the custom Ant tasks for the Tomcat 5.0 Manager application -->
<taskdef name="deploy"    classname="org.apache.catalina.ant.DeployTask"/>
<taskdef name="list"      classname="org.apache.catalina.ant.ListTask"/>
<taskdef name="reload"    classname="org.apache.catalina.ant.ReloadTask"/>
<taskdef name="resources" classname="org.apache.catalina.ant.ResourcesTask"/>
<taskdef name="roles"     classname="org.apache.catalina.ant.RolesTask"/>
<taskdef name="start"     classname="org.apache.catalina.ant.StartTask"/>
<taskdef name="stop"      classname="org.apache.catalina.ant.StopTask"/>
<taskdef name="undeploy"  classname="org.apache.catalina.ant.UndeployTask"/>

使用定義好的 ant 任務

完成任務定義後,即可在 ant 目標中使用相關的任務。

<!-- 移除原指定路徑上之應用系統 -->
<undeploy url="http://${uat.ftp.server}/manager" 
     username="${uat.tomcat.username}" password="${uat.tomcat.password}"
         path="/${ant.project.name}"/>
<!-- 傳送檔案 ( log4j.properties 設定檔 ) -->
 <echo>Sending file(s) to ${uat.ftp.server}...</echo>
 <ftp binary="yes" depends="yes" server="${uat.ftp.server}" 
     userid="${uat.deploy.name}" password="${uat.deploy.passwd}">
   <!-- 避開 .war 檔 -->
   <fileset dir="${output.path}" excludes="**/*.war"/>
 </ftp>
<sleep seconds="10" />
<!-- 重新部署 -->
 <deploy url="http://${uat.ftp.server}/manager" 
    username="${uat.tomcat.username}" password="${uat.tomcat.password}"
        path="/${ant.project.name}" war="${war.name}"/>

不過使用這個方式會有個問題: 若 undeploy 失敗後,建置程序就會中止

通常部署管理員在意的不是 undeploy 是否失敗,反而是 deploy 後該應用程序是否正確上線,因此或許混合各種不同的方式才可能取得最適合自己系統的部署方式。

另外,其他 Application Server 也多半都開始提供 ant 部署任務,這部份就等到遇上後再來整理相關的資料吧。