企业代码上线之SVN解决方案(一)

记得上篇文档我们SVN使用源码编译安装的,其实在生产环境中,最佳实践是用yum安装。
好吧,下面我们来一起看下yum 方式部署SVN(独立服务器访问)

一、SVN补充说明

之前文章已经做了说明,这里我们再补充说明下:
1.1 SVN的服务运行模式有3种:

1)独立服务器访问(SVN)
  访问地址如:svn://svn.liuliya.com/sadoc
2)借助apache等http服务(DAV)
  a.单独安装apche+svn(不要用)
  b.CSVN(apache+svn)是一个单独的整合软件,带web界面管理的SVN软件
3)本地直接访问(LOCAL)
  例如:file:///application/svndata/sadoc

1.2 SVN的访问方式说明:
  SVN客户端可以通过多种方式访问服务端,如:本地磁盘访问,或各种各样不同的网络协议访问,但一个版本库地址永远都是一个URL。(URL反映了访问方法)

  file://	直接访问本地磁盘或网络磁盘访问版本库
  http://	通过webdav协议访问支持subversion的apache服务器
  https://	与http://类似,只是用了ssl加密访问
  svn://	通过TCP/IP自定义协议访问subversion服务器
  svn+ssh://通过认证并加密的TCP/IP自定义协议访问subversion服务器,还可以先建立VPN或者IPSEC隧道,然后跑SVN服务。

1.3 SVN服务器存储版本方式(2种)
  1.BDB(一种事务安全型表类型)BDB方式在服务器中断时,有可能锁住数据。
  2.FSFS(默认的FSFS,一种不需要数据库的存储系统;上传后的数据是不透明的,FSFS方式相对安全一些)

 1)BDB
  伯克利DB,版本库可以使用的一种经过充分测试的后台数据库实现,不能在通过网络共享的文件系统上使用,是subversion1.2版本以前的默认版本库格式。
 2)FSFS
  一个专用于subversion版本的文件系统后端,可以使用网络文件系统(如NFS或SMBFS)。是1.2版本及其后的默认版本格式。

二、安装部署SVN

2.1 安装配置SVN服务
#准备操作系统并查看系统环境

[root@m01 ~]# cat /etc/redhat-release
CentOS release 6.7 (Final)
[root@m01 ~]# uname -r
2.6.32-573.el6.x86_64

  1)安装SVN

[root@m01 ~]# rpm -qa subversion
[root@m01 ~]# yum install -y subversion
[root@m01 ~]# rpm -qa subversion
subversion-1.6.11-15.el6_7.x86_64

  2)配置SVN
创建SVN版本库、数据存储根目录及用户、密码权限目录
#SVN数据存储根目录
[root@m01 ~]# mkdir -p /application/svndata
#SVN用户、密码权限目录
[root@m01 ~]# mkdir -p /application/svnpasswd
  3)启动服务
[root@m01 ~]# svnserve -d -r /application/svndata/ #指字SVN根目录
也可以指定PID文件启动
[root@m01 ~]# svnserve -d -r /application/svndata/ --pid-file=/application/svndata/svn.pid
提示:pid的参数可以不加,可以查看svnserve命令帮助,了解相关启动参数
#查看svn进程

[root@m01 ~]# netstat -lntup|grep svn
[root@m01 ~]# netstat -lntup |grep svnserve
tcp        0      0 0.0.0.0:3690                0.0.0.0:*                   LISTEN      3902/svnserve

补充说明:
svnserve –help参数说明
有效选项:

  -d [--daemon]            : 后台模式
  -i [--inetd]             : inetd 模式
  -t [--tunnel]            : 隧道模式
  -X [--listen-once]       : 监听一次方式(调试用)
  -r [--root] ARG          : 指定服务的根目录
  -R [--read-only]         : 强制只读;覆盖版本库配置文件
  --config-file ARG        : 从文件 ARG 读取配置
  --listen-port ARG        : 监听端口
                             [方式: daemon, listen-once]
  --listen-host ARG        : 监听主机名称或IP地址
                             [方式: daemon, listen-once]
  -T [--threads]           : 使用线程代替进程 [方式: daemon]
  --foreground             : 在前台运行(调试用)
                             [方式: daemon]
  --log-file ARG           : svnserve 日志文件
  --pid-file ARG           : 写进程 PID 到文件 ARG
                             [方式: daemon, listen-once]
  --tunnel-user ARG        : 隧道用户名(默认是当前UID对应的用户名)
                             [方式: tunnel]
  -h [--help]              : 显示本帮助
  --version                : 显示程序版本信息

