首先声明一下,paperen这里这种方案只是自己想出来的并不是完美的,也许已经有许多前辈已经遇到与我一样的需求并且已经有一套完善的项目管理办法,有知道的麻烦也给我提一下,paperen确实没google出来…

而目前就paperen这个解决办法简单来说就是通过svn的钩子来实现 也需要一些脚本的支持(这里还是用了php)

首先还是先举例,比如SVN服务器上有一个项目版本叫test,我在工作机上checkout下来了,然后又在测试服务器1上checkout一遍,又在测试服务器2上checkout一遍,那么到目前为止test这个项目已经有三个版本,我的工作机上、测试机1上、测试机2上,然后本地的版本某个文件修改了一段代码后提交,很明显其他两个测试机上的代码版本都不会产生变化,因为没有update,那么我得一台台远程过去svn update一遍,我很懒,我不想手动去更新版本,so…

于是乎paperen就想能否让svn服务器具有一些推送的动作,让测试机上的版本自动update,就像下图所示这样的一个机制

在svn版本库那边配置post-commit钩子 一旦提交动作完毕就会触发通知各个从服务器的代码更新 而这个实现是通过post-commit这个钩子,关于其他钩子可以参考这个资料 http://blog.csdn.net/deepwishly/article/details/5366757

post-commit.bat

C:\wamp\bin\php\php5.3.13\php.exe -f C:\SVN\test-SVN\hooks\trigger-update.php

trigger-update.php

$svn = 'test-SVN';
$svn_slave = array(
    "http://10.10.5.11/{$svn}/svn/",
    "http://10.10.3.211/{$svn}/svn/",
);
foreach( $svn_slave as $single ) {
    file( $single );
}

总而言之就是向配置好的svn站点 svn目录 发送一个请求就可以了

而各个服务器上的svn/index.php均为

define('APP_PATH', 'E:\\wamp\\www\\test-SVN');
echo exec('svn update ' . APP_PATH);
exit;

总结一下

  • 通过php执行cmd的方式更新自身版本,每个版本都必须将svn目录放到自身目录下 也就是说暴露出来 也可以通过浏览器直接访问该文件来实现更新 这样是有好处也有坏处 但安全性上可以做得更严密点 比如判断请求的IP或者加上令牌验证等等
  • svn版本库上需要发出请求,正如上面这个方案用的是php脚本但是若果svn服务器不具备php环境的话也可以使用其他语言来达到一样的效果
  • 需要调用exec命令,这有可能给服务器带来不太安全的因素
  • 无可否认还有很多优化的余地