简易灰度部署脚本 不使用jenkins的纯shell方式

简易灰度部署脚本 不使用jenkins的纯shell方式

tag: 项目部署 灰度部署 shell部署项目

部署环境需要安装maven和git

编译项目并启动服务

#!/bin/sh
srcPath=/data/git_repository/springboot_app #源码地址
deployPath=/data/apps/springboot_app #部署路径
jarName=springboot_app-0.0.1-SNAPSHOT.jar
# 编译依赖的模块并install
cd /data/git_repository/common_project
git pull
mvn clean install -Dmaven.test.skip=true
echo "common_project 代码构建完成!"
cd $srcPath
git pull
mvn clean package -Dmaven.test.skip=true
echo "app代码构建完成"
if [ ! -f "/data/git_repository/springboot_app/web/target/springboot_app-0.0.1-SNAPSHOT.jar" ];then
echo "打包失败,文件不存在!"
exit
fi
cd $deployPath
#当前时间 精确到秒
currentTimeStamp=`date '+%Y%m%d-%H%M%S'`
mv lib/$jarName lib/$jarName.$currentTimeStamp
echo "jar备份完成"
cp $srcPath/manager-web/target/$jarName lib/
echo "jar启动完成"
./bin/springboot_app.sh restart
# tail -300f logs/start.log

引用到的脚本

判断服务状态 ping.sh curl请求的的方式判断服务是否已经启动完成

```bash ping.sh

!bin/bash

set -x

server_url=$1

while [[ true ]] do echo waiting server $server_url ... urlstatus=$(curl -s -m 5 -IL $server_url |grep HTTP) if [ "${urlstatus}" != "" ];then echo "${server_url} is ONLINE" break fi sleep 3 done

**主启动脚本**
springboot_app.sh
主启动服务脚本
```bash springboot_app.sh
#!/usr/bin/env bash
set -e
export set LC_ALL='en_US.UTF-8'
PRG="$0"
version="0.0.1-SNAPSHOT"
moduleName="springboot_app"
BIN_HOME=`cd $(dirname "$PRG"); pwd`
APP_HOME=`cd ${BIN_HOME}/..;pwd`
echo "APP_HOME: $APP_HOME"
logs=$APP_HOME/logs
jar_path="${APP_HOME}/lib"
jar_name="${moduleName}-$version.jar"
startlog="${logs}/start.log"
server_port="9081"
slave_port="9181"
slave_sh=${BIN_HOME}/springboot_app-slave.sh
ping_sh=${BIN_HOME}/ping.sh
get_pid(){
pid=`ps -ef | grep -v grep | grep "${jar_path}/${jar_name}" | awk '{print $2}'`
echo $pid
}
process_is_running(){
pid=`get_pid`
if [ -z $pid ]
then
echo 1
else
echo 0
fi
}
start() {
pid=`get_pid`
if test `process_is_running` -eq 0
then
echo "WARN:process is running,pid is $pid"
exit 1
else
echo "Starting server: "
JVM_OPTS="-server -Xms4G -Xmx4G -XX:MaxMetaspaceSize=256M -XX:MetaspaceSize=256M -Xloggc:${logs}/gc.log -XX:-PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSCompactAtFullCollection -XX:+CMSParallelRemarkEnabled -XX:+HeapDumpOnOutOfMemoryError"
echo "java ${JVM_OPTS} -Dspring.config.location=classpath:application.properties,classpath:application.yml,file:${APP_HOME}/conf/application.properties -jar ${jar_path}/${jar_name}"
setsid su hdfs -c "java ${JVM_OPTS} -Dapp.log.home=${logs} -Dspring.config.location=classpath:application.properties,classpath:application.yml,file:${APP_HOME}/conf/application.properties,file:${APP_HOME}/conf/application.yml -jar ${jar_path}/${jar_name} > ${startlog} 2>&1 &"
sleep 2s
pid=`get_pid`
if test `process_is_running` -eq 0
then
echo "start success! pid is $pid"
else
echo "start fail."
fi
fi
#等待主服务启动完成
sh $ping_sh http://localhost:$server_port
#为了避免日志打印到多处,停止slave服务,开发环境不需要做负载均衡
echo stop slave
sh $slave_sh stop
}
stop() {
#停止服务的时候先启动slave_server
echo start slave_server
sh $slave_sh restart
#等待slave服务启动完成
sh $ping_sh http://localhost:$slave_port
pid=`get_pid`
if test `process_is_running` -eq 0
then
echo "stopping..."
pid=`get_pid`
kill -9 $pid
if test `process_is_running` -eq 0
then
echo "stop fail"
else
echo "stop success"
fi
else
echo "WARN:process is not exist."
fi
}
restart() {
stop
start
}
rh_status() {
pid=`get_pid`
if test `process_is_running` -eq 0
then
echo "process is running,pid is $pid"
else
echo "process is not running"
fi
RETVAL=$?
return $RETVAL
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
rh_status
;;
*)
echo $"Usage: $0 {start|stop|status|restart}"
exit 1
esac

