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

1、hook简单介绍html

    为了方便管理员控制提交的过程 ,Subversion提供了hook机制。当特定的事件发生时,相应的 hook会被调用,hook其实就至关于特定事件的处理函数。每一个hook会获得与它所处理的事件相关的参数,根据hook的返回值,Subversion会决定是否继续当前的提交过程
     要实际安装一个可用的钩子,你须要在 repos/hooks目录下安装一些与钩子同名(如 start-commit或者post-commit)的可执行程序或脚本。
 
2、本地机器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 LANG=zh_CN.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大。
 
3、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。
 
###############################################################################
4、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 #权限配置文件
realm = 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 --password a12016 --no-auth-cache
#$SVN update $WEB --username b2 --password b22016 --no-auth-cache
#$SVN update $WEB --username c3 --password c32016 --no-auth-cache
echo "$DEV1 Deployed by at $CURDATE,`whoami`,$REPOS,$REV" >> /var/log/svn_hook.log
#echo "$DEV2 Deployed by at $CURDATE,`whoami`,$REPOS,$REV" >> /var/log/svn_hook.log
#echo "$DEV3 Deployed by at $CURDATE,`whoami`,$REPOS,$REV" >> /var/log/svn_hook.log
注释最后一行 发邮件功能
添加脚本的执行权限 1.8 以上默认777权限,不然钩子不生效)
 
SVN版本库起动方式,如今svndata下面有dir一、dir二、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手动执行看报什么错误。若是乱码,请将文件内编码格式修改成GBK 
#提示**** is a direcitory:/usr/bin/svn你把这个搞错了,他不是一个目录,是svn的路径
相关文章
相关标签/搜索