钩子功能
该功能其实是依据脚本实现,该脚本的写法是shell 是一样的 。 钩子脚本就是对某些版本库触发的程序 。 类似 inotify
钩子的目录 在每一个svn的项目工程库下面。 里面会有模板。
[root@localhost sadoc]# pwd
/application/svndata/sadoc
[root@localhost sadoc]# ll
total 8
drwxr-xr-x 2 root root 79 Dec 29 12:06 conf
drwxr-sr-x 6 root root 253 Dec 31 12:39 db
-r--r--r-- 1 root root 2 Dec 28 12:37 format
drwxr-xr-x 2 root root 231 Dec 28 12:37 hooks
drwxr-xr-x 2 root root 41 Dec 28 12:37 locks
-rw-r--r-- 1 root root 229 Dec 28 12:37 README.txt
[root@localhost sadoc]# ll hooks/
total 36
-rw-r--r-- 1 root root 1977 Dec 28 12:37 post-commit.tmpl #提交完成时触发事务
-rw-r--r-- 1 root root 1638 Dec 28 12:37 post-lock.tmpl #对文件进行加锁之后执行的事物
-rw-r--r-- 1 root root 2289 Dec 28 12:37 post-revprop-change.tmpl #版本属性修改后触发事务
-rw-r--r-- 1 root root 1567 Dec 28 12:37 post-unlock.tmpl #对文件进行解锁之后执行的事物
-rw-r--r-- 1 root root 3426 Dec 28 12:37 pre-commit.tmpl #提交完成前触发事务
-rw-r--r-- 1 root root 2434 Dec 28 12:37 pre-lock.tmpl #对文件进行加锁之前执行的事物
-rw-r--r-- 1 root root 2786 Dec 28 12:37 pre-revprop-change.tmpl #版本属性修改前触发事务
-rw-r--r-- 1 root root 2122 Dec 28 12:37 pre-unlock.tmpl #对文件进行解锁之前执行的事物
-rw-r--r-- 1 root root 2780 Dec 28 12:37 start-commit.tmpl #提交前触发事务,还未提交时触发的时间
标黄的 为常用
重要提示:
1. 如果要使用这些模板。需要将模板后面的.tmpl 的后缀名去掉。
2.由于安全原因,Subversion 在一个空环境中执行钩子脚本是没有任何环境变量的 ,甚至没有$PATH。所以有的脚本,在系统中手动可以执行,但是在svn切不能运行。是因为没有变量 ,所以必须要在钩子设置中设置好环境变量或写好绝对路径。这个需要注意。
svn钩子生产场景应用举例
1. pre-commit
限制上传文件扩展名已经大小,控制提交要输入的信息等等
2.post-commit
svn更新后触发checkout程序,然后实时rsync推送,并且更新后的通知 等。
实例
当我们实际需要使用 钩子的时候。 需要将钩子模板后面扩展名去掉
[root@localhost hooks]# cd /application/svndata/sadoc/hooks [root@localhost hooks]# cp -rp post-commit.tmpl post-commit # 复制一份模板
[root@localhost hooks]# grep -E -v "^#|^$" post-commit # 简单的看下脚本,其实就是看下格式,正式的脚本可以将它里面的内容都替换掉,就是用它个名字。
REPOS="$1"
REV="$2"
mailer.py commit "$REPOS" "$REV" /path/to/mailer.conf
[root@localhost hooks]#
[root@localhost hooks]#
[root@localhost hooks]#
实验脚本:
场景说明:
svn 服务端在 192.168.134.174 上面。上面有个sadoc的项目工程 。 同时 174也是客户端,174机器的/data/www 会拉取 sadoc库的内容。
本地的pc机上面,有连接这个工程库。可以上传代码
linux的的192.168.134.171 会需要 使用sadoc的代码。所以需要174要自动往 134.171 这台机器上面推送代码 。
[root@localhost hooks]# sudo cat post-commit
#!/bin/sh
# Auth: Ricky
# Data: Jau 01 2020
# Usage: post-svn and rsync svn:/sadoc to 192.168.134.171
export LC_ALL=en_US.UTF-8 # 实际的时候,可能会有中文编码的问题,这边可能会声明下字符集
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
source /etc/profile # svn 本生没有任何环境变量, 所以这边声明下环境变量,也可以指令写全路径
REPOS="$1" # 传参暂时用不到, 这个用来判定,可以用来限制commit为空,或者路径为空的时候。 提交失败。这边暂时没用。
REV="$2"
Time=`date +%F-%H:%M`
LogPath="/app/log"
if [ ! -d $LogPath ];then # 检查日志目录是否存在,没有就创建
mkdir -p $LogPath
fi
### update svn and rsync to remote
svn update /data/www/ # 当有人svn提交之后。 本地的svn库先进行update
if [ $? -eq 0 ];then
echo "$Time svn update ok " >> $LogPath/log.log
rsync -avz --delete /data/www/ [email protected]:/svndata # 本地同步后,rsync到远端的其他机器上 。
if [ $? -eq 0 ];then
echo "$Time rsync ok " >> $LogPath/log.log
else
echo "$Time fail " >> $LogPath/log.log
fi
else
echo "$Time svn update fail " >> $LogPath/log.log
fi
注意:
1.rsync需要先做好免秘钥。
2.脚本写完之后,自己先测试下。
3.代码库要事先svn checkout以下。 否则直接update或失败 。
这边需要给这个 post-commit 文件 可执行权限 700或 755 权限
chmod 755 post-commit
然后我们实验一下
在window的 svn 工程下面 ,创建几个新文件。然后commit 提交
如果commit 失败,报以下错误, 注意查看下 post-commit这个文件是不是 700或者 755 权限。 就是要有可执行权限
如果提交完成,说明我们脚本没问题 。
上机器查看一下。 174 ok的 。
174上面日志也正常的
然后我们去171上面一下 。 可以看到我们171上面 。数据也同步过来了
至此,完成 。