关于SVN实时同步到远程服务器的方案
需求及流程简介
由于程序员协同开发,彼此之间开发习惯各有不同,经常会出现大家误删改他人代码的情况,对线上生产环境的稳定造成了极大的影响。因此特请出SVN来负责代码版本控制,以解决上述问题。
但是简单的代码控制要增加很多不必要的人工成本,如:手动提交、检出、发布、测试等,所以作为运维人员,就自然而然想到有什么办法可以让其将以上操作都自动执行完成。固有了如下需求。
1、代码commit至A服务器后,自动update到代码的working copy
2、update后需直接远程同步至B服务器进行测试
3、定期备份svn服务器代码库文件至备份服务器(此处与B公用一台)
4、待测试完毕后,通过程序控制将working copy文件,自动发布到生产环境(待开发)
以上前3步均是由系统级操作完成,第4步需要程序写出一个交互系统,来完成测试完毕发布的过程。公司里有2台测试服务器,一 台里面是开发的库文件,另一台是用来测试的。现在开发的提交了文件之后,每次需要手动的更新到另一台服务器上,很麻烦,所以有了这个方案,不过还没测试过 大量文件的时候会不会有什么问题。估计svn大量文件的时候会卡死,本文只是做一个测试,讲的是一个思路,哪位童鞋有更好的思路联系我哦。
思路:首先在SVN库服务器上建立一个目录,利用svn自带的post-commit来把提交的文件同步到该目录,然后利用sersrnc实时同步到远程的服务器。
环境:SVN服务器:192.168.2.199
Web测试服务器:192.168.2.117
首先在199上面安装svn,安装过程不再描述,在/var/svn/test建立一个test库,用import把文件上传到库里面,新建一个目录/data用checkout把该库迁出到/data目录
在199上面安装sersync
解压sersync2.4_32bit_binary.tar.gz
进入到GNU-Linux-x86目录
修改confxml.xml
修改这3行文件,
启用密码验证,指定验证用户名和密码文件的位置
然后创建/etc/rsync.pas配置文件,里面写入test用户的密码,然后更改该文件的权限为600
Chmod 600 /etc/rsync.pas
然后在192.168.2.117里面安装rsync
rsync-3.0.9.tar.gz
./configure --prefix=/usr/local/rsync && make && make install
编辑rsync的配置文件,默认位置问/etc/rsyncd.conf
uid=root //rsync运行的用户
gid=root //rsync运行的组
max connections=36000 //最大连接数
use chroot=no //不启用chroot
port=873 //端口
log file=/var/log/rsyncd.log //日志文件
pid file=/var/run/rsyncd.pid //pid文件
lock file=/var/run/rsyncd.lock //锁文件
[web] //模块的名称
path = /www/test //测试服务器网站的路径
ignore errors = yes //忽略错误
read only = no //该目录可读可写
auth users = test //需要的用户名
secrets file = /etc/rsyncd.secrets //密码文件存放的位置
然后创建/etc/rsyncd.secrets密码文件,里面写入用户名和密码可以写入多个用户
Test:test
更改该文件的权限为600 chmod 600 /etc/rsyncd.secrets
然后启动守护进程/usr/local/rsync/bin/rsync –daemon
再在192.168.2.199上面启动sersync
这个时候199上面的/data目录和117上面的/www/test目录已经同步了,在199上面更改/data目录下面的文件就会同步更新到117上面的/www/test目录里面了
现在需要做的就是如何让开发人员在提交的时候更新到测试服务器
首先在199上面把库文件迁出到/data目录下
Svn checkout svn://192.168.2.199/test /data
迁出之后,/data目录已经有文件了,这个时候去查看117上面的/www/test目录里面也是有文件的。
在test库下面有一个hooks文件夹,里面有svn的钩子
我们可以借助这个钩子来触发当提交的时候,把文件同步更新到/data目录下面,然后sersync把该文件同步到远程服务器上
在hooks目录下面
Cp pre-commit.tmpl post-commit
post-commit这个文件就是当提交之后会执行的动作,编辑该文件
vim post-commit
export LANG=zh_CN.UTF-8 //指定编码
WEB=/data/ //定义一个被更新的目录
SVN=/usr/local/subversion/bin/svn //定义SVN程序的路径
$SVN update $WEB --username wugang --password 2011110 //执行svn的update命令,后面是指定用户和密码
然后给post-commit可执行权限,然后重启svn
这个时候当svn提交的时候,会通过该脚本同步到本地服务器的/data目录,然后sersync服务会把/data目录同步到远程测试服务器的/www/test目录下面。