svn钩子脚本
使用钩子脚本的意义:
我们在测试环境中搭建好svn后,开发人员可以正常的上传和下载写好的代码了。但是上传到测试服务器,在版本库中(tshop)是看不到这些数据的。所以在测试环境中(linux测试服务器)也看不到这些数据。所以我们还需要在linux测试服务器中,检出这些数据,放到lanmp(测试环境)中。这样开发才能在linux测试服务器上检测自己的代码是否有问题。这就用到了钩子脚本。
大致思路:
户提交程序到SVN,SVN触发hooks,按不同的hooks进行处理,这里用到的是post-commit(客户机在提交完成时,会执行post-commit中的内容),利用post-commit到代码检出到SVN服务器的本地硬盘目录(linux测试服务器上)
知识点:
1、SVN的hooks
# start-commit 提交前触发事务
# pre-commit 提交完成前触发事务
# post-commit 提交完成时触发事务
# pre-revprop-change 版本属性修改前触发事务
# post-revprop-change 版本属性修改后触发事务
我们现在客户机上以adm用户登录svn版本库。在版本库中创建wwwroot根目录。然后在客户端在检出。
编辑钩子脚本
mkdir /jianchu/www -p
svn co --username=adm --password=123 svn://192.168.3.10/tshop/wwwroot/ /jianchu/www
#将wwwroot下的目录检出到/jianchu/www下
mkdir /jianchu/wwwroot -p
useradd www
mkdir /var/log/svn
cd /data/svn/tshop/hooks/
cp post-commit.tmpl post-commit
chmod +x post-commit
vim post-commit
#!/bin/bash
export LANG=zh_CN.UTF-8
REPOS="$1"
REV="$2"
AUTHOR=`/usr/local/bin/svnlook author -r $REV $REPOS`
TIME=`date '+%F %T'`
echo "[$TIME]--[$AUTHOR] svn commit file:" >> /var/log/svn/svn_rain_update.log
lujing=`/usr/local/bin/svnlook changed -r $REV $REPOS | awk '{print $2}' | awk -F/ '{print $1}'|uniq`
if [ $lujing = wwwroot ];then
svnlook changed -r $REV $REPOS |while read line
do
updatePath=`echo $line |awk '{print $2}'|awk -F/ '{for(i=2;i<=NF;i++)printf $i"/"}{printf "\n"}'|sed 's/\/$//g'`
updatePath2=`echo $updatePath|awk -F/ '{for(i=1;i<=NF-1;i++)printf $i"/"}{printf "\n"}'`
fullUpdatePath="/jianchu/www/$updatePath"
fullUpdatePath2="/jianchu/wwwroot/$updatePath"
fullUpdatePath3=`echo $line |awk '{print $1}'`
if [ $fullUpdatePath3 = D ];then
/usr/local/bin/svn update --username adm --password 123 /jianchu/www/$updatePath2 >> /var/log/svn/svn_rain_update.log
rm -rf $fullUpdatePath2
else
/usr/local/bin/svn update --username adm --password 123 /jianchu/www/$updatePath2 >> /var/log/svn/svn_rain_update.log
/usr/bin/rsync -avz $fullUpdatePath $fullUpdatePath2 >> /var/log/svn/rsync.log
chown -R www.www $fullUpdatePath
chown -R www.www $fullUpdatePath2
fi
done
fi
解释:
一、命令格式:
svnlook author -r 更新的版本号(更新的第几次) 产品仓库路径
这条命令就可以获取更新数据的用户了。
例子:
[root@CentOS6-node1 hooks]# svnlook author -r 1 /data/svn/tshop/
adm
#adm用户提交的1版本
[root@CentOS6-node1 hooks]# svnlook author -r 2 /data/svn/tshop/
lisi
#lisi用户提交的2版本
二、
命令格式:
svnlook changed -r 更新的版本号(也是更新的第几次) 产品仓库路径
这条命令会获取更新最新的文件
例子:
[root@CentOS6-node1 hooks]# svnlook changed -r 1 /data/svn/tshop/ #A代表添加
A abc/
[root@CentOS6-node1 hooks]# svnlook changed -r 2 /data/svn/tshop/
A abc/asd/
三、
脚本中的
$AUTHOR :这个变量定义的是过滤出提交的用户谁。
$lujing :过滤出用户提交路径是否为wwwroot。我们在搭建服务时,定义的目录wwwroot是让所有的开发上传代码上传到这里。以便于管理(不至于根目录很乱)。adm用户管理根目录
$updatePath:提取上传的文件,并去掉每一行的"/"
例子:
本次11版本一共提交了3个文件如上
(1)[root@CentOS6-node1 ~]# svnlook changed -r 11 /data/svn/tshop/
A wwwroot/11111/
A wwwroot/33333/
A wwwroot/44/
(2)[root@CentOS6-node1 ~]# svnlook changed -r 11 /data/svn/tshop/ |awk '{print $2}'
wwwroot/11111/
wwwroot/33333/
wwwroot/44/
(3)[root@CentOS6-node1 ~]# svnlook changed -r 11 /data/svn/tshop/ |awk '{print $2}' |awk -F/ '{for(i=2;i<=NF;i++)printf $i"/"}'
11111//33333//44//[root@CentOS6-node1 ~]#
(4)svnlook changed -r 11 /data/svn/tshop/ |awk '{print $2}' |awk -F/ '{for(i=2;i<=NF;i++)printf $i"/"}{printf "\n"}'
11111//
33333//
44//
(5)最后一部在去掉每行末尾的/