SpringBoot项目使用shell自动拉取代码并部署笔记

每次都要自己手动打包上传,感觉非常麻烦,都是些重复的工作,写一个脚本一劳永逸。

附上:常规打包方法,工具安装笔记


提前装好一些要用的工具:

jdk:centos有自带的,如果只是想先做测试,用自带的openjdk也行,生产环境的话自己装一个

maven:需要使用maven命令进行clean-->compile-->package

git:更新代码


脚本解析。

配置方面

#第一行必须要定义用什么解析器去执行脚本:
#!/bin/bash

#项目运行在哪个端口上,如果SpringBoot启动端口修改了,也可以更新这个值,主要是解决端口占用问题:
port=8084

#从仓库哪个分支拉取代码,一般生产环境都是master,如果测试脚本,改成dev也行:
branch=master

#为了能够让脚本不管在哪个文件下存储,都能成功执行,使用全路径
#定义路径前缀,我的所有SpringBoot项目都在这个文件夹下面:
prefix=/data/sbproject

#一个脚本只针对某个项目进行自动部署,这里配置具体项目的根目录:
projectrootdir=${prefix}/BlogMybatis

#这里分开定义是为了做文件夹不存则生成的操作
#默认的jar包是在target文件夹下的,为了能更好地控制,生成之后拿出来比较好:
newjarfiledir=${prefix}/jar

#newjarfilename是jar文件的全路径,利用mv命令可以直接将生成的包移动到newjarfiledir目录下同时更改名字为blogproject.jar
newjarfilename=${newjarfiledir}/blogproject.jar

#这里分开定义是为了做文件夹不存则生成的操作
oldjarfiledir=${prefix}/oldjar

#如果觉得以前的jar包不那么重要,也可以将移动命令更改为删除jar包的操作,具体命令在移动命令那注释
#为了不让文件名重复,定义时间串
currenttime=$(date "+%Y%m%d%H%M%S")

#使用时间串
oldjarfilename=${oldjarfiledir}/blogproject${currenttime}.jar

#这个一般是默认数据,项目根路径下target包会在mvn clean命令执行后生成
targetdir=${projectrootdir}/target

#这个是接口访问输出文件,可以使用进入target目录使用 tail -f  nohup.out 命令访问,我这里设定是存在target目录下的
outfilename=${targetdir}/nohup.out

执行思路:

1.为了防止还可能用到上一次运行的jar包,首先创建两个目录(如果已经创建则跳过),一个是保存重新打包生成的jar包的jar文件夹,另一个是保存上一次运行的jar包的oldjar文件夹

#是否存在存放jar的文件夹
if [ ! -d "${newjarfiledir}" ]; then
	mkdir ${newjarfiledir}
else
	echo "使用已存在的目录${newjarfiledir}"
fi
#是否存在存放oldjar的文件夹
if [ ! -d "${oldjarfiledir}" ]; then
	mkdir ${oldjarfiledir}
else
	echo "使用已存在的目录${oldjarfiledir}"
fi

2.检查项目使用端口是否被占用,占用则杀死进程

#首先要获取进程PID
pid=$(lsof -i:${port} | awk 'NR==2{print $2}')
if [ ! -n "$pid" ]; then
        echo "${port}端口未被占用"
else
       $(kill -s 9 $pid)
fi

3.进入根目录,使用git命令拉取设定好的分支的最新代码:

#进入根目录
cd ${projectrootdir}

#切换分支
git checkout master

#拉取最新代码
git pull origin ${branch}

4.这里也是在根目录下操作的,上一步已经进入根目录了,就不必重复操作了,使用maven命令:清除-->编译-->打包

#clean命令删除target包
mvn clean

#compile命令生成target包
mvn compile

#跳过test,打成jar包,生成的jar包目录是taregt
mvn -Dmaven.test.skip=true package

#这一步是定义一个变量接受生成的包名,接收作为参数,提供给下面使用
targetjarfilename=$(find ${targetdir} -name "*.jar" | sed 's#.*/##')

