SEARU.ORG
当前位置:SEARU.ORG > Linux 新闻 > 正文

Svn结合hook实现自动更新及多Project管理更新

一、hook简单介绍

    为了方便管理员控制提交的过程 ,Subversion提供了hook机制。当特定的事件发生时,相应的 hook会被调用,hook其实就相当于特定事件的处理函数。每个hook会得到与它所处理的事件相关的参数,根据hook的返回值,Subversion会决定是否继续当前的提交过程

    要实际安装一个可用的钩子,你需要在 repos/hooks目录下安装一些与钩子同名(如 start-commit或者post-commit)的可执行程序或脚本。


二、本地机器SVN自动更新

1.export方式(备份)

    在使用svn客户端时,有可能需要对某一个版本进行本地备份,比如制作成压缩包进行发布,这时候需要从svn文件夹中提取出内容,去除.svn等隐藏的svn配置文件。最笨的方法拷贝一份出来,然后显示隐藏文件,把所有.svn文件夹都删掉。在svn菜单中,可以找到export命令,这个命令可以将当前svn目录中的内容干净地导出到指定的目录

    例如你版本库的svn访问地址是http://192.168.15.132:36002/svn/project1,你想把这个版本库下的/trunk/web文件夹发布到tomcat上,发布到tomcat的文件夹地址是/data/tomcat/web,svn的管理员用户名是test,密码test2016,对应的命令:svn export http://192.168.15.132:36002/svn/project1/trunk/web  /data/tomcat/web –force –username test –password test2016 –no-auth-cache

注:

–force  强制覆盖/data/tomcat/opt/web这个文件夹,避免这个文件夹不为空时报错

–username test –password test2016  自动将用户名和密码作为参数传送进去

–no-auth-cache  不缓存用户名和密码,这是出于安全考虑

  

2.update方式

修改hooks/post-commit 

#!/bin/bash

REPOS=”$1″

REV=”$2″ 

DIR=”/opt/webdir/assets”  #注意权限问题

export LC_ALL=en_US.UTF-8

export.UTF-8

CURDATE=`date`

echo “Code Deployed by at $CURDATE,$REPOS,$REV” >> /root/code_deploy.log

/usr/bin/svn update $DIR –username username –password password –no-auth-cache 2>1 /root/svn_look.log

#加上–no-auth-cache

默认使用的shell类型是sh,最好改成bash,sh是bash的子集,centos中sh其实就是软链接到bash

3.update和export比较

    update会生成一个隐藏.svn文件夹,这个文件夹是我们不需要的,如果整个发布的内容很多的话,建议还是用update,而不用export,因为update只更新有变化的部分,而export将重新导出所有内容,网络消耗比update大。


三、svn实现远程机器自动更新

首先实现A机器通过ssh无密码登陆B机器, 修改A机器的post-commit文件

/usr/bin/ssh -l root  192.168.127.183 “/bin/bash /home/www/svnup.sh”  

然后在B机器的/home/www/目录创建svnup.sh可执行文件

/usr/bin/svn update /web/root/code  

版本库提交请求的时候自动会执行post-commit脚本,post-commit脚本通过ssh让远程机器执行shell脚本自动更新svn。

##############################################################################################

四、svn配置Hook实现自动更新

单项目库管理

Svn安装(“yum install subversion -y“)

新建版本库

mkdir -p /home/svndata/webdev

svnadmin create /home/svndata/webdev

修改配置文件

配置过程:

svnserve.conf    #配置版本库信息和用户文件和用户密码文件的路径、版本库路径

anon-access = none        #默认是只读read

auth-access = write       #认证后有写入权限

password-db = passwd      #帐号密码配置文件

authz-db = authz          #权限配置文件

rrealm = My Projects       #改成自己的版本库生效范围

注意:svnserve的”realm”的值,在上面的设置下,应该保证所有的版本库使用相同的realm值(这里配置的为单版本),这样,对版本库的密码缓存可以在多个版本库之间共享,更多细节见客户端凭证缓存。

authz              #文件,创建svn组和组用户的权限

[group]

admin = test1      #创建一个admin的组,并制定两个用户testl和test2


[/]                      #指定根目录下的权限

@admin = rw              #admin组用户权限为读写

* = r                    #其他用户只有读权限

passwd   #创建或修改用户密码 

[users]

test1 = test12016

添加hook脚本文件

cd /home/svndata/webdev/hooks

复制一份post-commit.tpl文件更名为post-commit,这是提交svn版本库会触发的脚本

配置钩子触发自动更新(svn版本库和更新地址都在同一台服务器上

#!/bin/bash

export LANG=zh_CN.UTF-8

SVN=/usr/bin/svn

WEB=/usr/local/nginx/html

CURDATE=`date`

$SVN update $WEB –username test –password test2016 –no-auth-cache

echo “Deployed by at $CURDATE,`whoami`,$REPOS,$REV” >> /var/log/svn_hook.log

注释最后一行发邮件功能

添加脚本的执行权限1.8以上默认777权限,否则钩子不生效)