2.2 创建SVN的版本库
#创建一个项目(可以创建多个项目)

[root@m01 ~]# svnadmin create /applicaiton/svndata/sadoc
[root@m01 ~]# tree /application/svndata/sadoc
/application/svndata/sadoc
├── conf                                   #配置文件的目录
│   ├── authz      #
│   ├── passwd      #
│   └── svnserve.conf      #
├── db                                    #数据库的目录
│   ├── current
│   ├── format
│   ├── fsfs.conf
│   ├── fs-type
│   ├── min-unpacked-rev
│   ├── rep-cache.db
│   ├── revprops
│   │   └── 0
│   │       └── 0
│   ├── revs
│   │   └── 0
│   │       └── 0
│   ├── transactions
│   ├── txn-current
│   ├── txn-current-lock
│   ├── txn-protorevs
│   ├── uuid
│   └── write-lock
├── format
├── hooks                                    #钩子的目录
│   ├── post-commit.tmpl
│   ├── post-lock.tmpl
│   ├── post-revprop-change.tmpl
│   ├── post-unlock.tmpl
│   ├── pre-commit.tmpl
│   ├── pre-lock.tmpl
│   ├── pre-revprop-change.tmpl
│   ├── pre-unlock.tmpl
│   └── start-commit.tmpl
├── locks                                      #锁目录
│   ├── db.lock
│   └── db-logs.lock
└── README.txt
10 directories, 28 files

2.3 配置SVN服务端
#复制授权文件及密码文件
[root@m01 ~]# cd /application/svndata/sadoc/conf
#剪切授权文件、和密码文件
[root@m01 conf]# mv authz passwd /application/svnpasswd/
2.4 编辑svn服务端配置文件

[root@m01 conf]# cp svnserve.conf{,.ori}                   #备份,方便恢复和修改完成后对比
vim svnserve.conf                                          #写的配置文件一定要顶格,否则会报错
12 anon-access = none  #设置不允许匿名访问
13 auth-access = write    #认证访问设置为可写
20 password-db = /application/svnpasswd/passwd   #密码文件路径
27 authz-db = /application/svnpasswd/authz   #授权文件路径

扩展知识:LDAP,实现账号管理,一个账号通用,需要什么功能开通什么功能
SVN要支持域的话设置的大概步骤:
编辑svnserve.conf配置文件
vim /application/svndata/sadoc/conf/svnserve.conf
通过[sasl]结合LDAP进行认证。

2.5 根据需求设置密码

[root@m01 conf]# cd /application/svnpasswd/
[root@m01 svnpasswd]# vim passwd                                 #注意格式,等号前后有空格
oldboy = 123456
bingbing = 123
tingting = 456
[root@m01 svnpasswd]# tail -4 passwd

2.6 编辑授权文件
系统给出的例子

[groups]
# harry_and_sally = harry,sally                    #分组授权用户,相同权限的多个用户放在一个组
# harry_sally_and_joe = harry,sally,&joe           #分组授权用户,相同权限的多个用户放在一个组
# [/foo/bar]
# harry = rw
# &joe = r
# * =
# [repository:/baz/fuz]
# @harry_and_sally = rw                           #用户组的方式授权
# * = r                                           # *代表所有用户
sa = oldboy,bingbing,tingting                     #定义组
[sadoc:/]                                         #项目名称
oldboy = rw                                       #用户权限
bingbing = r
tingting = r
@sa = r                                          #以组的方式授权

提示:
  1)等号前为SVN账号,等号后为SVN密码,密码是明文的,注意密码权限
  2)更改svnserve.conf时,需要重启SVN,更改authz、passwd文件时不需要重启svn服务