4.移动:新生成包存储目录内可能冲突的jar包-->oldjar目录:

因为是同一个项目可能会运行多次脚本,所以在这一次执行脚本之前,jar文件夹内已经有很多文件,可能会引起文件名冲突问题,所以将jar内冲突文件移动到oldjar内,此时可能又会引发一个问题,就是oldjar内的文件冲突,所以使用了时间串作为文件名一部分。

if [ ! -f "${newjarfilename}" ]; then
	echo "${newjarfilename}下未发现文件名冲突jar包"
else
	echo "移动包:${newjarfilename} --> ${oldjarfilename}"
	mv ${newjarfilename} ${oldjarfilename}
fi

5.移动:target目录下新生成的jar包 --> jar文件夹

mv ${targetdir}/${targetjarfilename} ${newjarfilename}

6.运行

nohup java -jar ${newjarfilename} > ${outfilename} 2>&1 &

7.整体代码。

整个流程不复杂,如果是使用相同的方式(生成文件夹那些),只需要更改配置部分就行了。

#!/bin/bash

#项目运行端口
port=8084
#打包分支
branch=master
#项目路径统一前缀(全路径)
prefix=/data/sbproject
#项目根路径
projectrootdir=${prefix}/BlogMybatis
#生成的jar包的名称以及路径,保证sh文件到处都可运行,使用全路径
newjarfiledir=${prefix}/jar
newjarfilename=${newjarfiledir}/blogproject.jar
#旧jar包不删除,移动到指定目录(为了不重名,采用时间串)
oldjarfiledir=${prefix}/oldjar
currenttime=$(date "+%Y%m%d%H%M%S")
oldjarfilename=${oldjarfiledir}/blogproject${currenttime}.jar

#默认数据
#target目录
targetdir=${projectrootdir}/target

#输出文件目录
outfilename=${targetdir}/nohup.out

#是否存在存放jar的文件夹
if [ ! -d "${newjarfiledir}" ]; then
	mkdir ${newjarfiledir}
else
	echo "使用已存在的目录${newjarfiledir}"
fi
#是否存在存放oldjar的文件夹
if [ ! -d "${oldjarfiledir}" ]; then
	mkdir ${oldjarfiledir}
else
	echo "使用已存在的目录${oldjarfiledir}"
fi

#开始处理
echo "开始查找${port}端口进程PID"
pid=$(lsof -i:${port} | awk 'NR==2{print $2}')
if [ ! -n "$pid" ]; then
        echo "${port}端口未被占用"
else
       echo "端口已被占用,正在结束进程..."
       $(kill -s 9 $pid)
       echo "结束进程成功!"
fi
echo "cd ${projectrootdir}"
cd ${projectrootdir}
echo "git checkout ${branch}"
git checkout master
echo "git pull origin ${branch}"
git pull origin ${branch}
echo "mvn clean"
mvn clean
echo "mvn compile"
mvn compile
echo "mvn -Dmaven.test.skip=true package"
mvn -Dmaven.test.skip=true package
targetjarfilename=$(find ${targetdir} -name "*.jar" | sed 's#.*/##')
echo "生成的包名为:${targetjarfilename}"
if [ ! -f "${newjarfilename}" ]; then
	echo "${newjarfilename}下未发现文件名冲突jar包"
else
	echo "移动包:${newjarfilename} --> ${oldjarfilename}"
	mv ${newjarfilename} ${oldjarfilename}
fi
echo "移动包:${targetdir}/${targetjarfilename} -->  ${newjarfilename}"
mv ${targetdir}/${targetjarfilename} ${newjarfilename}
echo "启动:java -jar ${newjarfilename} > ${outfilename} 2>&1 &"
nohup java -jar ${newjarfilename} > ${outfilename} 2>&1 &
echo "启动成功,成功运行脚本自动化部署springBoot项目!!"
 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值