svn的hook机制,跟其他很多类似的工具一样,hook机制的本身就是在某个具体的时机所触发的内容,类似于事件驱动的回调。
场景说明
举个简单的例子,我们使用svn commit的时候如果希望对日志的信息进行判断,如果日志中没有包含指定格式的Ticket号时,提示相关的错误信息,不允许提交。这样的场景,就是hook机制起作用的最为常见的情形之一。这篇文章中会用最简单的方式来演示这个机制的设定和使用方式。
svn的hook
svn的hook模版
在创建的svn的仓库中,目前默认包含了如下9种hook的版本
- start-commit
- pre-commit
- post-commit
- pre-revprop-change
- post-revprop-change
- pre-lock
- post-lock
- pre-unlock
- post-unlock
hook说明
这9种相关的hook所触发的时机相关的信息如下
类型 | 触发时机 | 常见用途 | 备注 |
---|---|---|---|
start-commit | 提交事务生成之前 | 一般可根据用户名对提交进行权限控制,一般多用于对svn版本功能check的检查 | 参数个数为2,svn 1.5为3个 |
pre-commit | 事务已生成,但是尚未提交 | 可可根据提交的内容或者comment进行控制,比如提交日志不能为空 | - |
post-commit | 提交之后 | 数据进行备份,以及修改提示的mail操作,或者驱动自动构建 | - |
pre-revprop-change | 属性变更前,尚未变化 | 可以进行属性变更权限的控制 | - |
post-revprop-change | 属性变更前 | 进行版本属性的备份以及mail通知操作等 | - |
pre-lock | 加锁之前 | 可进行是否能加锁的控制 | - |
post-lock | 加锁之后 | 可进行mail通知,使开发成员了解此文件已经加锁 | 往往有时结合特定流程,比如有提交冻结期的结束,可结合这个属性进行使用 |
pre-unlock | 解锁前 | 可进行是否能解锁的控制 | - |
post-unlock | 解锁之后 | 可进行mail通知,使开发成员了解此文件已经解锁 | 往往有时结合特定流程,比如有提交冻结期的结束,可结合这个属性进行使用 |
hook参数
当前版本的hook的相关参数信息如下所示:
类型 | 参数1 | 参数2 | 参数3 | 参数4 | 参数5 |
---|---|---|---|---|---|
start-commit | 代码库路径 | 用户名 | - | - | - |
pre-commit | 代码库路径 | 事务名 | - | - | - |
post-commit | 代码库路径 | 版本号 | 事务名 | - | - |
pre-revprop-change | 代码库路径 | 版本号 | 用户名 | 属性名 | ACTION |
post-revprop-change | 代码库路径 | 版本号 | 用户名 | 属性名 | ACTION |
pre-lock | 代码库路径 | 路径 | 用户名 | Comment | STEAL(1 |
post-lock | 代码库路径 | 用户名 | - | - | - |
pre-unlock | 代码库路径 | 路径 | 用户名 | TOKEN | BREAK-UNLOCK(1 |
post-unlock | 代码库路径 | 用户名 | - | - | - |
起效方式
缺省创建的库中的9个文件均以tmpl结尾,而这样是不起作用的,在Unix/Linux下,删除tmpl的后缀才能起作用,而windows则需要将.tmpl改成.bat。
修改之后立即起效,无需重新启动svn服务。
注意事项
因为安全的考量,在钩子函数中是无法使用环境变量的。Unix/Linux下基础的PATH也是环境变量,因为这个的缘故,导致可执行文件必须使用全路径进行引用,这就是你在代码里面没有看到svnlook而是/usr/bin/svnlook的根本原因。
实例
场景说明:
在版本管理中,我们建议在提交的日志中结合Ticket番号,如果在svn commit的时候提交日志的信息为空或者不包含Ticket号的信息,则无法提交到代码库。日志格式一般为:# xxxx: 日志信息
事前准备
事前准备
准备镜像
可以使用前面文章中Dockerfile生成的alpine的svn的lts版本的镜像,也可以直接使用使用easypack打好的镜像。
[root@liumiaocn svn]# docker pull liumiaocn/svn:1.10.0
1.10.0: Pulling from liumiaocn/svn
8e3ba11ec2a2: Already