文章目录
背景脚本源码脚本说明脚本使用背景
因为项目中有多个模块,每个模块需要打包成一个jar运行。每次更新到服务器比较麻烦,所以就想到利用脚本一键实现代码的更新、编译打包、备份、和启动工作。项目中模块除了一个是用gradle编译,其他都是采用maven管理依赖。
脚本源码
deploy.sh
#!/bin/bash#//微服务启动管理脚本//#模块列表,因为maven和gradle构建的差异,为了避免脚本出现过多if else判断,所以两部分分开。#///Maven部分/JarNames=(discover-1.0-SNAPSHOT.jarconsumer-1.0-SNAPSHOT.jar)#--------------------------更新代码----------------------------------echo -e "\e[1;32m 开始更新代码 \e[0m"cd /home/boc/git pullecho -e "\e[1;32m 代码更新完成 \e[0m"#-------------------------循环对所有模块进行编译打包和启动--------------for JarName in ${JarNames[@]}do#查看进程IDPID=$(ps aux | grep ${JarName} | grep -v 'grep' | awk '{print $2}')#要将模块名称分割开,获取到模块名称,同时也是目录名称。先存储旧的分隔符OLD_IFS="$IFS"#设置分隔符IFS="-"#如下会自动分隔arr=(${JarName})# 将IFS恢复成原来的IFS="$OLD_IFS"#------------1.关闭已有进程----------------if [[ ! -z ${PID} ]];thenecho -e "\e[1;32m ${arr[0]} 的进程ID是:$PID \e[0m"echo -e "\e[1;32m 即将关闭${arr[0]} \e[0m"kill -9 ${PID}elseecho -e "\e[1;33m ${arr[0]} 没有启动 \e[0m"fi#------------2.编译代码--------------------echo -e "\e[1;32m 开始编译代码 \e[0m"cd /home/boc/${arr[0]}/mvn clean package -Dmaven.test.skip=trueecho -e "\e[1;32m 编译完成 \e[0m"#------------3.移动备份jar包----------------echo -e "\e[1;32m 开始备份旧jar包,备份位置在:/home/script/serverJAR/bak \e[0m"cd /home/script/serverJARif [[ -e ${JarName} ]];thenmv ${JarName} /home/script/serverJAR/bak/ -frm -rf ${JarName}echo -e "\e[1;32m JAR包备份完成 \e[0m"elseecho -e "\e[1;37m JAR包不存在,直接下一步 \e[0m"fi#------------4.移动新jar包到执行目录----------------cd /home/boc/${arr[0]}/targetif [[ -e ${JarName} ]];thenmv ${JarName} /home/script/serverJAR -fecho -e "\e[1;32m 新JAR准备好 \e[0m"elseecho -e "\e[1;31m JAR包不存在,直接下一步 \e[0m"fi#------------5.开始启动jar包----------------cd /home/script/serverJARecho -e "\e[1;32m 开始启动${arr[0]} \e[0m"nohup java -jar ${JarName} >${arr[0]}_log 2>&1 &echo -e "\e[1;32m 项目启动完成 \e[0m"#tail -f nohup.outdone#///Gradle构建的项目,该类型目前只有一个项目,所以不用循环///weId="weid-1.0-SNAPSHOT.jar"#查看进程IDPID_WeId=$(ps aux | grep ${weId} | grep -v 'grep' | awk '{print $2}')#------------1.关闭已有进程----------------if [[ ! -z ${PID_WeId} ]];thenecho -e "\e[1;32m weId 的进程ID是:${PID_WeId} \e[0m"echo -e "\e[1;32m 即将关闭weId \e[0m"kill -9 ${PID_WeId}elseecho -e "\e[1;33m weId 没有启动 \e[0m"fi#------------2.编译代码--------------------echo -e "\e[1;32m 开始编译gradle项目 \e[0m"cd /home/boc/weidchmod +x ./gradlew && ./gradlew build -x testecho -e "\e[1;32m 编译完成 \e[0m"#------------3.移动备份jar包----------------echo -e "\e[1;32m 开始备份旧jar包,备份位置在:/home/script/serverJAR/bak \e[0m"cd /home/script/serverJARif [[ -e ${weId} ]];thenmv ${weId} /home/script/serverJAR/bak/ -frm -rf ${weId}echo -e "\e[1;32m JAR包备份完成 \e[0m"elseecho -e "\e[1;37m JAR包不存在,直接下一步 \e[0m"fi#------------4.移动新jar包到执行目录----------------cd /home/boc/weid/build/libsif [[ -e ${weId} ]];thenmv ${weId} /home/script/serverJAR -fecho -e "\e[1;32m 新JAR准备好 \e[0m"elseecho -e "\e[1;31m JAR包不存在,直接下一步 \e[0m"fi#------------5.开始启动jar包----------------cd /home/script/serverJARecho -e "\e[1;32m 开始启动weid \e[0m"nohup java -jar ${weId} >weid_log 2>&1 &echo -e "\e[1;32m 项目启动完成 \e[0m"
脚本说明
脚本总体分为maven部分和gradle项目部分,因为maven项目较多,所以采用一个数组定义,并在循环中处理。gradle部分主要不同时编译命令不同,其他相似。为了清晰,把两部分分开写。
总体思路就是:
先判断服务进程运行情况,如果运行,则关闭进程然后进行代码更新和编译备份旧jar包,这一步很必要,如果启动出现问题,可以方便回滚到之前的服务拷贝新jar包后启动服务
shell脚本部分语法说明:
字符串分隔数组
OLD_IFS="$IFS"#设置分隔符IFS="-"#如下会自动分隔arr=(${JarName})# 将IFS恢复成原来的IFS="$OLD_IFS"
IFS是系统默认的分隔符,这里是固定语法,用自己需要的分隔符分隔数组后,恢复系统默认即可。
打印字符颜色
\e[1;37m xxx \e[0m
不同的颜色有不同的序号表示,根据需要查阅即可。
编译jar包命令
maven项目打包并跳过测试代码:
mvn clean package -Dmaven.test.skip=true
gradle项目打包并跳过测试:
chmod +x ./gradlew && ./gradlew build -x test
说明:如果服务器没有装gradle,则用gradlew命令。使用前需要先授权。如果服务器装有gradle。也可以采用下面的命令:
gradle build -x test
脚本使用
执行脚本时,可以进入到脚本所在目录执行下面命令:
sh deploy.sh
为了在不同目录执行,可以将脚本所在目录配置到环境变量,这样就可以在任意目录执行
vim /etc/profile增加PATH路径source /etc/profile
执行效果:
如果觉得《利用shell脚本自动更新部署SpringBoot项目》对你有帮助,请点赞、收藏,并留下你的观点哦!