CentOS下快速搭建SVN服务器流程

1,985 阅读8分钟

一、前言

SVN服务器在商业生产中有非常大的作用,虽然目前代码类的项目的版本基本已经使用Git作为持续集成的平台,但是依然有很多商业项目内部的部分资源通过svn进行版本控制和管理,尤其是美术资源类的项目,svn由于相对简单使用收到了很多人的欢迎。因此本文将简单描述在一台Linux服务器中搭建一个svn环境的方法,目的是让对服务器系统不太熟悉的开发人员(例如美术、项目经理等)也可以快速搭建一台svn服务器。后续如果有时间会更新关于svn开启ldap登录的方法。

二、准备工作

考虑到本文阅读者可能有对服务器和linux软件部署不太熟悉的人,因为还是大致介绍一下Linux系统和Linux软件的安装思路。 Linux系统是一个一切皆文件的系统,任何系统内的组成,包括软件和硬件还有一些微处理器,本质上在linux系统中都可以通过类似于文件的性质进行编辑和处理。因此当前主流的互联网、游戏、金融公司都采用了Linux系统作为后端的服务运行系统。因为在这样的系统下权限的控制、文件的管理、配置的更新、错误的排查都能做到百分百的权利握在开发者的手中,甚至对于高阶的开发公司,改写系统内核也是必要的操作。日常使用的话基本用命令行工具操作。

当然对于本文的svn服务器部署,事情不需要这么复杂。但是使用Linux系统前最好还是对其有个粗略的了解比较好。

1、系统环境更新

对于一个全新的CentOS系统我们最好对齐的系统组件进行一次更新和升级。在CentOS中作为软件安装和版本管理的工作叫做yum,类比来说就是App store一样的东西。我们先更新系统:

[root@fangwei-physics ~]# yum update
[root@fangwei-physics ~]# yum upgrade

我们可以搜一下yum仓库中有没有svn服务端:

[root@fangwei-physics ~]# yum search subversion
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
================================================================================================================================= N/S matched: subversion =================================================================================================================================
hgsubversion.noarch : Mercurial extension for working with Subversion repositories
subversion-devel.i686 : Development package for the Subversion libraries
subversion-devel.x86_64 : Development package for the Subversion libraries
subversion-gnome.i686 : GNOME Keyring support for Subversion
subversion-gnome.x86_64 : GNOME Keyring support for Subversion
subversion-javahl.i686 : JNI bindings to the Subversion libraries
subversion-javahl.x86_64 : JNI bindings to the Subversion libraries
subversion-kde.i686 : KDE Wallet support for Subversion
subversion-kde.x86_64 : KDE Wallet support for Subversion
subversion-libs.i686 : Libraries for Subversion Version Control system
subversion-libs.x86_64 : Libraries for Subversion Version Control system
subversion-perl.i686 : Perl bindings to the Subversion libraries
subversion-perl.x86_64 : Perl bindings to the Subversion libraries
subversion-python.x86_64 : Python bindings for Subversion Version Control system
subversion-ruby.i686 : Ruby bindings to the Subversion libraries
subversion-ruby.x86_64 : Ruby bindings to the Subversion libraries
subversion-tools.x86_64 : Supplementary tools for Subversion
git-svn.x86_64 : Git tools for importing Subversion repositories
hgsvn.noarch : A set of scripts to work locally on subversion checkouts using mercurial
mod_dav_svn.x86_64 : Apache httpd module for Subversion server
pysvn.x86_64 : Pythonic style bindings for Subversion
python-subvertpy.x86_64 : Python bindings for Subversion
subversion.i686 : A Modern Concurrent Version Control System
subversion.x86_64 : A Modern Concurrent Version Control System
svn2cl.noarch : Create a ChangeLog from a Subversion log
svnmailer.noarch : Tool to post subversion repository commit information
texlive-svn-prov.noarch : Subversion variants of \Provides... macros
websvn.noarch : Online subversion repository browser

  名称和简介匹配 only,使用“search all”试试。

2、软件安装

在上一节的内容中我们可以看到所有匹配的软件都在列表里面了,而我们需要安装的仅仅是subversion这个软件,而且yum的功能非常智能,在安装的过程中一般会自动安装一个软件需要的所有依赖包。所以我们直接安装subversion服务端:

[root@fangwei-physics ~]# yum install -y subversion
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
软件包 subversion-1.7.14-14.el7.x86_64 已安装并且是最新版本
无须任何处理

此处由于本台服务器已经完成了SVN服务端的安全,因此无需任何处理,如果没有安装过的服务器由于-y参数的存在会自动完成软件的安装。

三、配置设定

SVN服务软件目前已经装在本台服务器中了,我们下一步需要做的就是服务器配置的设定。

1、创建仓库文件夹

首先我们要在服务器里面创建一个文件夹,用来作为服务器的仓库所在地址。注意此处有服务运行位置和子仓库位置的概念。例如我们在/svn下启动了svn服务,则svn的各个仓库都应该以文件夹的形式放在这个目录中。

我们本次配置使用/svn作为主目录,使用mkdir指令新建文件夹:

[root@fangwei-physics ~]# mkdir /svn

然后再这个主目录中新建仓库文件夹,本次以kivinsae为例:

[root@fangwei-physics ~]# mkdir /svn/kivinsae

然后对这个仓库进行svn初始化操作,这个步骤如果对git有所了解的话其实和git init差不多:

