将原本部署在Windows服务器下的SVN服务端VisualSvnServer迁移到Linux下的iF.SVNAdmin,实现基于浏览器端的SVN管理,提升管理体验,降低管理成本。
现有SVN服务端管理每次需要远程登录服务器的痛苦如同压抑良久的火山终于爆发,部门近期终于下定决心将SVN Server从VisualSvnServer迁移到iF.SVNAdmin。
本文将介绍将VisualSvnServer所管理的现有SVN仓库迁移到iF.SVNAdmin中时候的一些注意事项。
关于iF.SVNAdmin的安装,网上已经有了非常详尽的资料(可参见底部链接),并且 iF.SVNAdmin的最近一次更新追溯到2013年,因此也不用担心网上资料时效性的问题,因此笔者这里就不再拾人牙慧。
以下笔者仅就个人在安装过程中遇到的一些典型问题进行总结:
Error: Could not copy configuration file template. Require write permission (777) to "data" folder and all containing files.
把SELinux状态状态改为disabled并重启电脑。在终端输入 setenforce 0(临时关闭),永久关闭参考:https://jingyan.baidu.com/article/851fbc37a05a0d3e1f15abe3.html。
访问错误日志查询。
在iF.SVNAdmin的架构体系下,响应请求的其实是Apache所提供的服务,因此相关的错误日志,我们可以从/etc/httpd/logs/error_log
下进行寻找。
SVN访问地址。
svnadmin的管理页面为 http://ip/svnadmin,而与之对应的,每个仓库的访问地址则为 http://ip/svn/{仓库名}
2021/07/26更正。
我们依然可以使用"复制VisualSvnServer下指定仓库到iF.SVNAdmin对应目录下"的方式来完成的SVN仓库的迁移。
重要: 对比Windows端VisualSvnServer所拥有svn.exe的版本,然后将安装了iF.SVNAdmin的Linux端的SVN客户端工具升级为同样的版本。方法参见【Linux】centos7.x 升级svn版本到指定版本。
在保证两端SVN版本号相同之后,接下来的事情就简单了:
cd /var/www/svn/{仓库明}/db/
vi format
# 内容修改为:
# 4
# layout sharded 1000
关于这一块,笔者本来打算直接采取复制VisualSvnServer下指定仓库到iF.SVNAdmin对应目录下的方式来完成的,但是在实际的操作过程中发现现实并没有那么美好,迁移过来的仓库要么无法正常展示仓库层级,要么甚至网页都报错。
无奈之下祭出最为稳妥的方式: 备份还原大法:
#################### VisualSvnServer(Windows Server下), 使用svnadmin进行指定仓库的备份
### 千万注意: 以下操作必须在CMD下进行, 切勿使用powershell
# PATH-TO-REPO - SVN 项目仓库目录
# PATH-TO-DUMP - 导出SVN项目仓库dump目录文件名
svnadmin dump PATH-TO-REPO > PATH-TO-DUMP
# 范例
cd d:/SVN/Repositories/
svnadmin dump ./DEVOPS > D:/fulizhe/DEVOPS
#################### iF.SVNAdmin(Centos7下), 依然是使用svnadmin进行指定上述svn备份库的还原
# 1. 首先使用 iF.SVNadmin的浏览器管理工具创建一个空的SVN仓库(这里注意直接选择"空库")
# 2. 使用svnadmin进行上述svn备份库的还原
# PATH-TO-NEW-REPO - SVN 项目仓库目录
# PATH-TO-DUMP - 已保存的SVN项目仓库dump文件
svnadmin load PATH-TO-NEW-REPO < PATH-TO-DUMP
# 范例
svnadmin load /var/www/svn/DEVOPS/ < /root/DEVOPS
迁移完仓库,接下来就该迁移SVN用户。关于这一点,得益于SVN服务端本身良好的设计,这一块工作量很少。
VisualSvnServer仓库根目录下有:
htpasswd
的文件,其中存在着用户信息,将其拷贝到 iF.SVNAdmin中的 passwd 文件(示例目录:/var/www/svn/passwd
)里即可。groups.conf
的文件,其中存在着分组信息。将其拷贝到 iF.SVNAdmin中的 authz文件(示例目录:/var/www/svn/authz
)里即可。依次对VisualSvnServer中的仓库完成上述3.1小节的操作之后,我们将得到完整提交日志的SVN仓库。接下来我们要做的是将原本在VisualSvnServer中配好的权限管理迁移到iF.SVNAdmin下。
得益于SVN服务端本身良好的设计,这一块工作量也很少。
VisualSvnServer下针对每个仓库的权限配置存放在每个仓库文件夹下的 VisualSVN-SvnAuthz.ini
中(例如: F:\Repositories\{RepositoryName}\conf\VisualSVN-SvnAuthz.ini
)。
复制上述文件中的权限配置项,粘贴到iF.SVNAdmin中的authz文件中(形如/var/www/svn/authz
),形如:
[DEVOPS:/] # 仓库根目录, 这一部分由当前所操作的仓库名决定
admin=rw # 用户权限,这一部分正是从第一步中拷贝而来
@agroup-read=r # 组权限,这一部分正是从第一步中拷贝而来
重要!如果想要正常登录系统,还需要一步额外操作,这个属于iF.SVNAdmin所专属地。
cd /var/www/html/svnadmin
vi ./data/userroleassignments.ini
# 增加以下内容, 按用户名
[zhubowen]
User= # 拥有登录和修改密码地权限
为了最大化地减少使用者对于迁移的感知,降低迁移成本。我们还决定引入对于https的支持,最大化地模拟VisualSVNServer的访问方式。
################################################ 生成ssl证书
# 本地生成ssl证书 (我们可以使用openssl工具自己生成证书, 这里我们就自己生成一个自签名证书)
# 1. 首先,生成2048位的加密私钥
openssl genrsa -out server.key 2048
# 2. 然后,生成证书签名请求(CSR),这里需要填写许多信息,如国家,省市,公司等
# 其中在输入" Common Name (eg, your name or your server's hostname) []: "时候, 主机名一定要和httpd.conf文件中的ServerName 172.16.x.x保持一致,否则会报错。
openssl req -new -key server.key -out server.csr
# 3. 最后,生成类型为X509的自签名证书。有效期设置3650天,即有效期为10年
openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
################################################ 安装ssl模块
# 安装ssl模块
# 安装完成后,会在/etc/httpd/conf.d/下生成一个ssl.conf配置文件。
yum install mod_ssl -y
# 建一个目录用来放ssl证书文件
mkdir /etc/httpd/ssl/
# 复制秘钥和证书文件到指定位置
cp server.crt server.key /etc/httpd/ssl/
# 编辑ssl配置文件
vi /etc/httpd/conf.d/ssl.conf
DocumentRoot "/var/www/html" #网页文件路径
ServerName 域名:443 #改为自己的域名
SSLEngine on #启用SSL功能
SSLCertificateFile /etc/httpd/ssl/2_www.**.cn.crt #填写证书文件路径
SSLCertificateKeyFile /etc/httpd/ssl/3_www.***.cn.key #填写私钥文件路径
SSLCertificateChainFile /etc/httpd/ssl/1_root_bundle.crt #填写证书链文件路径
# 重启服务器
service httpd restart
#### 关键路径
/etc/httpd/conf.d/ssl.conf # ssl相关配置
/etc/httpd/conf.modules.d/00-ssl.conf # 配置加载 mod_ssl.so 模块
/etc/httpd/modules/mod_ssl.so
参考:
从 Windows下的VisualSVN迁移到Linux下的iF.SVNAdmin,原本正常生效的pre-commit报错,最终发现是脚本里换行符导致的。以下是笔者所面临问题的解决方案:
# 去掉多余的 \r
sed -i 's/\r$//' pre-commit
Error output could not be translated from the native locale to UTF-8.
# 修改/etc/httpd/conf/httpd.conf文件
#往文件中添加内容:
<IfModule mod_dav_fs.c>
# Location of the WebDAV lock database.
DAVLockDB /var/lib/dav/lockdb
SVNUseUTF8 On
</IfModule>
# 重启
service httpd restart
使用iF.SVNadmin代替VisualSvnServer进行SVN管理之后,确实杜绝了每次SVN服务端操作需要登录远程服务器的窘境,但iF.SVNadmin的权限配置这一块确实不如VisualSvnServer来的方便,你必须手动输入需要进行权限配置的SVN目录,这是笔者目前体验下来最大的痛点。
还有就是即使在进行了iF.SVNadmin的迁移之后,SVN仓库创建以及权限的分派之初,依然是一个相当明显的重复枯燥工作。
我们完全可以考虑借助Jenkins + Ansible 来将SVN仓库的创建和权限维护操作自助化。