51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

SVN 钩子介绍

前言 {#前言}

钩子是什么,有什么用?SVN有哪些钩子,可以用来做什么,本篇将为大家解答。

SVN 钩子,英文叫 hooks ,钩子这个说法可能有些人觉得太玄乎,实际上它就是一个回调而已,当某个事件发生后会回调告诉你。

本篇讲解的是如何在 Linux 服务器上配置钩子。

SVN钩子介绍 {#SVN钩子介绍}

SVN的钩子有很多,他们存放在服务端的/hooks目录:

上图中,我们看到文件后缀都是以.tmpl结尾,这些是模版文件,都是不会生效的,如果你想要某个钩子生效,只需要把.tmpl去掉就可以了。
他们都是 shell 脚本,如果是在windows上,则这个脚本的后缀应该是 exe/bat

虽然上图中有9个钩子脚本,但是常用的只有两个:

  • 提交代码前触发的钩子pre-commit
  • 提交代码后触发的钩子post-commit

提交前的钩子,最经典的应用就是用来检查是否有填写提交描述(commit log),

|------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #!/bin/sh # 这是仓库地址,更多的钩子环境变量还可以在 /conf/hooks-env 里面配置 REPOS="$1" # 版本号,subversion里面专用的,跟我们看到的那个版本号不一样 TXN="$2" # 判断是否有填写提交描述,没有则不给提交并提示 SVNLOOK=/usr/bin/svnlook msg=$($SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]") if [ -z "$msg" ];then # 这行错误提示将会在svn客户端显示 echo "必须填写提交描述">&2; # 有错误,不允许提交,则返回非0错误吗 exit 1 fi # Exit on all errors. set -e # 全部检查都通过,则返回错误码0允许提交, exit 0 |

如果你使用的是 TortoiseSVN 客户端,提示大概如下:

而提交后的钩子(post-commit)最经典的应用就是自动化更新服务器代码。
例如在代码提交后,我们可以判断提交描述中是否有update,有则自动更新服务器上的代码并且重启服务器以便立刻生效,这个在开发中是非常有用的,可以节省大量的繁琐操作。

通常我们的 SVN 仓库跟我们的 web/app 服务器不在同个服务器上。所以我们可以配置钩子调用我们的一个 http 接口通知更新,如下:

|------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 5 6 7 8 9 10 | #!/bin/sh # 仓库路径 REPOS="$1" # 仓库版本号,这个是跟我们客户端看到的版本号是一致的。 REV="$2" TXN_NAME="$3" # 代码提交后,我们调用这个 http 接口,具体的逻辑由这个接口去处理 curl -s -X POST -d "repos=$1&rev=$2" "http://your-server-url/api/post-commit" |

你需要提供一个 http 接口,这个接口在收到调用后判断是否需要更新,然后可以执行 svn update 命令去更新你的代码目录,然后执行重启服务的命令。

在上面的钩子脚本中,我们给接口传递了 reposrev 参数,没有提交描述,这样就没办判断否包含update字符来决定是否更新服务器。
要获得提交描述也很简单,我们在脚本中调用 svnlook 命令去获取描述内容就可以,如下:

|---------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 5 6 7 8 9 10 11 | #!/bin/sh # 仓库路径 REPOS="$1" # 仓库版本号,这个是跟我们客户端看到的版本号是一致的。 REV="$2" TXN_NAME="$3" log=$($SVNLOOK log -t "$REV" "$REPOS" | grep "[a-zA-Z0-9]") # 增加log参数,在 http 接口中我们可以判断是否包含update字符 curl -s -X POST -d "repos=$1&rev=$2&log=log" "http://your-server-url/api/post-commit" |

还有更高级的判断方式是,判断提交者是否为指定用户、是否更新了某个文件/目录。
这需要调用更多的命令去查询这些信息,这里我们就不再深入了。


赞(1)
未经允许不得转载:工具盒子 » SVN 钩子介绍