专注系统运维、网络架构,研究技术解决方案,记录我的思想轨迹、工作学习、生活和关注的领域
分类: LINUX
2012-05-18 16:35:02
昨日在与同事讨论如何将测试服务器上的数据同步到生产环境,前提是利用SVN来操作,当SVN更新到测试机上的代码,经过测试后,没有问题,那么就同步到生产环境,是否有SVN有一个操作可以分别完成这两个步骤呢?
在我以往搭建的SVN服务器中,提交后自动更新到测试机,可以用“钩子”来完成,只需要在hooks处理post-commit添加SVN的相关操作,包括:update、checkout、export等。当然也可以写入脚本。
我的想法也是想通过脚本同步到生产环境,但是SVN怎样触发这不同的动作呢?
第一:
是否可以通过SVN提交的不同动作来实现,如注释。查阅了相关资料,确实SVN没有这种功能,但SVN客户端可以配置选项来实现,如当前的动作是触发不同“钩子”,“钩子”写入不通的触发脚本。这样既复杂、又不易操作,完全PASS。
第二:
不修改SVN客户端的配置文件,让默认的提交动作使用同一个“钩子”,然后在里面写入更新到测试服务器和生产环境的脚本。测试服务器SVN每次更新都要求会执行,同步到生产环境必须通过读取代码中的一个文件值作判断,比如当文件内容为1,则脚本中断,为2脚本执行同步。这样,当要同步到生产环境,修改文件值就ok了。
这种方法确实可以实现,但我认为很少有人会用到这个方法吧,毕竟不能确保同步到生产环境不出问题。
最后补充下关于SVN更新操作的相关资料:
前言:其实利用SVN实时同步到WEB服务器即时展现出来的文章已经到处都是,但是我在做的时候 还是有不少的小问题,很多文章也没有提出来过,还有同步也是,我还是记录下自己做过的尤其是一些细节,时间一长又会忘掉了。
同步程序思路:用户提交程序到SVN,SVN触发hooks,按不同的hooks进行处理,这里用到的是post-commit,利用post-commit到代码检出到SVN服务器的本地硬盘目录,再通过rsync同步到远程的WEB服务器上。
知识点:
1、SVN的hooks
# start-commit 提交前触发事务
# pre-commit 提交完成前触发事务
# post-commit 提交完成时触发事务
# pre-revprop-change 版本属性修改前触发事务
# post-revprop-change 版本属性修改后触发事务
通过上面这些名称编写的脚本就就可以实现多种功能了,相当强大。
2、同步命令rsync的具体参数使用
3、具有基个语言的编程能力bash python perl都可以实现
post-commit具体实现细节
post-commit脚本
#!/bin/sh
# -------------------------------------------------------------------------------
# Filename: post-commit # Revision: 1.0
# Date: 2009/03/20
# Author: Ajian
# Email: ajian521
#gmail.com
# Website:
# Description: WEB server with synchronization code by SVN
# -------------------------------------------------------------------------------
# Copyright: 2009 (c) Ajian
# License: GPL #
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty
# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# -------------------------------------------------------------------------------
#Version 1.0
#When users submit finished code, put the code up-to-date detection and synchronization to the WEB server, taking care not to include the delete operation.
#Set variable SVN=/usr/bin/svn WEB=/home/test_nokia/ RSYNC=/usr/bin/rsync LOG=/tmp/rsync_test_nokia.log WEBIP="192.168.0.23" export LANG=en_US.UTF-8
#update the code from the SVN $SVN update $WEB --username user --password password
#If the previous command completed successfully, to continue the following if [ $? == 0 ] then echo "" >> $LOG echo `date` >> $LOG echo "##############################" >> $LOG chown -R nobody:nobody /home/test_nokia/
#Synchronization code from the SVN server to the WEB server, notes:by the key $RSYNC -vaztpH --timeout=90 --exclude-from=/home/svn/exclude.list $WEB root@$WEBIP:/www/ >> $LOG fi
以上是具体的post-commit程序利用SVN的钩子还可以写出很多的程序来控制SVN 如代码提交前查看是否有写日志,是否有tab,有将换成空格,是否有不允许上传的文件,是否有超过限制大小的文件等等。