其实和回调是一个概念,当某个事情发生时就会调用你提供的方法,利用好SVN钩子能够大大的方便你的开发。
web开发人员,每次提交了代码都须要手动到服务器更新下代码才能看到效果。
今天我就教你们如何利用钩子自动化更新。php
下面我将以SVNBucket为例,若是你尚未SVNBucket账号,点击注册html
如上图,点击添加钩子,咱们须要填入 连接、token、触发条件python
连接:就比如咱们的回调方法,在你提交代码后就会自动调用这个连接,你收到调用后就能够执行代码更新了。token:是一个可选的参数,在调用连接时会带上这个参数,能够用来检查调用是否来自SVNBucket。这里能够随意填写一个本身想要的参数就好了web
触发条件:触发条件咱们选择提交后,这样代码提交以后就会调用连接。shell
那么咱们的连接填写什么呢?你须要本身写一个http服务,用来接收调用。segmentfault
下面我以Python代码为例(PHP版本看文章最后),写一个简单的http服务来接收调用:服务器
# -*- coding:utf8 -*- # 注意:运行这个脚本的机器要安装SVN的客户端 import os from bottle import run, request, post @post('/onCommit') def onCommit(): # 参数有: # event: 事件名字,有 start-commit(提交前), post-commit(提交后) # token: 校验字符串 # rev: 版本号( post-commit 事件才有值) # log:提交描述内容( post-commit 事件才有值), # user:提交者用户名 # 高级技巧:利用好log、user参数能够作选择性的更新,好比判断log中包含“update”才进行服务器更新; param = request.params # 校验token,检查是否是本身在SVNBucket上配置的,防止恶意请求 if param.get('token', '') == 'YourToken': # 调用shell脚本进行svn update output = os.popen('./up_and_restart.sh') print output.read() else: print 'token校验不对,忽略' return 'failed' return 'ok' if __name__ == '__main__': run(host='0.0.0.0', port=8080, server='cherrypy')
这里咱们用python的bottle框架搭建了一个简单的http服务来处理代码更新。根据这个能够本身实现一个其余语言的版本框架
在收到请求后咱们就执行了一个shell脚本,这个shell脚本就是调用svn update去更新咱们的代码了。svn
假设你的服务器IP是119.29.35.39,http服务的端口是8080,那么咱们就应该配置上面的连接地址为:http://119.29.35.39:8080/onCommitpost
配置好了后,咱们能够点击测试按钮进行测试,这样就会手动的触发一次连接请求,而且在下面区域显示调用记录、是否成功
最后再提供一个PHP版本的供参考:
<?php header("Content-Type: text/html; charset=utf-8"); header("Cache-Control:no-cache,must-revalidate"); // 参数有: // event: 事件名字,有 start-commit(提交前), post-commit(提交后) // token: 校验字符串 // rev: 版本号( post-commit 事件才有值) // log:提交描述内容( post-commit 事件才有值) // user:提交者用户名 // 高级技巧:利用好log、user参数能够作选择性的更新,好比判断log中包含“update”才进行服务器更新; // 注意:运行这个脚本的机器要安装SVN的客户端 if($_POST['token'] === '你填写的Token值') { $username = '你的SVN用户名'; $password = '你的SVN密码'; $target_dir = '/data/www'; exec("svn up --username $username --password $password --no-auth-cache $target_dir 2>&1", $output, $outresult); print_r("\noutput:$output, result:$outresult"); if ($outresult ===0 ) { echo '更新成功!'; //echo print_r($output); return 'ok'; } else { echo '更新失败!'; echo print_r($output); return 'failed'; } } else { echo '数据校验失败,无效更新!'; return 'failed'; }
SVN快速上手
SVN经常使用命令
轻松解决SVN冲突
SVN 和 Git 的一些误解和真相
Mac用户SVN图形界面推荐
Eclipse安装SVN插件和检出代码