Git hooks發布代碼到多服務器(centos7)

配置前提:

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

結果如圖,大功告成



最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容