乐心博客

逆流而上,遇强则强

svn利用钩子hook实现自动更新

业务场景:
代码通过svn管理,每次有代码提交后都要手动到服务器里执行svn update更新,非常的麻烦,于是想实现当有代码发布之后,自动更新服务器上的代码的功能

在之前不知道svn钩子之前,我是使用的crontab每分钟执行svn up 来更新,这样做有两个问题:

  1. 有一分钟的延迟,代码发布人员需要等待
  2. 如果代码没有更新,每分钟的请求其实是不必要的

这个时候钩子的作用就出来了,svn在新建了项目后,会自动的在hook目录生成一些钩子模板,使用的时候只要将这些模板复制去掉后缀即可

首先介绍下svn钩子的类型:
post-commit
在提交完成,成功创建版本之后执行该钩子,提交已经完成,不可更改,因此本脚本的返回值被忽略。

post-lock
对文件进行加锁操作之后执行该脚本

post-revprop-change
在修改 revision 属性之后,执行该脚本。因为修改稿已经完成,不可更改,因此本脚本的返回值被忽略(不过实际上的实现似乎是该脚本的正确执行与否影响属性修改)

post-unlock
对文件进行解锁操作之后执行该脚本

pre-commit
在 Subversion transaction 完毕之后,在提交之前,执行该脚本

pre-lock
对文件进行加锁操作之前执行该脚本

pre-revprop-change
在修改 revision 属性之前,执行该脚本

pre-unlock
对文件进行解锁操作之前执行该脚本

start-commit
在客户端还没有向服务器提交数据之前,即还没有建立 Subversion transaction(缩写为 txn) 之前,执行执行该脚本

常用的钩子应该是pre-commit和post-commit
前者可以实现限制提交人必须填写comment的需求
后者可以实现代码提交后自动更新服务器代码的需求

下面就来介绍下如何利用post-commit实现自动代码更新


svn版本库的安装和建立这里就不说了,需要的话可以参考我的linux下svn服务搭建
版本库建立成功后,版本库内会有一个hook文件夹,里面已经有预设好的一些.tmpl模板文件,复制一个改名即可使用

cd hooks
cp post-commit.tmpl post-commit
#这里记得要加下执行权限,不然后面提交之后会报code 255错误
chmod a+x post-commit
vim post-commit

我编写的内容是这样的,仅供参考

#!/bin/bash

REPOS="$1"
REV="$2"

export LANG=en_US.UTF-8
echo "Code Deployed at `date "+%Y-%m-%d %H:%M"`" >> ~/hook_dkf.log
/usr/bin/svn update --username abc --password 123456 /home/www/dkf

保存,大功告成!

我在做的时候还碰到了code 1报错,网上查了很多文章都没有什么实际的效果,我觉得这应该是sh文件有错,手动运行了./post-commit文件没有问题,可以执行,那么我觉得是否是权限问题,检查了/home/www/dkf目录的所有者为www,没有问题,那么我就尝试切换到www然后运行一下试试看

#首先编辑/etc/passwd将www的/sbin/nologin改为/bin/bash
#然后
su www
#手动执行
/usr/bin/svn update --username abc --password 123456 /home/www/dkf
#提示是否保存账号密码信息,我输入yes,执行成功
#然后再提交一次svn,这个post-commit就生效了

code 1一般是代码或者权限引起的,自己都去检查检查就行了
好了,收工!

添加新评论