利用svn的hooks配合rsync进行代码同步发布

[文档申明]

作者:@ 二毛哥

时间:2014-12-06

本文档记录了需求解决的全过程,仅供需要使用相关技术的朋友以参考,转载请说明出处!

[背景描述]

1、公司内部有一台服务器,开发环境已搭好,内网ip是:192.168.1.234  对应的映射公网ip是:183.62.43.150

2、线上的测试服务器ip是:210.73.216.153

3、svn代码版本已部署在192.168.1.234上

4、本地和线上服务器均已部署web项目

[需求]

1、需要完成将183.62.43.150服务器上svn代码通过rsync同步到153服务器对应的web目录项目下 。

2、与此同时需要把234的svn更新的代码同步到该服务器上对应的web项目目录。

[技术实现]

1、需要做svn的hooks程序

2、需要完成rsync的配置与同步

[过程记录]

1、约定svn的对应的子项目版本库的路径是:/Data/apps/svndata/chonggou/

2、进入上述目录  

#cd /Data/apps/svndata/chonggou/

 

3、 查看该目录结构

如上图所示,hooks目录里面存放着svn的各种动作触发脚本(shell),那么我们展开一下hooks看下里面的文件

#cd hooks
#ll

post-commit就是代码有提交且生成新的版本后触发的脚本程序,默认是木有这个文件的,但是有个post-commit.tmpl(这个就是参考的模板文件),如是:

#vi post-commit

进入vi编辑器后按下键盘上的i键进入插入模式,开始编写shell脚本

#!/bin/bash

REPOS="$1" 
REV="$2" 
BASEPATH=/Data/svn_hooks_cf
WEBPATH="$BASEPATH/"
export LC_ALL=en_US.UTF-8
export LANG=zh_CN.UTF-8

#重新检出svn版本
/usr/bin/svn export file:///Data/apps/svndata/chonggou /Data/svn_hooks_cf/ --force --username root --password muzhiwanroot#@$

#删除配置文件
rm -rf /Data/svn_hooks_cf/application/config/

#删除swf插件目录
rm -rf /Data/svn_hooks_cf/swfupload/

先写入测试的脚本,让hooks能正常工作,本地修改一个文件测试下然后到服务器检查是否在 /Data/svn_hooks_cf/目录下正常checkout的代码了(当然前提是这个目录初始内容为空),通过测试后那么咱们就完成了第一个关键点了。

4、接下来需要配置rsync的同步程序了

两台机器上分别需要安装好rsync,至于安装步骤本文档则略去,网上比较多教程都可以参考。

假定客户端(183.62.43.150)和服务器端(210.73.216.153)都已经安装了rsync

第一步、分别修改两台机器上的配置文件 /etc/xinetd.d/rsync

(客户端)

cat /etc/xinetd.d/rsync

(服务端)

#cat /etc/xinetd.d/rsync

第二步、服务器端修改(加入没有就新增)/etc/rsync.conf

# vi /etc/rsync.conf

进入vi后插入以下代码:

uid = root
gid = root
user chroot = no
max connections = 200
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log
[web]
path = /Data/svn_hooks_cf/ 
ignore errors  
read only = no  
list = no  
hosts allow = 183.62.43.150/255.255.255.0
auth users = root
secrets file = /etc/rsyncd.password

编写这个配置的时候注意格式问题,比如注释不规范的、多余的空格之类的问题会造成下一步同步不成功的情况!

*为了不影响配置文件几个重要的注释地方拉到下面说明:

*uid 和 gid 分别指定rsync的用户和组(你# ps aux | grep rsync就可以查出来哪个用户在使用这个服务)

*[web]制定了服务的模块,客户端使用命令的时候要用到

*secrets file=  这一项制定服务器端的用户密码

解释完,继续

现在需要新增密码文件了

# vi /etc/rsyncd.password

vi中输入:

root:xxxxxxx

root(用户):xxxxxxx(密码)

chmod -R 0600 /etc/rsyncd.password

切记,一定要赋予上面的密码文件以0600的权限,否则容易出现验证不通过的报错!!!


接着我们需要启动服务器端的rsync服务,命令如下:

# /usr/local/rsync/bin/rsync --daemon --config=/etc/rsync.conf

检查是否启动:

# ps aux | grep rsync

说明rsync服务启动成功!

第三步、需要设置客户端的密码

# vi /etc/rsyncd.password

vi中输入:

xxxxxxx

这里注意啊,只需要输入密码就OK了,不需要加入任何其他的符号或者字符!同理,这个文件的权限也需要设置为0600!!!

# chmod -R 0600 /etc/rsyncd.password/

第四步、测试rsync从客户端传代码到服务器端的功能是否正常,进入客户端命令行输入下面的命令

# rsync -auv /Data/svn_hooks_cf/* root@210.73.216.153::web --password-file=/etc/rsyncd.password

然后到服务器端检测目录下是否新增了许多文件?

那么到这里rsync功能已经配置成功了,接下来我们要完善第一步的post-commit脚本了:

#!/bin/bash

REPOS="$1" 
REV="$2" 
BASEPATH=/Data/svn_hooks_cf
WEBPATH="$BASEPATH/"
export LC_ALL=en_US.UTF-8
export LANG=zh_CN.UTF-8

#重新检出svn版本
/usr/bin/svn export file:///Data/apps/svndata/chonggou /Data/svn_hooks_cf/ --force --username root --password muzhiwanroot#@$

#删除配置文件
rm -rf /Data/svn_hooks_cf/application/config/

#删除swf插件目录
rm -rf /Data/svn_hooks_cf/swfupload/

#开始同步文件
rsync -auv /Data/svn_hooks_cf/* root@210.73.216.153::web --password-file=/etc/rsyncd.password

接下来就在本地找个文件修改下,然后检测本地的代码提交到svn后是不是正常同步到线上服务器了?哈哈,这样一来就完全省略掉了手工同步的人力省了大量的琐碎时间让开发人员把更多的精力放到业务层了,\(^o^)/~

posted @ 2014-12-06 15:01  男孩二毛  阅读(417)  评论(1)    收藏  举报