SVN+MAVEN实现在LINUX上自动部署项目

本文介绍如何在Linux环境下利用SVN的钩子功能配合Maven实现项目的自动部署。主要内容包括配置SVN钩子、Maven环境设置、编写自动部署脚本及解决并发部署问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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--检查是否有别的实例在运行,保证同时只能运行一个实例
	  
# 结束进程锁



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值