部署Svn+自动发布单/多台服务(进阶版)

企业实战Svn

环境要求:

 

服务端:

系统 :Centos 7.4 (刚安装完的系统)

项目名称:www.ITM.com      www.CML.com

yum源下载地址:http://mirrors.163.com/.help/centos.html

安装epel源:yum -y install epel-release

IPv4: 192.168.100.125/24

 

客户端:

系统:windows 7

Svn工具:TotoiseSvn

IPv4:192.168.100.114/24


1、Svn搭建

[root@Redis ~]# yum -y install subversion-1.7.14-14.el7.x86_64

部署Svn+自动发布单/多台服务(进阶版)_第1张图片

[root@Redis ~]# systemctl enable svnserve.service && systemctl start svnserve.service

[root@Redis ~]# mkdir -p /webdept/svnconf    #创建SVN配置文件目录,后期可能会有很多项目所以配置文件最好在统一位置

[root@Redis ~]# svnadmin create /webdept/www.ITM.com    

[root@Redis ~]# svnadmin create /webdept/www.CML.com     #www.CML.com 是SVN项目名称跟web项目要一致相同

[root@Redis ~]# ll /webdept/www.ITM.com/

部署Svn+自动发布单/多台服务(进阶版)_第2张图片

文件描述:

db目录:就是所有版本控制的数据存放文件

hooks目录:放置hook脚本文件的目录

locks目录:用来放置subversion监控锁定数据的目录,用来追踪存取文件库的客户端

format文件:是一个文本文件,里面只放了一个整数。表示当前文件库配置的版本号

conf目录:是这个仓库的配置文件(仓库的用户访问账号、权限等),也是我们要关注的配置文件

 

[root@Redis ~]# ls /webdept/www.ITM.com/conf/

authz          passwd         svnserve.conf 

文件描述:

authz                         #认证权限相关

passwd                      #用户名和密码

svnserve.conf             #服务器配置文件

 

[root@Redis ~]# cp /webdept/www.ITM.com/conf/passwd  /webdept/svnconf/passwd

[root@Redis ~]# cp /webdept/www.ITM.com/conf/authz  /webdept/svnconf/authz

注:因为svn服务器上存在多个项目,为方便管理账户信息、授权,使用统一的用户配置文件

 

[root@Redis ~]# vim /webdept/svnconf/passwd

部署Svn+自动发布单/多台服务(进阶版)_第3张图片

注:创建一个test用户 密码 123456

 

[root@Redis ~]# vim /webdept/svnconf/authz

部署Svn+自动发布单/多台服务(进阶版)_第4张图片

注:对www.ITM.com这个项目授权  r:读   w:写 

 

[root@Redis ~]# vim /webdept/www.ITM.com/conf/svnserve.conf

部署Svn+自动发布单/多台服务(进阶版)_第5张图片

注:

anon-access = read             #原先注释掉了,匿名用户可以读,使用none的话就是匿名用户不可以访问

auth-access = write              #这几行都要取消注释,认证用户可以写,可以是read,write,none

password-db = passwd         #密码库文件,默认使用的是同一目录下的passwd文件作为用户密码库

authz-db = authz                #认证权限文件

realm = Welcome to the ITM project      #登陆提示信息

注意:此配置文件的所有内容必须顶格,否则会报错

 

[root@Redis ~]# vim /webdept/www.CML.com/conf/svnserve.conf

部署Svn+自动发布单/多台服务(进阶版)_第6张图片

注:这个项目的 passwd authz 文件均使用绝对路径指定

1.1 修改svn根目录:

 

[root@Redis ~]# vim /etc/sysconfig/svnserve

部署Svn+自动发布单/多台服务(进阶版)_第7张图片

注:把原/var/svn  改为自己创建的svn根目录

[root@Redis ~]# systemctl restart svnserve.service

 

1.2 windows客户端连接

部署Svn+自动发布单/多台服务(进阶版)_第8张图片

部署Svn+自动发布单/多台服务(进阶版)_第9张图片

1.3 排错1:

