虚拟机安装实例走起说明,还是依旧在虚拟机里面测试,该版本如下:
Linux:CentOS Linux release 7.4.1708 (Core)
PHP:PHP 7.2.1
mysql:mysql Ver 15.1 Distrib 10.2.11-MariaDB
nginx:nginx/1.10.2
SVN在服务器中地址为:/var/svn
NGINX在服务器中位置为:/usr/local/nginx
SVN服务器/nginx服务器:192.168.126.158
检查已安装版本
检查是否安装了低版本的SVN,如果没有其他显示。说明没有安装过。:
[root@localhost ~]# rpm -qa subversion
卸载旧版本SVN:
[root@localhost ~]# yum remove subversion
安装SVN:
[root@localhost ~]# yum install subversion
输入rpm -ql subversion查看安装位置
[root@localhost ~]# rpm -ql subversion
可以看到 svn在bin目录下生成了几个二进制文件。
验证安装,检验已经安装的SVN版本信息,如果成功会输出版本号:
[root@bogon var]# /usr/bin/svnversion --version svnversion,版本 1.7.14 (r1542130) 编译于 Aug 23 2017,20:43:38 版权所有 (C) 2013 Apache 软件基金会。 此软件包含了许多人的贡献,请查看文件 NOTICE 以获得更多信息。 Subversion 是开放源代码软件,请参阅 http://subversion.apache.org/ 站点。 [root@localhost ~]# svnserve --version svnserve,版本 1.7.14 (r1542130) 编译于 Aug 23 2017,20:43:38 版权所有 (C) 2013 Apache 软件基金会。 此软件包含了许多人的贡献,请查看文件 NOTICE 以获得更多信息。 Subversion 是开放源代码软件,请参阅 http://subversion.apache.org/ 站点。 下列版本库后端(FS) 模块可用: * fs_base : 模块只能操作BDB版本库。 * fs_fs : 模块与文本文件(FSFS)版本库一起工作。 Cyrus SASL 认证可用。
1、建立版本库
创建svn数据目录(subversion默认是把/var/svn作为数据根目录的,开机启动默认也是从这里)
[root@localhost ~]# mkdir -p /var/svn [root@localhost ~]# svnadmin create /var/svn/MyFirstSvn [root@localhost ~]# cd /var/svn/ [root@localhost svn]# ls MyFirstSvn [root@localhost svn]# cd MyFirstSvn/ [root@localhost MyFirstSvn]# ls -al 总用量 8 drwxr-xr-x 6 root root 86 1月 22 10:52 . drwxr-xr-x 3 root root 24 1月 22 10:52 .. drwxr-xr-x 2 root root 54 1月 22 10:52 conf drwxr-sr-x 6 root root 233 1月 22 10:52 db -r--r--r-- 1 root root 2 1月 22 10:52 format drwxr-xr-x 2 root root 231 1月 22 10:52 hooks drwxr-xr-x 2 root root 41 1月 22 10:52 locks -rw-r--r-- 1 root root 229 1月 22 10:52 README.txt [root@localhost ~]# rm -rf /var/svn/MyFirstSvn #删除版本库
执行上面的命令后,自动建立MyFirstSvn 库,查看/var/svn/MyFirstSvn 文件夹发现包含了conf, db,format,hooks, locks, README.txt等文件,说明一个SVN库已经建立。
2、配置svn配置文件:
1)、进入上面生成的文件夹conf下,进行配置:
[root@localhost MyFirstSvn]# cd /var/svn/MyFirstSvn/conf [root@localhost conf]# ls authz passwd svnserve.conf #authz文件是权限控制文件、passwd是帐号密码文件、svnserve.conf SVN服务配置文件 authz passwd svnserve.conf
2)、用户密码passwd配置:
[root@localhost conf]# vi passwd ##修改passwd为以下内容:#在[users]块中添加用户和密码,格式:帐号=密码 [users] # harry = harryssecret # sally = sallyssecret cuikai = 123456
3)、权限控制authz配置(目的是设置哪些用户可以访问哪些目录,向authz文件追加以下内容):
#设置[/]代表根目录下所有的资源
[/] cuikai = rw 网上其他用法: [groups] admin = admin #admin为用户组,等号之后的admin为用户 test = fuhd,test [wangwa:/] #表示根目录(/var/svn/wangwa),wangwa: 对应前面配置的realm = wangwa @admin = rw #表示admin组对根目录有读写权限,r为读,w为写 [wangwa:/test] #表示test目录(/var/svn/wangwa/test) @test = rw #表示test组对test目录有读写权限 版本库目录格式: [<版本库>:/项目/目录] @<用户组名> = <权限> <用户名> = <权限> 其中,方框号内部分可以有多种写法: /,表示根目录及以下。根目录是svnserve启动时指定的,我们指定/opt/svndata。这样,/就是表示对全部版本库设置权限。 repos1:/,表示对版本库1设置权限 repos2:/abc, ,表示对版本库2中的abc项目设置权限 repos2:/abc/aaa, ,表示对版本库2中的abc项目的aaa目录设置权限 权限主体可以是用户组、用户或*,用户组在前面加@,*表示全部用户。权限可以是w、r、wr和空,空表示没有任何权限。
3)、服务svnserve.conf配置:
[root@localhost conf]# vi svnserve.conf 追加以下内容: [general] #匿名访问的权限,可以是read,write,none,默认为read anon-access=none #使授权用户有写权限 auth-access=write #密码数据库的路径 password-db=passwd #访问控制文件 authz-db=authz #认证命名空间,subversion会在认证提示里显示,并且作为凭证缓存的关键字 realm=MyFirstSvn
4)、关闭防火墙、或者配置防火墙端口
配置防火墙端口: 首先要明确CentOS7的默认防火墙为firewallD。subversion的默认端口为3690,如果没有打开会报错: [root@localhost conf]# firewall-cmd --zone=public --add-port=3690/tcp success [root@localhost conf]# firewall-cmd --reload success
5)、启动,查看和停止SVN服务
启动SVN
# -d : 守护进程 -r : svn数据根目录
[root@localhost conf]# svnserve -dr /var/svn
查看SVN服务:#默认端口为:3690
[root@localhost conf]# ps aux|grep svnserve root 5519 0.0 0.1 197628 1032 ? Ss 13:49 0:00 svnserve -dr /var/svn root 5521 0.0 0.0 112676 984 pts/1 S+ 13:49 0:00 grep --color=auto svnserve [root@localhost conf]#
检测SVN 端口
[root@localhost conf]# netstat -ln |grep 3690 tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN
停止重启SVN
[root@localhost conf]# killall svnserve #停止,杀死SVN服务器 [root@localhost conf]# svnserve -dr /var/svn/MyFirstSvn/ #启动 svnserve: E000098: 不能绑定服务器套接字: 地址已在使用 [root@localhost conf]# ps -aux | grep svnserve root 4787 0.0 0.1 197132 1024 ? Ss 22:24 0:00 svnserve -dr /var/svn/MyFirstSvn/ root 4806 0.0 0.0 112660 976 pts/0 S+ 22:25 0:00 grep --color=auto svnserve [root@localhost conf]# kill 4787 [root@localhost conf]# ps -aux | grep svnserve root 4808 0.0 0.0 112660 976 pts/0 S+ 22:26 0:00 grep --color=auto svnserve [root@localhost conf]# kill 4808 -bash: kill: (4808) - 没有那个进程 [root@localhost conf]# systemctl start svnserve.service [root@localhost conf]# 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 一 2017-07-10 22:26:21 CST; 8s ago Process: 4815 ExecStart=/usr/bin/svnserve --daemon --pid-file=/run/svnserve/svnserve.pid $OPTIONS (code=exited, status=0/SUCCESS) Main PID: 4816 (svnserve) CGroup: /system.slice/svnserve.service └─4816 /usr/bin/svnserve --daemon --pid-file=/run/svnserve/svnserve.pid -r /var/svn 7月 10 22:26:21 localhost systemd[1]: Starting Subversion protocol daemon... 7月 10 22:26:21 localhost svnserve[4815]: DIGEST-MD5 common mech free 7月 10 22:26:21 localhost systemd[1]: Started Subversion protocol daemon. [root@localhost conf]# systemctl start svnserve.service #启动 [root@localhost conf]# systemctl status svnserve.service #查看状态 [root@localhost conf]# systemctl stop svnserve.service #停止 [root@localhost conf]# systemctl restart svnserve.service #重启 [root@localhost conf]# systemctl enable svnserve.service #设置开机启动
6)、怎么自动同步svn的代码到项目目录呢?
利用SVN的POST-COMMIT钩子自动部署代码 我们在开发的过程将代码提交到SVN后使用SVN的hook,通过post-commit脚本,在目 标文件夹根下执行svn update操作,将更新内容同步到测试环境,这样开发调试非常方便。
[root@bogon MyFirstSvn]# cd hooks/ [root@bogon hooks]# cp -f post-commit.tmpl post-commit [root@bogon hooks]# vi post-commit 删除除了第一行的#!/bin/sh的代码,编辑,/usr/local/nginx/html/ck2.com 为我的项目目录 #!/bin/sh /usr/bin/svn update --username cuikai --password 123456 /usr/local/nginx/html/ck2.com [root@bogon hooks]# chmod +x post-commit [root@bogon hooks]# /usr/bin/svn checkout svn://192.168.216.158/MyFirstSvn /usr/local/nginx/html/www.ck2.com 认证领域: <svn://192.168.216.158:3690> MyFristSvn “root”的密码: 认证领域: <svn://192.168.216.158:3690> MyFristSvn 用户名: cuikai “cuikai”的密码: ----------------------------------------------------------------------- 注意! 你的密码,对于认证域: <svn://192.168.216.158:3690> MyFristSvn 只能明文保存在磁盘上! 如果可能的话,请考虑配置你的系统,让 Subversion 可以保存加密后的密码。请参阅文档以获得详细信息。 你可以通过在“/root/.subversion/servers”中设置选项“store-plaintext-passwords”为“yes”或“no”, 来避免再次出现此警告。 ----------------------------------------------------------------------- 保存未加密的密码(yes/no)?yes A /usr/local/nginx/html/www.ck2.com/index.php A /usr/local/nginx/html/www.ck2.com/1.txt 取出版本 2。
至此,svn已经配置成功!
怎么测试呢?在虚拟机的本机里面利用已经搭好的lnmp,测试即可,修改本机hostC:Windows\system32\drivers\etc\hosts,添加
192.168.216.158 www.ck2.com
本机通过客户端TortoriseSVN checkout下来代码,
在本机编辑代码,index.php
<?php echo 'My Frist Svn';
在添加一个1.txt文件,(后续我们可以编辑更改1.txt内容查看,svn是否会自动更新代码到项目目录)
111 2223
svn提交代码,查看项目目录代码
最后在本机访问虚拟机(注意关闭防火墙),查看代码效果:
客户端测试:
客户端可以通过TortoriseSVN测试。
这时候可能会防火墙问题。如果是防火墙问题,会提示无法连接。
用systemctl检查服务器的防火墙配置:
[root@localhost conf]# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: ens33 sources: services: dhcpv6-client http https ssh telnet ports: 3690/tcp protocols: masquerade: no forward-ports: sourceports: icmp-blocks: rich rules: 可以看到,没有telnet服务和3690端口。增加telnet服务器和3690端口: [root@localhost conf]# firewall-cmd --permanent --add-service=telnet [root@localhost conf]# firewall-cmd --permanent --add-port=3690/tcp
经常有新手配置基于svnserve的subversion服务器后,在客户端访问subversion版本库时出现这个错误:
svnserve.conf:12: Option expected 为什么会出现这个错误呢,就是因为subversion读取配置文件svnserve.conf时,无法识别有前置空格的配置文件,如 ### This file controls the configuration of the svnserve daemon, if you ### use it to allow access to this repository. (If you only allow ### access through http: and/or file: URLs, then this file is ### irrelevant.) ### Visit http://subversion.tigris.org/ for more information. [general] ### These options control access to the repository for unauthenticated ### and authenticated users. Valid values are "write", "read", ### and "none". The sample settings below are the defaults. anon-access = read auth-access = write 像上面的配置文件中,anon-access是顶行的,没问题,而auth-access就存在前置空格,会导致这个错误。 要避免出现这个错误,应该在去掉这些行前的#时,也要顺手去掉前面的空格,这一点,在郑新星老早的文章《Subversion之路--实现精细的目录访问权限控制》就提到过。 注意: 1:/home/svn就是SVN在服务器上绝对路径。 2:防火墙配置 /etc/sysconfig/iptables # Generated by iptables-save v1.4.7 on Wed Jan 11 05:23:43 2017 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [20:13480] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 3690 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT # Completed on Wed Jan 11 05:23:43 2017 以上配置完成后。重启NGINX和防火墙已经SVN 客户端:在window客户端的host文件中配置SVN地址. C:Windows\system32\drivers\etc\hosts 添加: 192.168.216.158 www.ck2.com
源码编译安装SVN:
subversion官网:http://subversion.apache.org/download.cgi?update=201708081800
[root@localhost ~]# wget -O subversion-1.9.7.tar.gz http://mirrors.tuna.tsinghua.edu.cn/apache/subversion/subversion-1.9.7.tar.gz [root@localhost ~]# mv subversion-1.9.7.tar.gz /usr/local/src [root@localhost ~]# cd /usr/local/src/ [root@localhost src]# tar -zxvf subversion-1.9.7.tar.gz
安装svn需要的依赖软件包:
APR 1.6.3、APR-util 1.6.1 两个依赖官网地址:http://apr.apache.org/download.cgi
[root@localhost ~]# wget -O apr-1.6.3.tar.gz http://mirrors.hust.edu.cn/apache//apr/apr-1.6.3.tar.gz [root@localhost ~]# wget -O apr-util-1.6.1.tar.gz http://mirrors.hust.edu.cn/apache//apr/apr-util-1.6.1.tar.gz [root@localhost ~]# mv apr-1.6.3.tar.gz /usr/local/src/ [root@localhost ~]# mv apr-util-1.6.1.tar.gz /usr/local/src/ [root@localhost ~]# cd /usr/local/src/ [root@localhost src]# tar -zxvf apr-1.6.3.tar.gz [root@localhost src]# tar -zxvf apr-util-1.6.1.tar.gz [root@localhost src]# cd apr-1.6.3/ [root@localhost apr-1.6.3]# ./configure --prefix=/usr/local/apr 注意:如果 rm: cannot remove 'libtoolT': No such file or directory 报错 编辑 configure文件,查找 $RM "$cfgfile" 这个地方,用#注释掉,从新编译即可 [root@localhost apr-1.6.3]# vi configure [root@localhost apr-1.6.3]# make [root@localhost apr-1.6.3]# make install [root@localhost apr-1.6.3]# cd .. [root@localhost src]# cd apr-util-1.6.1/ [root@localhost apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr 注意:如果 xml/apr_xml.c:35:19: 致命错误:expat.h:没有那个文件或目录 报错 [root@localhost apr-util-1.6.1]# yum install expat-devel #安装expat库试试 [root@localhost apr-util-1.6.1]# make [root@localhost apr-util-1.6.1]# make install [root@localhost apr-util-1.6.1]# cd .. [root@localhost src]# cd subversion-1.9.7/ [root@localhost subversion-1.9.7]# mkdir sqlite-amalgamation [root@localhost ~]# wget http://www.sqlite.org/2018/sqlite-autoconf-3220000.tar.gz [root@localhost ~]# tar -zxvf sqlite-autoconf-3220000.tar.gz [root@localhost ~]# mv sqlite-autoconf-3220000 /usr/local/src/sqlite [root@localhost ~]# cd /usr/local/src/sqlite/ [root@localhost sqlite]# cp sqlite3.c /usr/local/src/subversion-1.9.7/sqlite-amalgamation/ [root@localhost sqlite]# cp sqlite3ext.h /usr/local/src/subversion-1.9.7/sqlite-amalgamation/ [root@localhost subversion-1.9.7]# ./configure --prefix=/usr/local/svn --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util [root@localhost subversion-1.9.7]# make [root@localhost subversion-1.9.7]# make install [root@localhost subversion-1.9.7]# vi /etc/profile #添加系统环境变量,添加到最后一行 追加 :/usr/local/svn/bin [root@localhost subversion-1.9.7]# source /etc/profile #使配置立刻生效 [root@localhost subversion-1.9.7]# svnserve --version 建立版本库 (可建立多个,新建库后以下各项都需重新配置。注意区别安装目录与版本库目录,以下讲的都是版本库目录) [root@localhost subversion-1.9.7]# mkdir -p /var/svn/MyFristSvn [root@localhost subversion-1.9.7]# chmod -R 775 /var/svn/MyFristSvn [root@localhost subversion-1.9.7]# svnadmin create /var/svn/MyFristSvn [root@localhost subversion-1.9.7]# cd /var/svn/MyFristSvn [root@localhost conf]# vi authz [/] admin=rw [root@localhost conf]# vi passwd [users] # harry = harryssecret # sally = sallyssecret admin = 123456 [root@localhost conf]# vi svnserve.conf anon-access = read auth-access = write password-db = passwd authz-db = authz groups-db = groups realm = MyFirstSvn [root@localhost conf]# svnserve -d -r /var/svn/ [root@localhost conf]# ps -aux |grep svn root 67406 0.0 0.0 146784 864 ? Ss 12:47 0:00 svnserve -d -r /var/svn/ root 67408 0.0 0.0 112676 980 pts/1 S+ 12:47 0:00 grep --color=auto svn
本文为崔凯原创文章,转载无需和我联系,但请注明来自冷暖自知一抹茶ckhttp://www.cksite.cn