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.SVN安装以及相关内容参见: http://www.ttlsa.com/html/category/os/web-application/svn
b.Gearman Server安装,PHP扩展以及相关内容参见: 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: [email protected]
#############################
#
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 �Cusername=$user �Cpassword=$password �Cno-auth-cache");
system("chown -R nobody.nobody /www/web/$repo");
}else{
system("svn co svn://192.168.1.222/web/$repo �Cusername=$user �Cpassword=$password �Cno-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: [email protected]
#############################
*/
#!/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 images /media/dat