如出现一直连接不上,可能是因为firewall的缘故,解决方案:

第一种

关闭防火墙:

临时关闭:systemctl stop firewalld

永久关闭:systemctl disable firewalld

或者:iptables -F

第二种

防火墙放行规则:

[root@Redis ~]# firewall-cmd --permanent --add-port=3690/tcp

[root@Redis ~]# firewall-cmd --reload

本次使用关闭防火墙

部署Svn+自动发布单/多台服务(进阶版)_第10张图片

部署Svn+自动发布单/多台服务(进阶版)_第11张图片

连接成功

1.4 排错2:

经过排错1后连接正常,但发现每次重启系统后无法连接,服务也是启动状态,报错图:

部署Svn+自动发布单/多台服务(进阶版)_第12张图片

查看服务进程:

[root@Redis ~]# ps -aux| grep svn

解决方案:

临时解决:手动执行: kill  -9  1014(PID)  结束进程

                     启动服务:[root@Redis ~]# svnserve -d -r /webdept/

永久解决:

[root@Redis ~]# vim /etc/selinux/config

部署Svn+自动发布单/多台服务(进阶版)_第13张图片

将Enforcing 改为 Disabled 永久关闭掉Selinux

[root@Redis ~]# reboot

通过永久解决方法测试后发现能正常开机自启并连接成功

2、Svn自动更新到web根目录

环境要求

实验环境:

apache 和 SVN都属于同一台服务器

IPv4:192.168.100.125/24

svn钩子是啥?

钩子就是由版本库的事件(代码提交,属性修改等)触发程序(Shell 脚本等)。 
每一个 SVN 仓库下都有一个目录hooks,在这里面放所有的钩子程序。其中以.tmpl结尾的代表是模板,可以用来参考。

2.1 安装apache

[root@Redis hooks]# yum -y install httpd

[root@Redis ~]# vim /etc/httpd/conf.d/vhosts-httpd.conf

        ServerName www.ITM.com

        DocumentRoot /var/www/www.ITM.com

        ServerName www.CML.com

        DocumentRoot /var/www/www.CML.com

注:配置好虚拟目录

[root@Redis ~]# systemctl start httpd

[root@Redis ~]# systemctl enable httpd

2.2 www.ITM.com 项目

[root@Redis ~]# cd /webdept/www.ITM.com/hooks/

[root@Redis hooks]# vim post-commit

#!/bin/sh

export LANG=en_US.utf8

SVN_PATH=/usr/bin/svn

WEB_PATH=/var/www/www.ITM.com

sudo -u apache $SVN_PATH update $WEB_PATH --username 'test' --password '123456' --no-auth-cache

命令解析:

sudo  -u  apache  #指定以 apache 这个用户去执行svn 更新命令,本次测试用root

[root@Redis hooks]# chown apache:apache post-commit

[root@Redis hooks]# chmod 755 post-commit

[root@Redis hooks]# cd /var/www

[root@Redis www]# svn co svn://192.168.100.125/www.ITM.com

#输入root 用户认证密码: XXXXX

#输入svn连接用户:test

#输入svn连接密码:123456

#是否保存秘钥:yes

2.3 www.CML.com 项目

[root@Redis ~]# cd /webdept/www.CML.com/hooks/

[root@Redis hooks]# vim post-commit

#!/bin/sh

export LANG=en_US.utf8

SVN_PATH=/usr/bin/svn

WEB_PATH=/var/www/www.CML.com

sudo -u apache $SVN_PATH update $WEB_PATH --username 'test' --password '123456' --no-auth-cache

[root@Redis hooks]# chown apache:apache post-commit

[root@Redis hooks]# chmod 755 post-commit

[root@Redis hooks]# cd /var/www

[root@Redis www]# svn co svn://192.168.100.125/www.ITM.com

#输入root 用户认证密码: XXXXX

#输入svn连接用户:test

#输入svn连接密码:123456

#是否保存秘钥:yes

 

 

2.4 验证

windows客户端先检出Svn上的项目

上传index.html 测试页面

部署Svn+自动发布单/多台服务(进阶版)_第14张图片

