快速搭建企业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了,我也该洗洗睡了,晚安喽~

 

 

 

 

 

 

 

 

 

posted @ 2016-12-10 01:15  尹正杰  阅读(1453)  评论(0编辑  收藏  举报