由于工作需要,springboot需要脱离原有部署环境,在没有自动部署功能的前提下,为了防止人为误操作以及其他的一些原因,需要规范系统部署,但同时带了人工操作的复杂度,因此需要通过脚本控制来降低人工成本。
目录
1.前期准备
2.系统部署规范
3. 资源利用记录
4.服务启停脚本
1.前期准备
springboot的前期工作不再赘述,环境搭建不是这里的重点,因此Java环境等等忽略
2.系统部署规范
既然说要脚本完成启停,必然需要规范系统部署,规则如下
2.1springboot结构相关
/ --------------根目录
/apps --------------部署服务目录
/apps/xxx-sc(项目名称) --------------日志文件目录
/apps/xxx-sc(项目名称)/logs --------------项目日志目录
/apps/xxx-sc(项目名称)/logs/xxx.年月日 --------------项目日志目录 (日志每日一切割,每50M一切割)
/apps/xxx-sc(项目名称)/ --------------项目启停脚本
/apps/xxx-sc(项目名称)/service/xxx-sc-aaaa(项目名称-sc-端口号) --------------项目日志名称
/apps/xxx-sc(项目名称)/tmp --------------临时jar
/apps/xxx-sc(项目名称)/target --------------target
2.2数据库相关
/ --------------根目录
/apps --------------部署服务目录
/apps/dbconfig --------------数据库文件目录
/apps/dbconfig/数据库名字 --------------数据库文件目录
3. 资源利用记录
由于同一个服务器可能存在多服务情况,为了防止相互之间端口占用的影响,需要资源备案进行分配
项目名称 | 域名 | 框架 | 环境 | http端口号 | Shutdown端口 | AJP端口 | 数据库 |
---|---|---|---|---|---|---|---|
xxx | springboot | 生产 | 8989 | xxx | |||
xxx-nc | springboot | 内测 | 8988 | xxx-nc | |||
ppp | tomcat | 生产 | 8987 | 8187 | 8287 | ppp | |
ppp-nc | tomcat | 内测 | 8986 | 8186 | 8286 | ppp-nc | |
8985 |
4.服务启停脚本
目录名称 | 目录说明 | 备注 |
---|---|---|
xxx-sc | 项目所在目录 | xxx:项目名称 sc:生产环境 nc:内测环境 |
xxx-sc-aaaa | 项目名称 | aaa:端口号 |
springboot项目启停脚本 | 启动: start 停止: stop 重启: restart 上线: push 回滚: rollback 状态查询: status |
|
由于shell脚本不是特别熟悉,有什么更好的方式可以达成目标,欢迎大家指点
#!/bin/sh
## java env
#export JAVA_HOME=/usr/local/jdk/jdk1.8.0_101
#export JRE_HOME=$JAVA_HOME/jre
echo
echo "**********************环境检测 开始**********************"
`java -version`
echo
service_path=`ls -lt ./service/ | find ./service -name "*.jar"`
echo ">>> 服务路径地址: $service_path"
service_name=${service_path##*/}
echo ">>> 服务JAR名称: $service_name"
tmp_path=`ls -lt ./tmp/ | find ./tmp -name "*.jar"`
echo ">>> 临时文件路径: "$tmp_path
tmp_name=${tmp_path##*/}
echo ">>> 临时JAR名称: "$tmp_name
echo "**********************环境检测 结束**********************"
echo
echo
API_NAME=$service_path
JAR_NAME=$service_name
#使用说明,用来提示输入参数
usage() {
echo "Usage: sh 执行脚本.sh [start|stop|restart|status|push|rollback]"
exit 1
}
#检查程序是否在运行
is_exist(){
pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' `
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
echo ">>> 服务 $JAR_NAME 未运行"
return 1
else
echo ">>> 服务 $JAR_NAME 运行中"
return 0
fi
}
#启动方法
start(){
echo "**********************启动服务 开始**********************"
is_exist
if [ $? -eq "0" ]; then
echo ">>> 服务 ${JAR_NAME} 已经在运行中, PID=${pid} <<<"
else
nohup java -jar $service_path >/dev/null 2>&1 &
getPID
if [ $? -eq "0" ]; then
echo ">>> 服务 $JAR_NAME 启动失败 <<<"
else
echo ">>> 服务 $JAR_NAME 启动成功 PID=$! <<<"
fi
fi
echo "**********************启动服务 完成**********************"
}
#停止方法
stop(){
echo "**********************关闭服务 开始**********************"
is_exist
if [ $? -eq "1" ]; then
echo ">>> 无服务运行中"
else
pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' `
echo ">>> 服务运行中,PID=$pid . 开始关闭服务."
kill -9 $pid
echo ">>> 服务已停止."
fi
echo "**********************关闭服务 完成**********************"
}
#输出运行状态
status(){
echo "**********************查询服务状态 开始**********************"
is_exist
if [ $? -eq "0" ]; then
echo ">>> 服务 ${JAR_NAME} is running PID is ${pid} <<<"
else
echo ">>> 服务 ${JAR_NAME} is not running <<<"
fi
echo "**********************查询服务状态 完成**********************"
}
#重启
restart(){
echo "**********************重启服务 开始**********************"
stop
echo
start
echo "**********************重启服务 完成**********************"
}
#上线
push(){
echo "**********************上线服务 开始**********************"
stop
echo
rmJar
echo
start
echo "**********************上线服务 完成**********************"
}
#回滚
rollback(){
echo "**********************回滚服务 开始**********************"
stop
echo
rollBackJar
echo
start
echo "**********************回滚服务 完成**********************"
}
rmJar() {
current=`date "+%Y%m%d%H%M%S"`
jar_new_anme=$JAR_NAME-$current
cp $API_NAME ./target/$jar_new_anme
echo ">>> 历史服务备份完成,备份文件:" $jar_new_anme
rm -rf $API_NAME
echo ">>> 移除运行中文件:" + $API_NAME
cp ./tmp/$tmp_name $API_NAME
echo ">>> 拷贝最新jar包并加载:" + $tmp_name
rm -rf ./tmp/$tmp_name
echo ">>> 移除临时jar包:" + $tmp_name
}
rollBackJar() {
target_jar=`ls -lt ./target/ | grep $JAR_NAME | head -n 1 |awk '{print $9}'`
echo ">>> 获取历史服务备份文件:" $target_jar
cp ./target/$target_jar $API_NAME
echo ">>> 加载历史服务备份文件 $target_jar 回滚为 $API_NAME"
}
getPID() {
pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' `
if [ -z "${pid}" ]; then
echo ">>> 服务 $JAR_NAME 未运行"
return 1
else
echo ">>> 服务 $JAR_NAME 运行中"
return ${pid}
fi
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
"push")
push
;;
"rollback")
rollback
;;
*)
usage
;;
esac
exit 0