记录一下Linux上面安装部署SVN服务

SVN安装

使用yum安装SVN

1
$ yum -y install subversion

创建目录并配置

建立版本库目录(建议使用/var/svn 这样的路径,不然后续在配置开机自启的时候需要修改部分配置,看个人喜好吧!)

1
$ mkdir -p /opt/svn/

创建svn代码库

1
$ svnadmin create  /opt/svn/repo

执行上面的命令后,自动建立repo测试库,查看/opt/svn/repo 文件夹发现包含了conf, db,format,hooks, locks, README.txt等文件,说明一个SVN库已经建立。以后创建svn库类似,替换repo名称即可

用户密码passwd配置

1
2
[root@Master ~]# cd /opt/svn/repo/conf/
[root@Master conf]# nano passwd

修改password为以下内容:

1
2
3
4
[users]
# harry = harryssecret
# sally = sallyssecret
admin=admin

注:格式必须是 用户名=密码(用户名和密码必须成对

权限控制authz配置

1
[root@Master conf]# nano authz 

目的是设置哪些用户可以访问哪些目录,向authz文件追加以下内容:

1
2
3
#设置[/]代表根目录下所有的资源   或者写成[repl:/]
[/]
admin = rw

以上配置表示demo对根目录有读写权限,r为读,w为写

如果是多个用户开发,这里可以配置用户组,编辑示例:

1
2
3
4
5
6
7
8
9
[groups]
admin = admin # admin为用户组,等号之后的admin为用户
test = fuhd,test

[repo:/] # 表示根目录(/opt/svn/repo)
@admin = rw # 表示admin组对根目录有读写权限,r为读,w为写

[repo:/test] # 表示test目录(/opt/svn/repo/test)
@test = rw # 表示test组对test目录有读写权限

服务svnserve.conf配置

每个版本库创建之后都会生成svnserve.conf主要配置文件。编辑它:

1
[root@Master conf]# nano svnserve.conf 

追加以下内容:

1
2
3
4
5
6
7
8
9
10
11
[general]
#匿名访问的权限,可以是read,write,none,默认为read
anon-access=none
#使授权用户有写权限
auth-access=write
#密码数据库的路径
password-db=passwd
#访问控制文件
authz-db=authz
#认证命名空间,subversion会在认证提示里显示,并且作为凭证缓存的关键字,可以填写为项目名称
realm=repositories

启动与停止svn服务

查看svn的服务是否启动

1
$ ps -ef|grep svn

如果没有启动执行下面命令即可(默认端口3690):

1
2
3
4
5
6
$ svnserve -d -r /opt/svn/repo
# 或者:
$ systemctl start svnserve

## 指定端口
$ svnserve -d -r /opt/svn/repo --listen-port=9527

停止:

1
$ killall svnserve

开启端口

如果配置了防火墙规则,使用如下命令即可:

1
2
3
4
$ /sbin/iptables -I INPUT -p tcp --dport 3690 -j ACCEPT
$ /etc/rc.d/init.d/iptables save
$ /etc/init.d/iptables restart
$ /etc/init.d/iptables status
  • 访问

    本地使用svn去checkout代码。请求地址:svn://ip(域名)/库名

    eg:

    QQ截图20211116180137

    填写账号、密码

    QQ截图20211116181201

配置开机自启

1
$ systemctl enable svnserve.service  

如果前面设置的svn目录地址使用的是/var/svn 这样的路径,开机时能够启动的,如果不是,可能会报如下错误:

1
2
3
4
5
6
7
8
9
10
11
12
[root@Master ~]#systemctl status svnserve
● svnserve.service - Subversion protocol daemon
Loaded: loaded (/usr/lib/systemd/system/svnserve.service; enabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Tue 2021-11-16 18:22:03 CST; 31s ago
Process: 1011 ExecStart=/usr/bin/svnserve --daemon --pid-file=/run/svnserve/svnserve.pid $OPTIONS (code=exited, status=1/FAILURE)

Nov 16 18:22:02 Master systemd[1]: Starting Subversion protocol daemon...
Nov 16 18:22:03 Master svnserve[1011]: svnserve: 根路径“/var/svn”不存在,或者不是目录。
Nov 16 18:22:03 Master systemd[1]: svnserve.service: control process exited, code=exited status=1
Nov 16 18:22:03 Master systemd[1]: Failed to start Subversion protocol daemon.
Nov 16 18:22:03 Master systemd[1]: Unit svnserve.service entered failed state.
Nov 16 18:22:03 Master systemd[1]: svnserve.service failed.

这里需要修改/etc/sysconfig下的svnserve文件:

1
[root@Master ~]# nano /etc/sysconfig/svnserve

将该配置文件中的/var/svn变更为你自己的路径就行,eg:

1
2
3
4
# OPTIONS is used to pass command-line arguments to svnserve.
#
# Specify the repository location in -r parameter:
OPTIONS="-r /opt/svn"

使用如下命令项目是可以启动的:

1
$ systemctl start svnserve.service

查看svn服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@Master ~]# systemctl status svnserve.service
● svnserve.service - Subversion protocol daemon
Loaded: loaded (/usr/lib/systemd/system/svnserve.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2021-11-16 18:28:58 CST; 28s ago
Process: 2049 ExecStart=/usr/bin/svnserve --daemon --pid-file=/run/svnserve/svnserve.pid $OPTIONS (code=exited, status=0/SUCCESS)
Main PID: 2050 (svnserve)
Tasks: 1
Memory: 596.0K
CGroup: /system.slice/svnserve.service
└─2050 /usr/bin/svnserve --daemon --pid-file=/run/svnserve/svnserve.pid -r /opt/svn

Nov 16 18:28:58 Master systemd[1]: Starting Subversion protocol daemon...
Nov 16 18:28:58 Master systemd[1]: Started Subversion protocol daemon.

配置SVN以HTPP的形式访问

安装HTTP访问需要的软件

1
2
3
$ yum install -y httpd mod_dav_svn

# httpd 是Apache公司提供的http访问软件,mod_dav_svn是协助SVN使用http访问的插件

配置HTTP访问SVN时登录授权

这里需要使用htpasswd 命令重新创建SVN认证的账号和密码,这里是为了在使用HTTP访问SVN的时候授权认证

1
2
3
4
5
6
7
8
9
10
# 备份原来的账号密码
$ mv passwd passwd.default

# 使用htpasswd创建账号密码
$ htpasswd -cm passwd yourname
$ htpasswd -m passwd myname

# 如果移动了passwd文件,在使用htpasswd的同时需要添加-c参数去创建passwd文件,如果不使用,会报如下错误:
htpasswd: cannot modify file passwd; use '-c' to create it
# eg: htpasswd -cm passwd zhangsan,zhangsan就是登录的账号

给予apache用户对于SVN仓库的权限

1
$ chown -R apache:apache repo

如果不给于权限,代码可能只能更新,不能提交,并报 could not begin a transaction 错误,如下:

image-20220419162649778

创建HTTP访问SVN的配置文件

1
2
3
4
5
# 进入httpd配置服务的目录
$ cd /etc/httpd/conf.d

# 创建访问SVN的网络请求配置
$ touch svn.conf

填充svn.conf文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 这里Location后面的配置就是http访问时的路由地址
<Location /repo>
# 使用刚刚安装的mod_dav_svn
DAV svn
# 该参数是SVN仓库的上级目录,这里即 /opt/svn
# SVNParentPath /opt/svn
# 配置SVN仓库路径
SVNPath /opt/svn/repo
# 配置HTTP授权方式
AuthType Basic
AuthName "Authorization Realm"
# 配置HTTP访问SVN时的登录账号密码等
AuthUserFile /opt/svn/repo/conf/passwd
# 配置HTTP访问SVN时的授权账号或者用户组等
AuthzSVNAccessFile /opt/svn/repo/conf/authz
Satisfy all
Require valid-user
</Location>

启动或者重启httpd服务

1
2
3
4
5
6
7
8
# 启动httpd服务
$ systemctl start httpd

# 重启httpd服务
$ systemctl restart httpd

# 配置httpd服务开机自启
$ systemctl enable httpd

在浏览器上查看SVN服务

  1. 打开浏览器,访问http://192.168.217.128/repo,看看有无问题

    image-20220419141743172

    输入配置的账号密码,可在浏览器端查看上传的文件

    image-20220419141824384

  2. 安装上SVN客户端,拉取SVN仓库后提交文件测试

使用Nginx代理HTTP+SVN访问

分配端口

因为Nginxhttpd默认使用的都是80端口,所以我们需要重新分配下Nginxhttpd两个的默认端口,我这里修改的是httpd的默认端口(看个人取舍吧!)

1
2
3
4
5
6
7
8
9
10
11
# 进入httpd默认的配置文件中
$ nano /etc/httpd/conf/httpd.conf

# 找到Listen属性 将80修改为非80端口即可(因为我这里使用的是httpd访问SVN,而SVN服务默认端口为3690,故这里也设置为3690)
Listen 3690

# 重启或者重载httpd服务使配置生效
# 重启
$ systemctl restart httpd
# 重载
$ service httpd reload

注意:有些情况下修改了httpd的端口重启后可能会报如下错误:

image-20220419135100365

这是因为本机selinux而导致的错误,调整selinux状态即可,修改selinux的状态有两种方式,一种是命令方式,临时生效,一种是修改配置文件,永久生效

1、命令方式:调整至permissive

1
$ setenforce 0

2、修改配置文件

1
2
3
4
5
6
7
8
# 修改/etc/selinux下的config文件
$ nano /etc/selinux/config

# 将SELINUX=enforcing 属性值改为 disabled
SELINUX=disabled

# 重新启动让其生效
$ reboot

Nginx中代理HTTP+SVN服务

/etc/nginx/conf.d 地址下创建svn.conf文件

1
$ touch /etc/nginx/conf.d/svn.conf

在该文件中填入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
listen 80;
server_name localhost;
location / {
# 这里的请求就是HTTP+SVN访问地址
proxy_pass http://127.0.0.1:3690;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Cookie $http_cookie;
client_max_body_size 5000M;
}
}

校验Nginx配置并重载服务

1
2
3
$ nginx -t

$ nginx -s reload

美化浏览器访问SVN库显示样式

默认的浏览器访问SVN代码的时候

image-20220419144345113

这里无法很好的区分文件或者是文件夹

美化后的效果:

image-20220419144608495

需要在 /etc/httpd/conf.d/ 下创建的 SVN 配置文件中添加 SVNIndexXSLT “/svnindex.xsl” 属性值,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 这里Location后面的配置就是http访问时的路由地址
<Location /repo>
# 使用刚刚安装的mod_dav_svn
DAV svn
# 该参数是SVN仓库的上级目录,这里即 /opt/svn
# SVNParentPath /opt/svn
# 配置SVN仓库路径
SVNPath /opt/svn/repo
# 自定义美化浏览器访问时页面
SVNIndexXSLT "/svnindex.xsl"
# 配置HTTP授权方式
AuthType Basic
AuthName "Authorization Realm"
# 配置HTTP访问SVN时的登录账号密码等
AuthUserFile /opt/svn/repo/conf/passwd
# 配置HTTP访问SVN时的授权账号或者用户组等
AuthzSVNAccessFile /opt/svn/repo/conf/authz
Satisfy all
Require valid-user
</Location>

svnindex.xsl 文件从哪里来?

如果是用的yum安装的subversion ,svnindex.xsl 默认地址为 /usr/share/doc/subversion-1.7.14/xslt

如果找不到,可通过如下命令搜索该文件:

1
$ find / -name "svnindex.xsl"

当然,也可使用我这里已经配置好了的样式(看个人爱好吧!)

第三方自定义样式地址

注:如果svnindex.xsl同级的目录下有其他文件,请在移动复制时一起操作

svnindex.xsl 文件该放在哪里才能生效?

因为这是在httpd工具下显示样式,因此该文件需放置在https默认的配置路径下,即:/var/www/html

image-20220419150406367