我們公司使用了 6 年的Spring Boot 項目部署方案!打包 + Shell 腳本部署詳解,穩(wěn)的一批!
上一篇:只有自己牛B,才能對社會無情鞭撻!
本篇和大家分享的是 Spring Boot 打包并結合 Shell 腳本命令部署,重點在分享一個shell 程序啟動工具,希望能便利工作;
profiles指定不同環(huán)境的配置
maven-assembly-plugin打發(fā)布壓縮包
分享shenniu_publish.sh程序啟動工具
linux上使用shenniu_publish.sh啟動程序
profiles指定不同環(huán)境的配置
通常一套程序分為了很多個部署環(huán)境:開發(fā),測試,uat,線上 等,我們要想對這些環(huán)境區(qū)分配置文件,可以通過兩種方式:
這里我們要講的是第二種,首先在mvn中配置如下內(nèi)容:
1?
?2?
?3?node
?4?
?5?
?6?node
?7?${scripts_packageName}
?8?${scripts_bootMain}
?9?
10?
11?true
12?
13?
14?
15?node1
16?
17?node1
18?${scripts_packageName}
19?${scripts_bootMain}
20?
21?
22?
23?node2
24?
25?node2
26?${scripts_packageName}
27?${scripts_bootMain}
28?
29?
30?
節(jié)點粗解:
id:用來指定不同環(huán)境配置文件所在的目錄,如下我這里:


activeByDefault:指定默認環(huán)境配置文件夾
maven-assembly-plugin打發(fā)布壓縮包
1?
?2?org.apache.maven.plugins
?3?maven-jar-plugin
?4?2.6
?5?
?6?
?7?false
?8?
?9?true
10?lib/
11?${scripts_bootMain}
12?
13?
14?
15?
16?**/*.yml
17?**/*.properties
18?**/*.xml
19?**/*.sh
20?
21?
22?
23?
24?make-a-jar
25?compile
26?
27?jar
28?
29?
30?
31?
32
33?
34?org.apache.maven.plugins
35?maven-assembly-plugin
36?2.4
37?
38?
39?
40?
41?${project.basedir}/src/main/assembly/assembly.xml
42?
43?
44?
45?
46?make-assembly
47?package
48?
49?single
50?
51?
52?
53?
值得注意的地方如下幾點:
有了上面mvn配置,我們還需要assembly.xml的配置,這里提取了結合shell腳本發(fā)布程序的配置:
"http://maven.apache.org/ASSEMBLY/2.0.0" ?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
??????????xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0?http://maven.apache.org/xsd/assembly-2.0.0.xsd
http://maven.apache.org/ASSEMBLY/2.0.0?">
????${activeProfile}
????
????
????????zip
????
????
????false
????
????????
????????????
????????????false
????????????${package-name}-${activeProfile}/lib
????????????false
????????
????
????
????????
????????
????????????${project.basedir}/src/main/profiles/${activeProfile}
????????????${package-name}-${activeProfile}/conf
????????????
????????????????**/*
????????????????
????????????????
????????????????
????????????
????????
????????
????????
????????????${project.basedir}/src/main/scripts
????????????
????????????
????????????????**/*
????????????
????????????
????????????777
????????????
????????????777
????????????
????????????true
????????
????????
????????
????????????${project.build.directory}
????????????${package-name}-${activeProfile}/
????????????
????????????????*.jar
????????????
????????
????
重點節(jié)點介紹:
formats節(jié)點:把配置文件和jar包等壓縮成什么文件格式,這里可以有:zip,tar等
fileMode節(jié)點:指定scripts目錄下腳本文件(這里是:shenniu_publish.sh)在linux上文件權限為777
filtered節(jié)點:腳本中參數(shù)變量為pom的profiles中properties的值(該配置,是把mvn中屬性值映射生成到sh文件中,如:${package-name})
完成上面配置后,此時我們可以通過idea上勾選切換不同環(huán)境來打zip包,如圖:

分享shenniu_publish.sh程序啟動工具
上面步驟完成了zip格式的發(fā)布包,我們再分享下啟動程序的shell腳本,該腳本具有的功能如:
解壓zip+啟動jar包
啟動jar包
停止對應jar運行
重啟jar程序
目前該shell中封裝了兩種啟動jar命令的方式:
java -cp
java -jar
如圖命令格式:

