目标:SVN版本库提交,服务器中的工做拷贝能自动update。php
实现方法:subversion, curl,php脚本实现,而且入mysql库来进行管理。改hosts文件来进行访问!提交触发钩子脚本时调用 curl 访问内网php脚本,内网内svn更新html
基本思路:默认状况下,版本库的hooks子目录中包含各类版本库钩子模板。以下图:mysql
钩子是经过版本库事件触发,例如新版本的建立或一个未版本化属性的修改。一些钩子(“pre hooks”)在事件发生前运行,能够用来报告发生了什么以及防止它发生。还有一些钩子(“post hooks”)在版本库事件以后发生,只是用来报告。这里咱们要用post-commit钩子,在版本库提交事件发生后,更新服务器的工做拷贝。linux
深刻了解hooks:对每种钩子的都有一个模板,经过查看这些脚本的内容,咱们能看到是什么事件触发了脚本及如何给传递数据。要实际安装一个可用的钩子,咱们须要在repos/hooks目录下安装一些与钩子同名(如 start-commit或者post-commit)的可执行程序或脚本。例如,在linux下,咱们须要复制模板,去掉后缀名 .tmpl,自定义钩子的内容,并使之成为一个可执行地脚本;Windows用文件的扩展名来决定一个程序是否可运行,因此咱们要使程序的基本名与钩子同名,同时,它的扩展名是Windows系统所能辨认的,例如exe、com和批处理的bat。web
如何使用hooks:在版本库hooks目录下新建文件 post-commit 并输入以下内容保存:sql
#!/bin/sh export LANG=en_US.UTF-8 # 以www身份更新svn su - www -c "svn up /home/www/zmqnw_mobile --accept theirs-full"
curl -s http://192.168.1.60/distribute?project=zmqnw_mobile
碰到问题:实际状况是,SVN服务端和须要自动更新的测试环境不在同一台服务器。svn update 命令没法触发远程服务器的更新。apache
解决方案:思路——在钩子里向测试服务器发送HTTP请求,测试服务器收到请求后,经过php的system函数本地调用svn up 命令,实现测试服务器的工做拷贝的更新。两件事情:服务器
1.测试服务器安装 linux版svn客户端(下载地址,),在web根目录下新建svnupdate.php文件。代码以下:curl
<?phpsvn
empty($_GET['path']) && die('miss params');
$paramArr = explode('|||', $_GET['path']);
$path = $paramArr[0];
$username = isset($paramArr[1])?$paramArr[1]:'';
$password = isset($paramArr[2])?$paramArr[2]:'';
$res = exec("export LANG='zh_CN.GBK' && /usr/bin/svn up $path --username='$username' --password='$password'");
if (strpos($res, '修订版')!== false) echo '成功更新到5.211';
2.SVN服务器版本库中hooks目录下post-commit.bat 修改以下:
其中ab.exe是apache下的压测工具;参数path格式:测试服务器工做拷贝路径[|||SVN用户名[|||SVN密码]],如有特殊字符需urlencode。
碰到的新问题:在咱们的配置中,php-fpm进程以www:www运行,在调用exec和system函数时,其参数中的命令也以www:www执行,而/usr/bin/svn的执行须要 root 身份,因此上面的svnupdate.php不可能成功更新工做拷贝。
解决方案:
让/usr/bin/svn能够以www:www执行;