SVN(二)hooks的应用

大概了解了一下钩子,发现这个功能也是蛮实用,能够对svn代码更新前后自动做一些操作,而且比较有意思的是可以合shell无缝对接。通常有一些场景下我们做这个比较多,我们公司的svn做一些限制,比如svn不允许上传.mp4的文件,比如在更新代码比较频繁的情况下我们需要对上传的没一个版本强制要求做一个Message信息,还有比如代码更新完以后我们希望能够自动上传到/var/www/html下并给我发送一封邮件进行告知,这些是比较常规的做

官方文档:http://shouce.jb51.net/svnbook/1.4/index.html

首先熟悉下钩子的配置文件:

路径:/data1/svndata/www/hooks/

[root@localhost ~]# cd /data1/svndata/www/hooks/
[root@localhost hooks]# tree -L 1 .
.
├── post-commit                           ##  真正被执行的钩子文件
├── post-commit.tmpl                   ##  .tmpl的文件是钩子的模板文件
├── post-lock.tmpl
├── post-revprop-change.tmpl
├── post-unlock.tmpl
├── pre-commit
├── pre-commit.tmpl
├── pre-lock.tmpl
├── pre-revprop-change.tmpl
├── pre-unlock.tmpl
└── start-commit.tmpl

0 directories, 11 files

那么对于这么多的不同类型的钩子的具体应用场景我们可以参考http://shouce.jb51.net/svnbook/1.4/index.html
官方的文档做一些理解

案例一:将开发人员官网代码更新提交到SVN(www中心库)后立即更新到本机的Apache(/var/www/html)下并发送邮件告知我(post-commit):

[root@CentOS6-1 ~]# cd /data1/svndata/www/hooks/
[root@CentOS6-1 hooks]# chmod 700 post-commit
[root@CentOS6-1 hooks]# vim post-commit

#!/bin/sh

export LANG=en_US.UTF-8     ##设置语言,防止乱码
REPOS="$1"      ##这里变量代表着中心库位置我的是/data1/svndata/www
REV="$2"           ##这里是修订号

SVNLOOK=/usr/bin/svnlook
AUTHOR=$($SVNLOOK author -r $REV "$REPOS")
MESSAGE=$($SVNLOOK info $REPOS|awk "NR==4")    ##获取注释信息
PROJECT="/var/www/html/"    ##我项目的目录
SVN="/usr/bin/svn"

##同步
$SVN update $REPOS $PROJECT --username a1 --password 123 --no-auth-cache
##当然我这是同步到本机,如果其他主机也需要的话在这后面跟rsync也可以,灵活变通一下
if [ $? -eq 0 ]
  then
                echo  "
                        作者:$AUTHOR
                        事件:$REPOS update OK
                        版本:$REV 请悉知
                        注释:$MESSAGE
                        时间:`date +%Y-%m-%d-%H:%M:%S`"| mail -s "$AUTHOR 代码更新OK"  xxx@qq.com

fi

对于SVN来说我们有时候需要开发人员对自己上传的每一个版本都清楚修正了哪些东西,但是如果一旦最新的版本有问题,那么回退起来很困难,对于我们而言只知道修订号和一个简单的日期,其余的真的是靠记性了,但是时间久了就尴尬了,所以说我们要求开发人员在代码更新的时候强制编写Message信息

案例二:强制开发人员填写Message信息,要求输入最少8个字符(pre-commit)

[root@CentOS6-1 ~]# cd /data1/svndata/www/hooks/
[root@CentOS6-1 hooks]# chmod 700 post-commit
[root@CentOS6-1 hooks]# vim pre-commit
#!/bin/sh
REPOS="$1"
TXN="$2"

export LANG=en_US.UTF-8
SVNLOOK=/usr/bin/svnlook
MESSAGE=$($SVNLOOK info -t "$TXN" "$REPOS"|awk 'NR==4'|xargs echo -n|wc -m)  
#获取提交者输入的Message信息,echo -n去除输出的\n,wc -m统计字符个数非字节数

#echo "$MESSAGE" >> /tmp/svnlog         ##用来调试查看输出的字符数,这里仅想表达echo的排错方法

if [ $MESSAGE -lt 8 ]    ##根据自己的需要来修改
   then
        echo -e "\n错误信息:Message信息必须不少于8个字符\n" 1>&2 
        ##1>&2这个很关键哦,别写错了,表示标准输出返回值输入到错误返回值通道
        exit 1
fi
exit 0

其实钩子大家可以看得到有很多的模板文件,其实钩子还可以做很多事,比如常见的限制上传文件大小,限制文件类型之类的,由于它是shell解释器,主要依靠svnlook配合shell取值,再进行流程判断,那么在编写的时候是相当容易的了

相关文章
相关标签/搜索