Jeffrey Wang
文章85
标签144
分类12
如何搭建自己的SVN服务器,附踩坑实录

如何搭建自己的SVN服务器,附踩坑实录

目标

  1. 在Linux服务器上搭建SVN,实现服务器本地使用SVN自动同步最新代码
  2. 新建N个账号,给产品、程序员在公网环境下使用

准备工作

首先,,你得有一台服务器,如果这个SVN仓库需要能在公网访问,服务器得需要有一个公网IP。 如果没有公网环境,虚拟机来做测试也是可以的,甚至家里边用不上的电脑加花生壳软件,再做一个映射都行。

SVN简介

SVN是subversion的简称,是一个操作简单的中心化的版本控制器,Windows上使用TortoiseSVN软件或者Linux上使用subversion工具,就可以方便的在各个客户端同步代码、资料等。TortoiseSVN下载

操作步骤

安装subversion

先确定服务器是否有安装subversion

1
[root@localhost ~]# svnversion --version

如下图所示,是未安装的情况 如果未安装,使用yum install安装一下即可

1
[root@localhost ~]# yum install subversion

安装成功后,subversion -v确定下,如下图所示就是安装成功

1
[root@localhost ~]# svnversion --version

新建SVN仓库

创建SVN仓库的命令是svnadmin create 仓库路径 比如,我想让我的/var/svn/作为我SVN仓库的根目录,那么可以分为三个步骤进行仓库创建操作

1
创建文件夹 => 进入文件夹 => 创建仓库

示例如下:

1
2
3
[root@localhost ~]# mkdir /var/svn
[root@localhost ~]# cd /var/svn/
[root@localhost svn]# svnadmin create test

执行结果如下,在/var/svn/test下创建了一个仓库

配置SVN

创建完毕后,/var/svn/test目录下出现conf、db、hooks等目录 其中,conf文件夹下包含三个重要的文件conf/passwdconf/authzconf/svnserve

文件名

描述

conf/passwd

用户文件,配置用户名和密码

conf/authz

用户权限文件,用于配置用户权限

conf/svnserve.conf

配置启动参数

用户文件passwd

首先,编辑passwd文件,里边只有一个[users]模块,含义是 用户名 = 密码 比如,我们有Jeffrey、Sally、Jack、Pony四个人,密码是名字+123,就可以这样写

1
[root@localhost conf]# vim passwd

权限文件authz

权限文件用于指定访问权限,可指定分组权限或个人权限 比如: Jeffrey和Sally是程序员,属于programers分组,只读/doc/目录,读写/src/目录。 Jack是产品经理,属于PM分组,能读写/doc/,不能访问/src/。 Pony是老板,属于Mangager分组,能读写/doc/src/样例如下: [groups]模块里边配置分组信息 [/dir]模块里边配置分组权限/个人权限信息,r代表读,w代表写

1
2
3
4
配置说明:
分组名 = rw # 分组权限配置
&用户名 = rw # 单个用户权限配置
* = rw # 所有用户权限配置

启动文件svnserve.conf

用于配置启动参数,具体说明如下图所示

运行SVNSERVE

配置完毕之后就可以启动SVN服务了,svnserve是一个服务端程序,启动后就能向其他人提供SVN服务。 参数说明: svnserve -d -r /路径 –listen-port 端口号 -d 表示守护进程 -r 表示SVN服务根路径 –listen-port 可指定端口号

1
2
3
4
5
6
# 运行服务端程序
[root@localhost conf]# svnserve -d -r /var/svn/
# 检查是否运行成功
[root@localhost conf]# ps -fe grep svnserve
root 1586 1 0 02:25 ? 00:00:00 svnserve -d -r /var/svn/
root 1588 1448 0 02:25 pts/0 00:00:00 grep svnserve

本地仓库测试

假设现在这个服务器上搭建有一个网站,路径是/var/www/html/,需要使用svn更新代码。 【注】首次使用,需要输入root密码和配置的用户名+密码,root密码直接输入空就行了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@localhost html]# svn checkout svn://127.0.0.1/test/
认证领域: <svn://127.0.0.1:3690> My First Repository
“root”的密码:
认证领域: <svn://127.0.0.1:3690> My First Repository
用户名: Jeffrey
“Jeffrey”的密码:

-----------------------------------------------------------------------
注意! 你的密码,对于认证域:

<svn://127.0.0.1:3690> My First Repository

只能明文保存在磁盘上! 如果可能的话,请考虑配置你的系统,让 Subversion
可以保存加密后的密码。请参阅文档以获得详细信息。

你可以通过在“/root/.subversion/servers”中设置选项“store-plaintext-passwords”为“yes”或“no”,
来避免再次出现此警告。
-----------------------------------------------------------------------
保存未加密的密码(yes/no)?yes
[root@localhost html]# svn checkout svn://127.0.0.1/test/
取出版本 0。

添加文件

【注】先切换到/var/www/html/test/,再进行SVN操作,还有使用的用户是Jeffrey用户,只有src目录的写权限,所以只能提交src目录,否则报权限错误。。 【注】测试是,我给src/index.html里边写入了”Hello World!”

