公司项目启动脚本及部署脚本

61 阅读1分钟

1.Java项目启动脚本

image-20250730151143131

image-20250730151143131

因为公司目前有些项目仍然采用裸机部署的方式,所以有些Java项目还需要使用脚本启动。以下为启动脚本内容(公司内部所有裸机部署的项目都采用此脚本,如需使用请按照自己项目进行调整)


    
    
    
  #!/bin/bash
# 这里是查找并拼接目录(注意一个在项目文件夹中只能有一个jar后缀名文件)
CURRENT_PATH=$(cd "$(dirname "$0")"pwd)
cd $CURRENT_PATH
JAR=$(find $CURRENT_PATH -maxdepth 1 -name "*.jar")
PID=$(ps -ef | grep $JAR | grep -v grep | awk '{ print $2 }')
# 设置变量作为启动时的参数
MAXJAVA="-Xms2g"
STARTJAVA="-Xmx2g"
HDOOOME="-XX:+HeapDumpOnOutOfMemoryError -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m"
# 这里是skywalking代理的变量配置(可以忽略)
#JAVA_AGENT=-javaagent:/usr/local/monitor/skywalking-java-agent-8.16.0/skywalking-agent.jar
#AGENT_NAME=-Dskywalking.agent.service_name=CN-Mailbase::CN-Mailbase-22

# 这里是java环境变量
export JAVA_HOME=/usr/local/jdk17
export PATH=$JAVA_HOME/bin:$PATH

if [ x$2 != x ]; then
    MAXJAVA=$2
fi
if [ x$3 != x  ]; then
    STARTJAVA=$3
fi

