SVN


SVN安装和使用

简介:Subversion是一个自由开源的版本控制系统。在Subversion管理下,文件和目录可以超越时空。Subversion将文件存放在中心版本库里,这个版本库很像一个普通的文件服务器,不同的是,它可以记录每一次文件和目录的修改情况,这样就可以借此将数据恢复到以前的版本,并可以查看数据的更改细节。正因为如此,许多人将版本控制系统当作一种神奇的“时间机器”。----没错,这里是复制百度的

安装

yum -y install subversion 

使用及配置

mkdir -p /application/svndata       #创建svn版本库数据存储目录(svndata)及用户、密码权限目录(svnpasswd)
mkdir -p /application/svnpasswd

svnserve -d -r /application/svndata #启动svn服务指定服务的svn根目录
svnadmin create /application/svndata/sadoc #建立项目版本库

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

#调整svn配置文件及权限文件
cd /application/svndata/sadoc/conf
cp svnserve.conf svnserve.conf.bak #备份

vi svnserve.conf
anon-access = none #禁止匿名
auth-access = write #权限为写入
password-db = /application/svnpasswd/passwd #密码的数据库(每个项目库都有一个自带的配置文件这里统一了,指定到刚才创建的)

authz-db = /application/svnpasswd/authz #权限的数据库(也统一了)
diff svnserve.conf.bak svnserve.conf #比对一下看看改了哪里
或者 egrep "-access|-db =" svnserve.conf  #这样也可以

cp passwd authz /application/svnpasswd  #拷贝到统一权限目录下

vi passwd #这里备份不备份都行
  daniel = daniel123
  a1 = a1123
  a2 = a2123

#加三个用户和密码
#生产环境就要加密了或者将文件权限改成700
#更改svnserve.conf时,需要重启svn,更改authz,passwd文件时不需要重启svn

vi authz
#格式
  [<版本库>:/项目/目录]
  @<用户组名> = <权限>
  <用户名> = <权限>
#修改
sagroup = a1,a2
[sadoc:/]
daniel = rw
@sagroup = r
#sadoc就是咱们刚才创建的,daniel是读写权限,然后把a1,a2放入了sagroup,将sagroup组给了读权限,改这个不需要重启svn

#由于刚才改svnserve.conf没有重启,这里重启一下
pkill svnserve
svnserve -d -r /application/svndata/ 

#然后使用客户端测试一下

客户端测试

#windows

#windows需要下载个软件--tortoisesvn,去官网下一下就行,根据自己的windows系统位数,然后一步一步往下走

新建一个文件夹,取名随便,安装完后,右键文件夹,选择svn checkout,然后会让你输入用户名密码,要先在服务端开启svn的端口--3690,或者关闭防火墙


#liunx

用法: svn <subcommand> [options] [args]
Subversion 命令行客户端,版本 1.6.11。
使用“svn help <subcommand>” 显示子命令的帮助信息。
使用“svn --version”查看程序的版本号和版本库访问模块,或者
使用“svn --version --quiet”只查看程序的版本号。

大多数的子命令可接受文件或目录参数,对目录进行递归处理。
如果没有指定参数,默认对当前目录(包含当前目录)递归处理。

可用的子命令: 
   add
   blame (praise, annotate, ann)
   cat
   changelist (cl)
   checkout (co)
   cleanup
   commit (ci)
   copy (cp)
   delete (del, remove, rm)
   diff (di)
   export
   help (?, h)
   import
   info
   list (ls)
   lock
   log
   merge
   mergeinfo
   mkdir
   move (mv, rename, ren)
   propdel (pdel, pd)
   propedit (pedit, pe)
   propget (pget, pg)
   proplist (plist, pl)
   propset (pset, ps)
   resolve
   resolved
   revert
   status (stat, st)
   switch (sw)
   unlock
   update (up)

Subversion 是版本控制工具。
#新建一个本地目录,用于保存项目

mkdir /sadoc
svn checkout svn://192.168.0.110/sadoc /sadoc/ --username=daniel --password=daniel123  #下载命令
或者
svn co svn://192.168.0.110/sadoc /sadoc/ --username=daniel --password=daniel123  #co是checkout的简写,sadoc是本地路径

svn update svn://192.168.0.110/sadoc /sadoc/ --username=daniel --password=daniel123  #更新项目库

svn list svn://192.168.0.110/sadoc /sadoc/ --username=daniel --password=daniel123  #查看有什么文件,简写为ls,有ls,肯定有cat,看文件内容

#提交新代码
touch file1 file2 file3
svn add file1 file2 file3
svn ci -m "新版本"   #ci是上传,-m是注释

