我業管的一個系統是運行在 tomcat 上的 jsp web application,建置方式是各所屬機關自建主機,但使用統一開發及派送的 war 檔版本。所屬機關接收到新的 war 檔要做版更時有幾種方式,其中我認為最簡單的方法是直接從網頁管理的後台把該 application undeploy, 再把新版 war 檔放到 tomcat 的 webapps 目錄下。但一方面不少機關的資訊業務是其他職系同仁兼辦,怕把管理介面告訴他們後反而增加他們的困擾;二來有些機關不只有一個 application,此時手動操作的作法可能有些繁複,因此目前都是統一告訴所屬以下的作法:

1. 把 tomcat 服務停掉
2. 備份原有的 war 檔,以便發生問題時 rollback 用
3. 把新版的 war 檔依原來 webapp 下面的 application 數量複製並取相同檔名,並各自解壓縮到同名目錄下,以備更版用
4. 把原來 tomcat 目錄下 webapps\ 內的 war 檔,同名目錄都刪除;\work\Catalina\localhost\ 下的同名目錄也刪除
5. 把步驟 3 跟 4 的檔案移到 tomcat 目錄下 webapps\ 內
6. 執行廠商的設定用批次檔
7. 啟動 tomcat 服務

雖然只是一些解壓縮、複製、搬移的動作,但經過幾次派版後,還是有人反應這樣的步驟太繁複、怕作錯 (你就可以看出政府機關資訊人力有多不足...連 MIS 工作都有困難),再者我也希望可以設定在下班後自動執行以上程序,不用再留下來操作這些步驟,因此寫了一個 windows batch,讓大家可以設定更版時間後,自動執行更版程序,且有 log 可查:

:: OO 系統自動更版批次檔 release @ itgov.pixnet.net, 20130317
:: 使用說明:把新版 TBKN.war 與本程式放在同一目錄(路徑不可含有空白)下,執行本程式即可

@echo off
echo ******************************
echo *    OO 系統自動更版程式     *
echo ******************************
echo.

:: 設定相關目錄
set tomcatDir=C:\Tomcat 7.0\
set backupDir=%cd%\AOSD自動更新備份\
set logFile=%backupDir%%date:~0,4%%date:~5,2%%date:~8,2%.txt
set newFileDir=%cd%\newfile\
set propertiesFile=C:\Tomcat 7.0\properties_bk.bat

:: 視主機為 32 或 64 位元,設定 7-zip 預設路徑
if exist "C:\Program Files\7-Zip\7z.exe" (
	goto Set7Zip
)
if exist "C:\Program Files (x86)\7-Zip\7z.exe" (
	goto Set7ZipX86
)
goto VerifyDir

:Set7Zip
set sevenZipFile=C:\Program Files\7-Zip\7z.exe
goto VerifyDir	

:Set7ZipX86
set sevenZipFile=C:\Program Files (x86)\7-Zip\7z.exe

:VerifyDir
:: 確認新版 TBKN.war, Tomcat 所在目錄及 properties_bk.bat 存在
if not exist %cd%\TBKN.war (
	echo ** 錯誤:找不到新版 TBKN.war,請聯絡客服或承辦人
	goto EndProgram
)
if not exist "%tomcatDir%webapps\TBKN\" (
	echo ** 錯誤:找不到 Tomcat 目錄,請聯絡客服或承辦人
	goto EndProgram
)
if not exist "%propertiesFile%" (
	echo ** 錯誤:找不到 properties_bk.bat,請聯絡客服或承辦人
	goto EndProgram
)
if not exist "%sevenZipFile%" (
	echo ** 錯誤:找不到 7-zip 解壓縮軟體,請先下載安裝,
	echo ** 下載位置:http://....../files/Tools/壓縮軟體/7-Zip.exe
	goto EndProgram
)

:: 選擇幾小時後開始更版,限定選項為 0-9 避免誤按
choice /c:0123456789 /n /m "** 請輸入要在幾個小時後開始自動更版(0-9):"
if errorlevel 10 goto SetNineHour
if errorlevel 9 goto SetEightHour
if errorlevel 8 goto SetSevenHour
if errorlevel 7 goto SetSixHour
if errorlevel 6 goto SetFiveHour
if errorlevel 5 goto SetFourHour
if errorlevel 4 goto SetThreeHour
if errorlevel 3 goto SetTwoHour
if errorlevel 2 goto SetOneHour
if errorlevel 1 goto SetZeroHour
:SetNineHour
set /a secToUpdate=9*3600
goto Countdown
:SetEightHour
set /a secToUpdate=8*3600
goto Countdown
:SetSevenHour
set /a secToUpdate=7*3600
goto Countdown
:SetSixHour
set /a secToUpdate=6*3600
goto Countdown
:SetFiveHour
set /a secToUpdate=5*3600
goto Countdown
:SetFourHour
set /a secToUpdate=4*3600
goto Countdown
:SetThreeHour
set /a secToUpdate=3*3600
goto Countdown
:SetTwoHour
set /a secToUpdate=2*3600
goto Countdown
:SetOneHour
set /a secToUpdate=1*3600
goto Countdown
:SetZeroHour
set secToUpdate=0

