Subversion Service Deployment
当今时代,代码版本管理,一般推荐“Git”。但是工作用到“Subversion”,即“SVN”,所以记录一下相关部署。
1. 概述
在Debian 11上部署SVN(即Subversion)服务,一般按以下步骤执行即可。
- 安装。Debian使用
apt
命令即可。 - 配置。包括创建运行用户、建立部署文件夹、设置Systemd自动启动。
- “仓库”管理。包括“仓库”的创建、备份、导出、迁移等。
- “踩坑”。记录遇到的问题。
参考
- Debian官方教程:SVNAdministrationTutorial - Debian Wiki
- SVN详细文档:Subversion 与版本控制
2. 安装
通过apt
命令安装“subversion”即可。
sudo apt install subversion
“subversion”包含3类程序:
服务程序
- svnserve:提供SVN的网络服务。
- svnsync:仓库镜像工具,仓库都可以是远程的或本地的。
管理程序
- svnadmin:管理SVN仓库。
- svnlook:查看SVN仓库,纯只读。
- svnrdump:远程仓库数据迁移。相当于
svnadmin dump
和svnadmin load
的网络版。 - svndumpfilter:历史过滤工具,从SVN的转储文件中移除某些历史 (即版本号)。
客户端程序
- svn:SVN命令行客户端。
- svnversion:显示工作副本版本信息。
- svnmucc:多URL命令行客户端,允许用户在没有工作副本的情况下,向仓库提交任意修改。
以上程序的使用,可参考:Subversion 命令行参考手册
3. 配置
- 创建系统用户“svn”,用于运行SVN服务。
useradd -r -M -s /bin/false svn
- 创建SVN“仓库”的路径。
sudo mkdir -p /opt/svn/repos
sudo chown svn /opt/svn/repos
- 创建Systemd的服务配置文件
/etc/systemd/system/svnserve.service
。其内容如下:
[Unit]
Description=Subversion protocol daemon
After=syslog.target network.target
[Service]
Type=forking
RuntimeDirectory=svnserve
PIDFile=/run/svnserve/svnserve.pid
EnvironmentFile=/etc/default/svnserve
ExecStart=/usr/bin/svnserve $DAEMON_ARGS
User=svn
Group=svn
KillMode=control-group
Restart=on-failure
[Install]
WantedBy=multi-user.target
- 创建设置SVN服务启动参数的配置文件
/etc/default/svnserve
。其内容如下:
# svnserve options
DAEMON_ARGS="--daemon --pid-file /run/svnserve/svnserve.pid --root /srv/svn/repos --log-file /var/log/svnserve/svnserve.log"
- 创建Log日志文件目录。
sudo mkdir /var/log/svnserve
sudo chown svn /var/log/svnserve
- 创建Log日志文件自动转存的配置文件
/etc/logrotate.d/svnserve
。设置每天按天进行转存并压缩日志,最多保留最近30天。其内容如下:
/var/log/svnserve/*.log {
daily
missingok
rotate 30
compress
notifempty
create 640 svn adm
sharedscripts
postrotate
if /bin/systemctl status svnserve > /dev/null ; then \
/bin/systemctl restart svnserve > /dev/null; \
fi;
endscript
}
- 最后SVN服务设置为自动开机启动,并立即启动它。
sudo systemctl daemon-reload
sudo systemctl enable svnserve.service
sudo systemctl start svnserve.service
4. 仓库管理
SVN的“仓库”(Repository),是一系列需要进行版本管理的目录和文件的管理单位。例如一个包含几个子项目的大型项目。“仓库”没有限制组织结构,只是以树状形式保存相关目录和文件。
- 创建“仓库”。在所有“仓库”的存放目录下,建立指定“仓库”目录“project1”。
sudo -u svn svnadmin create /opt/svn/repos/project1
设置“仓库”访问权限。修改仓库的“conf”目录下的文件。
- svnserve.conf,配置“仓库”的认证、授权策略、访问控制等。
- authz-db,“仓库”的访问控制文件,包括配置可访问“仓库”的用户。
- password-db,可访问“仓库”的用户的密码。
- 迁移“仓库”。把“仓库”导出,再导入到另一个新的仓库。可用于升级SVN服务软件后,把已有“仓库”迁移过去。
# 导出仓库project1
sudo -u svn svnadmin dump project1 > project1.dump
# 导入到仓库project2。project2需要提前新建。
sudo -u svn svnadmin load project2 < project1.dump
- 备份“仓库”。使用“svnadmin hotcopy”命令,对“仓库”进行在线备份(不用担心是否还有其他进程在访问“仓库”),并能够在原“仓库”出现故障时顶替上去。此命令也可用于不同机器的同版本SVN服务之间迁移数据。
# 执行备份
sudo -u svn mkdir -p /var/svn/backups/
sudo -u svn svnadmin hotcopy /opt/svn/repos/project1 /var/svn/backups/project1.bak
# 执行还原
sudo -u svn svnadmin hotcopy /var/svn/backups/project1.bak /opt/svn/repos/project1
5. 踩坑
5.1. 默认权限不能查看历史记录
使用svnadmin create
创建“仓库”后,默认不能查看历史记录。需要修改“仓库”下的conf/svnserve.conf
,设置以下两个配置项,并重启SVN服务:
anon-access = none
auth-access = write
5.2. 影响MySQL部署
Debian 11的服务器上,通过MySQL官方源安装了“mysql-server”服务,再安装“subversion”后,MySQL的配置文件被改为指向了MariaDB的(如下),导致MySQL服务不能运行。手工修正解决问题。
/etc/alternatives/my.cnf -> /etc/mysql/mariadb.cnf