每次都要自己手动打包上传,感觉非常麻烦,都是些重复的工作,写一个脚本一劳永逸。
附上:常规打包方法,工具安装笔记
提前装好一些要用的工具:
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项目!!"