最完善的自動化運維腳本(打包、復制、上傳、備份、啟動、刪除)
1、需求背景:為了快速部署測試,故有如下腳本
2、windows下maven 打包(單個、多個)和copy腳本:
現有開發工具都提供了很方便的打包快捷鍵,但是如果是項目模塊較多,一個個打包麻煩,這時候我們就需要一個自動打包的腳本
打包腳本如下:
參數說明:
D:\codejiedian\workcodejiedian201105\Cloud-Power-Gateway 項目路徑
D:\MAVEN\apache-maven-3.6.1\conf\riest-study-settings.xml maven 配置文件位置
clean install package -Dmaven.test.skip=true 調用maven的 clean install package 跳過測試
腳本如下:
@echo OFF
:START
:TUNNEL
cd /d D:\codejiedian\workcodejiedian201105\Cloud-Power-Gateway
mvn --settings D:\MAVEN\apache-maven-3.6.1\conf\riest-study-settings.xml clean install package -Dmaven.test.skip=true
PAUSE
goto TUNNEL
如果有很多個模塊怎么處理?
-
寫多個上述的打包腳本,每一個是一個單獨的腳本
-
然后寫一個總的bat腳本來啟動多個打包腳本
參數說明: D:\packagebatWirhIdea\workcodejiedian201105\power\maven-Cloud-Power-WebBase.bat 單個打包腳本未知 ...... 表示可以寫多個 @echo OFF call D:\packagebatWirhIdea\workcodejiedian201105\power\maven-Cloud-Power-WebBase.bat call D:\packagebatWirhIdea\workcodejiedian201105\power\maven-Cloud-Power-Gateway.bat ......
-
將所有打包好的包復制到一個指定的文件夾(就是一個copy腳本)
參數說明: D:\mavenjar\com\riest\power\Cloud-Power-Activiti\1.0.0\Cloud-Power-Activiti-1.0.0.jar jar包位置 E:\JarManager\fushuntest\201217-01 目的地 ...... 表示可以寫多個 @echo off copy D:\mavenjar\com\riest\power\Cloud-Power-Activiti\1.0.0\Cloud-Power-Activiti-1.0.0.jar E:\JarManager\fushuntest\201217-01 copy D:\mavenjar\com\riest\power\Cloud-Power-Gateway\1.0.0\Cloud-Power-Gateway-1.0.0.jar E:\JarManager\fushuntest\201217-01 ...... TIMEOUT /T 5
3、將所有j准備好jar上傳至服務器
我們這采用pcsp ,這個很簡單,下載安裝就行,也可用自帶的ssh
打開windows命令行窗口,推薦使用powershell
命令如下:
參數說明
--password:服務器密碼
--path:要上傳的文件路徑
--ip:服務器ip
--serverpath對應的服務器ip
pscp -r -P 22 -pw password path root@ip:serverpath
4、Liunx 啟動jar腳本
需求:調用該腳本后,如果之前有對應的jar啟動,將器kill,然后啟動新的
腳本如下(我們以同時啟動兩個jar為例子)
#!/bin/sh
# jar 名稱,根據實際情況來
export Jenkins_01=Jenkins-1.0.0-01.jar
export Jenkins_02=Jenkins-1.0.0-02.jar
# 啟動參數,根據實際情況配置
export Jenkins_01_xms=-Xms256m -Xmx256m -Xmn128m -Duser.timezone=GMT+8
export Jenkins_02_xms=-Xms256m -Xmx256m -Xmn128m -Duser.timezone=GMT+8
# 啟動端口
export Jenkins_01_port=9090
export Jenkins_02_port=9091
case "$1" in
start)
## 啟動Jenkins9090
echo "--------Jenkins9090 開始啟動--------------"
nohup java -jar $Jenkins_01 $Jenkins_01_xms &
Jenkins_01_pid=`lsof -i:$Jenkins_01_port|grep "LISTEN"|awk '{print $2}'`
until [ -n "$Jenkins_01_pid" ]
do
Jenkins_01_pid=`lsof -i:$Jenkins_01_port|grep "LISTEN"|awk '{print $2}'`
done
echo "Jenkins_01 pid is $Jenkins_01_pid"
sleep 10
echo "--------Jenkins9090 啟動成功--------------"
## 啟動Jenkins9091
echo "--------Jenkins9091 開始啟動--------------"
nohup java -jar $Jenkins_02 $Jenkins_02_xms &
Jenkins_02_pid=`lsof -i:$Jenkins_02_port|grep "LISTEN"|awk '{print $2}'`
until [ -n "$Jenkins_02_pid" ]
do
Jenkins_02_pid=`lsof -i:$Jenkins_02_port|grep "LISTEN"|awk '{print $2}'`
done
echo "Jenkins_02 pid is $Jenkins_02_pid"
sleep 10
echo "--------Jenkins9091 啟動成功--------------"
echo "===startAll success==="
;;
stop)
P_ID=`ps -ef | grep -w $Jenkins_01 | grep -v "grep" | awk '{print $2}'`
if [ "$P_ID" == "" ]; then
echo "===Jenkins-01 process not exists or stop success"
else
kill -9 $P_ID
echo "Jenkins-01 killed success"
fi
P_ID=`ps -ef | grep -w $Jenkins_02 | grep -v "grep" | awk '{print $2}'`
if [ "$P_ID" == "" ]; then
echo "===Jenkins-02 process not exists or stop success"
else
kill -9 $P_ID
echo "Jenkins-02 killed success"
fi
echo "===stop success==="
;;
restart)
$0 stop
sleep 10
$0 start
echo "===restart success==="
;;
esac
exit 0
5、Liunx 下備份腳本
我們在啟動新版本的jar時需要備份之前的jar
備份命令如下
#!/bin/bash
#獲得當前的時間
ctime=$(date +%Y%m%d%H%M%S)
#創建文件夾
mkdir -p /usr/local/backup/${ctime}
#將需要備份的數據copy
cp -r /mydata/mongodb/* /usr/local/backup/${ctime}
# 壓縮備份 這里有兩個問題
#1、給壓縮文件起名字的時候不能用前面的ctime,暫不清楚原因
#2、壓縮文件會將/usr/local/backup全部備份,后續解決
tar -zcPvf /usr/local/backup/backup$(date +%Y%m%d%H%M%S).tar.gz /usr/local/backup/${ctime}
#刪除copy文件
rm -rf /usr/local/backup/${ctime}
6、聚合腳本:讓前面所有的腳本達到一鍵啟動
- 詳見測試
7、本地寫代碼打包上傳備份測試
建2個springboot項目,寫一個controller,發送get請求,返回一個字符串,如下圖
新建打包腳本
Cloud-Jenkins-9001.bat
@echo OFF
:START
:TUNNEL
cd /d D:\SpringCloudSeata\SpringCloudStudy\Jenkins-02
mvn --settings D:\MAVEN\apache-maven-3.6.1\conf\riest-study-settings.xml clean install package -Dmaven.test.skip=true
PAUSE
goto TUNNEL
Cloud-Jenkins-9002.bat
@echo OFF
:START
:TUNNEL
cd /d D:\SpringCloudSeata\SpringCloudStudy\Jenkins
mvn --settings D:\MAVEN\apache-maven-3.6.1\conf\riest-study-settings.xml clean install package -Dmaven.test.skip=true
PAUSE
goto TUNNEL
如圖:
將打包腳本聚合在一起
@echo OFF
call E:\210107TEST\PackageBat\SinglePackage\Cloud-Jenkins-9001.bat
call E:\210107TEST\PackageBat\SinglePackage\Cloud-Jenkins-9002.bat
windows復制腳本
@echo off
del E:\210107TEST\Testjar\*.*
copy D:\mavenjar\com\riest\Jenkins\1.0.0\Jenkins-1.0.0.jar E:\210107TEST\Testjar
copy D:\mavenjar\com\riest\Jenkins-02\1.0.0\Jenkins-02-1.0.0.jar E:\210107TEST\Testjar
TIMEOUT /T 5
遠程主主機的備份shell(判斷是否需要備份,存在備份即可)
#!/bin/bash
if [ ! -d "/root/download/Testjar/" ];then
echo "文件夾不存在"
else
echo "**文件夾存在,開始備份**"
#獲得當前的時間
ctime=$(date +%Y%m%d%H%M%S)
#創建文件夾
mkdir -p /root/download/backup/${ctime}
#將需要備份的數據copy
cp -r /root/download/Testjar/* /root/download/backup/${ctime}
# 壓縮備份 這里有兩個問題
#1、給壓縮文件起名字的時候不能用前面的ctime,暫不清楚原因
#2、壓縮文件會將/usr/local/backup全部備份,后續解決
tar -zcPvf /root/download/backup/backup$(date +%Y%m%d%H%M%S).tar.gz /root/download/backup/${ctime}
#刪除copy文件
rm -rf /root/download/backup/${ctime}
fi
上傳jar包到遠程主機
@echo off
pass:服務器密碼
ip:服務器ip
E:\210107TEST\Testjar:文件路徑
/root/download:遠程主機命令
pscp -r -P 22 -pw pass E:\210107TEST\Testjar root@服務器ip:/root/download
啟動上傳的jar(三個命令組成:start、stop、restart)
#!/bin/sh
# jar 路徑以及名稱,根據實際情況來
export Jenkins_01=/root/download/Testjar/Jenkins-1.0.0.jar
export Jenkins_02=/root/download/Testjar/Jenkins-02-1.0.0.jar
# 啟動參數,根據實際情況配置
export Jenkins_01_xms=-Xms256m-Xmx256m-Xmn128m-Duser.timezone=GMT+8
export Jenkins_02_xms=-Xms256m-Xmx256m-Xmn128m-Duser.timezone=GMT+8
# 啟動端口
export Jenkins_01_port=9092
export Jenkins_02_port=9091
case "$1" in
start)
## 啟動權限01
echo "--------Jenkins9092 開始啟動--------------"
nohup java -jar $Jenkins_01 $Jenkins_01_xms &
Jenkins_01_pid=`lsof -i:$Jenkins_01_port|grep "LISTEN"|awk '{print $2}'`
until [ -n "$Jenkins_01_pid" ]
do
Jenkins_01_pid=`lsof -i:$Jenkins_01_port|grep "LISTEN"|awk '{print $2}'`
done
echo "Jenkins_01 pid is $Jenkins_01_pid"
sleep 10
echo "--------Jenkins9092 啟動成功--------------"
## 啟動工作流01
echo "--------Jenkins9091 開始啟動--------------"
nohup java -jar $Jenkins_02 $Jenkins_02_xms &
Jenkins_02_pid=`lsof -i:$Jenkins_02_port|grep "LISTEN"|awk '{print $2}'`
until [ -n "$Jenkins_02_pid" ]
do
Jenkins_02_pid=`lsof -i:$Jenkins_02_port|grep "LISTEN"|awk '{print $2}'`
done
echo "Jenkins_02 pid is $Jenkins_02_pid"
sleep 10
echo "--------Jenkins9091 啟動成功--------------"
echo "===startAll success==="
;;
stop)
P_ID=`ps -ef | grep -w $Jenkins_01 | grep -v "grep" | awk '{print $2}'`
if [ "$P_ID" == "" ]; then
echo "===Jenkins-01 process not exists or stop success"
else
kill -9 $P_ID
echo "Jenkins-01 killed success"
fi
P_ID=`ps -ef | grep -w $Jenkins_02 | grep -v "grep" | awk '{print $2}'`
if [ "$P_ID" == "" ]; then
echo "===Jenkins-02 process not exists or stop success"
else
kill -9 $P_ID
echo "Jenkins-02 killed success"
fi
echo "===stop success==="
;;
restart)
$0 stop
sleep 10
$0 start
echo "===restart success==="
;;
esac
exit 0
一鍵啟動腳本(windows)
@echo OFF
chcp 65001
echo "啟動,開始打包"
call E:\210107TEST\PackageBat\PolyPackage\Maven-Cloud-Package.bat
echo "啟動,開始復制"
call E:\210107TEST\CopyBat\CopyJar.bat
echo "啟動,遠程調用linux服務器上的sh備份腳本..."
call E:\210107TEST\BackUpLiunx\backup.bat
echo "啟動,開始上傳"
call E:\210107TEST\UploadLiunx\UploadLiunx.bat
echo "啟動,遠程調用linux服務器上的sh啟動腳本..."
call E:\210107TEST\StratJar\startjar.bat
@cmd.exe
exist
8、遺留問題
首先給所有shell腳本授權
chmod +x xxx.sh
9、bug解決
**-bash: ./xxx.sh: /bin/sh^M: bad interpreter: No such file or directory **
原因:Windows環境下dos格式文件傳輸到unix系統時,會在每行的結尾多一個^M,所以在執行的時候出現了這種現象
解決辦法,執行
sed -i -e 's/\r$//' xxx.sh
failed to run command `java': No such file or directory
解決辦法:
首先排除服務器是否有java 環境,當然這一般不可能
第一步:
vim /etc/profile
將自己java配置的環境變量copy出來,如下
第二步執行:
vim ~/.bashrc
第三步將復制的java環境變量copy出來復制到最后,如下
第三步:
source ~/.bashrc