zoukankan      html  css  js  c++  java
  • 快速搭建企业subversion

                         快速搭建企业SVN(subversion)

                                                              作者:尹正杰

    版权声明:原创作品,谢绝转载!否则将追究法律责任。

      我们公司用的版本控制控制系统就是subversion(简称SVN),不得不说这是一款比较好使的管理工具。我们公司用的就是这个去完成一些列的工作,我的工作也几乎天天要跟着SVN打交道,比如部署接口什么的,如果有新的分支的话需要登录堡垒机服务器去checkout代码~

     

     

    一.什么是SVN?

      1>.SVN(subversion)是今年来崛起的版本管理工具,与CVS一样,SVN是一个跨平台的开元的版本控制系统,Subversion管理着随时间改变的数据。这些数据放置在一个中英资料档案库中。这个档案库很像一个普通的文件服务器,不过它会记住每一次文件的变动。这样你就可以吧档案回复到旧的版本,或是浏览文件的变动历史。

      2>.SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS、CVS,它采用了分支管理系统,它的设计目标就是取代CVS。互联网上很多版本控制服务已从CVS迁移到Subversion。

      3>.相对于大多数公司来说,SVN是最普及的,其他版本控制比较流行的还有GIT。

      4>.SVN是一个通用的软件系统,它不但可以用来管理程序源码,他还可以管理任何类型的文件,如文本,视频,图片等等。

      相关站点:http://subversion.apache.org/

       

    二.SVN的服务器运行模式与访问方式

    1.SVN服务端运行模式

      SVN常见的有三种运行访问方式,本篇博客采取第一种运行方式。

      a>.独立服务器(例如:svn://svn.yinzhengjie.com/jky);

      b>.借助Apache(例如:http://svn.yinzhengjie.com/jky);

      c>.本地直接访问(例如:file:///yinzhengjie/svndata/jky);

    2.svn客户端访问方式

      Subversion可以通过多种方式访问,如本地磁盘访问或各种各样不同的网络协议,但是一个版本库地址永远都是一个URL。

      方式一:“file:// ” 

          访问方法:直接版本库访问(本地磁盘或网络磁盘)
      方式二:“http://”

          访问方法:通过WebDAV协议访问支持Subversion的Apache服务器。

      方式三:“https://”

          访问方法:与“http://”相似,但是用了SSL加密。

      方式四:“svn://”

          访问方法:通过未认证的TCP/IP自定义协议访问svnserve服务器。

      方式五:“svn + ssh://”

          访问方法:通过认证未加密的TCP/IP自定义协议访问svnserve服务器。

    三.SVN的数据格式

      SVN存储版本数据也有2中方式,即BDB(一种事物安全型表类型)和FSFS(一种不需要数据库的存储系统)。因为BDB方式在服务器中断时,有可能锁住数据,所以还是FSFS方式更安全一点。

      CVS是一个基于RCS文件的版本控制系统,每个CVS文件都不过是普通的文件,加上一些额外的信息。这些文件会简单的重复本地文件的树结构。因此,不必担心有什么数据丢失。如果必要的话可以手工修改RCS文件。

      SVN是基于关系数据库的(BerkleyDB)或一些了二进制文件的(FS_FS).一方面这解决了许多问题(例如:并行读取共享文件)以及添加了许多新功能(例如:运行时事物特性)。然而另一方面,数据存储由此变得不透明。

     1 /*
     2 @author :yinzhengjie
     3 Blog:http://www.cnblogs.com/yinzhengjie
     4 EMAIL:y1053419035@qq.com
     5 */
     6 
     7 
     8 扩展小知识:
     9 
    10 1>.BDB
    11 
    12   伯克利DB(Berkeley DB),版本库可以使用一种经过充分测试的后台数据库实现,不能再通过网络共享的文件系统上使用,伯克利DB是Subversion 1.2版本以前缺省版本库格式。
    13 
    14 2>.FSFS
    15 
    16   一个专用于Subversion版本库的文件系统后端,可以使用网络文件系统(例如NFS或SMBFS)。是1.2版本机器以后的版本库的默认后端。
    17 
    18 3>. 版本库数据存储对照表
    19   在Subversion1.2中,版本库中存储数据有两种方式。一种是在Berkeley DB数据库中存储数据;另一种是使用普通的文件,使用自定义格式。因为Subversion的开发者称版本库为(版本化的)文件系统,他们接受了称后一种存储方式为FSFS的习惯,也就是说,使用本地操作系统文件系统来存储数据的版本化文件的系统。
    20   建立一个版本库时,管理员必须决定使用Berkeley DB还是FSFS。它们各有优缺点,我们将详细描述。这两个中并没有一个是更正式的,访问版本库的程序与采用哪一种实现方式无关。访问程序并不知道版本库如何存储数据,它们只是从版本库的API读取到修订版本和事务树。

                        

      如果感兴趣的小伙伴可以参考一下原链接:http://svndoc.iusesvn.com/svnbook/svn.reposadmin.html#svn.reposadmin.basics.backends

    四.SVN系统的逻辑架构图

      无论通过命令行工具还是图形化工具都需要调用客户端的一个库(Working Copy Mangement Library)来连接SVN服务器。提交SVN我们之前说过了有三种方式,即Apache,svn,localhost。通过这三种方式都可以访问版本库数据(数据存储库)其实我们工作常用的提交数据就是通过图形来提交的数据的。

                              

    五.集中式的版本管理系统

     1   集中式代码管理的核心是服务器,所有开发者在开始新一天的工作之前必须从服务器获取代码,然后开发,最后解决冲突,提交。所有的版本都放在服务器上,如果脱离了服务器,开发者就无法工作。
     2 
     3 下面举一个生产环境中案例:
     4 
     5   周一到来了,开始新的一天的工作:
     6 
     7   1>.从服务器下载项目组最新代码;
     8 
     9   2>.进入自己的分支,进行工作,每隔一个小时向服务器上自己的分支提交一次代码(很多人都习有这个习惯。因为有时候自己对代码改来改去,最后又想还原到前一个小时的版本,或者看前一个小时自己修改了哪些代码,就需要这样做了)。
    10 
    11   3>.下班时间到了,把自己的分支合并到服务器主分支上,一天的工作完成,并反映给服务器。
      这就是经典的SVN工作流程,从流程上来看,有缺点也有优点。
      缺点:
        1>.服务器压力太大,SVN数据库容量暴增;
        2>.如果不能连接到服务器上,基本上不可用工作,看上面第二步,如果服务器不能连接上,就不能提交,还原,对比等等;(所以SVN开发需要服务器稳定,不然会严重影响工作效率!)
        3>.不适合开元开发(开发人数非常非常多,但是Gooogel app engine就是用svn的)。但是一般集中式管理的有非常明确的权限管理机制(例如:分支访问限制),开元实现分成管理,从而很好的解决开发人数众多的问题。
      优点:
        1>.管理方便,逻辑明确,符合一般人思维习惯;
        2>.易于管理,集中式服务器更能保障安全性;
        3>.代码一致性非常高;
        4>.适合开发人数不多的项目开发;
        5>.大部分软件配置管理的大学材料都是使用svn和vss。
     

                        

     六.搭建SVN服务器

    1.部署环境

      a>.操作系统是“Linux”版本;

      b>.发行版是“CentOs6.6”;

      c>.内核版本是“2.6.32-504.el6”;

      d>.是“x86_64”的操作系统;

                        

    2.安装SVN

       可能网上大家发现了有好多都是源码安装,其实我也蛮喜欢源码安装的,这才体现出一个做运维的特色,哈哈~不过我这里采用的是yum安装方式,别问我为什么啊,因为我懒,感兴趣的小伙伴可以去官网下载相应的tar包,解压到指定的目录即可。好了~废话不多说了~说干就干!

    a>.更换国内阿里云源

    1 [root@yinzhengjie ~]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
    2 [root@yinzhengjie ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
    3 [root@yinzhengjie ~]# yum clean all
    4 [root@yinzhengjie ~]# yum makecache

    b>.编辑yum配置文件,让rpm包安装完毕后不自动清除(当你的源不好使的时候,我们可以将这些包手动rpm安装)

    1 [root@yinzhengjie ~]# sed -i 's/keepcache=0/keepcache=1/g' /etc/yum.conf 
    2 [root@yinzhengjie ~]# grep keepcache /etc/yum.conf 
    3 keepcache=1
    4 [root@yinzhengjie ~]#

    c>.安装SVN

     1 [root@yinzhengjie ~]# yum -y install subversion
     2 
     3 [root@yinzhengjie ~]# yum -y install tree
     4 
     5 [root@yinzhengjie ~]# rpm -qa | grep subversion
     6 subversion-1.6.11-15.el6_7.x86_64
     7 [root@yinzhengjie ~]#
     8 
     9 [root@yinzhengjie ~]# rpm -qa | grep subversion
    10 subversion-1.6.11-15.el6_7.x86_64
    11 [root@yinzhengjie ~]# 
    12 [root@yinzhengjie ~]# find / -name subversion-1.6.11-15.el6_7.x86_64.rpm
    13 /var/cache/yum/x86_64/6/base/packages/subversion-1.6.11-15.el6_7.x86_64.rpm
    14 [root@yinzhengjie ~]#
    15 
    16 
    17 [root@yinzhengjie ~]# tree /var/cache/yum/x86_64/6/base/packages/
    18 /var/cache/yum/x86_64/6/base/packages/
    19 ├── perl-URI-1.40-2.el6.noarch.rpm
    20 ├── subversion-1.6.11-15.el6_7.x86_64.rpm
    21 └── tree-1.5.3-3.el6.x86_64.rpm
    22 
    23 
    24 0 directories, 3 files
    25 [root@yinzhengjie ~]#

    3.启动SVN

    a>.创建SVN的根目录以及密码权限目录

    1 [root@yinzhengjie ~]# mkdir -pv /yinzhengjie/application/svndata
    2 mkdir: created directory `/yinzhengjie/application'
    3 mkdir: created directory `/yinzhengjie/application/svndata'
    4 [root@yinzhengjie ~]# 
    5 [root@yinzhengjie ~]# mkdir -pv /yinzhengjie/application/svnpasswd
    6 mkdir: created directory `/yinzhengjie/application/svnpasswd'
    7 [root@yinzhengjie ~]# 

                            

    b>.启动SVN并指定项目的目录

     1 [root@yinzhengjie ~]# svnserve --help
     2 usage: svnserve [-d | -i | -t | -X] [options]
     3 
     4 Valid options:
     5   -d [--daemon]            : daemon mode
     6   -i [--inetd]             : inetd mode
     7   -t [--tunnel]            : tunnel mode
     8   -X [--listen-once]       : listen-once mode (useful for debugging)
     9   -r [--root] ARG          : root of directory to serve
    10   -R [--read-only]         : force read only, overriding repository config file
    11   --config-file ARG        : read configuration from file ARG
    12   --listen-port ARG        : listen port
    13                              [mode: daemon, listen-once]
    14   --listen-host ARG        : listen hostname or IP address
    15                              [mode: daemon, listen-once]
    16   -T [--threads]           : use threads instead of fork [mode: daemon]
    17   --foreground             : run in foreground (useful for debugging)
    18                              [mode: daemon]
    19   --log-file ARG           : svnserve log file
    20   --pid-file ARG           : write server process ID to file ARG
    21                              [mode: daemon, listen-once]
    22   --tunnel-user ARG        : tunnel username (default is current uid's name)
    23                              [mode: tunnel]
    24   -h [--help]              : display this help
    25   --version                : show program version information
    26 
    27 [root@yinzhengjie ~]# svnserve -d -r /yinzhengjie/application/svndata/ --pid-file=/yinzhengjie/application/svndata/svn.pid
    28 [root@yinzhengjie ~]# 
    29 [root@yinzhengjie ~]# ps -ef | grep svn | grep -v grep
    30 root       2987      1  0 06:47 ?        00:00:00 svnserve -d -r /yinzhengjie/application/svndata/ --pid-file=/yinzhengjie/application/svndata/svn.pid
    31 [root@yinzhengjie ~]# 
    32 [root@yinzhengjie ~]# netstat -untalp | grep 3690
    33 tcp        0      0 0.0.0.0:3690                0.0.0.0:*                   LISTEN      2987/svnserve       
    34 [root@yinzhengjie ~]# 
    35 [root@yinzhengjie ~]# lsof -i :3690
    36 COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    37 svnserve 2987 root    3u  IPv4  49123      0t0  TCP *:svn (LISTEN)
    38 
    39 [root@yinzhengjie ~]# 
    40 [root@yinzhengjie ~]# more /yinzhengjie/application/svndata/svn.pid 
    41 2987
    42 [root@yinzhengjie ~]# 

                        

    4.配置SVN

    a>.建立版本库

     1 [root@yinzhengjie ~]# svnadmin create /yinzhengjie/application/svndata/jky
     2 [root@yinzhengjie ~]# 
     3 [root@yinzhengjie ~]# ls -l /yinzhengjie/application/svndata/jky
     4 total 24
     5 drwxr-xr-x 2 root root 4096 Sep 25 07:00 conf
     6 drwxr-sr-x 6 root root 4096 Sep 25 07:00 db
     7 -r--r--r-- 1 root root    2 Sep 25 07:00 format
     8 drwxr-xr-x 2 root root 4096 Sep 25 07:00 hooks
     9 drwxr-xr-x 2 root root 4096 Sep 25 07:00 locks
    10 -rw-r--r-- 1 root root  229 Sep 25 07:00 README.txt
    11 [root@yinzhengjie ~]# 

                    

                    

    b>.备份svnserver.conf配置文件

     1 [root@yinzhengjie ~]# cd /yinzhengjie/application/svndata/jky/conf/
     2 [root@yinzhengjie conf]# ll
     3 total 12
     4 -rw-r--r-- 1 root root 1080 Sep 25 07:00 authz
     5 -rw-r--r-- 1 root root  309 Sep 25 07:00 passwd
     6 -rw-r--r-- 1 root root 2279 Sep 25 07:00 svnserve.conf
     7 [root@yinzhengjie conf]# 
     8 [root@yinzhengjie conf]# cp svnserve.conf svnserve.conf`date +%F` 
     9 [root@yinzhengjie conf]# 
    10 [root@yinzhengjie conf]# ll
    11 total 16
    12 -rw-r--r-- 1 root root 1080 Sep 25 07:00 authz
    13 -rw-r--r-- 1 root root  309 Sep 25 07:00 passwd
    14 -rw-r--r-- 1 root root 2279 Sep 25 07:00 svnserve.conf
    15 -rw-r--r-- 1 root root 2279 Sep 25 07:07 svnserve.conf2017-09-25
    16 [root@yinzhengjie conf]# 

    c>.编辑svnserver.conf配置文件

      修改之前的配置如下:

                

      修改之后的配置如下:

     1 [root@yinzhengjie conf]# egrep "-access|-db =" svnserve.conf
     2 anon-access = none
     3 auth-access = write
     4 password-db = /yinzhengjie/application/svnpasswd/passwd
     5 authz-db = /yinzhengjie/application/svnpasswd/authz
     6 [root@yinzhengjie conf]# 
     7 [root@yinzhengjie conf]# 
     8 [root@yinzhengjie conf]# diff svnserve.conf2017-09-25 svnserve.conf
     9 12,13c12,13
    10 < # anon-access = read
    11 < # auth-access = write
    12 ---
    13 > anon-access = none
    14 > auth-access = write
    15 20c20
    16 < # password-db = passwd
    17 ---
    18 > password-db = /yinzhengjie/application/svnpasswd/passwd
    19 27c27
    20 < # authz-db = authz
    21 ---
    22 > authz-db = /yinzhengjie/application/svnpasswd/authz
    23 [root@yinzhengjie conf]# 

    d>.拷贝文件到制定目录并修改权限

     1 [root@yinzhengjie conf]# cp authz passwd /yinzhengjie/application/svnpasswd/
     2 [root@yinzhengjie conf]# 
     3 [root@yinzhengjie conf]# cd /yinzhengjie/application/svnpasswd/
     4 [root@yinzhengjie svnpasswd]# 
     5 [root@yinzhengjie svnpasswd]# ll
     6 total 8
     7 -rw-r--r-- 1 root root 1080 Sep 25 07:28 authz
     8 -rw-r--r-- 1 root root  309 Sep 25 07:28 passwd
     9 [root@yinzhengjie svnpasswd]# 
    10 [root@yinzhengjie svnpasswd]# chmod 700 *
    11 [root@yinzhengjie svnpasswd]# 
    12 [root@yinzhengjie svnpasswd]# ll
    13 total 8
    14 -rwx------ 1 root root 1080 Sep 25 07:28 authz
    15 -rwx------ 1 root root  309 Sep 25 07:28 passwd
    16 [root@yinzhengjie svnpasswd]# 

                                    

    e>.修改配置文件

       修改passwd文件:

                         

      修改authz文件:

                         

    七.客户端连接

    1.自行下载svn客户端,然后再客户端checkout服务器所创建的分支即可

                                    

     2.输入账号密码(这个账号密码就是你在服务器上所配置的哟,我这里输入的就是yinzhengjie,密码是123),然后可以提交一个文件(SVN Commit),提交成功会弹出以下弹窗

                            

    3.以上操作说明你是第一次地提交,你可以在当前目录右击鼠标,点击“TortoiseSVN”,再点击“Repo-browser”,就可以看见刚刚在服务器提交的文件了

                            

      到这为止,SVN的服务器就算部署完成了,现在也是23:40了,我也该洗洗睡了,晚安喽~

     

     

     

     

     

     

     

  • 相关阅读:
    实时监听输入框值变化的完美方案:oninput & onpropertychange
    展示两行,超出用。。。表示
    修改下拉框滚动条样式
    js单线程工作
    锚点
    火狐图片乱码
    解决重复提交的几种方法
    forward和redirect的区别
    form表单刷新自动提交
    addEventListener和attachEvent的区别
  • 原文地址:https://www.cnblogs.com/yinzhengjie/p/6154664.html
Copyright © 2011-2022 走看看