三、Windows客户端安装

3.1 windows下测试
http://sourceforge.net/projects/tortoisesvn/files/1.6.16/Application/TortoiseSVN-1.6.16.21511-win32-svn-1.6.17.msi/download
下载:(根据自己的系统下载合适的版本)
安装过程,一路向北,哈哈。

svn客户端连接服务器的方式,帐号及密码:
svn://10.0.0.61/sadoc
用户名:oldboy
密  码:123456
提示:SVN的使用过程见https://www.liuliya.com/archive/659.html SVN管理部分

3.2 checkout从服务器上下载

输入用户名和密码

SVN客户端密码保存地址:
C:\Users\Administrator\AppData\Roaming\Subversion\auth\svn.simple
如果更改用户 可以将客户端密码文件删除
3.3 下载结果

3.4 更新成功的状态

3.5 查看服务器端数据

3.6 客户端上传文件到服务端
如果没有东西可以从本地上传东西,(先把东西放到该(oldboy)目录里–点右键commit)

3.7 上传结果

提交完成
3.8 linux下测试

见https://www.liuliya.com/archive/659.html SVN管理部分

四、SVN 钩子介绍

SVN的钩子,简单理解为inotify
4.1 SVN钩子脚本的简介

  钩子脚本的具体写法就是系统中shell脚本程序的写法,钩子脚本就是被某些版本库时间触发的程序。
例:创建新版本或者修改未被版本控制的属性。每个钩子都能掌管足够的信息来了解发生了什么事件,操作对象是什么触发事件用户的账号。类似inotify或sersync。
  根据钩子的输出或者返回状态,钩子程序能够以某种方式控制该动作继续执行,停止或挂起。

#钩子默认的目录

ls -l /application/svndata/sadoc/hooks
├── hooks                                    #钩子目录
│   ├── post-commit.tmpl
│   ├── post-lock.tmpl
│   ├── post-revprop-change.tmpl
│   ├── post-unlock.tmpl
│   ├── pre-commit.tmpl
│   ├── pre-lock.tmpl
│   ├── pre-revprop-change.tmpl
│   ├── pre-unlock.tmpl
│   └── start-commit.tmpl
├── locks                                      #锁
│   ├── db.lock
│   └── db-logs.lock

4.2 常用的钩子模板脚本

post-commit  #在提交完成成功创建版本后执行该钩子,提交已经完成,不可更改,因此,本脚本的返回可以被忽略。提交完成时触发事务
pre-commit  #提交完成前触发执行该脚本  
start-commit #在客户端还没有向服务器提交数据之前,即还没建立subversion transaction 之前,执行该脚本(提交前触发事务)  

4.3 非常有用的钩子脚本

pre-revprop-change
在修改 revision属性之前,执行该脚本
post-revprop-change
在修改revison 属性之后,执行该脚本。因为修改稿已经完成,不可更改。(实际上的实现似乎该脚本的正确执行与否影响属性修改)
pre-unlock
对文件进行解锁之前操作执行该脚本
post-unlock
对文件进行解锁之后执行该脚本
pre-lock
文件加锁之前执行该脚本
post-lock
对文件加锁之后执行该脚本

4.4使用钩子注意事项

  1)一定要定义变量,主要是用过的命令的路径。因为SVN的考虑的去安全问题,没有调用系统变量,如果手动执行是没有问题的,但SVN自动执行就无法执行了。
  2)SVN update之前一定要先手动checkout 一份出来,还有这里一定添加用户和密码,如果只是手动一样会更新,但自动一样的不行,此处添加的账号为系统账号.
  3)加上对前一个命令的判断,如果update的时候出现了问题,程序没有退出的话还会继续同步代码到web服务器上,这样会造成代码有问题。
  4)记得设置所属用户,因为rsync可以同步文件属性。而且我们的web服务器一般都不是root用户,用户不正确会造成web程序无法正常工作
  5)建议最好记录日志,出错的时候可以很快的拍错。
  6)最后是数据同步,rsync的相关参数一定要清楚。

4.5钩子的生产应用
#钩子生产应用场景举例