#导入svn原始目录树
#规范svn项目库,会有trunk(主干),branch(分支),tag(标记)三个目录
svnadmin create /application/svndata/sadoc2/ #新建一个项目库
mkdir -p /svn/trunk /svn/breach /svn/tag    #创建三个标准目录
svn import /svn/ file:///application/svndata/sadoc2/ -m "import" #使用import命令导入

#copy
cd trunk/
touch 1
svn add 1
svn ci -m "trunk"
svn copy svn://192.168.0.110/sadoc/trunk svn://192.168.0.110/sadoc/branch/branch_cms_20180106  -m "create branch" --username=daniel --password=daniel123  #将主干复制成一个分支

SVN钩子简介

  介绍:

    钩子脚本的具体写法就是操作系统中shell脚本程序的写法,可根据自己的svn所在的操作系统和shell程序进行相应的开发

    钩子脚本就是被某些版本库事件触发的程序,例如:创建新版本或修改未被版本控制的属性。每个钩子都能长官足够的信息来了解发生了什么事件,操作对象是什么以及触发事件用户的账号

    根据钩子的输出或者返回状态,钩子程序能够以某种方式控制该动作继续执行,停止或者挂起

  使用:

#在每个项目库里有一个hooks目录,这里面就是存储钩子模板的
#重要提示:由于安全原因,Subversion版本库在一个空环境中执行钩子脚本一就是没有任何环境变量,甚至诶呦$PATH或%PATH,由于这个原因,许多管理员会感到困惑,它们的钩子脚本手工运行时正常,可在Subversion中却不能允许。要注意必须在你的钩子中设置好环境变量或为你的程序指定好绝对路径

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

#非常用hook钩子脚本
    pre-revprop-change            #在修改revision属性之前,执行该脚本
    post-revprop-change          #在修改revision属性之后,执行该脚本。因为修改稿已经完成,不可更改,因此本脚本的返回值忽略(不过实际上的实现似乎是改脚本的正确执行与否英雄属性修改)
    pre-unlock                           #对文件进行解锁操作之前执行该脚本
    post-unlock                         #对文件进行解锁操作之后执行该脚本
    pre-lock                               #对文件进行加锁操作之前执行该脚本
    post-lock                             #对文件进行加锁操作之后执行该脚本   

#svn钩子生成应用场景举例
    pre-commit
    限制上传文件扩展名及大小,控制提交要输入的信息等。

    post-commit
    SVN更新自动周知,MSN,邮件或短信周知
    SVN更新触发checkout程序,然后事实rsync推送到服务器等

#svn钩子生产使用实战
    rsync与svn钩子结合实现数据实时同步某企业小案例
    1.建立同步web目录
    mkdir /web/html
    2.将svn中内容checkout到web目录一份
    svn checkout svn://192.168.0.110/sadoc  /web/html --username=daniel --password=daniel123
    3.启用post-commit钩子脚本
    cd /application/svndata/sadoc/hooks/
    cp post-commit.tmpl post-commit
    vi post-commit
        REPOS="$1"
        REV="$2"
        export LC-CTYPE="en_US.UTF-8"
        export LC_ALL=

        LOGPATH="/app/log"

        [ ! -d ${LOGPATH} ] && mkdir ${LOGPATH} -p
        #update content from svn
        SVN=/usr/bin/svn
        $SVN update --username daniel --password daniel123 /web/html #做更新
        if [ $? -eq 0 ];then
        /usr/bin/rsync -az --delete /web/html /tmp/webbak/ #如果成功了就同步到webbak下去
        fi
然后权限给755,或者700,去windows客户端创建个东西然后commit上来,直接去看linux客户端的web/html和/tmp/webbak/,就会发现自动同步了
#注意事项
1.钩子脚本的权限要允许svn执行,可以设置成 chmod 700 post-commit
2.写钩子脚本时要尽可能定义环境变量,主要是用过的命令的路径,因为svn考虑安全问题,不会调用系统环境变量,所以如果发现手动执行post-commit没有问题,但svn自动执行也可能会无法执行
3.这个脚本案例,在svn uodate之前一定要先动手checkout到本地一份出来,还有要加上用户名和密码

企业实战案例

#案例一:利用svn钩子脚本做svn上传文件各类检查控制
    #利用pre-commit限制上传文件扩展名及大小
#!/bin/sh
#SVN look
REPOS="$1"
TXN="$2"
#此处更改大小限制,这里是5M
MAX_SIZE=5242880
#此处增加限制文件名后缀名
FILTER='.(zip|rar|o|obj|tar|gz|zip)$’
# Make sure that the log message contains some text.
SVNLOOK=/usr/bin/svnlook

