当前位置: 首页 > 科技观察

【博文推荐】利用SVN的post-commit钩子实现多项目自动同步_0

时间:2023-03-12 02:57:53 科技观察

【博文推荐】利用SVN的post-commithook实现多个项目的自动同步svn的post-commithook脚本在每次commit后运行。我们可以在这个脚本中实现一些实用的功能,比如发送邮件提醒,自动备份版本库,自动同步代码到web服务器等。这里使用post-commit来实现多个项目的自动同步。思路是在svn版本仓库的根目录下划分多个项目文件夹。当项目团队成员提交文件时,post-commit会自动判断文件所属的项目,然后同步到对应的项目。在网络服务器上。测试环境配置:SVN服务器:172.16.4.234项目1WEB服务器:172.16.4.235项目1代码库:svn://172.16.4.234/project1项目2WEB服务器:172.16.4.236项目2代码库:svn://172.16.4.234/project2以下是操作步骤:1.WEB服务器WEB服务器作为SVN客户端,从SVN服务器上检出代码到本地。注意一定要先切换成www用户再checkout,因为www是apache或者nginx的执行用户(你的环境可能不一样)。项目1WEB服务器,站点根目录为/data/apps/project1:shell#suwwwshell$cd/data/apps/shell$svnco--usernamezb--password123456svn://172.16.4.234/project1项目2WEB服务器,站点根目录for/data/apps/project2:shell#suwwwshell$cd/data/apps/shell$svnco--usernamezb--password123456svn://172.16.4.234/project22.配置ssh免密码访问SVN服务器需要ssh访问无密码WEB服务器方便post-commit脚本ssh到WEB服务器执行svnup。注意这里的www用户是没有密码可以访问的,因为WEB服务器上的代码是通过www用户签出的。在SVN服务器上执行ssh-keygen-trsa,然后一直回车,生成公钥和私钥,保存在/root/.ssh/中。然后先切换到WEB服务器上的www用户,创建authorized_keys文件:[root@localhost~]#suwww[www@localhostroot]$cd[www@localhost~]$mkdir.ssh[www@localhost~]$chmod755.ssh/[www@localhost~]$vi.ssh/authorized_keys将SVN服务器上的/root/.ssh/id_rsa.pub公钥文件内容复制到authorized_keys文件中。然后设置authorized_keys文件权限为600[www@localhost~]$chmod600.ssh/authorized_keys测试,SVN服务器登录项目1WEB服务器:[root@localhost~]#sshwww@172.16.4.235[www@localhost~]$三,SVN服务器post-commitpost-commit在SVN的hooks目录下。post-commit脚本内容:#!/bin/shREPOS="$1"#仓库路径REV="$2"#新提交版本号LOGFILE=/var/log/svn.log#hook脚本日志#Both脚本标准输出和标准错误输出打印到日志文件exec1>>"$LOGFILE"exec2>&1SVNLOOK=/usr/bin/svnlookTIME=$(date"+%Y-%m-%d%H:%M:%S")AUTHOR=$($SVNLOOKauthor-r$REV"$REPOS")#提交作者CHANGEDDIRS=$($SVNLOOKdirs-changed$REPOS)#修改目录集MESSAGE=$($SVNLOOKlog-r$REV"$REPOS")#提交时备注信息,不建议使用中文#SVN客户端配置,需要自行修改***************************************CLIENT1=172.16.4.235#project1服务器CLIENT2=172.16.4.236#project2服务器CLIENTSVNROOT=/data/apps#WEB服务器代码根目录SVNUSER="zb"SVNPASSWD="123456"#*********************************************************************函数myecho(){echo"$TIME""$*"}myecho"**************************************************************************************************************************************************$AUTHOR"myecho"提交备注:$MESSAGE"myecho"修改目录:$(echo$CHANGEDDIRS|tr'\n''')"MASTERDIR=$(echo"$CHANGEDDIRS"|head-1)#CHANGEDDIRS中的主目录#遍历提交的代码目录,同步到WEB服务器while["$CHANGEDDIRS"!=""];doPROJECT=$(echo$MASTERDIR|awk-F/'{print$1}')#判断工程文件夹if["$PROJECT"=="project1"];thenmyechomyecho"project:$PROJECT同步目录:$MASTERDIR"myecho"同步$MASTERDIRto$CLIENT1:$CLIENTSVNROOT/$MASTERDIR"#无密码ssh连接客户端服务器,执行svnup/usr/bin/sshwww@$CLIENT1"exportLANG=en_US.UTF-8;svnup--non-interactive--用户名$SVNUSER--密码$SVNPASSWD'$CLIENTSVNROOT/$MASTERDIR'"elif["$PROJECT"=="project2"];thenmyechomyecho"项目:$PROJECT同步目录:$MASTERDIR"myecho"同步$MASTERDIR到$CLIENT2:$CLIENTSVNROOT/$MASTERDIR"/usr/bin/sshwww@$CLIENT2"exportLANG=en_US.UTF-8;svnup--非交互--用户名$SVNUSER--密码$SVNPASSWD'$CLIENTSVNROOT/$MASTERDIR'"else:fi#删除目录集合中的同步目录CHANGEDDIRS=$(echo"$CHANGEDDIRS"|grep-v"^$MASTERDIR")#获取需要同步的新主目录MASTERDIR=$(echo"$CHANGEDDIRS"|head-1)done别忘了给post-commit可执行权限4.测试在project1Document.txt”,查看日志文件/var/log/svn.log:日志显示文件已经同步到project1WEB服务器。