SVN钩子hooks使用
简述
由于安全原因,Subversion版本库在一个空环境中执行钩子脚本-->就是没有任何环境变量,甚至没有$PATH或%PATH%。注意必须在你的钩子中设置好环境变量或为你的程序指定好绝对路径。
默认情况下,SVN版本库钩子的目录中包含各种版本库钩子模板
[root@localhost hooks]# ll /svn/HLink/hooks/ 总用量 36 -rw-r--r-- 1 root root 1977 12月 19 2016 post-commit.tmpl -rw-r--r-- 1 root root 1638 12月 19 2016 post-lock.tmpl -rw-r--r-- 1 root root 2289 12月 19 2016 post-revprop-change.tmpl -rw-r--r-- 1 root root 1567 12月 19 2016 post-unlock.tmpl -rw-r--r-- 1 root root 3426 12月 19 2016 pre-commit.tmpl -rw-r--r-- 1 root root 2410 12月 19 2016 pre-lock.tmpl -rw-r--r-- 1 root root 2786 12月 19 2016 pre-revprop-change.tmpl -rw-r--r-- 1 root root 2100 12月 19 2016 pre-unlock.tmpl -rw-r--r-- 1 root root 2780 12月 19 2016 start-commit.tmpl
start-commit 事务创建之前。
传给 hook 的 参数:
- 参 数 1 , 代码库路径。
- 参 数 2 , 试图提交的用户名。
hook 的返回值:非 0 则 终止。
一 般用途:判断用户是否有权限进行提交 操作。
pre-commit 事务完成,但未提交。
- 参 数 1 , 代码库路径。
- 参 数 2 , 事务名。
hook 的返回值:非 0 则 终止提交,操作回滚。
一 般用途:对提交内容进行检查。如要求 提交必须填写提交信息。
post-commit 事务提交完毕,新的修订版被 创建。
传给 hook 的 参数:
- 参 数 1 , 代码库路径。
- 参 数 2 , 刚创建的修订版号。
hook 的返回值被忽 略。
一 般用途:发送邮件通知,或备份代码 库。
pre-revprop-change 修改修订版属性(如提交时提 供的信息 message )之前。
由于修订版属性一旦修改就会 永久的丢失,除非安装这个事件的 hook ,subversion 的 客户端不允许远程修改修订版属性。
传给 hook 的 参数:
- 参 数 1 , 代码库路径。
- 参 数 2 , 要修改的修订版号。
- 参 数 3 , 操作用户名。
- 要 修改的属性。
hook 的返回值:非 0 则 终止。
一 般用途:保存修订版属性的改变记录。
post-revprop-change 修订版属性值被修改之后。
如果没有安装 pre-revprop-change 的 hook , 这个事件的 hook 不会被执行。
传给 hook 的 参数:
- 参 数 1 , 代码库路径。
- 参 数 2 , 要修改的修订版号。
- 参 数 3 , 操作用户名。
- 要 修改的属性。
hook 的返回值被忽 略。
一 般用途:发送邮件
实践
因svn仓库在服务器2上, 服务器3是测试服务器, 钩子要远程执行更新脚本.所以先做ssh免密认证
服务器2上 生成秘钥对 ssh-keygen , ssh-copy-id 把公钥发给服务器3
非默认端口时: ssh-copy-id -i /root/.ssh/id_rsa.pub '-p 224 root@111.198.29.223'
[root@localhost ]# ssh-keygen #回车 [root@localhost ]# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.0.3
编辑钩子脚本
[root@localhost hooks]# pwd
/svn/hcloud/hooks
[root@localhost hooks]# vim post-commit
#!/bin/bash export LANG=en_US.UTF-8 REPOS="$1" TXN="$2" datelog=`date +%Y%m%d` datetime=`date +%Y-%m-%d-%T-%A` # Make sure that the log message contains some text. /bin/echo $REPOS $TXN $datetime >>/tmp/svn-hcloud-$datelog.log || exit 1 # ssh 192.168.0.3 "sh /srv/uphcloud.sh"
ssh 192.168.0.3 "nohup /srv/uphcloud.sh >test.log 2>&1 &"
# Check that the author of this commit has the rights to perform # the commit on the files and directories being modified. # commit-access-control.pl "$REPOS" "$TXN" commit-access-control.cfg || exit 1 # All checks passed, so allow the commit. exit 0
[root@local ~]# cat /srv/uphcloud.sh #!/bin/bash type svn if [ $? != 0 ];then echo "need install subversion first" exit fi cd /srv [ ! -e /srv/hcloud ]&& mkdir -p /srv/hcloud;cd /srv/hcloud echo `pwd` >>/srv/herror.log echo `date` >>/srv/herror.log # BScloud echo "hcloud" >>/srv/herror.log #if [ ! -e /srv/hcloud ]; then if [ ! -e /srv/hcloud/web ]; then /usr/bin/svn co --no-auth-cache svn://192.168.0.2/hcloud/web --username svn账号 --password 密码 2>&1 >>/srv/herror.log else #cd /srv/hcloud/ cd /srv/hcloud/web /usr/bin/svn update --no-auth-cache --username svn账号 --password 密码 2>&1 >>/srv/herror.log cd /srv fi cp -uraf /srv/hcloud/web/* /data/web/hcloud/web/ cd /data/web/ chown -R nginx:nginx hcloud/ chmod -R 777 /data/web/hcloud/web/web_code/smarty/templates_c