Linux系统:CentOS 7
主机版本信息
LSB Version: :core-4.1-amd64:core-4.1-noarch
Distributor ID: CentOS
Description: CentOS Linux release 7.6.1810 (Core)
Release: 7.6.1810
Codename: Core
maven安装:(也可以访问http://mirror.bit.edu.cn/apache/maven自行寻找自己要的版本)
wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.5.3/binaries/apache-maven-3.5.3-bin.tar.gz
tar -zxvf apache-maven-3.5.3-bin.tar.gz
环境变量的设置[root@VM_16_11_centos ~]# vim /etc/profile
#SET MAVEN
#自己定义的解压的路径
export MAVEN_HOME=/usr/local/apache-maven-3.5.3
export MAVEN_HOME
export PATH=$PATH:$MAVEN_HOME/bin
svn安装:
[root@VM_16_11_centos ~]# yum install subversion
实现思路:
自动部署通过svn的钩子实现,在触发钩子的时候进行maven的项目打包,之后进行发布
具体实现:
使用svn建库之后,进入hooks文件夹,将里面的post-commit.tmpl修改成post-commit
post-commit:
#!/bin/sh
EPOS="$1"
REV="$2"
TXN_NAME="$3"
#自己checkout出来的项目路径
SERVE=/root/temp/xxxx
export LANG=zh_CN.UTF-8
#打印出项目更新的时间
echo "Code Deployed at `date "+%Y-%m-%d %H:%M"`" >> /root/deploy_log
#使用svn自动更新自己checkout出来的项目
/usr/bin/svn update $SERVE --username mdy --password mdy >> /root/vedio_svn_log
#使用mvn进行项目打包,-f参数可以指定pom.xml的路径,在打包成功后会先杀掉已经进行的项目进程
#这里要注意nohup的堵塞,即使使用了nohup依旧会阻塞进程,这里使用了ssh命令另外开了一个控制台
ssh root@xxxx "nohup /root/cgi/auto_build.sh >/dev/null 2>&1 & exit;"
# 也可以直接使用下面的命令执行脚本
# nohup /root/cgi/auto_build.sh >/dev/null 2>&1 &
auto-build.sh(自动部署项目的脚本,注意这里的maven和jdk都要知道具体的路径,具体路径可以在自己的主机上查看,方法很多,像是whereis mvn
之类的)
#!/bin/sh
#set java environment
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-1.el7_6.x86_64
JRE_HOME=$JAVA_HOME/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
# the root path of the project
ROOT=/xxxx
# develop the project
if [ $? -eq 0 ]; then
# maven
/usr/local/apache-maven-3.5.3/bin/mvn -f $ROOT/pom.xml clean package > /root/auto_build.log
if [ $? -eq 0 ]; then
ps aux | grep demo | grep -v grep | cut -c 9-15 | xargs kill
if [ $? -ne 0 ]; then
echo "kill the process fail"
else
echo "succes kill"
fi
setsid java -jar $ROOT/target/demo-0.0.1-SNAPSHOT.jar --spring.profiles.active=produce >/root/uniform-nohup 2>&1 &
else
echo "maven fail"
# 如果出错则使用邮件通知
mail -s "auto build error!!!!!!(maven)" xxxx@qq.com < /root/auto_build.log
fi
else
mail -s "auto build error!!!!!!(svn)" xxxx@qq.com < /root/auto_build.log
fi
# 删除日志
rm /root/auto_build.log
实际上如果像上面一样配置的话,存在一点问题,那就是同时有几个提交的话,由于maven打包需要时间,会导致线程问题,即多个脚本对项目目录进行修改,如果上面启动脚本的命令是堵塞型的话则不存在该问题,但是如果不是则需要考虑,下面是解决方法,从网上搜索得到
# 开始进程锁,防止同时运行多个自动部署
#定义一个标识脚本正在执行的文件名,尽量让这个临时文件名独特
#避免与他处指定重名,可借鉴C/C++防止重复包含头文件的宏命名法
TMPFILE=/root/cgi/auto_build.sh.tmp
# BEGIN--检查是否有别的实例在运行,保证同时只能运行一个实例
while :
do
if [ -e $TMPFILE ] #判断临时文件是否存在
then
echo "Other instance is running!" #存在表明有一个实例在运行
# 休眠60秒
sleep 60
else
touch $TMPFILE #监时文件若不存在,就用 touch 新建一个
chmod 600 $TMPFILE #把临时文件属性改为只建立者可读写
break
fi
done
#用 trap 命令设置一个对信号的监听器
#程序运行中当监听到信号 0,1,2,3,9,15就会删除临时文件,并退出脚本执行
#比如说,当脚本自行运行结束、被用户 Ctrl+C 掉、被 Kill 掉、终端被关闭
#系统关机或重启的情况下,都需将临时文件删除,否则脚本以后都没机会执行
#在 Linux 的 shell 下可以运行 trap -l 查看到所以信号
trap "rm -f ${TMPFILE}; exit" 0 1 2 3 9 15
# END--检查是否有别的实例在运行,保证同时只能运行一个实例
# 结束进程锁