部署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

[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/

文件描述:

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

注:創建一個test用戶 密碼 123456

 

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

注:對www.ITM.com這個項目授權  r:讀   w:寫 

 

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

注:

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

注:這個項目的 passwd authz 文件均使用絕對路徑指定

1.1 修改svn根目錄:

 

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

注:把原/var/svn  改爲自己創建的svn根目錄

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

 

1.2 windows客戶端連接

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

本次使用關閉防火牆

連接成功

1.4 排錯2:

經過排錯1後連接正常,但發現每次重啓系統後無法連接,服務也是啓動狀態,報錯圖:

查看服務進程:

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

解決方案:

臨時解決:手動執行: kill  -9  1014(PID)  結束進程

                     啓動服務:[root@Redis ~]# svnserve -d -r /webdept/

永久解決:

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

將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

<VirtualHost *:80>

        ServerName www.ITM.com

        DocumentRoot /var/www/www.ITM.com

</VirtualHost>

<VirtualHost *:80>

        ServerName www.CML.com

        DocumentRoot /var/www/www.CML.com

</VirtualHost>

注:配置好虛擬目錄

[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 測試頁面

內容分別爲:

My www.CML.com V1

My www.ITM.com V1

上傳好之後提交

修改Windows客戶端的host文件,否則會無法連接。

第一次通過瀏覽器去訪問

修改index.html內容後提交更新再次去訪問

My www.CML.com V2

My www.ITM.com V2

那麼問題又來了,要知道生產環境千變萬化,各種要求層出不窮防不勝防。以上針對的環境是SVN和WEB服務器屬於同一臺,如果你的SVN在內網,服務器在外網怎麼辦?難道手工去上傳更新嗎?

下面來個進階版的,使用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 = *

[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

 

安裝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  <localpath watch="/opt/tongbu">

25  <remote ip="127.0.0.1" name="tongbu1"/>

31  <auth start="false" users="root" passwordfile="/etc/rsync.pas"/>

32  <userDefinedPort start="false" port="874"/><!-- port=874 -->

修改後:

24  <localpath watch="/var/www/html/source_web">

<!—-設置監控的目錄-->

25  <remote ip="47.91.235.62" name="html"/>

<!—設置目標服務器的IP和”模塊名在目標服務器/etc/rsyncd.conf 裏面” -->

31  <auth start="true" users="root" passwordfile="/etc/rsync.pas"/>

<!—-設置同步的用戶名和密碼文件-->

32  <userDefinedPort start="false" port="873"/><!-- port=874 -->

 <!—-設置rsync的端口,要和目標服務器那邊開啓的端口一致-->

#在源服務器上創建測試數據,用來看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客戶端,在裏面創建一些文件測試

 

完成了~~~~~

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章