pre-commit
  1)限制上传文件拓展名及大小,控制提交输入的信息等、
post-commit
  2)SVN更新自动周知,微信,邮件或者短信周知某人。
  3)SVN更新自动触发 checkout程序,然后调用rysnc把提交的程序推送到服务器上等。

4.6钩子生产应用是实战
#rsync与svn钩子结合实现数据实时同步某企业小案例
 1)建立同步WEB目录;
mkdir /data/www
 2)将SVN中的内容 checkout到web目录一份
svn checkout file:///application/svndata/sadoc /data/www/
补充:

上图是rsync同步的前提条件
 3)使用钩子

编辑钩子 post-commit,清空原来的内容

cat post-commit
#!/bin/bash
#this scripts is created by liuliya 14:53 2015/11/29
#site:https://www.liuliya.com
REPOS="$1"
REV="$2"
export LANG=en_US.UTF-8
LOGPATH="/app/log"
[ ! -d ${LOGPATH} ] && mkdir ${LOGPATH} -p
#update content from svn
SVN=/usr/bin/svn
svn up svn://10.0.0.61/sadoc/ /svn/ --username=oldboy --password=123456
if [ $? -eq 0 ]
  then
    /usr/bin/rsync -az --delete /svn /tmp/     #生产中可以rsync到远程生产服务器
fi

这样用户通过svn提交的文件,就会自动通过钩子将这些内容同步到远程服务器,这里我们省略了rsync服务的配置。
说明:
写钩子脚本一些注意事项:

  1)钩子脚本的权限要允许svn执行,一般可以设置 chmod 700 post-commit
  2)写钩子脚本时要尽量定义环境变量,主要时命令的路径。因为SVN考虑安全问题,不糊调用系统环境变量,所以如果发现手动执行post-commit没有问题,但是SVN自动执行也可以会无法执行。
  3)在SVN update之前一定要先手动checkout一份出来,还有尽可能加上用户和密码,如果只是手动一样会更新,但自动触发可能就不能更新了。
  4)利用pre-commit限制上传文件拓展名及大小

cp pre-commit.tmpl pre-commit
清空原来的内容

#!/bin/sh
#######################################################
# $Name:         pre-commit
# $Version:      v1.0
# $Author:       im@liuliya.com
# $blog:https://www.liuliya.com
# $Create Date:  2015-03-01
# $Description:  pre-commit limit upload Script.
#######################################################
REPOS="$1"
TXN="$2"
#此处更改大小限制,这里是5M
MAX_SIZE=5242880
#此处增加限制文件后缀名
FILTER='\.(zip|rar|o|obj|tar|gz|avi)$'
# Make sure that the log message contains some text.
SVNLOOK=/usr/bin/svnlook
#####svnlook log/cat
#LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" | wc -c`
LOGMSG=`$SVNLOOK log  -t "$TXN" "$REPOS" | wc -c`
if [ "$LOGMSG" -lt 9 ];
then
   echo -e "nLog message cann't be empty! you must input more than 8 chars as comment!." 1>&2
 exit 1
fi
files=$($SVNLOOK changed -t $TXN $REPOS |cut -d " " -f 4-)
#echo "$files">&2
#echo "$r">&2
#exit 1
rc=0
echo "$files" | while read f;
do
#check file type
if echo $f|tr A-Z a-z|grep -Eq $FILTER;
then
      echo "File $f is not allow ($FILTER) file" >&2
      exit 1;
fi
#check file size
filesize=`$SVNLOOK cat -t "$TXN" "$REPOS" "$f" | wc -c`
if [ "$filesize" -gt "$MAX_SIZE" ];
  then
      echo "File $f is too large(must <=$MAX_SIZE) B" >&2
      exit 1
  fi
done
# All checks passed, so allow the commit.
if [ $? -eq 1 ];
   then
 exit 1
   else
 exit 0
fi

钩子脚本功能:上传文件小于5M,允许提交哪些扩展名文件、提交必须写注释信息
哈哈,这部分先到这里,未完待续(代码上线之SVN部署方案)。

发表评论

发表评论

*

沙发空缺中,还不快抢~