这种方案是客户端每一次commit操作触动post-commit脚本执行,将代码update到本地后,再rsync到测试环境下。这存在潜在的问题,如磁盘IO,客户端提交时间(监控改变的目录,仅仅对改变的目录进行update操作比对整个项目进行update操作快)。
1 2 3 4 | 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如下:(在测试服务器下运行)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #!/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”); } } |
b). Gearman Client如下:(每个项目hoods下)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /* ############################ # 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(); ?> |
注意:
a. Gearman Client是使用php来实现的。 Perl添加异步任务不成功,会一直等待worker响应。
b. 要添加异步任务。如果添加同步任务的话,会阻塞的。