利用SVN钩子同步程序注意事项

昨日在与同事讨论如何将测试服务器上的数据同步到生产环境,前提是利用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: www.ohlinux.com

# 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/rsyncLOG=/tmp/rsync_test_nokia.logWEBIP="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 followingif [ $? == 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/ >> $LOGfi

以上是具体的post-commit程序


注意事项:
1、一定要定义变量,主要是用过的命令的路径。因为SVN的考虑的安全问题,没有调用系统变量,如果手动执行是没有问题,但SVN自动执行就会无法执行了。
2、SVN update 之前一定要先手动checkout一份出来,还有这里一定要添加用户和密码 如果只是手动一样会更新,但自动一样的不行。
3、加上了对前一个命令的判断,如果update的时候出了问题,程序没有退出的话还会继续同步代码到WEB服务器上,这样会造成代码有问题
4、记得要设置所属用户,因为rsync可以同步文件属性,而且我们的WEB服务器一般都不是root用户,用户不正确会造成WEB程序无法正常工作。
5、建议最好记录日志,出错的时候可以很快的排错
6、最后最关键的数据同步,rsync的相关参数一定要清楚,这个就不说了。注意几个场景:

这里的环境是SVN服务器与WEB服务器是开的
把SVN服务器定义为源服务器 WEB服务器为目的服务器

场景一、如果目的WEB服务器为综合的混杂的,像只有一个WEB静态资源,用户提交的,自动生成的都在WEB的一个目录下,建议不要用--delete这个参数
上面这个程序就是这样,实现的是源服务器到目的服务器的更新和添加,而没有删除操作,WEB服务器的内容会多于源SVN的服务器的

场景二、实现镜像,即目的WEB服务器与源SVN服务器一样的数据,SVN上任何变化WEB上一样的变化,就需要--delete参数

场景三、不需要同步某些子目录,可能有些目录是缓存的临时垃圾目录,或者是专用的图片目录(而不是样式或者排版的)要用exclude这个参数

注意:这个参数的使用不用写绝对路径,只要目录名称就行 aa代表文件 aa/ 代表目录 ,缺点就是如果有多个子目录都是一样的名称 那么这些名称就都不会被同步

建议用--exclude-from=/home/svn/exclude.list 用文件的形式可以方便的添加和删除
exclude.list
.svn/.DS_Storeimages/

利用SVN的钩子还可以写出很多的程序来控制SVN 如代码提交前查看是否有写日志,是否有tab,有将换成空格,是否有不允许上传的文件,是否有超过限制大小的文件等等。


使用SVN update的目标目录必须先check out一下,否则也会被skip。
如果系统使用中文环境,别忘了加utf8编码选项。
也就是这样

SVN官方库中有好多hook脚本。利用hook机制可以实现很多功能。比如SVN更新邮件通知等

# For more examples and pre-written hooks, see those in
# the Subversion repository at
# http://svn.collab.net/repos/svn/trunk/tools/hook-scripts/ and
# http://svn.collab.net/repos/svn/trunk/contrib/hook-scripts/


安全问题:

这样过去的目录会存在.svn目录,造成安全隐患
可以使用apache的RedirectMatch来保证安全。
例如:

RedirectMatch 301 (.*)\.svn(.*) http://g.cn/$1


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SVN上传文件的大小没有固定的限制,但是在实际使用中,建议限制单个文件的大小不要超过100M,否则会对版本库的性能和稳定性产生影响。 如果需要限制上传文件的大小和类型,可以通过使用Svn钩子实现。Svn钩子是一种机制,可以在版本库中的特定事件发生时触发脚本或程序。通过Svn钩子,可以实现对提交文件的大小和类型进行限制。 具体实现方法如下: 1. 编写限制上传文件大小和类型的脚本或程序。 2. 将脚本或程序保存在版本库的hooks目录下,并将其命名为pre-commit。 3. 给pre-commit文件添加可执行权限。 4. 在pre-commit文件中添加代码,以调用限制上传文件大小和类型的脚本或程序。 例如,以下是一个限制上传文件大小和类型的Python脚本(需要安装Python3): ```python #!/usr/bin/env python3 import os import sys # 限制上传文件的大小为100M MAX_SIZE = 100 * 1024 * 1024 # 限制上传文件的类型为txt和md ALLOWED_TYPES = ['.txt', '.md'] def check_file_size(path): size = os.path.getsize(path) if size > MAX_SIZE: print('File size exceeds limit: %s' % path) return False return True def check_file_type(path): _, ext = os.path.splitext(path) if ext.lower() not in ALLOWED_TYPES: print('File type not allowed: %s' % path) return False return True def main(argv): for path in argv: if not check_file_size(path) or not check_file_type(path): sys.exit(1) if __name__ == '__main__': main(sys.argv[1:]) ``` 在pre-commit文件中添加以下代码: ```bash #!/bin/sh REPOS="$1" TXN="$2" python3 /path/to/your/script.py "$REPOS"/"$TXN"/changes exit 0 ``` 其中,/path/to/your/script.py为限制上传文件大小和类型的Python脚本的路径。 这样,当用户提交文件时,Svn钩子会先调用pre-commit文件,pre-commit文件会再调用限制上传文件大小和类型的Python脚本进行检查,如果文件大小或类型不符合要求,提交操作就会失败。 注意,在使用Svn钩子时,需要注意以下几点: - Svn钩子只在服务器端生效,不会在客户端生效。 - Svn钩子是通过调用脚本或程序实现的,因此需要确保脚本或程序能够正确地执行。 - Svn钩子只能限制提交操作,无法限制其他操作,如更新、删除等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值