天天看点

用SVN钩子实现SVN与WEB测试服务器同步

多人开始使用subversion之后,就想着,要建立一个测试用的服务器,不需要把文件update到本地再进行测试。

原理:基于subversion的钩子,即hook(在每个版本库下有hooks文件夹,里面有很多钩子程序)。在subversion执行一个操作时, 那会相应的首先去调用相关的钩子程序(如果存在的话)。那么实现一个同步的测试服务器,我们只需要在一个用户执行完毕一个commit操作之后,让钩子程序去自动更新测试服务器的文件即可。通过这个思路,我们需要作的就是建立一个post-commit的钩子。

用SVN钩子实现SVN与WEB测试服务器同步

1.页面同步按钮触发

update_develop_svn.sh

用SVN钩子实现SVN与WEB测试服务器同步

#!/bin/sh  

svn=/usr/bin/svn  

web=$1  

wwwroot=/data/www/wwwroot/test.com/  

svntmp=/data/www/svntmp/test.com/  

if [ ! -d "${wwwroot}${web}" ]; then  

      echo "arg error"  

      exit  

fi  

#export lang =en_us.utf-8  

$svn update $svntmp$web  --username *** --password **  

/cp -rv $svntmp$web $wwwroot #svn更新文件复制到项目中  

find $wwwroot$web -type d -name ".svn" | xargs rm -rf #先(递归)找到当前路径下含有 .svn的文件目录  

chown www.www $wwwroot$web -r  

php执行shell,网页可以访问

用SVN钩子实现SVN与WEB测试服务器同步

<?php  

if (isset($_post['submit3']) &&$_post['submit3']){  

    shell_exec("./update_develop_svn.sh");// exec("./update_develop_svn.sh",$output);  

}  

?>  

<form name="form3" method="post" action="">  

    <meta http-equiv="content-type" content="text/html; charset=utf-8">  

    <label>  

        <input name="submit3" type="submit" id="submit3" value="同步" onclick="return confirm('确认需要同步?')">  

    </label>  

</form>  

2.windows自动更新

on a windows system, you should name the hook program 'post-commit.bat' or 'post-commit.exe',

在svn项目demo\hooks下面,新建post-commit.bat文件

用SVN钩子实现SVN与WEB测试服务器同步

@echo off  

"c:\svn\bin\svn.exe"  update "c:\htdocs\demo" --quiet  --username xxx --password xxxx  

3.linux自动更新

 项目库的 hooks/ 目录下新建 post-commit 文件

用SVN钩子实现SVN与WEB测试服务器同步

#!/bin/sh   

svn=/usr/bin/svn           #这里配置的是svn安装bin目录下的svn文件   

web=/var/www/html/test     #要更新的目录   

$svn update $web --username xxx --password xxx   

让post-commit有执行的权限,并将checkout的项目相关权限和宿主改一下

用SVN钩子实现SVN与WEB测试服务器同步

chmod 777 post-commit  

chown -r www:www ./.svn  

chown -r www:www ./.svn/*  

chown -r www:www ./.svn/  

chown -r www:www ./  

 以上的实现原理参考hooks/post-commit.tmpl文件