★几个关键的事项★
- 需要关闭防火墙filewalld跟selinux ,在root用户下操作:
[root@localhost svnRepos]# systemctl stop firewalld
[root@localhost svnRepos]# systemctl disable firewalld
[root@localhost svnRepos]# systemctl status firewalld
[root@localhost svnRepos]# vi /etc/selinux/config
# 把SELINUX=enforcing 改成 SELINUX=disabled
- 因为CentOS7安装的apache服务器httpd都是以apache组的apache用户身份访问,所以需要把apache用户添加到我们的SVN目录授权访问的组(本文中是cqgk组的cqgk用户拥有SVN目录权限),并且确保这个组对SVN目录有写权限
- 需要安装以下列表内容:
yum install httpd
yum install epel-release
yum install subversion # 需要按照下面的步骤添加最新的1.10版本的源配置后再安装
yum install mod_dav_svn # mod_dav_svn是apache服务器访问svn的一个模块,安装成功后会有两个so:
/usr/lib64/httpd/modules/mod_dav_svn.so、/usr/lib64/httpd/modules/mod_authz_svn.so
- 配置最多的http.conf里面修改内容:
- 找到里面的User apache、Group apache,分别修改为:User cqgk、Group cqgk,因为本文中的SVN目录所属用户、所属组均为cqgk
- 配置访问地址:找到ServerName 这样,修改后面的内容为实际访问的本机地址,例如本文中的
ServerName 192.168.1.253:80- 在最后添加以下两行:
LoadModule dav_svn_module /usr/lib64/httpd/modules/mod_dav_svn.so
LoadModule authz_svn_module /usr/lib64/httpd/modules/mod_authz_svn.so- 在最后再添加SVN的配置信息如下(多仓库):
<Location /svn-2>
DAV svn
SVNListParentPath on
# 对于多仓库,需要配置SVNParentPath
SVNParentPath /home/cqgk/svnRepos
AuthType Basic
AuthName "Hello, Subversion repos"
# 控制哪些用户可以访问svn,跟前面配置的路径一致
AuthzSVNAccessFile /etc/httpd/conf.d/svn-policy-file
# 授权用户的认证信息在哪里,跟前面配置的密码信息一致
AuthUserFile /etc/httpd/conf.d/svn-auth-conf
Require valid-user
</Location>
- 关于最后访问时SVN根目录可以,但是进入子仓库时提示:Could not find the requested SVN filesystem,请看最后一个疑问的暂时解决方案。
-
系统篇
-
1.安装CentOS7 7.4.1708_x86_64,下载地址:
CentOS7 7.4.1708_64 DVD 版本 -
2.下载最新的UltraISO软件,用它制作一个CentOS7的启动U盘,操作很简单:
【会格式化U盘,请及时备份重要资料】
启动UltraISO,从菜单:文件->打开,选择第1步下载的.iso文件
选择菜单:启动->写入硬盘映像,然后弹出对话框里的【写入方式】选择USB-HDD+,其它的保持默认,点击写入按钮等待制作完成。
-
3.在电脑上把U盘的卷标修改为:CENTOS7,后面需要用到这个名字
-
4.电脑插入制作好的U盘,进入BISO设置从这个U盘启动,进入CentOS的启动菜单界面
-
5.通过上下箭头选择第一个菜单项:Install CentOS 7,然后按TAB按键,底下会出现一行英文,大体意思是说要安装的源路径,可以看到有LABLE=CentOS 7…X86…64… 一长串的内容
把LABLE等号后面的这个内容修改为:CENTOS7,这个内容就是前面第3步修改的卷标名,区分大小写,必须跟卷标名完全一致,然后回车会自动重启进入到图形安装界面。
-
6.进入安装界面,第一步就是选择语言,选择我天朝的语言;下一步,时区选择上海时区;软件选择GNOME图形桌面(否则进入的是命令行操作界面,我是还没到那个层次,搞不定),GNOME附加项的内容根据需要勾选.
我选择的GNOME附加选项是:GNOME应用程序、互联网应用程序、办公套件、开发工具、传统X Windows系统的兼容性
-
7.安装位置
选择要把系统安装到那个硬盘,点进去后,选择硬盘(如果有多个就都勾选),然后设置具体分区,/boot挂载点用于存放系统启动相关的,大小设置不超过8G,一般设置4G足够了,可以多搞几个swap交换区,单个swap交换区大小一般是内存的2倍,然后/挂载点跟/home挂载点根据需要分配(/home 这个挂载点我是把1T硬盘剩下的800多G都给它了)
如果是多个硬盘,前面在选择安装位置时,都勾选上,然后在后面的分区时,设备类型就不能选标准的了,要选LVM类型的,它是在分区跟磁盘更上层的概念,会把多个磁盘连在一起使用。
-
8.进入安装界面,还有两个黄色的感叹号选项需要配置:设置root密码、创建cqgk用户及密码
-
配置篇
-
- 安装httpd
yum -y install httpd
-
- 卸载CentOS7 默认安装的svn 1.7版本
yum remove subversion rpm -qa subversion #输入查询如果不显示任何内容表示卸载成功
创建一个yum repo文件:vi /etc/yum.repos.d/wandisco-svn.repo
输入以下内容并且保存:
[WandiscoSVN]
name=Wandisco SVN Repo baseurl=http://opensource.wandisco.com/centos/7/svn-1.10/RPMS/$basearch/
enabled=1
gpgcheck=0 -
- 安装svn最新的1.10版本
yum -y install subversion
如果提示错误:软件包:subversion-1.10.0-1.x86_64 (WandiscoSVN) 需要:libserf-1.so.0()(64bit) ,则先安装:
yum install epel-release
然后重新输入命令安装svn:
yum -y install subversion
装完后,输入 svn --version,会显示当前安装的版本信息
-
- cd到cqgk的主目录:/home/cqgk,创建SVN目录:mkdir svnRespo,然后进入svnRespo批量创建svn库目录:
mkdir service.foundation service.order web.miniprogram front.admin service.goods web.scheduler service.market uapp web.wechat
然后逐个初始化svn库:
svnadmin create front.admin/ svnadmin create service.foundation/
…
-
- 进入到/home/cqgk/svnRepo 目录,批量删除各个子库下面的conf目录里面的授权、密码文件(用不到,后面会统一指向外层的文件,方便控制,否则对于多仓库的管理非常麻烦)
[cqgk@localhost svnRespo]$ find . -name 'authz' -type f -print -exec rm -rf {} \; [cqgk@localhost svnRespo]$ find . -name 'passwd' -type f -print -exec rm -rf {} \;
-
- 逐个进入到子仓库的conf目录,修改svnserve.conf文件中仓库的授权、账号文件路径:
在svnserve.conf文件的[general] 下面加入以下代码
#匿名访问的权限,可以是read,write,none,默认为read
anon-access=none
#使授权用户有写权限
auth-access=write
#密码数据库的路径
password-db= /etc/httpd/conf.d/svn-auth-conf
#访问控制文件
authz-db = /etc/httpd/conf.d/svn-policy-file
#认证命名空间,subversion会在认证提示里显示,并且作为凭证缓存的关键字
realm=/home/cqgk/svnRepos -
- 切换到root用户,创建前面这一步指定的授权控制以及密码验证文件
vi /etc/httpd/conf.d/svn-auth-conf
然后保存
vi /etc/httpd/conf.d/svn-policy-file
按i进入编辑模式,把以下内容粘贴进去:
[aliases]
[groups]
#表示cqgk跟xiaochuanyi两个用户都属于cqgk组
cqgk = cqgk,xiaochuanyi
# 如果要允许用户对整个svn库根目录都拥有读写权限
# [/]
# 用户名 = rw
# 如果只是允许用户对svn库下面某个子目录拥有读写权限
# [xxx:/]
# 用户名 = rw
[/]
@cqgk = rw然后按Esc退出编辑模式保存,shift+:进入命令行模式,输入wq,回车,保存成功。
-
- 因为整个仓库的最顶级目录所属用户组是cqgk,而apache用户默认不是属于cqgk组,需要添加到这个组:
[root@localhost svnRespo]# usermod -G cqgk apache
-
- 为前面授权群组中的两个用户:cqgk、xiaochuanyi创建用于http访问svn的密码:
[root@localhost svnRespo]# htpasswd /etc/httpd/conf.d/svn-auth-conf xiaochuanyi
输入两次一样的密码,即可为用户配置用于鉴权svn访问权限时用的密码了
-
- 为httpd配置通过http方式访问svn的信息:
[root@localhost svnRespo]# vi /etc/httpd/conf/httpd.conf
在文件的最后,插入以下内容:
# 以下两行是http方式通过apache访问svn的通讯必须的库 LoadModule dav_svn_module /usr/lib64/httpd/modules/mod_dav_svn.so LoadModule authz_svn_module /usr/lib64/httpd/modules/mod_authz_svn.so # 以下内容是配置http://ip地址/路径 方式访问的属性:
<Location /svn>
DAV svn
SVNListParentPath on
# 对于多仓库,需要配置SVNParentPath
SVNParentPath /home/cqgk/svnRespo/
AuthType Basic
AuthName "Hello, Subversion repos"
# 控制哪些用户可以访问svn,跟前面配置的路径一致
AuthzSVNAccessFile /etc/httpd/conf.d/svn-policy-file
# 授权用户的认证信息在哪里,跟前面配置的密码信息一致
AuthUserFile /etc/httpd/conf.d/svn-auth-conf
Require valid-user
</Location>
# 以上配置,访问时的url为:http://ip地址/svn/仓库1
-
- mod_dav_svn是apache服务器访问svn的一个模块,通过yum安装:
[root@localhost svnRespo]# yum install mod_dav_svn
安装成功后,会有mod_dav_svn.so和mod_authz_svn.so两个文件。
[root@localhost svnRespo]# find / -name mod_dav_svn.so
会出现:/usr/lib64/httpd/modules/mod_dav_svn.so
[root@localhost svnRespo]# find / -name mod_authz_svn.so
会出现:/usr/lib64/httpd/modules/mod_authz_svn.so
-
- 启动svn服务:
[root@localhost svnRespo]# svnserve -d -r /home/cqgk/svnRespo/
-
- 启动httpd服务,以便通过http方式访问svn库:
[root@localhost svnRepos]# systemctl start httpd.service
关于httpd服务的命令:
# 启动、终止、重启 systemctl start httpd.service #启动 systemctl stop httpd.service #停止 systemctl restart httpd.service #重启 # 设置开机启动/关闭 systemctl enable httpd.service #开机启动 systemctl disable httpd.service #开机不启动 # 检查httpd状态 systemctl status httpd.service
-
- 此时通过http://当前服务器ip/svn 如果无法访问刚才建立的SVN 仓库,或者返回403错误,可能是防火墙问题,需要增加防火墙规则:
[root@localhost svnRespo]# firewall-cmd --permanent --add-service=http [root@localhost svnRespo]# firewall-cmd --permanent --add-service=https [root@localhost svnRespo]# firewall-cmd --reload
-
- 进入到各个子仓库目录的hooks钩子目录,复制一个钩子pre-revprop-change文件,然后进入编辑,里面所有内容去掉,只保留exit 0 这一句:
[cqgk@localhost hooks]$ cp pre-revprop-change.tmpl pre-revprop-change
然后初始化仓库:
[cqgk@localhost hooks]$ svnsync init file:///home/cqgk/svnRespo/cqgk.commons https://192.168.1.251/svn/cqgk.commons --username xiaochuanyi --password xiaochuanyi521*
正常会出现:复制版本0 的属性
注意:上面的用户名跟密码,在源服务器(Win7系统)跟当前CentOS7 服务器中需要完全一致,也就是两个SVN库中都有这个用户,且密码都是一样的
最后,同步仓库内容:
[cqgk@localhost hooks]$ svnsync sync file:///home/cqgk/svnRespo/cqgk.commons https://192.168.1.251/svn/cqgk.commons --username xiaochuanyi --password xiaochuanyi521*
正常会出现以下内容:
已提交版本 14。 复制版本 14 的属性。 已提交版本 15。 复制版本 15 的属性。 已提交版本 16。 复制版本 16 的属性。 已提交版本 17。 传输文件数据.........
-
- 此时通过http://ip地址/svn 来访问svn,还是不行,提示:Can’t open directory’/home/cqgk/svnRepos’: Permissiondenied ,原来是还忘修改http.conf里面的几个地方,哈哈:
[root@localhost svnRepos]$ vi /etc/httpd/conf/httpd.conf\
找到以下两行:
User apache
Group apache因为我们的svn目录都是cqgk用户,属于cqgk用户组,所以要把这两个都改为cqgk:
User cqgk
Group cqgk还有,修改ServerName 为你的当前Linux真实ip地址 :
ServerName 192.168.1.253:80最后让apache用户对”/home/cqgk/svnRepos″目录拥有写权限。
#将用户apache加入root组
[root@localhost cqgk]# usermod -a -G cqgk apache
#让group对/home/cqgk/svnRepos目录也有写权限
[root@localhost cqgk]# chmod -R g+w /home/cqgk/svnRepos
☆实现客户端提交代码后,从Win7源服务器自动同步到CentOS7备份服务器☆
前面的步骤,已经实现了能正常通过 http://ip:端口/svn 来访问仓库了。现在要实现的是,从win7源服务器上有代码提交时自动同步到CetnOS7备份服务器。下面描述中代号:SPC 表示win7源服务器,DPC表示CentOS备份服务器
- 首先,需要在SPC里面执行一下同步的命令,让SPC的SVN应用能获得自动执行所需的权限 :
然后会提示询问你是否保存 https证书信息C:\Users\Administrator>svnsync sync http://192.168.1.253/svn-2/service.goods --sync-username 用户名 --sync-password 密码 --config-dir E:\svnsynccertauth
®eject, accept (t)emporarily or accept §ermanently?
选择p。然后输入当前主机登录所需的账号、密码
Error validating server certificate for 'https://192.168.1.251:443':
- The certificate is not issued by a trusted authority. Use the
fingerprint to validate the certificate manually!
- The certificate hostname does not match.
Certificate information:
- Hostname: PC201411132127
- Valid: from Apr 13 02:56:53 2015 GMT until Apr 10 02:56:53 2025 GMT
- Issuer:
- Fingerprint: F6:76:A2:CA:A5:AF:EC:30:47:4B:36:8E:DB:6A:F6:23:3D:81:FF:AC
(R)eject, accept (t)emporarily or accept (p)ermanently? p
Authentication realm: <https://192.168.1.251:443> VisualSVN Server
Password for 'Administrator': 输入你登录当前win7系统用户的密码
Authentication realm: <https://192.168.1.251:443> VisualSVN Server
Username: 访问当前SVN服务器的用户名
Password for 'xiaochuanyi': 访问当前SVN服务器用户的密码
- 然后,在VisualSVN Server的应用程序上,在所需要同步的仓库目录右键选择属性,点击hooks钩子页签,双击Commit 下面的Post-commit hook ,输入以下同步的命令:
svnsync sync –non-interactive --trust-server-cert http://192.168.1.253/svn-2/仓库名 --sync-username xiaochuanyi --sync-password xiaochuanyi521* --config-dir E:\svnsynccertauth
- ☆注意以上命令中最后的https证书存储目录–config-dir E:\svnsynccertauth要跟前面输入用户名密码前的那个命令里面的目录一致。
然后,当这个仓库有代码提交后,就会自动同步到192.168.1.253的备份SVN服务中了。
☆搞不懂的疑问?☆
-
疑问 在http.conf里面配置的ip访问时的根目录名如果为svn,其它都配置好之后,访问时,只能进入所有子仓库的共同父级目录,比如本文中的 /home/cqgk/svnRepos,会列出此目录中的各个子仓库,但是点击以后进入,就会提示Could not find the requested SVN filesystem
进入查看http的错误日志: vi /etc/httpd/logs/error_log,会提示
[Sun May 06 14:56:11.694794 2018] [:error] [pid 6481] (20014)Internal error: [client 192.168.1.212:62124] Can’t open file ‘/home/cqgk/svnRepos/svn/format’: No such file or directory, referer: http://192.168.1.253/svn/
这个目录肯定是没有的,真实的目录结构是/home/cqgk/svnRepos/xxxproject,然后把httpd.conf中配置的访问地址根目录从
<Location /svn>改为 <Location /svn-2>,然后重启httpd服务:[root@localhost svnRepos]# systemctl restart httpd.service
然后通过http://192.168.1.253/svn-2/的地址访问,会列出所有子仓库列表,点击某个子仓库也能正常访问了…