企業實戰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客戶端,在裏面創建一些文件測試
完成了~~~~~