[root@fangwei-physics ~]# svnadmin create /svn/kivinsae

到此为止,一个仓库文件夹的创建以及配置初始化已经完成了,接下来我们会对权限等配置进行说明。

2、权限和用户设置

进入仓库文件夹,我们会发现有一个conf文件夹,每个项目的配置文件默认就存放在这个文件夹中:

[root@fangwei-physics ~]# ls -la /svn/kivinsae/
总用量 8
drwxr-xr-x 6 root root  86 6月  25 10:58 .
drwxr-xr-x 3 root root  21 6月  25 10:58 ..
drwxr-xr-x 2 root root  54 6月  25 11:03 conf
drwxr-sr-x 6 root root 233 6月  25 10:58 db
-r--r--r-- 1 root root   2 6月  25 10:58 format
drwxr-xr-x 2 root root 231 6月  25 10:58 hooks
drwxr-xr-x 2 root root  41 6月  25 10:58 locks
-rw-r--r-- 1 root root 229 6月  25 10:58 README.txt

[root@fangwei-physics ~]# ls -la /svn/fangwei/conf/
总用量 12
drwxr-xr-x 2 root root   54 6月  25 11:03 .
drwxr-xr-x 6 root root   86 6月  25 10:58 ..
-rw-r--r-- 1 root root 1008 6月  25 11:03 authz
-rw-r--r-- 1 root root  328 6月  25 11:00 passwd
-rw-r--r-- 1 root root 3077 6月  25 11:00 svnserve.conf

我们分别介绍各个文件的作用,authz文件夹用于设定各个用户的权限,主要是读写权限的设定,passed文件用于设置仓库的用户信息,在连接仓库或者checkout仓库的时候用户信息是连接需要用到的凭证;svnserver.conf文件作为整个仓库的主要配置文件,设定了用户验证以及模块调用等基本设定和参数的信息。

我们首先来看一下passwd文件;

[root@fangwei-physics ~]# cat /svn/kivinsae/conf/passwd
[users]
# harry = harryssecret
# sally = sallyssecret
fangwei = fangwei

我们将本仓库所有用户的信息都写入user模块内,格式为<username> = <password>,每一位用户一条,依次设定即可

然后来看一下authz文件:

[root@fangwei-physics ~]# cat /svn/kivinsae/conf/authz
[aliases]
# joe = /C=XZ/ST=Dessert/L=Snake City/O=Snake Oil, Ltd./OU=Research Institute/CN=Joe Average

[groups]
admin = fangwei

[kivinsae:/]
@admin = rw
* =

这里重点说一下文件夹权限设定和group分组设定。在商业应用环境中,一个项目仓库经常会有几十上百人参与开发与跟进,这个时候用户的数量可能会非常的多,此时逐个设定用户权限无疑是一件非常蛋疼的时候,这个时候我们可以通过对所有用户进行分组来配置权限,只要在group模块中按照<groupname> = <username1>,<username2>,<username3>...这样的格式逐个添加用户组即可。

而在下面的文件夹权限中,首先要对模块进行命名,例如对于kivinsae这个项目仓库,如果要对整个仓库的所有文件应用权限,则模块名为[kivinsae:/],一般值得注意的是,这类模块设定权限的时候一般都要加上* = r或者* =,分别意为非设定的用户只有只读权和非设定用户无任何权利。在group中我们设定了fangwei为admin用户,则在文件夹权限设定中,则使用@<groupname> = <权限>的格式设定权限。权限部分的话r为只读,w为只写,rw为读写。

最后我们来聊一聊svnserve.conf文件。

[root@fangwei-physics ~]# cat /svn/fangwei/conf/svnserve.conf
[general]
anon-access = read
auth-access = write
password-db = passwd
authz-db = authz
realm = Fangwei-Test-Repo
# force-username-case = none

[sasl]
# use-sasl = true

一般默认如上开启即可,如果需要使用ldap登录验证,则需要讲use_sasl的注释去掉进行启用。

四、业务维护

在一切完成后,其实可以直接使用svnserve工具进行服务的启用,如下:

[root@fangwei-physics ~]# svnserve --daemon --root /svn

--daemon指通过守护模式运行,--root则指向svn仓库主目录的位置。

但是直接通过进程进行运行存在其弊端,类似于不方便管理和开机启动设定比较麻烦等,所以一般来说我们推荐讲这类服务端应用写成systemd进程的形式:

[root@fangwei-physics ~]# vim /etc/systemd/system/svn.service

记住此处systemd服务名不要用svnserve.service,会和原进程产生冲突。svn.service 内容编辑如下:

[Unit]
Description=Subversion Server

[Service]
Type=forking
ExecStart=/usr/bin/svnserve -d -r /svn
ExecStop=/usr/bin/kill -9 $(pidof svnserve)
Restart=always

[Install]
WantedBy=default.target

主要设定了ExecStart和ExecStop,确保每次都能正常启动服务。然后我们需要将这个service模块保存到systemd中:

[root@fangwei-physics ~]# systemd daemon-reload

到这一步,我们基本就完成了svn服务软件的systemd化管理。之后我们只需要做两部工作:

1、把服务设置为开机启动

[root@fangwei-physics ~]# systemd enable svn.service

2、启动服务

[root@fangwei-physics ~]# systemd start svn.service

之后我们就能通过svn客户端来登录svn仓库,并和朋友或者同事一起进行项目的开发和持续集成了。