文档章节

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

mind-blowing
 mind-blowing
发布于 2016/03/20 22:20
字数 2192
阅读 3318
收藏 53

一、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 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大。
 
三、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 #权限配置文件
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下面有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手动执行看报什么错误。如果乱码,请将文件内编码格式修改为GBK 
#提示**** is a direcitory:/usr/bin/svn你把这个搞错了,他不是一个目录,是svn的路径

 

© 著作权归作者所有

mind-blowing
粉丝 51
博文 219
码字总数 114570
作品 0
宝山
运维
私信 提问
加载中

评论(3)

mind-blowing
mind-blowing 博主

引用来自“wenhaoran”的评论

1
wenhaoran
wenhaoran
1
8
892757502
Svn结合hook实现自动发布及多Project管理更新

项目目的 出于管理需要,也需要在公司内部实现自动发布流程。当开发机提交SVN代码之后,自动同步到测试服务器进行测试。 工作原理 hook简单介绍 配置svnserve 创建多项目代码仓库 配置集中认...

ljpwinxp
2018/04/19
0
0
Puppet系列之三:Puppet结合SVN实现版本的集中化备份与恢复

1 概述 通过安装部署Puppet C/S模型,实现Puppet Server端管理所有被控制机的整个生命周期:从初始化到软件升级、从配置文件创建到测试部署、从系统维护到服务器迁移等。Puppet能够持续化的与...

guzhoujiexing
2018/06/26
0
0
SVN跨服务器配置post-commit提交后自动更新(SVN与WEB服务器不在同一台机器)

背景情况:SVN与WEB不在同一台服务器上,需要SVN提交后WEB站点自动进行SVN UPDATE更新,查阅网上的教程,发现部分的细节和权限部分没有提到导致跨服务器ssh执行更新脚本失败,手动执行post-...

PartyAnimals
2018/06/26
0
0
SVN各种错误提示产生原因及处理方法大全

SVN各种错误提示产生原因及处理方法大全 1. svn: Server sent unexpected return value (500 Internal Server Error) in response to OPTIONS request for 'http://svn.moon.ossxp.com/svn/......

诺灬晓月
2014/09/12
16.8K
1
eclipse本地svn插件与库版本不一致更新等操作出错解决方法

更新svn项目提示: org.apache.subversion.javahl.ClientException: The working copy needs to be upgraded svn: The working copy at 'D:AdministratorWorkspacesMyEclipse 2017 CIhuamu-......

ZhangLG
07/11
9
0

没有更多内容

加载失败,请刷新页面

加载更多

CSS--属性

一、溢出 当内容多,元素区域小的时候,就会产生溢出效果,默认是纵向溢出 横向溢出:在内容和容器之间再套一层容器,并且内部容器要比外部容器宽 属性:overflow/overflow-x/overflow-y 取值...

wytao1995
39分钟前
4
0
Confluence 6.15 使用附件宏

希望添加附件宏到一个页面中: 从编辑工具栏中,选择 插入(Insert) > 其他宏(Other Macros) 找到并且选择需要的宏。 可用使用自动完成加快这个过程:输入 { 然后开始输入你希望插入的宏的...

honeymoose
59分钟前
4
0
精华帖

第一章 jQuery简介 jQuery是一个JavaScript库 jQuery具备简洁的语法和跨平台的兼容性 简化了JavaScript的操作。 在页面中引入jQuery jQuery是一个JavaScript脚本库,不需要特别的安装,只需要...

流川偑
今天
6
0
语音对话英语翻译在线翻译成中文哪个方法好用

想要进行将中文翻译成英文,或者将英文翻译成中文的操作,其实有一个非常简单的工具就能够帮助完成将语音进行翻译转换的软件。 在应用市场或者百度手机助手等各大应用渠道里面就能够找到一款...

401恶户
今天
3
0
jenkins 插件下载加速最终方案

推荐做法 1、告诉jenkins 我哪些插件需要更新 jenkins插件清华大学镜像地址 https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json 1.进入jenkins系统管理 2.进入插件管...

vasks
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部