Spring Boot 項目自動發(fā)布
專題
Spring Boot 項目自動發(fā)布與Supervisor
簡介
在公司從移動端轉后端已經快一年了侣集,使用的技術框架一直是Spring Boot,和以前大學時候基于Tomcat的不太一樣。
這篇文章簡單介紹下如何發(fā)布Spring Boot 項目董饰,原先使用Tomcat時候褐啡,發(fā)布的文件是war文件霜第,現(xiàn)在使用Spring Boot就變得很簡單了玉锌,直接是一個jar文件抢肛,啟動方式按照啟動jar文件方式即可煞抬。
準備工作
使用Idea創(chuàng)建一個帶Spring Boot的項目霜大,使用gradle管理項目。
使用gradle依賴很簡單革答,同時創(chuàng)建兩個Controller战坤,一個用戶表示線上api接口,一個表示心跳接口残拐,用于測試途茫。
dependencies {
compileOnly('org.projectlombok:lombok')
compile('org.springframework.boot:spring-boot-starter-web')
testCompile('org.springframework.boot:spring-boot-starter-test')
}
@Slf4j
@RestController
public class HelloWorldController {
@Value("${app.env}")
String env;
@RequestMapping(path = "/hello", method = RequestMethod.GET)
public Object hello() {
log.info("hello>>>");
Map<String, Object> map = new HashMap<>();
map.put("hello", "world");
map.put("env", env);
log.info("map = " + map);
return map;
}
}
@Slf4j
@RestController
public class HeartbeatController {
@RequestMapping(path = "/heartbeat")
public Object heartbeat() {
return "success";
}
}
同時配置好對應的配置文件,我這有三個配置文件溪食,一個dev環(huán)境囊卜,一個表示prod環(huán)境,還有一個表示開關错沃。
Spring支持選擇對應的config文件边败,開發(fā)時候,配置成dev捎废,則生效的文件application-dev.properties
笑窜。
spring.profiles.active=dev
#spring.profiles.active=prod
dev
server.port=8080
app.env=dev
logging.config=classpath:logback-spring.xml
prod
server.port=8088
app.env=prod
logging.config=classpath:logback-spring.xml
我這邊用app.env
字段表示不同環(huán)境的內容,實際情況登疗,可以配置數據庫的內容排截,開發(fā)和線上的數據庫是不一樣的嫌蚤。
啟動程序,然后測試下請求断傲。
curl http://127.0.0.1:8080/hello
{"hello":"world","env":"dev"}
數據是正常的脱吱,env讀取的也是dev數據。
編譯和發(fā)布
由于項目使用gradle管理认罩,那么在發(fā)布時候箱蝠,直接使用gradle命令編譯即可,命令如下垦垂,clean是可選的宦搬,不過一般在本地開發(fā)然后再發(fā)布,建議先clean下劫拗。
./gradlew clean build
編譯成功后间校,在項目生成目錄中可以找到對應的jar文件,路徑是./build/libs/springboot-deploy-demo-0.0.1-SNAPSHOT.jar
页慷。
可以直接使用java命令來啟動憔足。
為了方便起見我在項目中寫個簡單腳本,編譯成功后酒繁,復制目標文件到相應的目錄滓彰,然后直接同步到服務器即可。
#!/usr/bin/env bash
./gradlew clean build
cp build/libs/* deploy/
deploy 目錄除了有目標文件外州袒,還有線上環(huán)境的配置文件揭绑,幾個服務啟動停止shell文件。
start.sh稳析,很簡單洗做,在啟動前,檢查是否已經啟動彰居,在沒有啟動情況下诚纸,在啟動服務。
#!/bin/sh
#get pwd
DIR_HOME="${BASH_SOURCE-$0}"
DIR_HOME="$(dirname "$DIR_HOME")"
PRGDIR="$(cd "${DIR_HOME}"; pwd)"
jarfile=$PRGDIR/springboot-deploy-demo-0.0.1-SNAPSHOT.jar
#get runing pid
pid=$(ps -ef | grep java | grep $jarfile | awk '{print $2}')
#create log dir
mkdir -p $PRGDIR/log/
if [ "$pid" != "" ];then
echo "ERROR: $jarfile is running! pid=$pid. You must stop it first!"
else
nohup java -jar $jarfile -Dfile.encoding=UTF-8 --spring.config.location=$PRGDIR/ >$PRGDIR/log/start.log 2>&1 &
pid=$(ps -ef | grep java | grep $jarfile | awk '{print $2}')
echo "INFO: $jarfile is running! pid=$pid"
url="http://127.0.0.1:8088/heartbeat";
echo $url
while [ true ]
do
sleep 1
HTTP_CODE=`curl -G -m 10 -o /dev/null -s -w %{http_code} $url`
echo "http code: ${HTTP_CODE}"
if [ ${HTTP_CODE} -eq 200 ]
then
echo "server start success..."
exit 0
fi
done
fi
同時啟動前陈惰,需要配置spring boot運行的參數畦徘,最重要的有Spring Boot啟動的配置文件的位置--spring.config.location
,我配置的位置是./
抬闯。
需要注意的是井辆,prod的配置文件,一些參數需要注意路徑溶握,開發(fā)中路徑是classpath:
開頭杯缺,線上是不需要的,當然了也是根據實際情況來看睡榆。
server.port=8088
app.env=prod
logging.config=logback-spring.xml
在啟動服務后萍肆,會嘗試調用相應的接口袍榆,測試啟動是否成功。
url="http://127.0.0.1:8088/heartbeat";
echo $url
while [ true ]
do
sleep 1
HTTP_CODE=`curl -G -m 10 -o /dev/null -s -w %{http_code} $url`
echo "http code: ${HTTP_CODE}"
if [ ${HTTP_CODE} -eq 200 ]
then
echo "server start success..."
exit 0
fi
done
stop.sh
停止服務很簡單塘揣,直接查找對應的進程包雀,然后殺掉,這里需要注意進程名字是以jar文件來查找的亲铡。
#!/bin/sh
process=springboot-deploy-demo-0.0.1-SNAPSHOT.jar
ifrun=$(ps -ef | grep $process | grep java)
if [ "$ifrun" != "" ];then
kill -9 `ps -ef | grep $process | grep java | awk '{print $2}'`
echo "INFO: $process is stoped!"
else
echo "WARN: Not found $process running."
fi
restart.sh
這個比較簡單才写,就是先停止,再啟動奖蔓。
#!/bin/sh
./stop.sh
./start.sh
同步到服務器
這里做簡單演示赞草,我使用的是Ubuntu虛擬機,使用scp命令上傳到服務器上锭硼,實際情況可以根據自己需求來選擇房资,比如使用svn蜕劝,ftp等檀头。
scp deploy/* xiaqiulei@192.168.153.134:~/deploy
然后ssh登陸上192.168.153.134
機器,進入deploy
目錄岖沛,執(zhí)行./start
即可暑始。
示例:
$ scp deploy/* xiaqiulei@192.168.153.134:~/deploy
xiaqiulei@192.168.153.134's password:
application-prod.properties 100% 63 84.7KB/s 00:00
application.properties 100% 27 26.4KB/s 00:00
deploy/log: not a regular file
logback-spring.xml 100% 881 753.4KB/s 00:00
restart.sh 100% 32 23.3KB/s 00:00
springboot-deploy-demo-0.0.1-SNAPSHOT.jar 100% 15MB 32.5MB/s 00:00
start.sh 100% 970 1.5MB/s 00:00
stop.sh 100% 291 169.0KB/s 00:00
$ ssh xiaqiulei@192.168.153.134
xiaqiulei@192.168.153.134's password:
Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-109-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
299 packages can be updated.
161 updates are security updates.
Last login: Tue Apr 24 23:04:57 2018 from 192.168.153.1
# xiaqiulei @ ubuntu in ~ [23:07:59]
$ cd deploy
# xiaqiulei @ ubuntu in ~/deploy [23:08:01]
$ ./start.sh
INFO: /home/xiaqiulei/deploy/springboot-deploy-demo-0.0.1-SNAPSHOT.jar is running! pid=4645
http://127.0.0.1:8088/heartbeat
http code: 000
http code: 000
http code: 000
http code: 000
http code: 000
http code: 200
server start success...
總結
本文只是簡單介紹使相關腳本發(fā)布Spring Boot服務到linux機器上,基本滿足小項目需求婴削。
當然了廊镜,還有不夠完善的地方,比如啟動的方式是nohup
唉俗,當進程掛掉以后嗤朴,不能夠自動重啟,高級的用法是使用supervisor
虫溜。
再比如雹姊,scp同步的時候,都是簡單的文件覆蓋衡楞,比較友好的方式是吱雏,先備份原先的文件,然后再同步文件瘾境,這樣如果服務有問題歧杏,還可以回滾。
源碼地址
源碼地址 https://github.com/LiushuiXiaoxia/springboot-deploy-demo