SVN跨服务器自动更新--实现文件分发
2014-10-30 11:54
357 查看
目标:SVN版本库提交,服务器中的工作拷贝能自动update。
实现方法:subversion, curl,php脚本实现,并且入mysql库来进行管理。改hosts文件来进行访问!提交触发钩子脚本时调用 curl 访问内网php脚本,内网内svn更新
基本思路:默认情况下,版本库的hooks子目录中包含各种版本库钩子模板。如下图:
钩子是通过版本库事件触发,例如新版本的创建或一个未版本化属性的修改。一些钩子(“pre hooks”)在事件发生前运行,可以用来报告发生了什么以及防止它发生。还有一些钩子(“post hooks”)在版本库事件之后发生,只是用来报告。这里我们要用post-commit钩子,在版本库提交事件发生后,更新服务器的工作拷贝。
深入了解hooks:对每种钩子的都有一个模板,通过查看这些脚本的内容,我们能看到是什么事件触发了脚本及如何给传递数据。要实际安装一个可用的钩子,我们需要在repos/hooks目录下安装一些与钩子同名(如 start-commit或者post-commit)的可执行程序或脚本。例如,在linux下,我们需要复制模板,去掉后缀名 .tmpl,自定义钩子的内容,并使之成为一个可执行地脚本;Windows用文件的扩展名来决定一个程序是否可运行,所以我们要使程序的基本名与钩子同名,同时,它的扩展名是Windows系统所能辨认的,例如exe、com和批处理的bat。
如何使用hooks:在版本库hooks目录下新建文件 post-commit 并输入如下内容保存:
实现方法:subversion, curl,php脚本实现,并且入mysql库来进行管理。改hosts文件来进行访问!提交触发钩子脚本时调用 curl 访问内网php脚本,内网内svn更新
基本思路:默认情况下,版本库的hooks子目录中包含各种版本库钩子模板。如下图:
钩子是通过版本库事件触发,例如新版本的创建或一个未版本化属性的修改。一些钩子(“pre hooks”)在事件发生前运行,可以用来报告发生了什么以及防止它发生。还有一些钩子(“post hooks”)在版本库事件之后发生,只是用来报告。这里我们要用post-commit钩子,在版本库提交事件发生后,更新服务器的工作拷贝。
深入了解hooks:对每种钩子的都有一个模板,通过查看这些脚本的内容,我们能看到是什么事件触发了脚本及如何给传递数据。要实际安装一个可用的钩子,我们需要在repos/hooks目录下安装一些与钩子同名(如 start-commit或者post-commit)的可执行程序或脚本。例如,在linux下,我们需要复制模板,去掉后缀名 .tmpl,自定义钩子的内容,并使之成为一个可执行地脚本;Windows用文件的扩展名来决定一个程序是否可运行,所以我们要使程序的基本名与钩子同名,同时,它的扩展名是Windows系统所能辨认的,例如exe、com和批处理的bat。
如何使用hooks:在版本库hooks目录下新建文件 post-commit 并输入如下内容保存:
#!/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[/code]
碰到问题:实际情况是,SVN服务端和需要自动更新的测试环境不在同一台服务器。svn update 命令无法触发远程服务器的更新。
解决方案:思路——在钩子里向测试服务器发送HTTP请求,测试服务器收到请求后,通过php的system函数本地调用svn up 命令,实现测试服务器的工作拷贝的更新。两件事情:
1.测试服务器安装 linux版svn客户端(下载地址,),在web根目录下新建svnupdate.php文件。代码如下:
<?php
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执行;
相关文章推荐
- 如何实现SVN导出某段时间修改过的文件;自动将class文件部署到服务器中;重启服务器
- Linux下SVN服务器自动更新文件到Web目录的方法
- Linux下搭建SVN服务器及自动更新项目文件到web发布目录(wwwroot)的方法
- expect实现文件自动传输初级,后面多台服务器可以结合NFS批量分发。
- Linux下SVN服务器自动更新文件到Web目录的方法
- Linux(CentOS)+SVN服务器,并实现本地提交后,服务器端自动更新
- centos下svn的主要常用命令(解决商城系统添加的文件无法自动更新至svn服务器)
- liunx 搭建svn服务器并实现钩子自动更新到web项目
- 利用svn的commit hooks,实现服务器项目自动更新
- 自己写的一个批处理文件,自动更新svn文件 并自动用ant编译 调用jboss的run启动服务器
- Linux下搭建SVN服务器及自动更新项目文件到web发布目录(www)
- Linux CentOS SVN 设置钩子hooks/post-commit来同步更新服务器web目录,实现代码自动部署
- 【FTP】批处理实现用FTP服务器上的文件更新本机文件
- c#实现 ftp ;http;共享方式下载文件 并对比本地文件和服务器文件的更新时间 判断性下载
- SVN自动更新测试服务器工作副本(C#写winform程序实现)
- svn服务器中实现自动备份(post-commit钩子,linux系统)
- SVN服务器HOOKS自动更新
- 实现自动更新文件
- Java自动更新SVN程序,注意系统默认的忽略文件
- c#实现 ftp http共享方式下载文件 并对比本地文件和服务器文件的更新时间 判断性下载