1.场景说明
任何一种方法都是为了解决或改进现有的问题。随着SVN服务器版本库增多,代码量增多,随之而来的就面临着SVN服务器压力的问题。为了开发测试,一般在每个版本库的hooks下配置个钩子,来实现代码自动同步,如:https://www.ttlsa.com/html/1047.html文章源自运维生存时间-https://www.ttlsa.com/gearman/svn-gearman/
这种方案是客户端每一次commit操作触动post-commit脚本执行,将代码update到本地后,再rsync到测试环境下。这存在潜在的问题,如磁盘IO,客户端提交时间(监控改变的目录,仅仅对改变的目录进行update操作比对整个项目进行update操作快)。文章源自运维生存时间-https://www.ttlsa.com/gearman/svn-gearman/
for dir in `svnlook dirs-changed /www/www.ttlsa.com` do svn update -N /www/project/$dir done
2.思路说明文章源自运维生存时间-https://www.ttlsa.com/gearman/svn-gearman/
将checkout/update操作转移到其他服务器上进行,比如测试环境下。客户端每一次commit操作仅仅是发送一次update操作命令,交由相关的服务器去完成你所要进行的操作。文章源自运维生存时间-https://www.ttlsa.com/gearman/svn-gearman/
可以采用SVN+Gearman来实现上述功能,解决面临的问题。文章源自运维生存时间-https://www.ttlsa.com/gearman/svn-gearman/
3.环境设置文章源自运维生存时间-https://www.ttlsa.com/gearman/svn-gearman/
a.SVN安装以及相关内容参见: https://www.ttlsa.com/html/category/os/web-application/svn文章源自运维生存时间-https://www.ttlsa.com/gearman/svn-gearman/
b.Gearman Server安装,PHP扩展以及相关内容参见: https://www.ttlsa.com/html/category/os/distributed-software-systems/distributed-processing-systems/gearman-distributed-processing-systems文章源自运维生存时间-https://www.ttlsa.com/gearman/svn-gearman/
c.Peal相关模块安装,如Gearman::Worker,Gearman::Client,JSON等等文章源自运维生存时间-https://www.ttlsa.com/gearman/svn-gearman/
4.实现步骤文章源自运维生存时间-https://www.ttlsa.com/gearman/svn-gearman/
a). Gearman Worker如下:(在测试服务器下运行)文章源自运维生存时间-https://www.ttlsa.com/gearman/svn-gearman/
#!/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下)文章源自运维生存时间-https://www.ttlsa.com/gearman/svn-gearman/
/* ############################ # 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(); ?>
注意:文章源自运维生存时间-https://www.ttlsa.com/gearman/svn-gearman/
a. Gearman Client是使用php来实现的。 Perl添加异步任务不成功,会一直等待worker响应。文章源自运维生存时间-https://www.ttlsa.com/gearman/svn-gearman/
b. 要添加异步任务。如果添加同步任务的话,会阻塞的。文章源自运维生存时间-https://www.ttlsa.com/gearman/svn-gearman/
文章源自运维生存时间-https://www.ttlsa.com/gearman/svn-gearman/文章源自运维生存时间-https://www.ttlsa.com/gearman/svn-gearman/
评论