原理:在svn服务端编写post-commit钩子,当svn客户端更新svn时,服务端会自动执行钩子脚本,在web目录自动执行svnup命令同步最新文件。
1.搭建svn服务
sudo yum install -y subversion
sudo mkdir -p /data/svn/repositories
sudo svnadmin create /data/jrjsrv/svn/repositories
cd /data/jrjsrv/svn/repositories/conf
sudo vim authz
在尾部加入
[/]
qiang.deng=rw
sudo vim passwd
加入
[users]
qiang.deng=123456
sudo vim svnserve.conf
加入
[general]
anon-access=none
#使授权用户有写权限
auth-access=write
##密码数据库的路径
password-db=passwd
##访问控制文件
authz-db=authz
##认证命名空间,subversion会在认证提示里显示,并且作为凭证缓存的关键字
realm=/data/svn/repositories
启动svn服务:
sudo svnserve -d -r /data/svn/repositories
2.客户端向svn://192.168.1.1/project(服务器地址)导入项目源码
3.在web目录签出文件
sudo svn co svn://192.168.1.1 /data/www/htdocs
4. 编写钩子脚本
sudo vim /data/svn/repositories/hooks/post-commit
#!/bin/sh
REPOS="$1"
REV="$2"
export.UTF-8 #字符集,与服务器一致,可执行locale命令查看
WEB_PATH=/data/www/htdocs/
echo `date`,`whoami`,$REPOS,$REV >> /data/svn/repositories/hooks/svn_hook.log
svn update svn://192.168.1.1/ $WEB_PATH --username qiang.deng --password 123456 --no-auth-cache
chown -R apache:apache /data/www/htdocs/
chmod -R 755 /data/www/htdocs/
如果要同步多台服务器的web目录,可以使用rsync命令,如下
#!/bin/sh
REPOS="$1"
REV="$2"
export.UTF-8 #字符集,与服务器一致,可执行locale命令查看
WEB_PATH=/data/www/htdocs/
echo `date`,`whoami`,$REPOS,$REV >> /data/svn/repositories/hooks/svn_hook.log
svn update svn://192.168.1.1/ $WEB_PATH --username qiang.deng --password 123456 --no-auth-cache
cd /data/www/htdocs/
/usr/bin/rsync --timeout=30 -Ravz --exclude-from=/data/svn/repositories/exclude/htdocs.list ./* 192.168.1.2::htdocs
/usr/bin/rsync --timeout=30 -Ravz --exclude-from=/data/svn/repositories/exclude/htdocs.list ./* 192.168.1.3::htdocs
chown -R apache:apache /data/www/htdocs/
chmod -R 755 /data/www/htdocs/
htdocs.list是存放不被同步的文件,包括子目录下出现此类文件都不会被同步
往htdocs.list加入
.svn
这样只要包含.svn的目录都不会被同步
5.体验与感想:
使用这种方式部署代码非常方便,开发调试起来感觉很棒,只用提交客户端即可自动部署。多人同时开发因为在svn控制下也不会出现代码覆盖的情况。但是由于目录下的svn文件容易暴露,以上面的例子,不能把192.168.1.1作为生产环境服务器,但是192.168.1.2、192.168.1.3却不存在这个问题,这时候我们可以把192.168.1.1作为只能内部访问的环境,可以随时在上面排查线上问题。