启动

svnserve -d -r /home/svndata/webdev/ –listen-port 3690      #通过”–listen-port”指定运行端口,这里使用默认端口,可省略

lsof -i:3690

实现SVN与WEB同步,可以checkout一个出来,也可直接配在仓库中

设置WEB服务器根目录为/home/webroot,进入/home/webroot目录

svn checkout svn://{您的服务器地址}:{端口号}/dir1 .        #注意目录后面还有一个点

注意:此处的/dir1可不需要添加(添加的目的是为了实现多个项目)

svn checkout svn://192.168.15.132:3690 .   #注意目录后面还有一个点

可以使用TortoiseSVN对测试,并实现自动更新了。

多项目库管理

mkdir -p /home/svndata/{conf,dir1,dir2,dir3}

svnadmin create /home/svndata/dir1

svnadmin create /home/svndata/dir2

svnadmin create /home/svndata/dir3

分别创建了三个项目的版本库,各版本库目录conf中存在passwd/authz/svnserve.conf文件

将第一个项目下passwd/authz文件mv到/home/svndata/conf中,其余2个项目下conf目录中的passwd和authz文件删除,同时修改三个项目中conf目录下的svnserve.conf文件

svnserve.conf配置如下

[general] 

anon-access = none 

auth-access = write 

password-db = /home/svndata/conf/passwd 

authz-db = /home/svndata/conf/authz

realm = My Project1    #后两个修改为对应的Project2/Project3

修改版本库中的conf目录下的authz文件 以配置dir1版本库为例:

passwd

[users]

admin = admin2016

a1 = a12016

b2 = b22016

c3 = c32016


authz

[groups]

admin_group = admin

user = a1,b2,c3


[dir1:/]

@admin_group = rw

@user = rw


[dir2:/]

@admin_group = rw

b2 = rw

* = r


[dir3:/]

@admin_group = rw

c3 = rw

* = r

修改对应的hook文件

cd /home/svndata/dir*/hooks

复制一份post-commit.tpl文件更名为post-commit,这是提交svn版本库会触发的脚本

配置钩子触发自动更新(svn版本库和更新地址都在同一台服务器上

#!/bin/bash

export LANG=zh_CN.UTF-8

SVN=/usr/bin/svn

DEV1=/dev/dir1

#DEV2=/test/dir2

#DEV3=/www/dir3

#对应的Project的文件夹

CURDATE=`date`

$SVN update $web –username a1 –passowrd a12016 –no-atuh-cache

#SVN update $web –username b2 –passowrd b22016 –no-atuh-cache

#SVN update $web –username c3 –passowrd c32016 –no-atuh-cache

echo  “$DEV1 Deployed by at $CURDATE,`whoami`,$REPOS,$REV” >> /var/log/svn_hook.log

#echo  “$DEV1 Deployed by at $CURDATE,`whoami`,$REPOS,$REV” >> /var/log/svn_hook.log

#echo  “$DEV1 Deployed by at $CURDATE,`whoami`,$REPOS,$REV” >> /var/log/svn_hook.log

注释最后一行发邮件功能

添加脚本的执行权限1.8以上默认777权限,否则钩子不生效)

SVN版本库起动方式,现在svndata下面有dir1、dir2、dir3三个项目版本库  

svnserve -d -r /home/svndata/

#注意注:”-d”参数效果同于”-daemon “,”-r”参数效果同于”-root”,关注”-r”参数后对应的目录,”-root”设置根位置来限制服务器的访问目录,从而增加安全性和节约输入svnserve URL的时间

实现SVN与对应dir*同步,可以checkout一个出来,也可直接配在仓库中

设置Project服务器对应根目录如下,进入各自目录

DEV1=/dev/dir1  

DEV2=/test/dir2

DEV3=/www/dir3 

进入各自目录DEV1/DEV2/DEV3,分别执行

svn checkout svn://{您的服务器地址}:{端口号}/dir* .

注意:此处的/dir1需要添加

svn checkout svn://192.168.15.132:3690/dir* .

接下来,可以使用TortoiseSVN对测试环境文件进行管理,并实现自动更新了。


常见错误

#255错误:post-commit没有给执行权限或者头部没有执行用sh执行,就是没有#!/bin/bash 

#提示跳过目录:服务器目录没有checkout代码,记得一定要先checkout一次,才能同步(!,每次新建项目都需要) 

#什么提示也没有:这种情况出现在用工具commit的时候,成功了,但是就是没有同步,建议你到linux下,使用./post-commit手动执行看报什么错误,同时检查日志。

#提示**** is a direcitory:/usr/bin/svn你把这个搞错了,他不是一个目录,是svn的路径

未经允许不得转载:SEARU.ORG » Svn结合hook实现自动更新及多Project管理更新

赞 (0)
分享到:更多 ()

评论 0