配置前提:
1臺開發電腦,我本地是windows10,(主要用來提交開發的網站代碼)
1臺git服務器,已安裝好git環境。本案例所用服務器ip為192.168.32.131,centos7系統,
n臺web服務器(下文都以web服務器統稱)。本案例用了3臺服務器,ip分別為192.168.32.128,192.168.32.129,192.168.32.130,centos7系統
達到目的:
在開發電腦上開發好網站,向git服務器push更新,如果提交的描述帶有發布release_new_version(當然也可以自己配置)的字眼,就把代碼更新發布到多臺web服務器。
配置步驟:
1,看系統原來有沒有rsync,如果有,先刪除,以防以前版本太舊,配置不成功(web服務器上執行)。
$ yum remove rsync? ? (注意不要在git所在服務器執行此操作,有可能會刪除git,因為git依賴了rsync)
2,安裝同步工具rsync(git服務器和web服務器上都要執行此步)
$ wget https://download.samba.org/pub/rsync/src/rsync-3.1.2.tar.gz
$?tar -zxvf rsync-3.1.2.tar.gz
$ cd rsync-3.1.2
$ ./configure --prefix=/usr/local/rsync
$ make
$ make install
$ ln -s/usr/local/rsync/bin/rsync? /usr/local/bin/rsync
3,編輯rsync啟動所需要的配置文件(web服務器執行)
$ mkdir/usr/local/rsync/etc? /usr/local/rsync/var
$ mkdir /usr/local/rsync/var/run? /usr/local/rsync/var/log
$ cd /usr/local/rsync/etc
$ vim rsyncd.conf? ? 內容如下
#global settings
pid file = /usr/local/rsync/var/run/rsyncd.pid
port = 873
lock file = /usr/local/rsync/var/run/rsyncd.lock
log file = /usr/local/rsync/var/log/rsync.log
gid = root
uid = root
#
##module settings
[www] #寫模塊,到時要在git所在服務器的同步配置中指定此模塊名www
path = /home/wwwroot/advanced/
use chroot = no
max connections = 15
read only = no
list = no
ignore errors = yes
timeout = 120
secrets file = /usr/local/rsync/etc/rsyncd.secrets
hosts allow = 192.168.32.131? #限制ip,只有git倉庫所在服務器才有同步權限
$ vim rsyncd.secrets? 內容如下
rsync:123456
4,編輯服務腳本(web服務器上執行)
$ vim/etc/init.d/rsync? 內容如下
#!/bin/bash
#this script for start|stop rsync daemon service
#date:2017/11/3
status1=$(ps -ef | egrep "rsync --daemon.*rsyncd.conf" | grep -v'grep')
pidfile="/usr/local/rsync/var/run/rsyncd.pid"
start_rsync="/usr/local/rsync/bin/rsync --daemon--config=/usr/local/rsync/etc/rsyncd.conf"
function rsyncstart() {
if [ "${status1}X" =="X" ];then
rm -f $pidfile
${start_rsync}
status2=$(ps -ef | egrep"rsync --daemon.*rsyncd.conf" | grep -v 'grep')
if ["${status2}X" != "X"];then
echo "rsync servicestart.......OK"
fi
else
echo "rsync service isrunning !"
fi
}
function rsyncstop() {
if [ "${status1}X" !="X" ];then
kill -9 $(cat $pidfile)
status2=$(ps -ef | egrep"rsync --daemon.*rsyncd.conf" | grep -v 'grep')
if [ "${statusw2}X" =="X" ];then
echo "rsync servicestop.......OK"
fi
else
echo "rsync service is notrunning !"
fi
}
function rsyncstatus() {
if [ "${status1}X" !="X" ];then
echo "rsync service isrunning !"
else
echo "rsync service is notrunning !"
fi
}
function rsyncrestart() {
if [ "${status1}X" =="X" ];then
echo "rsync serviceis not running..."
rsyncstart
else
rsyncstop
rsyncstart
fi
}
case $1 in
"start")
rsyncstart
;;
"stop")
rsyncstop
;;
"status")
rsyncstatus
;;
"restart")
rsyncrestart
;;
*)
echo
echo"Usage: $0start|stop|restart|status"
echo
esac
5,啟動rsync(web服務器上執行)
$ service rsync start
6,編輯同步密碼文件(git服務器上執行),假設文件放在/home/git目錄下,可以自己指定。
$ vim? /home/git/rsync.passwd? ?內容如下(內容就是我們在以上步驟web服務器中配置的rsyncd.secrets密碼部分的內容,一定要對應)
123456
7,進入網站代碼所在git倉庫鉤子目錄(如/home/git/repositories/advanced.git/hooks)(git服務器上執行)
$ cd /home/git/repositories/advanced.git/hooks
$ ls
$ cp post-update.sample post-update
$ vim post-update? ?內容如下
#!/bin/sh
#
# An example hook script to prepare a packed repository for use over
# dumb transports.
#
# To enable this hook, rename this file to "post-update".
#此參數自己定,到時像發布時,commit–m這個參數
RELEASE_MSG="release_new_version";
LEN=`git log -1 | grep $RELEASE_MSG | wc -L`;
if [[ $LEN -gt 0 ]]; then
echo "發布代碼到所有服務器";
GIT_REPO=$HOME/repositories/advanced.git
TMP_GIT_CLONE=$HOME/tmp/advanced
mkdir -p $TMP_GIT_CLONE
#從本機clone倉庫到臨時目錄
git clone $GIT_REPO $TMP_GIT_CLONE
#進入到臨時目錄,并執行其中的deploy.sh
cd $TMP_GIT_CLONE && chmod +x deploy.sh && ./deploy.sh
echo 'deploying complete.'
#刪除臨時目錄
rm -rf $TMP_GIT_CLONE
fi
8,創建deploy.sh腳本,放到代碼的根目錄,到時和代碼一起提交到版本庫(開發電腦上操作)。內容如下
#!/bin/bash
# current dir is the same as this script
# current user is git
# make sure /home/git/rsync.passwd is exist and has 600 permission ( for thersync password )
# need rsync 3.10+ support also server should be 3.10+
# 刪除不需要發布的文件,這里根據自己的情況而定(由于此腳本執行的是上一步創建的臨時目錄,所以大膽刪,同步完整個目錄會被刪除的)
rm -rf .git
rm -r .gitignore
rm -rf api/runtime/cache
rm -rf api/runtime/logs
rm -rf backend/runtime/cache
rm -rf backend/runtime/logs
rm -rf frontend/runtime/cache
rm -rf frontend/runtime/logs
#發布到3臺web服務器(此處ip地址后的::www就是之前配置web服務器的synecd.conf里指定的模塊,同步的時候,會自動同步到模塊指定的目錄)
rsync -av ./ rsync@192.168.32.128::www --chown=www:www --password-file=/home/git/rsync.passwd --exclude=deploy.sh
rsync -av ./ rsync@192.168.32.129::www --chown=www:www --password-file=/home/git/rsync.passwd --exclude=deploy.sh
rsync -av ./ rsync@192.168.32.130::www --chown=www:www --password-file=/home/git/rsync.passwd --exclude=deploy.sh
deploy.sh腳本所在目錄如下圖,在網站根目標。
9,提交deploy.sh到版本庫,修改網站代碼,提交測試(開發電腦上操作,要確定deploy.sh會被提交到版本庫)
$ git add –all
$ git commit –am”release_new_version”(如果沒有這個release_new_version參數,是不會同步的)
$ git push
結果如圖,大功告成