基於Shell指令碼的Linux下Javaweb專案一鍵部署
阿新 • • 發佈:2018-11-06
剛買到伺服器的時候想把專案部署上去時,經常會用到各種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
如圖,基本上就是先向伺服器傳送命令,然後等待一段時間自動輸入密碼引數,再等一段時間之後退出。
實現遠端命令的執行之後,就可以編寫主要邏輯了,基本上的思路就是
- 停止目標伺服器的tomcat工作
- 複製war檔案到伺服器對應目錄下
- 遞迴刪除同名資料夾
- 解壓縮xxx.war
- 執行tomcat
- 進入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 專案名
最後貼一張執行圖: