1. 程式人生 > >基於Shell指令碼的Linux下Javaweb專案一鍵部署

基於Shell指令碼的Linux下Javaweb專案一鍵部署

剛買到伺服器的時候想把專案部署上去時,經常會用到各種scp、unzip之類一大堆的命令。雖然整個流程不是特別麻煩,不過學了一些Shell的命令知識之後我發現這個過程還是有優化的空間,於是大概花了幾個小時完成了這樣一個自動部署的指令碼。

首先要解決的問題是,命令如何在遠端伺服器上執行,因為之前每次我都是用密碼登入的,所以這個問題不解決後面的流程也就無從談起,因此我使用了Linux下的一個expect命令,這個命令基本上就相當於是幫你自動往控制檯中送輸入的,於是將這個命令先封裝成一個sh指令碼executeCmd.sh。

#!/usr/bin/expect -f
#用途:遠端執行一條任務
set user [lindex $argv 0]    #使用者名稱
set host [lindex $argv 1]    #伺服器地址
set password [lindex $argv 2]    #伺服器密碼
set cmd [lindex $argv 3]    #命令

spawn ssh 
[email protected]
$host $cmd #spawn $cmd set timeout 300 expect "[email protected]$host's password:" set timeout 300 send "$password\r" set timeout 300 send "exit\r" expect eof

如圖,基本上就是先向伺服器傳送命令,然後等待一段時間自動輸入密碼引數,再等一段時間之後退出。

實現遠端命令的執行之後,就可以編寫主要邏輯了,基本上的思路就是

  1. 停止目標伺服器的tomcat工作
  2. 複製war檔案到伺服器對應目錄下
  3. 遞迴刪除同名資料夾
  4. 解壓縮xxx.war
  5. 執行tomcat
  6. 進入logs中,tail -f catalina.out 檢視日誌檔案

其中,複製war檔案到伺服器對應目錄這一步也需要輸入使用者名稱和密碼,因此我們需要為它也專門寫一個指令碼檔案來進行處理,命名為copyFile.sh,用於遠端複製檔案

#!/usr/bin/expect -f
#用途:遠端複製檔案
set user [lindex $argv 0]    #使用者名稱
set host [lindex $argv 1]    #伺服器地址
set password [lindex $argv 2]    #密碼
set locaFile [lindex $argv 3]    #本地檔案
set targetPath [lindex $argv 4]    #目標路徑

spawn scp $locaFile 
[email protected]
$host:$targetPath #spawn $cmd set timeout 300 expect "[email protected]$host's password:" set timeout 300 send "$password\r" set timeout 300 send "exit\r" expect eof

基本原理和executeCmd.sh那個指令碼一樣。

實現這兩個子指令碼之後就可以實現主要邏輯了,新建檔案deploy.sh,程式碼如下:

#!/bin/bash
#檔名: deploy.sh
#用途:向tomcat部署專案

user='xxxx'
tomcatLoca='/home/tomcat/apache-tomcat-7.0.78' #遠端計算機tomcat的路徑
host='xxx.xx.xxx.xx'	#遠端主機的地址
password='xxxxxxxx'	#密碼
filename=$1	#檔名稱
curLoca=`pwd`	#當前目錄
#echo 當前目錄為$curLoca
#首先停止遠端主機上tomcat的正常工作
executeCmd.sh $user $host $password $tomcatLoca/bin/shutdown.sh
#遠端複製war到webapps目錄下
copyFile.sh $user $host $password $curLoca/$filename.war $tomcatLoca/webapps
#遞迴刪除同名資料夾
executeCmd.sh $user $host $password rm\ -rf\ $tomcatLoca/webapps/$filename
#遠端解壓檔案
executeCmd.sh $user $host $password unzip\ $tomcatLoca/webapps/$filename.war\ -d\ $tomcatLoca/webapps/$filename
#執行tomcat
executeCmd.sh $user $host $password $tomcatLoca/bin/startup.sh
#檢視日誌檔案
executeCmd.sh $user $host $password tail\ -f\ $tomcatLoca/logs/catalina.out

這樣整體功能就完成了,使用時,需要把user、tomcatLoca等變數的值改成自己的情況,然後用如下方式呼叫(切記不要加.war,該指令碼可以再優化一下就是判斷引數中是否有.war,不過用習慣了也無所謂):

deploy.sh 專案名

最後貼一張執行圖:

執行情況