内容分别为:

My www.CML.com V1

My www.ITM.com V1

上传好之后提交

部署Svn+自动发布单/多台服务(进阶版)_第15张图片

修改Windows客户端的host文件,否则会无法连接。

部署Svn+自动发布单/多台服务(进阶版)_第16张图片

第一次通过浏览器去访问

部署Svn+自动发布单/多台服务(进阶版)_第17张图片

修改index.html内容后提交更新再次去访问

My www.CML.com V2

My www.ITM.com V2

部署Svn+自动发布单/多台服务(进阶版)_第18张图片

部署Svn+自动发布单/多台服务(进阶版)_第19张图片

那么问题又来了,要知道生产环境千变万化,各种要求层出不穷防不胜防。以上针对的环境是SVN和WEB服务器属于同一台,如果你的SVN在内网,服务器在外网怎么办?难道手工去上传更新吗?

部署Svn+自动发布单/多台服务(进阶版)_第20张图片

下面来个进阶版的,使用sersync+rsync做到从内网发布到外网的服务器上!

服务器信息:

主机名

IP

所属区域

系统

担任角色

Source

192.168.100.125/24

内网

Centos 7.4

源代码存放

Destination

47.91.235.X/32

外网

Centos 7.4

线上服务器

 

工作原理:

  • 开发人员在本地提交代码到SVN;
  • SVN通过Commit自动更新到内网服务器;
  • 内网服务器使用Rsync+Sersync监控源代码文件变化;
  • 检测到文件发生变化之后同步数据到公网服务器上;

47.91.235.X 配置:

[root@destination ~]# yum -y install rsync   #安装rsync工具

[root@destination ~]# vim /etc/rsyncd.conf

uid = root

gid = root

use chroot = yes

max connections = 10

strict modes = yes

pid file = /var/run/rsyncd.pid

lock file = /var/run/rsyncd.lock

log file = /var/run/rsyncd.log

 

[html]

#定义模块名称

path= /var/www/html/xsweb_server

#数据存放目录,这里为我网站的根目录

comment= analyse

read only = no

hosts allow = *

部署Svn+自动发布单/多台服务(进阶版)_第21张图片

[root@destination ~]# /usr/bin/rsync --daemon /etc/rsyncd.conf  #启动服务

[root@destination ~]# netstat -antup | grep rsync
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      25260/rsync         
tcp6       0      0 :::873                  :::*                    LISTEN      25260/rsync         

[root@destination ~]# ps -aux | grep rsync
root     20864  0.0  0.0 112704   972 pts/1    S+   15:13   0:00 grep --color=auto rsync
root     25260  0.0  0.0 114740   580 ?        Ss   Nov27   0:09 /usr/bin/rsync --daemon /etc/rsyncd.conf

外网服务器就这样配置完了,记住你的rsyncd.conf 里面的模块名称 html

########################################################################

 

#又带你们回顾一遍svn的创建,注意这里先不要写“钩子”

[root@Redis ~]# svnadmin create /webdept/source_web

[root@Redis ~]# cp /webdept/www.ITM.com/conf/svnserve.conf /webdept/source_web/conf/

[root@Redis ~]# cd /var/www/html/

[root@Redis html]# svn co svn://127.0.0.1/source_web

部署Svn+自动发布单/多台服务(进阶版)_第22张图片

 

部署Svn+自动发布单/多台服务(进阶版)_第23张图片安装rsync

[root@Redis ~]# yum -y install rsync

[root@Redis ~]# ssh-keygen   #使用root用户免交互登陆

Generating public/private rsa key pair.   #回车

Enter file in which to save the key (/root/.ssh/id_rsa):   #回车

Enter passphrase (empty for no passphrase):   #回车

Enter same passphrase again:  #回车

Your identification has been saved in /root/.ssh/id_rsa.

Your public key has been saved in /root/.ssh/id_rsa.pub.

The key fingerprint is:

SHA256:l7pPzaWl4vs1urARAJMBcBa7pGmTnpD62l/sBBIzs9U root@source

The key's randomart image is:

+---[RSA 2048]----+

|  ..=o+o         |

|   o o.o         |

|  = + E .        |

| . % .   . .     |

|o O o   S +   o  |

|.+ + o   o + =   |

|. o   + . = = o  |

| o   +   + = o . |

|..o.. . ..=o+.   |

+----[SHA256]-----+

[root@Redis ~]# ssh-copy-id [email protected]   #将公钥给目标服务器

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"

The authenticity of host '47.91.235.62 (47.91.235.62)' can't be established.

ECDSA key fingerprint is SHA256:1MqJ2HF1oUToNzdCzoRfRpXJA71/hW4X2sLCJeFbXa0.

ECDSA key fingerprint is MD5:e2:de:46:35:ca:a6:f8:d1:f3:6a:b0:92:52:19:5b:f7.

Are you sure you want to continue connecting (yes/no)? yes

[email protected]'s password:   #输入目标服务器root密码

[root@Redis ~]# ssh [email protected]   #测试登陆

安装sersync :

链接: https://pan.baidu.com/s/1gioP_p8pyNh0KtKKkuyYvw 提取码: 5a8q 

[root@Redis ~]#tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz

[root@Redis ~]#mv GNU-Linux-x86/ /usr/local/sersync

[root@Redis ~]#cd !$

cd /usr/local/sersync

[root@Redis sersync]# vim confxml.xml   #编辑配置文件

原:

24 

25 

31 

32 

修改后:

24 

25 

31  

32  

 

#在源服务器上创建测试数据,用来看sersync+rsync是否成功同步数据

[root@Redis ~]# cd /var/www/html/source_web/
[root@Redis source_web]# touch aaa

root@Redis source_web]# ls
aaa 

[root@Redis ~]# /usr/local/sersync/sersync2 -r -d -o /usr/local/sersync/confxml.xml

#启动服务

 

#返回线上服务器查看文件是否同步成功

[root@destination ~]# cd /var/www/html/xsweb_server/
[root@destination xsweb_server]# ls
aaa 

#删除源服务器上的文件,为了后面的自动同步实验

[root@Redis hooks]# cd /var/www/html/source_web/

[root@Redis source_web]# rm -rf aaa bbb ccc

[root@Redis source_web]# killall sersync2

#没有killall 这个命令就 yum -y install psmisc 安装一下

#只所以要Killall sersync2 这个进程,是因为如果不杀掉进程后面svn提交完成后无法退出。可以自行尝试一下

 

重点来了,如何通过Post-commit 使它自己同步呢?

编辑post-commit 配置文件

[root@Redis ~]# vim /webdept/source_web/hooks/post-commit   #复制下面脚本内容

#!/bin/sh
export LANG=en_US.utf8
SVN_PATH=/usr/bin/svn
WEB_PATH=/var/www/html/source_web
SERSYNC=/usr/local/sersync/sersync2
SERCONF=/usr/local/sersync/confxml.xml
$SVN_PATH update $WEB_PATH --username 'test' --password '123456' --no-auth-cache
if [ $? == 0 ];then
        echo "" >>/tmp/sersync.log
        echo `date` >>/tmp/sersync.log
        echo "-----------------------------------------">>/tmp/sersync.log
        $SERSYNC -d -r -o $SERCONF >>/tmp/sersync.log
  if [ $? == 0 ];then
          killall sersync2
  else
          echo "Error:Process not killed"
  fi
else
        echo "Error:Update to 47.91.235.62 server failed" >>/tmp/sersync.error
fi

[root@Redis ~]# chmod +x /webdept/source_web/hooks/post-commit

 

#打开Windows上的svn客户端,在里面创建一些文件测试

部署Svn+自动发布单/多台服务(进阶版)_第24张图片

部署Svn+自动发布单/多台服务(进阶版)_第25张图片

部署Svn+自动发布单/多台服务(进阶版)_第26张图片

 

部署Svn+自动发布单/多台服务(进阶版)_第27张图片完成了~~~~~

 

 

 

你可能感兴趣的:(Linux,RSYNC,Sersync)