欢迎您, 来到 宁时修博客.^_^

Centos环境下用svn实现代码同步

2017/11/29 宁时修 php,Linux,SVN 1555
实现的原理其实很简单,当我们在本地提交代码到svn服务器的时候,svn会利用本身的hooks钩子功能把文件代码同步到WEB目录中

svn同步代码实现的原理

实现的原理其实很简单,当我们在本地提交代码到svn服务器的时候,svn会利用本身的hooks钩子功能把文件代码同步到WEB目录中。这样做的目的,是为了不需要在本地每次提交更新文件到svn服务时,都需要在WEB目录进行手动UPDATE更新。原理图如下:

1.png

实现过程

简单理解就5个大步骤,如下

Ø  搭建SVN服务端(subversion

Ø  创建版本库

Ø  设置用户访问权限

Ø  web拉取版本库目录

Ø  创建post-commit钩子脚本 

l  安装svn服务端(subversion)

安装之前需要检查一下系统是否已经安装,如果已经安装了可以跳过安装步骤,也可以卸载软件,这个你开心就行。

Ø  检查是否安装,执行命令

 >rpm  -qa | grep subversion

Ø  卸载软件,如果是以yum安装的方式 可采用 以下方式进行卸载 其他的卸载方式请自行百度 ^_^

 >yum remove subversion

Ø  安装svn

 >yum install -y subversion

Ø  测试是否已经安装

 >svn --version

l  创建版本库统一存放的目录 方便管理svn项目版本库 

新建一个目录专用用于管理svn版本库 (所有的版本库都放在/home/svn目录下面)

>mkdir -p /home/svn

l  创建版本库

Ø  创建

>svnadmin  create /home/svn/testjh

Ø  创建成功你会看到以下的目录

u  --conf       #配置目录 待会会说

u  --db    

u  --format  

u  --hooks     # 钩子目录 代码同步全得靠它

u  --looks

u  --README.txt

修改SNV配置文件,创建svn用户以及设置用户访问权限 

Ø  进入配置目录,设置配置文件

>cd /home/svn/testjh/conf  如果已经在shop目录里面 直接 cd conf就行

进入配置目录后,你会看到以下三个文件

u  -- authz    --用户组或用户的权限文件 设置访问权限

u  --passwd    --设置用户的密码文件

u  --svnserve.conf   --设置版本库的服务配置文件

 

我们先来配置用户(用户组)的权限

Ø  编辑authz文件 执行命令

> vi authz

111111111.png

当然从上述图就可以看出设计的很简单清晰,如有复杂的权限设计需求可自行百度学习。哈哈 ^_^

按字母键 i 进入编辑模式

编辑完成后,按ESC键退出编辑模式 输入wq! 保存退出!


Ø  配置用户的密码

Ø 进入密码配置文件

>vi passwd

222.png

如图配置即可,密码自行设置 ^_^

按字母键 i 进入编辑模式

编辑完成后,按ESC键退出编辑模式 输入wq! 保存退出!

 

Ø 修改svn版本库的配置文件

Ø 进入svnserve.conf

>vi svnserve.conf

[general]

n  anon-access = none   #访客权限 直接关闭

n  auth-access = write    #用户授权登录后  可读可写

n  password-db = /home/svn/testjh/conf/passwd    #密码配置文件的位置

n  authz-db = /home/svn/testjh/conf/authz    #权限文件位置

n  realm = /home/svn/testjh                #版本库项目的具体位置

效果如图

333333.png

如图配置即可

按字母键 i 进入编辑模式

编辑完成后,按ESC键退出编辑模式 输入wq! 保存退出!


  启动SVN服务

>svnserve -d --listen-port 3690 -r /home/svn

 解释上述参数的意思

Ø  -d 是开启守护者进程

Ø  -r 指定svn执行的目录 (一般指定svn目录就行,这样的话他目录下面所有版本库将都会启动)

回到Web目录  checkout版本库 测试SVN版本库是否已成功搭建


关闭SVN服务

>killall svnserve

我的WEB 目录统一放在 /web 下面

 

Ø  进入web目录

>cd /web

Ø  拉取svn版本库

>svn co svn://127.0.0.1:3690/testjh  /web/testjh  --username admin  --password  123456

注意:拉取svn版本库这一项必须要做,不然无法进行同步,我尝试了n次,svn在同步web目录时是不能自动创建同步目录的,必须要在同步之前,web目录中checkout一次版本库,拉取创建!

 

解释上述参数的意思

Ø  svn://127.0.0.1:3690/testjh  svn版本库的项目地址】 在内部服务器中我一般习惯使用127.0.0.1本机ip来获取 当然你可以指定服务器ip 如同本地操作一样,二者都行!  :3690 svn服务端口  如果svn服务端口有改变 你可执行 > netstat -lntp|grep svn 进行查看

Ø  /web/testjh  【拉取的代码需要存放的web目录位置】

Ø  --username  该参数是指定你的用户名  (只要是在这个版本库中的用户组里面任何一个用户都可以,因为他们都有可读可写权限)

Ø  --password   该参数指定你的用户密码 (跟用户名对应密码即可)

利用SVN提供的hooks钩子 功能 进行代码同步到web目录

Ø  进入版本库目录

>cd /home/svn/testjh

Ø  版本库的目录结构

u  --conf       #配置目录

u  --db    

u  --format  

u  --hooks     # 钩子目录

u  --looks    

u  --README.txt

 

Ø 进入钩子目录

>cd  hooks

Ø  post-commit文件脚本,并且编辑

>vi post-commit

按字母键 i 进入编辑模式

 

复制以下内容【post-commit脚本内容,最好去除带#号的中文注释】

#!/bin/sh
export.UTF-8  #指定svn上传的编码类型 svn默认是utf-8 该项必须要 不然svn update同步代码会报错 exit code 1的错误
REPOS="$1"
REV="$2"
SVN_PATH=/usr/bin/svn    #svn编译安装目录 (指定正确之后就不要再改了)
WEB_PATH=/app/web/testjh  #web同步目录 (需要同步那个目录就指定那个目录,这个随需求改动)
LOG_PATH=/tmp/svn_update.log
echo "\n\n\n##########开始提交 " `date "+%Y-%m-%d %H:%M:%S"` '##################' >>$LOG_PATH
echo `whoami`,$REPOS,$REV >> $LOG_PATH
#注意将此行user和password改为你具体的user和password (版本库用户组下面的任意一个用户都可以,因为他们都可读可写权限)
$SVN_PATH update --username admin --password 123456 $WEB_PATH --no-auth-cache

编辑完成后,按ESC键退出编辑模式 输入wq! 保存退出!

 

我们还需要给post-commit 这个文件赋予可执行权限,不然SVN同步文件代码的时候会失败。

执行

>chmod +x post-commit

好了,所有操作完成之后。我们服务端的工作就全部做完了。

注意:我们每新建一个版本库都需要做以下操作,缺一不可哦 ^_^

Ø  创建版本库

Ø  设置用户访问权限

Ø  web拉取版本库目录

Ø  创建post-commit钩子脚本

 

==============分割线=====================

在本地拉取svn版本库时,如果报无法连接主机 由于连接方在一段时间后没有正确答复或连接

可能出现的原因有

Ø  svn项目配置文件问题:

    解决方法:检查重新配置svn项目中的authz、passwd、svnserve.conf

Ø  防火墙问题:开启了防火墙

    解决方法:1:关闭防火墙、2:开放3690端口

Ø  svn客户端:有历史数据

    解决方法:清除认证数据等

Ø  svn未启动

    解决方法:启动svn

 centos 7以下版本 开放3690端口

/etc/init.d/iptables status #查看端口
/sbin/iptables -I INPUT -p tcp --dport 3690 -j ACCEPT #新增3690端口到防火墙
/etc/rc.d/init.d/iptables save #保存端口

 centos 7版本 开放3690端口

查看已经开放的端口:
firewall-cmd --list-ports

开启端口
firewall-cmd --zone=public --add-port=3690/tcp --permanent

–zone #作用域

–add-port=3690/tcp #添加端口,格式为:端口/通讯协议

–permanent #永久生效,没有此参数重启后失效


如果你的服务器是云ECS服务器,哪很有可能是安全组没有开放。

一:登录到阿里云

1111.jpg

二:查看是否已经开放了3690端口

222222.jpg

三:如果没有3690的端口就添加一条安全组规则

4444.jpg

四:添加安全组规则

33333.jpg

点赞
说说你的看法

所有评论: (0)

# 加入组织

1、用手机QQ扫左侧二维码

2、搜Q群:1058582137

3、点击 宁时修博客交流群