6.svn 钩子功能

钩子功能

该功能其实是依据脚本实现,该脚本的写法是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 这台机器上面推送代码 。

6.svn 钩子功能_第1张图片

 

 

 

 

[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

 

6.svn 钩子功能_第2张图片

 

 

 

 

然后我们实验一下

在window的 svn 工程下面 ,创建几个新文件。然后commit 提交

6.svn 钩子功能_第3张图片

 

 如果commit 失败,报以下错误, 注意查看下  post-commit这个文件是不是 700或者  755  权限。  就是要有可执行权限

6.svn 钩子功能_第4张图片

 

 

如果提交完成,说明我们脚本没问题 。

6.svn 钩子功能_第5张图片

 

 

 上机器查看一下。  174  ok的 。

6.svn 钩子功能_第6张图片

 

 

174上面日志也正常的

6.svn 钩子功能_第7张图片

 

 

 

 

 

 

 

 

然后我们去171上面一下 。 可以看到我们171上面 。数据也同步过来了

6.svn 钩子功能_第8张图片

 

 

至此,完成 。

你可能感兴趣的:(6.svn 钩子功能)