什么是shell脚本?
首先我们要了解一下shell的概念。shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。而shell脚本则是shell程序可以解释和运行的指令。
实现远程发布
前景介绍
博主所在公司的项目开发流程当中,前后端项目都是交于后端同学来打包部署。由于没有使运维,也没使用jenkins来实现项目的自动发布。导致在前后端联调发布新版本的时候,每次都需要后端同学手动来实现项目的部署,非常费时费力。出于折衷的目的,博主先推动了shell脚本来实现自动发布,每个项目配置一个自动发布的shell脚本。
rsa公钥登录配置
rsa公钥的配置,博主在之前的博客已经讲解过了。看过的小伙伴可以接着往下阅读。
脚本实现要素
这里我们先思考一下,实现shell脚本的远程发布需要实现哪些步骤?
1.拷贝压缩文件到远程服务器临时目录。
2.在临时目录将压缩文件进行解压。
3.关闭项目对应的进程。
4.将项目原文件进行剪切到备份目录。
5.将临时目录的项目文件拷贝到工作目录。
6.重启开启进程。
脚本编写
测试环境下,对于java后端的springboot项目,博主的实际使用脚本如下。
#引用字符超过俩次,需要抽取成变量。
#服务器用户和ip地址
server=root@192.168.0.1
#项目名称
projectname=OurwayLgVopak
#app名称
appname=userweb-0.0.1-SNAPSHOT.jar
#上传jar包到服务器路径
scp ./userweb/target/bin/${appname} ${server}:/project/${projectname}/
#ssh远程连接之后需要执行的多条脚本,采用了分隔符的方式,这里以单引号分割
ssh ${server} '
cd /project
projectname=OurwayLgVopak
appname=userweb-0.0.1-SNAPSHOT.jar
#先获取到运行项目的进程编号
pid=$(ps -ef|grep ${projectname}/src/${appname}|grep -v grep|awk "{print \$2}")
if [ ! "${pid}" ];then
echo "没有找到${appname}的进程,无需kill"
else
echo "找到${appname}的进程${pid}"
echo "kill ${pid}"
kill ${pid}
fi
#覆盖移动jar包
mv -f ${projectname}/${appname} ${projectname}/src/${appname}
#nohup方式启动java应用
nohup java -jar ${projectname}/src/${appname} >> ${projectname}/src/nohup.out &
#获取到项目运行的pid,排除执行命令的进程,排除被杀死的原型进程
#awk命令,默认使用空格分隔,并得到第二个参数的值
newpid=$(ps -ef|grep ${projectname}/src/${appname}|grep -v grep|grep -v ${pid}|awk "{print \$2}")
echo "${appname}启动完毕,进程${newpid}"
#退出远程连接
exit
'
echo '脚本执行完成'
运行脚本
博主这里的开发环境是windows,因此我们将脚本语句保存为.sh类型的文件。然后先打开.git bash窗口,在上面输入 ./{scriptName} 就可以查看脚本的运行结果了。这里需要注意的是你的脚本 跟 你需要发布的jar包之前的层级关闭。j运行结果如下图所示:
在idea里面执行shell脚本
idea内置了shell plugin,可以帮助我们执行 和 编写shell脚本。这里我们需要修改一下shell path路径,不再使用cmd.exe打开。
打开我们需要运行的sh文件,点击上面的绿色三角按钮。
查看运行结果: