hook代码 svn_使用SVN的hook将更新内容同步到测试环境

我们在开发的过程将代码提交到SVN后使用SVN的hook,通过post-commit脚本,在目标文件夹根下执行svn update操作,将更新内容同步到测试环境,这样开发调试非常方便。

现在SVN库的文件数量越来越多,svn 本地的目录已经3个多G了,几十万个文件,在目标文件夹下执行svn update进行更新速度也就越来越慢了,常常提交之后SVN客户端会等几分钟没有响应,在没有响应的时间内,无法再继续提交内容。如果使用zendstudio进行提交的话,所有保存的操作都要等这个SVN提交完成才能继续。

原post-commit内容:

——————————————–

#!/bin/sh

REPOS=”$1″

REV=”$2″

WEB=/data/web

FRAMEWORK=/data/framework

export LC_ALL=zh_CN.UTF-8

a=`svn update $WEB $FRAMEWORK /data/conf /data/shell –username x*******i –password ******* | grep ‘nginx\.conf’`

if [ -n "$a" ]

then

kill -HUP `cat /dev/shm/nginx.pid`

fi

chown -R www.www $WEB &

———————————————–

我们主要做了以下几个工作:

1、SVN更新后,同步在/data/web、/data/framework、/data/conf、 /data/shell 4个文件夹在下执行svn update命令进行同步更新操作。

2、如果/data/conf/nginx.conf文件修改了,那么重启nginx。

3、将所有/data/web目录下的文件所有者和组都变成www。

原因在于:

1、提交的SVN的时候,4个文件在根下进行更新,文件数量巨大响应非常慢。

2、chown的操作也是比较浪费。

解决的想法:

对有变化的文件进行 svn update 这样更有效率。

解决的思路:

1、得到本次提交更新的文件。

2、在目标目录中更新指定的文件。

3、同时将指定文件所有者和组变成www。

4、使用PHP程序当shell来完成这样的工作。

最后的成果是巨大的,现在svn提交已经是飞一样的快了,要知道svn 本地的目录已经3个多G了,几十万个文件。

实现步骤:

1、得到更新的文件。

通过分析我们发现post-commit脚本有两个变量

# 库的路径

REPOS=”$1″

# 新提交的版本号

REV=”$2″

通过这样的操作就可以得到本次更新的内容与文件。

changed=$(svnlook changed -r $REV $REPOS)

2、将得到的本次更新的内容提交给PHP脚本来处理,分析哪些文件发生变化。

/usr/local/php/bin/php-cgi -q /data/shell/svn_post_commit_resources.php “$changed” &

用PHP分析出哪些文件发生变化后,构造shell命令,由PHP调用shell命令进行更新。

3、相关脚本:

最新的post-commit文件内容:

————————————-

#!/bin/sh

# 库的路径

REPOS=”$1″

# 新提交的版本号

REV=”$2″

WEB=/data/web

FRAMEWORK=/data/framework

export LC_ALL=zh_CN.UTF-8

changed=$(svnlook changed -r $REV $REPOS)

log=$(svnlook log -r $REV $REPOS)

n=$’\n’

/usr/local/php/bin/php-cgi -q /data/shell/svn_post_commit_resources.php “$changed” &

————————————–

处理更新内容,执行更新命令的PHP脚本文件 svn_post_commit_resources.php 的内容:

—————————————–

$files = explode("\n", $argv[1]);

if (!is_array($files)) {$files=(array)$files;};

foreach ($files as $v)

{

// 取文件名

$f_tem = trim(substr($v, 2));

// 取最顶层目录名

$d_tem = substr($f_tem, 0, strpos($f_tem, '/'));

if (!in_array($d_tem, array('web', 'framework', 'conf', 'shell'))) {

continue;

}

// SVN copy 对应的文件

$f_name = '/data/' . $f_tem;

$cmd = "svn update '$f_name' --username x****i --password K****$;chown www.www '$f_name'";

exec($cmd);

if (strpos($f_tem, 'nginx.conf')) {

exec("kill -HUP `cat /dev/shm/nginx.pid`");

}

}

exit();

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值