备服务启动脚本 springboot_app-slave.sh 备服务启动服务脚本

```bash springboot_app-slave.sh

!/usr/bin/env bash

export set LC_ALL='en_US.UTF-8' PRG="$0" version="0.0.1-SNAPSHOT" moduleName="springboot_app" BIN_HOME=cd $(dirname "$PRG"); pwd APP_HOME=cd ${BIN_HOME}/..;pwd echo "APP_HOME: $APP_HOME" logs=$APP_HOME/logs_slave jar_path="${APP_HOME}/lib" jar_name="${moduleName}-$version-slave.jar" s_jar_name="${moduleName}-$version.jar" startlog="${logs}/start.log" server_port="9181" get_pid(){ pid=ps -ef | grep -v grep | grep "${jar_path}/${jar_name}" | awk '{print $2}' echo $pid }

process_is_running(){ pid=get_pid if [ -z $pid ] then echo 1 else echo 0 fi }

start() { cp ${jar_path}/${s_jar_name} ${jar_path}/${jar_name} pid=get_pid if test process_is_running -eq 0 then echo "WARN:process is running,pid is $pid" exit 1 else echo "Starting server: " JVM_OPTS="-server -Xms4G -Xmx4G -XX:MaxMetaspaceSize=256M -XX:MetaspaceSize=256M -Xloggc:${logs}/gc.log -XX:-PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSCompactAtFullCollection -XX:+CMSParallelRemarkEnabled -XX:+HeapDumpOnOutOfMemoryError" echo "java ${JVM_OPTS} -Dspring.config.location=classpath:application.properties,classpath:application.yml,file:${APP_HOME}/conf/application.properties -jar ${jar_path}/${jar_name}" setsid su hdfs -c "java ${JVM_OPTS} -Dapp.log.home=${logs} -Dspring.config.location=classpath:application.properties,classpath:application.yml,file:${APP_HOME}/conf/application.properties,file:${APP_HOME}/conf/application.yml -jar ${jar_path}/${jar_name} --server.port=${server_port} > ${startlog} 2>&1 &" sleep 2s pid=get_pid if test process_is_running -eq 0 then echo "start success! pid is $pid" else echo "start fail." fi fi }

stop() { pid=get_pid if test process_is_running -eq 0 then echo "stopping..." pid=get_pid kill -9 $pid if test process_is_running -eq 0 then echo "stop fail" else echo "stop success" fi else echo "WARN:process is not exist." fi }

restart() { stop start }

rh_status() { pid=get_pid if test process_is_running -eq 0 then echo "process is running,pid is $pid" else echo "process is not running" fi RETVAL=$? return $RETVAL }

case "$1" in start) start ;; stop) stop ;; restart) restart ;; status) rh_status ;; *) echo $"Usage: $0 {start|stop|status|restart}" exit 1 esac ```