svn源码同步hooks

来源:互联网 发布:ees软件下载 编辑:程序博客网 时间:2024/05/04 20:09

一、安装
#yum install subversion
检查是否安装了svn
#subversion –v
创建svn库和对应的目录
#mkdir /svn/www.test.com
#svnadmin create /svn/www.test.com
二、配置
创建登录svn的用户和密码
#vim /svn/www.test.com/conf/passwd
[users]
用户名=密码
设置svn用户权限
#vim /svn/www.test.com/conf/authz
[/]#这里应该是相对于当前的svn目录根目录
用户名=rw
设置svn主配置文件
#vim /svn/www.test.com/conf/svnserve.conf 
anon-access=none #使非授权用户无法访问
auth-access=write #使授权用户有写权限
password-db=password
authz-db=authz #启用访问控制文件
realm=/svn/www.test.com #认证命名空间,subversion会在认证提示里显示,并且作为凭证缓存的关键字。
启用svn:#svnserve –d –r /svn/www.test.com
注可以用—listen-port 参数修改svn的端口
三、连接svn
1、linux主机连接svn
#svn co svn://192.168.1.180
输入用户名和密码后就可以将svn上的数据下载到本地。
2、windows主机连接svn
利用TortoiseSVN工具进行连接。
四、利用svn的post-commit将svn服务器的文件同步更新到固定的目录
先checkout至网站web目录
cd /var/www/wxcart
svn checkout svn://192.168.0.10/wxcart
输入创建svn版本库时的用户名和密码!
进入svn版本库的钩子目录
#cd /svn/www.test.com/hooks
#cp post-commit.tmpl post-commit
钩子文件添加权限
#chmod 777 post-commit
网站web目录添加权限
#chmod 777 /var/www/wxcart
编辑post-commit钩子脚本
#vim post-commit
export LANG=zh_CN.UTF-8 #设定环境变量,如果没有设定可能会出现update报错
/usr/bin/svn update /var/www/wxcart --username user1 --password 123456 --no-auth-cache
注:WEB中指定的目录不能为空目录,需要先checkout
 

我的post-commit文件内容为

#!/bin/sh 
export LANG=zh_CN.GBK
/usr/bin/svn update --username lxy --password 123456 /var/www/myproject


报错注解,及解决办法:
1、
svn: Error converting entry in directory '/usr/local/apache/htdocs/192.168.1.180' to UTF-8
svn: Can't convert string from native encoding to 'UTF-8':
svn: ?\229?\164?\141?\228?\187?\182 ?\229?\164?\141?\228?\187?\182 ?\229?\164?\141?\228?\187?\182 ?\229?\164?\141?\228?\187?\182 rsync-3.0.9.tar.gz
原因:svn服务器上的文件存在编码为UTF-8的文件,如果服务器不支持UTF-8编码就会报这个错误。
解决办法:在post-commit钩子脚本中,添加export LANG=zh_CN.UTF-8字段,更改环境变量中的编码。
2、
Skipped '/usr/local/apache/htdocs/192.168.1.180'
这个时候使用命令svn update命令会提示
Skipped ‘.’
原因:192.168.1.180是一个空目录或这个目录不存在
解决办法:先进行手工的checkout,之后再post-commit中将目录指定到checkout的目录,就解决了。

本文出自 “空の心” 博客,请务必保留此出处http://songknight.blog.51cto.com/2599480/742725




知识点:
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脚本

#Set variableSVN=/usr/bin/svnWEB=/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,有将换成空格,是否有不允许上传的文件,是否有超过限制大小的文件等等。





一、提交代码后在web上立即看到效果
其实原理很简单,就是利用svn的钩子:post-commit,在提交过后想做什么在这个脚本里就写什么。
假设我们的SVN目录是:/home/svn
我们需要同步的web目录是:/home/www/web(前提,这个web目录也是从svn里面检出的)

post-commit
#!/bin/sh
REPOS="$1"
REV="$2"/home/svn/repos/hooks/sync-web.sh $@


sync-web.sh
代码: 全选 #!/bin/sh
REPOS="$1"
REV="$2"
cd /home/www/web 2>&1 >> /tmp/svn.log
sudo /usr/local/bin/svn up 2>&1 >> /tmp/svn.log

二、提交时验证PHP语法
验证语法当然是在代码提交到仓库之前做的事情,所以要使用SVN的钩子:pre-commit

pre-commit
代码: 全选 #!/bin/sh
REPOS="$1"
TXN="$2"

#svn提交时有个参数 -m 用来记录提交信息,下面这一段是为了验证提交信息长度(规范操作嘛,否则svn里真的是一堆垃圾了)
LOGMSG=`svnlook log -t "$TXN" "$REPOS"|grep "[a-zA-Z0-9]"|wc -c`
if [ "$LOGMSG" -lt 9]; then
echo $LOGMSG 1>&2
echo -e "\nLog message is too short" 1>&2
exit 1
fi

# 用当前目录下的syntax-check脚本验证语法
source `dirname $0`/syntax-check

# All checks passed, so allow the commit.
exit 0


syntax-check脚本是从网上找的,我就不复制了,直接传文件了。
 syntax-check.zip PHP语法检查脚本


另外,SVN还有其他可以用的钩子:post-lock,post-revprop-change,post-unlock,pre-lock,pre-revprop-change,pre-unlock,start-commit。具体怎么用,看文档吧。