一、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的路径