1
2
3
4
5
6
[root@localhost html]# cd test/
[root@localhost test]# mkdir doc/ src
[root@localhost test]# vim src/index.html
[root@localhost test]# svn status
? doc
? src

提交

commit的时候,-m 后写上理由即可。

1
2
3
4
5
6
7
8
[root@localhost test]# svn add src/
A src
A src/index.html
[root@localhost test]# svn commit -m '初始化提交'
增加 src
增加 src/index.html
传输文件数据.
提交后的版本为 1。

实现脚本自动同步最新代码

Linux中可以使用shell+contab定时拉取SVN中的最新代码,也不麻烦。 如果没有安装crontab,需要yum install crontabs,再service crond start ~/svnupdate.sh内容:

1
2
3
4
5
#! /bin/sh
# 进入目标目录
cd /var/www/html/test
# 调用svn update即可同步
svn update

crontab -e内容:

1
*/60 * * * * /bin/shell /root/autogitpull.sh

命令概览

1
2
3
4
5
[root@localhost test]# vim ~/svnupdate.sh
[root@localhost test]# chmod u+x ~/svnupdate.sh
# 测试脚本是否正确
[root@localhost test]# ~/svnupdate.sh
版本 1。

远程仓库测试

首先,SVN服务器的IP为192.168.220.128,所以Linux或Windows需要在指定地址是svn://192.168.220.128/test(创建的test项目) 【注】如果出现如下错误,请按照采坑实录调整双方防火墙

1
2
[root@localhost html]# svn checkout svn://192.168.220.128/test/
svn: 无法连接主机“192.168.220.128”: 没有到主机的路由

Linux同步SVN测试

首先,按照相同的方法安装subversion

1
2
3
4
[root@localhost ~]# /usr/bin/yum install subversion
已加载插件:fastestmirror
设置安装进程
Loading mirror speeds from cached hostfile

特别需要注意,如果Linux本机没有开启8690的INPUT和OUTPUT,也会出现问题。 不用开启subserve,直接svn checkout svn://192.168.220.128/test/src/即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@localhost html]# svn checkout svn://192.168.220.128/test/src
认证领域: <svn://192.168.220.128:3690> My First Repository
“root”的密码:
认证领域: <svn://192.168.220.128:3690> My First Repository
用户名: Sally
“Sally”的密码:

-----------------------------------------------------------------------
注意! 你的密码,对于认证域:

<svn://192.168.220.128:3690> My First Repository

只能明文保存在磁盘上! 如果可能的话,请考虑配置你的系统,让 Subversion
可以保存加密后的密码。请参阅文档以获得详细信息。

你可以通过在“/root/.subversion/servers”中设置选项“store-plaintext-passwords”为“yes”或“no”,
来避免再次出现此警告。
-----------------------------------------------------------------------
保存未加密的密码(yes/no)?yes
A src/index.html
取出版本 1。
[root@localhost html]# tail src/index.html
Hello World!

Windows同步SVN测试

安装完TortoiseSVN之后,在一个空文件夹里 右键 》 SVN Checkout 填写SVN地址,点OK再输入密码,即可同步

踩坑实录

各位请留步,博主还针对容易出现各种”Connect timed out”、”Connect refused”等问题,进行了一下总结。

认证失败

如果出现“认证失败”或“Authorization Faild!”,首先考虑conf/authz的权限配置问题,特别是[/]分组的权限配置问题,先改为* = rw试一试。

1
2
[/]
* = rw

如果是输入密码错误导致的”Authorization Faild!”可以删除~/.subversion/auth/,删除后即可重新输入密码。

1
[root@localhost test]# rm -rf ~/.subversion/auth

iptables配置

svnserve的默认端口是3690,所以需要开启INPUT链 dport 3690和OUTPUT链 sport 3690。 vim /etc/sysconfig/iptables 在末尾加入下边三行代码

1
2
3
# SVN
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3690 -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 3690 -m state --state ESTABLISHED -j ACCEPT

然后重启防火墙,Centos6:service iptables restart,Centos7,如果使用fireware则另行配置。 如果SVN客户端也是Linux的话,需要给客户端Linux加上防火墙配置

1
2
3
# SVN
-A INPUT -m state --state NEW -m tcp -p tcp --sport 3690 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 3690 -m state --state ESTABLISHED -j ACCEPT

深坑-云主机的安全组

深坑警告!!! 腾讯云、阿里云均设有 安全组功能,类似于在服务器最外层加上了一个iptables,很多时候也能起到一定的防护作用。但是当我们启动了一个服务,但是没有在安全组内放开端口权限的话,,肯定报超时!!!

创建安全组

选择自定义

配置8690开放

入站规则 》 新建规则中,允许所有的8609访问 出站规则 》 新建规则中,允许所有流量流出即可 顺手来个表情包

总结

配置不坑,防火墙和安全组挺坑的

本文作者:Jeffrey Wang
本文链接:https://blog.wj2015.com/2018/07/20/%E5%A6%82%E4%BD%95%E6%90%AD%E5%BB%BA%E8%87%AA%E5%B7%B1%E7%9A%84svn%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%8C%E9%99%84%E8%B8%A9%E5%9D%91%E5%AE%9E%E5%BD%95/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可
×