Centos Linux下搭建SVN服务器

Centos下搭建SVN服务器

安装SVN

1
yum -y install subversion

查看SVN的安装位置

1
2
3
4
5
6
7
8
[root@VM_94_152_centos ~]# rpm -ql subversion
/usr/bin/svn
/usr/bin/svnadmin
/usr/bin/svndumpfilter
/usr/bin/svnlook
/usr/bin/svnserve
/usr/bin/svnsync
/usr/bin/svnversion

查看SVN版本

1
2
3
4
5
6
7
[root@VM_94_152_centos ~]# /usr/bin/svnversion --version
svnversion, version 1.6.11 (r934486)
compiled Aug 17 2015, 08:37:43

Copyright (C) 2000-2009 CollabNet.
Subversion is open source software, see http://subversion.tigris.org/
This product includes software developed by CollabNet (http://www.Collab.Net/).

创建svn版本库目录

1
mkdir -p /www/svn/lotkk

创建版本库

1
svnadmin create /www/svn/lotkk

执行了这个命令之后会在/www/svn/lotkk目录下生成如下这些文件

1
2
[root@VM_94_152_centos lotkk]# ls
conf db format hooks locks README.txt

初始化版本仓库中的目录

mkdir project project/server project/client project/test (建立临时目录)
svn import project/ file:///www/svn/lotkk -m “初始化SVN目录”
rm -rf project (删除临时建立的目录)

配置版本库

1
[root@VM_94_152_centos lotkk]# cd /www/svn/lotkk/conf

authz文件是权限控制文件
passwd是帐号密码文件
svnserve.conf SVN服务配置文件

添加用户

vim passwd 在[users]块中添加用户和密码,格式:帐号=密码

1
2
3
4
5
6
7
8
9
10
11
12
### This file is an example password file for svnserve.
### Its format is similar to that of svnserve.conf. As shown in the
### example below it contains one section labelled [users].
### The name and password for each user follow, one account per line.

[users]
# harry = harryssecret
# sally = sallyssecret
pm = pm_pw
server_group = server_pw
client_group = client_pw
test_group = test_pw

添加权限

vim authz 在末尾添加如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[groups]
project_p = pm
project_s = server1,server2,server3
project_c = client1,client2,client3
project_t = test1,test1,test1
[project:/]
@project_p = rw
* =
[project:/server]
@project_p = rw
@project_s = rw
* =
[project:/client]
@project_p = rw
@project_c = rw
* =
[project:/doc]
@project_p = rw
@project_s = r
@project_c = r
@project_t = r
* =

以上信息表示,只有project_p用户组有根目录的读写权。r表示对该目录有读权限,w表示对该目录有写权限,rw表示对该目录有读写权限。最后一行的* =表示,除了上面设置了权限的用户组之外,其他任何人都被禁止访问本目录。这个很重要,一定要加上!

修改svnserve.conf文件

vim svnserve.conf 打开下面的几个注释:

1
2
3
4
anon-access = none #非授权用户无法访问
auth-access = write #授权用户可写
password-db = /www/svn/lotkk/conf/passwd #使用哪个文件作为账号文件
authz-db = /www/svn/lotkk/conf/passwd #使用哪个文件作为权限文件

启动SVN

1
2
svnserve -d -r /www/svn/lotkk    #注意目录,不包含svn1
ps aux | grep svnserve #查看服务是否启动

关闭SVN

1
killall svnserve

删除版本库

1
rm -rf lotkk/

测试版本库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
svn co svn://lotkk.com/project
Authentication realm: <svn://lotkk.com:3690> 92731041-2dae-4c23-97fd-9e1ed7f0d18d
Password for 'root':
Authentication realm: <svn://lotkk.com:3690> 92731041-2dae-4c23-97fd-9e1ed7f0d18d
Username: server_group
Password for 'server_group':
svn: Authorization failed ( server_group没用根目录的访问权 )
# svn co svn://lotkk.com/project
Authentication realm: <svn://lotkk.com:3690> 92731041-2dae-4c23-97fd-9e1ed7f0d18d
Password for ‘root’:
Authentication realm: <svn://lotkk.com:3690> 92731041-2dae-4c23-97fd-9e1ed7f0d18d
Username: pm
Password for ‘pm’:
A project/test
A project/server
A project/client
Checked out revision 1. ( 测试提取成功 )
# cd project/server
# vim main.c
# svn add main.c
# svn commit main.c -m “测试一下我的C程序,看什么看,不行啊??”
Adding main.c
Transmitting file data .
Committed revision 2. ( 测试提交成功 )

同个SVN库下根据不同的权限访问不同的目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[groups]
group1 = user1,user2
group2 = user3,user4

[svn1:/]
test = rw
other = rw
anyone = rw
@group1 = rw
@group2 = rw

[svn1:/chanpin]
other = rw
@group1 = rw
* =

[svn1:/yanfa]
anyone = rw
@group2 = rw
* =

打开端口

这一步很重要,如果你都配置完了却发现连接不上,那一定是端口没有打开,默认端口是3690.

1
2
iptables -I INPUT -i eth0 -p tcp --dport 3690 -j ACCEPT #开放端口 
service iptables save #保存 iptables 规则(如不能保存请使用其他方法保存)

自动部署

每一次commit提交代码之后都会执行钩子post-commit,根据这个原理可以修改post-commit,让服务器上的web目录在每次有人commit之后自动update。

1
2
cp post-commit.tmpl post-commit 
vi post-commit

内容如下

1
2
3
4
5
6
7
export LANG=zh_CN.GBK   
#设定语言,根据系统语言设置,如果是UTF-8 就设置为 LANG=zh_CN.UTF-8
echo "hello world" >> /tmp/svn.log #用来测试钩子是否有执行,调试使用,如果正常就不需要这行了
SVN_PATH=/usr/bin/svn
WEB_PATH=/home/wwwroot/testsvn

$SVN_PATH update svn://127.0.0.1/project $WEB_PATH --username 用户名 --password 密码 --no-auth-cache

给post-commit 执行权限:chmod -R 755 post-commit

钩子文件里的其他都可以不要了,可以都把他们注释掉。能这么使用的前提是你的yourWebDir已经checkout过了

1
2
3
cd /data/wwwroot/yourWebDir 
svn checkout svn://你的服务器ip
... #根据提示完成checkout

至此全部搞定,每一次commit到服务器会自动更新网站内容了。