# 这里是设置启动脚本后面跟随的启动参数start(启动)|stop(停止)|restart(重启)|status(查看状态) 
case "$1" in
    start)
        if [ ! -z "$PID" ]; then
            echo "$JAR Already started, process number: $PID"
        else
            echo -n -e "starting $JAR ... \n"
            nohup java -Dloader.path=resources/*,lib/*  $MAXJAVA $STARTJAVA $HDOOOME -jar  $JAR --spring.profiles.active=prod > /dev/null 2>&1  &
            if [ "$?"="0" ]; then
                echo "Startup is complete, please check the log to ensure success"
            else
                echo "Startup failed"
            fi
        fi
        ;;
    stop)
        if [ -z "$PID" ]; then
            echo "$JAR Not running, no need to close"
        else
            echo "stoping  $JAR ..."
              kill -9 $PID
            if [ "$?"="0" ]; then
                echo "stop success"
            else
                echo "stop failed"
            fi
        fi
        ;;
    restart)
        ${0} stop
        ${0} start
        ;;
    status)
        if [ ! -z "$PID" ]; then
            echo "$JAR running"
        else
            echo "$JAR not running"
        fi
        ;;
  *)
    echo "Usage: ./springboot {start|stop|restart|status}" >&2
        exit 1
esac

使用方法


    
    
    
  # 拷贝脚本到项目目录
root@JD-CN-Service-xx2:/project/xx-xx# tree -L 1
.
├── deployjar.sh
├── deploylib.sh
├── deploy.sh
├── xx-xx.jar # 项目jar
├── lib  # 项目lib(目前公司打包会把lib分离出来)
├── logs
├── resources
└── script.sh # 启动脚本

# 启动方式
./script.sh start
# 停止方式
./script.sh start
# 重启方式
./script.sh restart
# 查看状态
./script.sh status

2.项目部署脚本(已经打包到指定文件夹!!!!!)

公司裸机部署的项目在打包的过程中会将项目jar和依赖lib进行分离,在有些情况下lib中的依赖是不会更新的,只需要更新一下项目jar即可,所以我设置了2个脚本给jenkins使用,请注意在使用脚本前我已经将项目通过jenkins打包并上传到了服务器的指定文件夹下!!!!


    
    
    
  # 项目目录
root@JD-CN-Service-xx2:/project/xx-xx# tree -L 1
.
├── deployjar.sh   # 直接部署jar
├── deploylib.sh   # 带有lib部署
├── deploy.sh
├── xx-xx.jar # 项目jar
├── lib  # 项目lib(目前公司打包会把lib分离出来)
├── logs
├── resources
└── script.sh # 启动脚本

# 直接部署jar
#!/bin/bash
# 这里是注销配置中心Consul中的服务状态(目前这个项目不需要注销)
#echo "Remove from consul"
#curl  -X PUT http://127.0.0.1:8500/v1/agent/service/maintenance/xxxx?enable=true
#sleep 30s


echo "Stop service"
cd /project/xxxn  # 进入项目目录
./script.sh stop # 使用脚本停止服务
sleep 3

echo "Clear Dump_file"
find /project/old-release/xxxxx/ -mindepth 1 -mtime +1 -exec rm -rf {} ; # 清理1天前的项目部署备份,这里我每次在部署前会将老项目进行备份到这目录,这个目录容易很大所以我设置了在部署时查看此目录,如果里面文件超过了1天就删除,这个时间可以根据你的需要定制
sleep 3

echo "Move project to dump" # 这里是先将停止服务的项目jar移动到备份目录进行压缩,然后再删除,防止项目有问题的时候需要回滚
mv /project/xxx/xxxx.jar /project/old-release/xxxxx/
cd /project/old-release/xxxxxx/
tar zcvf xxxxxx.tar.gz_$(date +%Y-%m-%d-%H-%M-%S) xxxxxx.jar
rm -rf /project/old-release/xxxxxx/xxxxxx.jar
sleep 3

echo "tar new jar"
tar zxf /project/pre-release/xxxxxx/xxxxxx.tar.gz -C /project/xxxxxx/
sleep 3

echo "Start service"
cd /project/xxxxxx
./script.sh restart


# 这里是项目启动后向consul注册相关服务
#echo "Add to consul"
#while true; do
#    curl -s --connect-timeout 2 http://127.0.0.1:xxxxx/xxxxx/ 2>&1 > /dev/null
#    if [ $? -eq 0 ];then
#        break
#    fi
#    sleep 10s
#done
#
#curl  -X PUT http://127.0.0.1:8500/v1/agent/service/maintenance/xxxxxx?enable=false

# 带有lib部署(这里我就不在赘述了,只是备份的时候多了一个lib)
#!/bin/bash

#echo "Remove from consul"
#curl  -X PUT http://127.0.0.1:8500/v1/agent/service/maintenance/xxxxxx?enable=true
#sleep 30s


echo "Stop service"
cd /project/xxxxxx
./script.sh stop
sleep 3

echo "Clear Dump_file"
find /project/old-release/xxxxxx/ -mindepth 1 -mtime +1 -exec rm -rf {} ;
sleep 3

echo "Move project to dump"
mv /project/xxxxxx/xxxxxx.jar /project/old-release/xxxxxx/
mv /project/xxxxxx/lib /project/old-release/xxxxxx/
cd /project/old-release/xxxxxx/
tar zcvf xxxxxx.tar.gz_$(date +%Y-%m-%d-%H-%M-%S) xxxxxx.jar lib
rm -rf /project/old-release/xxxxxx/xxxxxx.jar && rm -rf /project/old-release/xxxxxx/lib
sleep 3

echo "tar new jar"
tar zxf /project/pre-release/xxxxxx/xxxxxx.tar.gz -C /project/xxxxxx/
sleep 3

echo "Start service"
cd /project/xxxxxx
./script.sh restart

#echo "Add to consul"
#while true; do
#    curl -s --connect-timeout 2 http://127.0.0.1:9327/xxxxxx/ 2>&1 > /dev/null
#    if [ $? -eq 0 ];then
#        break
#    fi
#    sleep 10s
#done
#
#curl  -X PUT http://127.0.0.1:8500/v1/agent/service/maintenance/xxxxxx?enable=false