:Countdown
echo ** 以下開始倒數,等待期間若要停止程式請直接關閉視窗或按 Ctrl + C ...
timeout /t %secToUpdate% /NOBREAK

mkdir %backupDir%
mkdir %newFileDir%

echo %date:~0,4%%date:~5,2%%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2% ** 開始更版
echo ---------- %date:~0,4%%date:~5,2%%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2% ** 開始更版 ---------- >> %logFile%

echo %date:~0,4%%date:~5,2%%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2% ** 備份原 webapps 下 TBKN*.war ...
echo %date:~0,4%%date:~5,2%%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2% ** 備份原 webapps 下 TBKN*.war >> %logFile%
xcopy "%tomcatDir%webapps\TBKN*.war" %backupDir%%date:~0,4%%date:~5,2%%date:~8,2%\ /y >> %logFile%

echo %date:~0,4%%date:~5,2%%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2% ** 複製新的 TBKN*.war ...
echo %date:~0,4%%date:~5,2%%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2% ** 複製新的 TBKN*.war >> %logFile%
for %%I in ("%tomcatDir%webapps\TBKN*.war") do copy %cd%\TBKN.war %newFileDir%%%~nxI >> %logFile%

echo %date:~0,4%%date:~5,2%%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2% ** 解壓縮新的 TBKN*.war ...
echo %date:~0,4%%date:~5,2%%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2% ** 解壓縮新的 TBKN*.war >> %logFile%
for %%I in ("%newFileDir%TBKN*.war") do "%sevenZipFile%" x %%I -o%newFileDir%%%~nI\ -y >> %logFile%

echo %date:~0,4%%date:~5,2%%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2% ** 停止 Tomcat 服務並等待 5 分鐘 ...
echo %date:~0,4%%date:~5,2%%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2% ** 停止 Tomcat 服務並等待 5 分鐘 >> %logFile%
net stop Tomcat7  >> %logFile%
timeout /t 300 /NOBREAK

echo %date:~0,4%%date:~5,2%%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2% ** 將 localhost 下原 TBKN* 目錄刪除 ...
echo %date:~0,4%%date:~5,2%%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2% ** 將 localhost 下原 TBKN* 目錄刪除 >> %logFile%
for /d %%i in ("%tomcatDir%work\Catalina\localhost\TBKN*") do rmdir "%%i" /S /Q >> %logFile%

echo %date:~0,4%%date:~5,2%%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2% ** 將 webapps 下原 TBKN* 目錄刪除 ...
echo %date:~0,4%%date:~5,2%%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2% ** 將 webapps 下原 TBKN* 目錄刪除 >> %logFile%
for /d %%i in ("%tomcatDir%webapps\TBKN*") do rmdir "%%i" /S /Q >> %logFile%

echo %date:~0,4%%date:~5,2%%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2% ** 將 webapps 下原 TBKN*.war 檔刪除 ...
echo %date:~0,4%%date:~5,2%%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2% ** 將 webapps 下原 TBKN*.war 檔刪除 >> %logFile%
del "%tomcatDir%webapps\TBKN*.war" /F /Q >> %logFile%

echo %date:~0,4%%date:~5,2%%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2% ** 複製新檔案到 webapps 目錄下 ...
echo %date:~0,4%%date:~5,2%%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2% ** 複製新檔案到 webapps 目錄下 >> %logFile%
xcopy %newFileDir%* "%tomcatDir%webapps\" /y /e >> %logFile%

:: 因欲執行之bat檔案內為相對目錄,故先切換至該目錄下,另使用 echo | call 指令 bypass bat 檔內的 pause 語法
chdir /D %tomcatDir% >> %logFile%
echo %date:~0,4%%date:~5,2%%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2% ** 執行 properties_bk.bat ...
echo %date:~0,4%%date:~5,2%%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2% ** 執行 properties_bk.bat >> %logFile%
for %%j in ("%propertiesFile%") do echo | call %%j >> %logFile%

echo %date:~0,4%%date:~5,2%%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2% ** 啟動 Tomcat 服務 ...
echo %date:~0,4%%date:~5,2%%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2% ** 啟動 Tomcat 服務 >> %logFile%
net start Tomcat7 >> %logFile%

echo %date:~0,4%%date:~5,2%%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2% ** 將已複製完畢的 newfile 目錄刪除 ...
echo %date:~0,4%%date:~5,2%%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2% ** 將已複製完畢的 newfile 目錄刪除 >> %logFile%
rmdir %newFileDir% /S /Q >> %logFile%

echo %date:~0,4%%date:~5,2%%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2% ** 更版完成,紀錄檔在 %logFile%
echo ---------- %date:~0,4%%date:~5,2%%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2% ** 更版結束 ---------- >> %logFile%

:EndProgram
echo.
pause

batch  

以我自己在單位內使用來說,本來整個更版程序要花半小時以上,且一定要等下班後才能作,現在至少幫自己省下一小時的下班時間;同時也幫上了80個以上所屬機關人員的忙。
當然最好的作法是有個 GUI,按下按鈕就自行比對、下載新版 war 檔並自動備份及更新,不過我暫時還沒有時間,而且這本來應該是廠商的要作的工作...

創作者介紹

資訊人在政府

資訊人在政府 發表在 痞客邦 PIXNET 留言(0) 人氣()