如何搭建自己的SVN服务器,附踩坑实录
目标
在Linux服务器上搭建SVN,实现服务器本地使用SVN自动同步最新代码
新建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 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/passwd
、conf/authz
、conf/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试一试。
如果是输入密码错误导致的”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访问 出站规则 》 新建规则中,允许所有流量流出即可 顺手来个表情包
总结 配置不坑,防火墙和安全组挺坑的