1.场景说明

任何一种方法都是为了解决或改进现有的问题。随着SVN服务器版本库增多,代码量增多,随之而来的就面临着SVN服务器压力的问题。为了开发测试,一般在每个版本库的hooks下配置个钩子,来实现代码自动同步,如:http://www.ttlsa.com/html/1047.html

这种方案是客户端每一次commit操作触动post-commit脚本执行,将代码update到本地后,再rsync到测试环境下。这存在潜在的问题,如磁盘IO,客户端提交时间(监控改变的目录,仅仅对改变的目录进行update操作比对整个项目进行update操作快)。

for dir in `svnlook dirs-changed /www/www.ttlsa.com`

do

svn update -N /www/project/$dir

done

2.思路说明

将checkout/update操作转移到其他服务器上进行,比如测试环境下。客户端每一次commit操作仅仅是发送一次update操作命令,交由相关的服务器去完成你所要进行的操作。

可以采用SVN+Gearman来实现上述功能,解决面临的问题。

3.环境设置

a.: http://www.ttlsa.com/html/category/os/web-application/svn

b.: http://www.ttlsa.com/html/category/os/distributed-software-systems/distributed-processing-systems/gearman-distributed-processing-systems

c.Peal相关模块安装,如Gearman::Worker,Gearman::Client,JSON等等

4.实现步骤

a). Gearman Worker如下:(在测试服务器下运行)

[sourcecode language="perl"]

#!/usr/bin/perl

#

############################

# author: www.ttlsa.com

# QQ群: 39514058

# E-mail: service@ttlsa.com

#############################

#

use JSON;

use strict;

use Gearman::Worker;

#

my $worker=new Gearman::Worker;

$worker->job_servers(’192.168.1.111:4730′);

$worker->register_function(work_SVNUPDATE_01=>\&svnupdate);

$worker->work while 1;

#

sub svnupdate{

my $job=shift;

my $json=JSON->new->allow_nonref;

my $hash_ref = $json->decode($job->arg);

my $repo=$$hash_ref{‘repo’};

my $user=$$hash_ref{‘user’};

my $password=$$hash_ref{‘password’};

chdir "/www/web";

if ( -e -d "/www/web/$repo"){

system("svn up /www/web/$repo –username=$user –password=$password –no-auth-cache");

system("chown -R nobody.nobody /www/web/$repo");

}else{

system("svn co svn://192.168.1.222/web/$repo –username=$user –password=$password –no-auth-cache");

system("chown -R nobody.nobody /www/web/$repo");

}

}

[/sourcecode]

b). Gearman Client如下:(每个项目hoods下)

[sourcecode language="php"]

/*

############################

# author: www.ttlsa.com

# QQ群: 39514058

# E-mail: service@ttlsa.com

#############################

*/

#!/usr/bin/php

<?php

$args=array(‘repo’=>’www.ttlsa.com’,

‘user’=>’root’,

‘password’=>’www.ttlsa.com’);

$arg=json_encode($args);

$gearman_client = new GearmanClient();

$gearman_client->setTimeout(1000);

$gearman_client->addServers(’192.168.1.111:4730′);

$gearman_client->addTaskBackground("work_SVNUPDATE_01", $arg);

$gearman_client->runTasks();

?>

[/sourcecode]

注意:

a. Gearman Client是使用php来实现的。 Perl添加异步任务不成功,会一直等待worker响应。

b. 要添加异步任务。如果添加同步任务的话,会阻塞的。

[root@NServer02 iso]# cp  -rp  p_w_picpaths /media/dat