Linux + docker + svn +IF.SVNAdmin构建私有化代码托管平台
需求
周一接到同事需求,因为服务器即将到期,需要更换到Linux服务器,因此公司的线上SVN需要进行迁移。新的SVN需提供svn: 与http: 两种代码推送方式。我真的是栓Q了,怀着小抱怨的心情接下了任务,就当闲暇时光娱乐吧。 特此注意:文中提到的http: 与svn:推送/拉取方式对应的是,咱们在Windows 安装的客户端下的代码地址,比如说:svn://ip:端口号/svn/xxx 和 http://ip:端口号/svn/xxx
选择SVN版本
由于docker的便利以及笔者本身就很倾向于docker, 因此采用docker进行SVN搭建(若未安装docker环境的,请自行安装docker环境吧)。docker search svn 一下,发现garethflowers与elleflorio 两个版本非常受到大众喜爱,因此去 https://hub.docker.com/ 对比了两个镜像,对比结果garethflowers不提供WebSvn且http还要自己配置,而elleflorio 内置了httpd,支持svn:与http: 两种模式进行代码拉取与推送,并且镜像本身内置了IF.SVNAdmin的可视化管理平台,创建资源库、管理用户及授权访问等比较方便。果断选择elleflorio。
SVN搭建及原Windows系统下SVN代码迁移
SVN搭建
执行步骤:
- 拉取svn镜像:
- docker pull elleflorio/svn-server
- 创建svn仓库挂载目录:
- mkdir /home/code-trustee/docker-svn/repo
- 给予仓库挂载目录权限为777,否则IF.svnadmin无法创建仓库目录,且推送代码时会出现权限不允许:
- chmod -R 777 /home/code-trustee/docker-svn/repo
- 运行容器,将容器中的subversion-access-control与passwd复制到本地作为挂载文件:
- docker run --privileged=true -d --name svn-server -p 8011:80 -p 3690:3690 -v elleflorio/svn-server
- docker cp svn-server:/etc/subversion /home/code-trustee/docker-svn/subversion (docker复制命令)
- 停止并删除容器
- docker stop svn-server
- docker rm svn-server
- 运行并挂载配置文件启动 (8073是http端口,一定要打开后边访问IF.SVNAdmin与http: 推送/上传代码方式必备, 8074是svn:推送/上传端口, 8073、8074是笔者的端口号,可以根据自己的需要设置为其他的端口号)
- docker run --privileged=true -d --name svn-server -p 8073:80 -p 8074:3690 \
-v /home/code-trustee/docker-svn/repo:/home/svn \
-v /home/code-trustee/docker-svn/subversion/subversion-access-control:/etc/subversion/subversion-access-control \
-v /home/code-trustee/docker-svn/subversion/passwd:/etc/subversion/passwd \
elleflorio/svn-server- 运行后查看日志docker logs svn-server若出现ServerName 报错,则进入容器修改httpd.conf后再重启
- docker exec -it svn-server /bin/sh
- cd /etc/apache2/
- vi httpd.conf
- 找到ServerName,去掉注释或者Copy一行,修改为自己的域名或IP+端口(容器映射http端口: 8073)
- ServerName localhost:8073
- 重启容器
- docker restart svn-server
- 至此,svn咱们就搭建完毕了, 现在咱们就可以去拉取/推送代码了,svn://ip:8074/svn/xxx 和 http://ip:8073/svn/xxx
原Windows系统SVN代码迁移
步骤:
- 进入Windows SVN server -> 点击仓库右键,选择所有任务 -> Export Repository… -> Export repository dump -> 定义名称xxx.dump, 选择保存到D盘 -> 将dump 文件上传到linux至svn-server挂载的目录/home/code-trustee/docker-svn/repo下 -> 执行命令docker exec -it svn-server /bin/sh进入svn-server 容器中 -> cd /home/svn 下可以看到挂载进来的dump文件 -> 执行svnadmin create /home/svn/test 创建新的svn仓库test(仓库名与原仓库名可以不一致) -> 执行svnadmin load test < xxx.dump -> 等待一会儿,便导入成功。
IF.SVNAdmin 图形化管理平台
平台配置
浏览器访问,http://ip:8073/svnadmin,首次便可进入IF.SVNAdmin 的配置页面。依次填入:
- Subversion authorization file: /etc/subversion/subversion-access-control
- User authentication file (SVNUserFile):/etc/subversion/passwd
- Parent directory of the repositories (SVNParentPath):/home/svn
- Subversion client executable:/usr/bin/svn
- Subversion admin executable:/usr/bin/svnadmin
保存配置后,会自动创建账号admin, 密码也是admin。 浏览器访问:http://ip:8073/svnadmin/login.php登录平台便可。
平台介绍 (仅支持http: 推送/拉取方式,svn: 方式无效)
基础介绍
登录平台后,可以查看到导航仓库 + 用户 + 组 + 访问路径 + 设置 + session。
- 仓库:svn仓库管理,若已导入SVN的仓库,则现在就可以看到导入的代码了
- 用户:点击用户导航可以查询用户列表和添加用户。(所有的人员访问为用户*, 默认*是read权限)
- 组:添加组和将用户分到对应的组
- 访问路径:配置访问的仓库路径,“/” 为仓库的根路径,配置在“/”路径下则可用访问所有的仓库路径。
- 设置:平台配置,我们首次登陆已经配置好,无需再配置
- seesion: 修改密码,退出功能
特殊功能介绍
1.用户列表:查看用户列表,点击“选择角色“会出现以下角色介绍列表。用户可根据自己的需要,勾选用户 -> 选择角色 (下拉框) -> 分配。一定要记住给新建的账号分配“用户” 这个角色,不然无法登录后台。其他角色可以选择添加。(平台一次性只能选择一个角色,若要选择多个角色还需要再次选择角色配置)
- 访问路径: 点击导航栏,会出现“列表、添加、权限”三个选项,添加可以添加相关的访问路径,权限则是为每个用户分配访问权限。“/” 为根目录路径,配置了该路径的用户,可以访问所有仓库。咱们可以直接点击“权限“直接给用户分配指定的访问路径。
点击“权限”后
权限分配完毕后,回到访问路径管理列表,点击对应的路径栏,可以看到该路径下的人员,“/” 是根路径,目录下有“*”用户,这个用户是代表所有访问人权限,默认为read,即任何人只要知道svn地址都可以进行拉取代码,无需任何用户名密码。这不是扯犊子了吗? 必须要设置为no-access。 (请注意:Read 对应的是拉取, Write 对应的是推送)
- 代码仓库:点击导航"代码仓库",平台系统默认”代码仓库管理员”角色是不提供删除仓库功能和导出功能的,即不会出现以下红色标注的地方。“我一个超管,你居然不让我删库,你不是逗我吗?” 满脑袋都是这个想法让我不得不去设置删库权限。
步骤:
- 进入容器:docker exec -it svn-server /bin/sh
- 查询配置文件:find -name config.ini
- 修改配置文件:vi /opt/svnadmin/data/config.ini , 拉倒文件最后如下图2所示,将[GUI]下的权限开启为ture.
- 修改完后,退出svn容器,重启svn容器便可
.
RepositoryDeleteEnabled 指的是删除权限,RepositoryDumpEnabled 指的是导出权限,
AllowUpdateByGui 指的是版本更新权限。
按需开启吧!!!
注意事项
- IF.SVNAdmin 只是配置http: 方式推送/拉取的情况,如果要处理svn: 方式的推送/拉取,就需要到仓库下进行配置文件改写了。由于我们已经挂载到了/home/code-trustee/docker-svn/repo 目录下,那我们直接进入到该目录,进入到仓库文件夹中,conf下会出现authz、passwd、svnserve.conf 三个文件,其中authz 为权限文件,passwd 为用户名&密码文件,svnserve.conf 为该仓库的配置文件。由于配置简便,不在阐述,可以自行百度配置便可。
- 如果地址访问不通,需要查看一下ip是否写错,服务器端口号是否已开通。8073是http端口号,8074是svn端口号,切记别弄错。