來看全部的shell代碼:
#!/usr/bin/env?bash
#可變參數(shù)變量
languageType="javac"?#支持?java,javac,netcore?發(fā)布
#參數(shù)值由pom文件傳遞
baseZipName="${package-name}-${activeProfile}"?#壓縮包名稱?publish-test.zip的publish
packageName="${package-name}"?#命令啟動包名?xx.jar的xx
mainclass="${boot-main}"?#java -cp啟動時,指定main入口類;命令:java -cp conf;lib\*.jar;${packageName}.jar ${mainclass}
#例子
#?baseZipName="publish-test"?#壓縮包名稱?publish-test.zip的publish
#?packageName="publish"?#命令啟動包名?publish.jar的xx
#固定變量
basePath=$(cd?`dirname?$0`/;?pwd)
baseZipPath="${basePath}/${baseZipName}.zip"??#壓縮包路徑
baseDirPath="${basePath}"?#解壓部署磁盤路徑
pid=?#進程pid
#解壓
function?shenniu_unzip()
{
????echo?"解壓---------------------------------------------"
????echo?"壓縮包路徑:${baseZipPath}"
????if?[?!?`find?${baseZipPath}`?]
????then
????????echo?"不存在壓縮包:${baseZipPath}"
????else
????????echo?"解壓磁盤路徑:${baseDirPath}/${baseZipName}"
????????echo?"開始解壓..."
????????#解壓命令
????????unzip?-od?${baseDirPath}/${baseZipName}?${baseZipPath}
????????#設置執(zhí)行權限
????????chmod?+x?${baseDirPath}/${baseZipName}/${packageName}
????????echo?"解壓完成。"
????fi
}
#檢測pid
function?getPid()
{
????echo?"檢測狀態(tài)---------------------------------------------"
????pid=`ps?-ef?|?grep?-n?${packageName}?|?grep?-v?grep?|?awk?'{print?$2}'`
????if?[?${pid}?]
????then
????????echo?"運行pid:${pid}"
????else
????????echo?"未運行"
????fi
}
#啟動程序
function?start()
{
????#啟動前,先停止之前的
????stop
????if?[?${pid}?]
????then
????????echo?"停止程序失敗,無法啟動"
????else
????????echo?"啟動程序---------------------------------------------"
????????#選擇語言類型
????????read?-p?"輸入程序類型(java,javac,netcore),下一步按回車鍵(默認:${languageType}):"?read_languageType
????????if?[?${read_languageType}?]
????????then
????????????languageType=${read_languageType}
????????fi
????????echo?"選擇程序類型:${languageType}"
????????#進入運行包目錄
????????cd?${baseDirPath}/${baseZipName}
????????#分類啟動
????????if?[?"${languageType}"?==?"javac"?]
????????then
????????????if?[?${mainclass}?]
????????????then
????????????????nohup?java?-cp?conf:lib\*.jar:${packageName}.jar?${mainclass}?>${baseDirPath}/${packageName}.out?2>&1?&
???????????????#nohup?java?-cp?conf:lib\*.jar:${packageName}.jar?${mainclass}?>/dev/null?2>&1?&
????????????fi
????????elif?[?"${languageType}"?==?"java"?]
????????then
????????????nohup?java?-jar?${baseDirPath}/${baseZipName}/${packageName}.jar?>/dev/null?2>&1?&
????????????#?java?-jar?${baseDirPath}/${baseZipName}/${packageName}.jar
????????elif?[?"${languageType}"?==?"netcore"?]
????????then
????????????#nohup?dotnet?run?${baseDirPath}/${baseZipName}/${packageName}?>/dev/null?2>&1?&
????????????nohup?${baseDirPath}/${baseZipName}/${packageName}?>/dev/null?2>&1?&
????????fi
????????#查詢是否有啟動進程
????????getPid
????????if?[?${pid}?]
????????then
????????????echo?"已啟動"
????????????#nohup日志
????????????tail?-n?50?-f?${baseDirPath}/${packageName}.out
????????else
????????????echo?"啟動失敗"
????????fi
????fi
}
#停止程序
function?stop()
{
????getPid
????if?[?${pid}?]
????then
????????echo?"停止程序---------------------------------------------"
????????kill?-9?${pid}
????????getPid
????????if?[?${pid}?]
????????then
????????????#stop
????????????echo?"停止失敗"
????????else
????????????echo?"停止成功"
????????fi
????fi
}
#啟動時帶參數(shù),根據(jù)參數(shù)執(zhí)行
if?[?${#}?-ge?1?]
then
????case?${1}?in
????????"start")
????????????start
????????;;
????????"restart")
????????????start
????????;;
????????"stop")
????????????stop
????????;;
????????"unzip")
????????????#執(zhí)行解壓
????????????shenniu_unzip
????????????#執(zhí)行啟動
????????????start
????????;;
????????*)
????????????echo?"${1}無任何操作"
????????;;
????esac
else
????echo?"
??? command如下命令:
??? unzip:解壓并啟動
??? start:啟動
??? stop:停止進程
??? restart:重啟
????示例命令如:./shenniu_publish start
????"
fi

把生成的zip上傳到linux上,通過命令解壓:
1?unzip?-od?eureka-server-0.0.1-node?eureka-server-0.0.1-node.zip
其實shell腳本中包含有解壓命令,但是我在打包時放在了zip中,所以只能通過手動解壓了,當然可以調(diào)整;此時進入加壓目錄如此:

注:這里第一次執(zhí)行./shenniu_publish.sh腳本時候,提示了錯誤信息;是由于我是在windows上編輯的這個腳本,其空格等和linux上不一樣,所以運行會有問題,要解決可以使用vim命令在linux把該文件轉成linux格式,如下命令:
1?vim?shenniu_publish.sh
2?set?ff=unix
3?:wq
執(zhí)行完后,再來運行腳本./shenniu_publish.sh,此時有如下提示:

此刻我們文件是解壓狀態(tài),因此只需要start命令啟動程序即可:

到這里shenniu_publish.sh腳本使用就完成了,只要腳本沒有提示錯誤,基本都能啟動jar服務;其他restart和stop命令也如此執(zhí)行就行:

來源:神牛003 鏈接:cnblogs.com/wangrudong003/p/10502043.html
