背景
最近在搞自己的网站,需要往服务器上不停的更包,由于服务器配置很低,没必要搭个Jenkins,但是每次更新完代码都要手动打包、上传、启动,觉得很繁琐,所以搞了个全自动的脚本。
特殊说明:以下本地脚本基于mac编写,Windows环境应该差不多(没试过)。
思路
服务器写好重启服务的脚本/root/script/restart.sh,然后在本地使用scp将最新的jar包上传至服务器,再用ssh执行服务器上的重启脚本
脚本
服务器脚本
/root/script/restart.sh
#!/bin/bash
defaultAppName='dental-web-admin.jar'
appName=''
if [[ $1 && $1 != 0 ]]
then
appName=$1
else
appName=$defaultAppName
fi
echo ">>>>>>本次重启的应用: $appName <<<<<<"
# 关闭应用方法
stopApp(){
pid=$( ps -ef |grep $appName |grep 'java -jar'|grep -v grep|awk '{print $2}')
kill -9 $pid
}
# 启动应用方法
startApp(){
rm -f nohup.out
#原始重启命令提取应用名称
nohup java -jar -Dspring.profiles.active=application-commonBiz-test $appName > nohup.out 2>&1 &
}
# 滚动打印日志
printLog(){
#日志文件名取决于你输出日志的文件名,默认为nohup.out
tail -F nohup.out
}
stopApp
startApp
printLog
本地脚本
#!/bin/bash
rm -f ~/git/test.jar
git checkout dev
git pull
mvn package -Dmaven.test.skip=true
mv ./project_name/target/test.jar ~/git/test.jar
# 上传文件 --------------------------------------
/usr/bin/expect <<-EOF
# 设置超时时间
set timeout 100000
spawn scp -o ConnectTimeout=30000 ~/git/test.jar root@你的服务器ip:/root/server/
expect -exact "root@你的服务器ip's password:"
send "你的服务器登录密码\r"
expect "100%"
expect eof
EOF
# 上传文件结束 --------------------------------------
# 调用服务器脚本重启服务 --------------------------------------
/usr/bin/expect <<-EOF
set timeout 100000
spawn ssh -p 22 root@你的服务器ip
expect -exact "root@你的服务器ip's password:"
send "你的服务器登录密码\r"
expect "]# "
send "sh /root/script/restart.sh\r"
expect "nohup.out"
exit 0
expect eof
EOF
# 调用服务器脚本重启服务结束 --------------------------------------
git checkout feature/wangsen
git pull
git merge dev
git push
mvn clean
执行的效果如下:
接下来再有代码改动时,只需要本地执行下脚本,一个回车即可自动完成 打包 > 上传 > 重启,happy
补充
可以把脚本加到环境变量中,执行更方便