#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 check passed,so allow the commit.
if [ $? -eq 1 ];
then
        exit 1
else 
        exit 0
fi

SVN目录组织结构说明

tree /svn/
/svn/
├── breach    --分支,为测试时使用,几天以上的项目必须开分支,测试需要本分支通过,主线合并到分支通过,才能合并到主线进行测试
├── tag         --版本记录用
└── trunk      --主线,与正式线相对应,当天不上线文件不允许提交

 互联网大型企业代码上线发布架构方案


 解读:

1.本地开发人员从svn中取代码。当天上线的提交到trunk,否则,长期项目单开分支开发,然后再合并主线(trunk)

2.办公内网开发测试时,由开发人员或配置管理员通过部署平台jenkins实现统一部署,(即在部署平台上控制开发机器从SVN取代码,编译,打包,发布到开发机,包名如idc_dep.war)

3.开发人员通知或和测试人员一起测试程序,没有问题后,打上新的tag标记。

4.配置管理员,根据上步的tag标记,checkout出上线代码,并配置好IDC测试环境的所有配置,执行编译,打包(mvn,ant)(php不需要),然后发布到IDC内的统一分发服务器,这里要注意,不同的环境配置文件时随代码同时发布的。

5.配置管理员或SA上线人员,把分发的程序代码内容送到相关测试服务器(包名如idc_test.war),然后通知开发及测试人员进行测试。如果有问题向上回退,继续修改

6.如果测试没有问题,继续打好tag标记,此时,配置管理员,根据上步的tag标记,checkout出测试好的代码,并配置好IDC正式环境的所有配置,执行编译,打包(mvn,ant)(php不需要),然后发布到IDC内的统一分发服务器主机,准备批量发布。

7.配置管理员SA上线人员,把分发的内容推送到相关正式服务器(包名如idc_product.war),然后通知开发及测试人员进行测试。如果有问题直接发布回滚指令

IDC正式上线的过程对于JAVA程序,可以是A、B组分组上线的思路,即平滑下线一般的服务器,然后发布更新代码测试,无问题后,挂上服务器,同时在平滑下线另一半的服务器,然后发布更新代码测试(或者直接发布后就挂上线)

#上面的架构方案就是基于JAVA的

PHP程序代码上线的具体方案:

对于PHP上线方法:发布代码时可以发布到正式线临时目录,然后mv或更改link的方式发布到正式线目录,不需要重启http服务,(也需要测试流程)

#代码上线解决方案注意事项

1.上线的流程里,办公测试环境>IDC测试环境>正式生产环境,所有环境中的所有软件均应版本统一,否则将后患无穷,开发测试成功,IDC测试就可能有问题

2.开发团队小组办公内部测试环境测试(该测试环境属于开发小组维护,或定时自动更新代码),代码有问题返回给某开发人员重新开发

3.有专门的测试工程师,程序有问题直接返回给开发人员(此时返回的一般为程序的BUG,称为BUG库),无问题进行IDC测试

4.IDC测试由测试人员和运维人员参与,叫IDCtest,进行程序的压力测试,有问题直接返回给开发人员,无问题进行线上环境上线

5.书台服务器代码分发上线方案距离(JAVA程序)

  (1).假设同业务服务器有六台,将服务器分为A、B两组,A组三台,B组三台,先对A组进行从负载均衡器上平滑下线,B组正常提供服务,避免服务器因上线影响业务。

  (2).下线过程是通过脚本将A组服务器从RS池(LVS,NGINX,HAPROXY,F5等均有平滑方案)中踢出,避免负载均衡器将请求发送给A组服务器(此时的时间应该为网站流量少时,一般为晚上)

  (3).将代码分发到A组服务器的站点根目录下,对A组服务器上线并重启服务,并由专业的测试人员进行访问测试,测试成功后,挂上A组的服务器,同时下线B组服务器,B组代码上线操作测试等和A组相同,期间也要观察上线提供服务的服务器状况,有问题及时回滚

6.大多数门户公司的前段页面都已经静态化或者cache了,因此,动态的部分访问平时就不会特别多,流量低估就更少了,再加上是平滑上下线,因此基本上是对用户体验无影响的,当然,也有上线出问题的情况,这个是避免不了的

7.SVN上包含代码和配置

  (1).SVN上存放程序代码(不含资源,大公司基本资源和程序都是分离的),尽可能全量上线

  (2)。存放所有服务的配置文件(LAMP环境,如:apache的httpd.conf配置文件)

    1).开发小组测试环境使用的配置文件

    2)办公测试环境使用的配置文件

    3)IDC测试环境使用的配置文件

    4)线上应用使用的配置文件


原文地址:https://www.cnblogs.com/wazy/p/8215578.html