1. 程式人生 > >GIT伺服器實現web程式碼自動部署

GIT伺服器實現web程式碼自動部署

之前在一臺vps伺服器上面搭建了git伺服器,用來做程式碼管理,方便團隊開發。但是問題也就相應的來了,使用git可以輕鬆的上傳程式碼,而由於做的是web開發,每次還都得到伺服器上把程式碼手動pull或者複製到網頁所在的資料夾下,也就比較麻煩,不適合我這種懶人。git提供了hook機制,可以很容易的實現程式碼的自動部署。

個人原創,版權所有,轉載請註明原文出處:

一 git機制簡要介紹

git使用的是程式碼倉庫,git服務端有倉庫,稱為遠端倉庫,我們clone下來的,本地也有一個倉庫稱為本地倉庫。我們commit的時候是把程式碼提交到了本地倉庫,push時,是把程式碼提交到了遠端倉庫。pull的時候是把程式碼從遠端倉庫下載到本地倉庫。

程式碼倉庫對程式碼的儲存使用了版本指標,每個提交的版本都對應一個HEAD指標,當前版本指標隨著程式碼的提交而一直改變。

二 自動部署原理

說說現在程式碼的分佈情況,開發者電腦上的本地倉庫,git伺服器上的遠端倉庫,web伺服器上的另一個本地倉庫,我們瀏覽器訪問的就是這裡的程式碼。

要實現自動部署,就是要當開發者從本地倉庫提交程式碼到遠端倉庫的時候,自動把程式碼部署到web伺服器的本地倉庫,實現開發者本地倉庫和web伺服器的本地倉庫的同步。

三 實現自動部署

按照上面說的,就是要在開發者提交的時候,自動觸發指令碼,指令碼去實現web端程式碼的部署.

這裡就得講一下git的hook機制,當git伺服器接到各種事件時觸發,這裡使用的hook是

post-receive

這個hook在git伺服器受到push請求,並且接受完程式碼提交時觸發。

具體程式碼體現:

在git遠端倉庫的hooks目錄下新建post-receive檔案:

#!/bin/sh
 
#author: embbnux
#Blog of Embbnux: http://www.embbnux.com
 
#判斷是不是遠端倉庫
IS_BARE=$(git rev-parse --is-bare-repository)
if [ -z "$IS_BARE" ]; then
echo >&2 "fatal: post-receive: IS_NOT_BARE"
exit 1
fi
 
unset GIT_DIR
DeployPath="/var/web"
 
echo "==============================================="
cd $DeployPath
echo "deploying the test web"
 
#git stash
#git pull origin master
git fetch --all
git reset --hard origin/master
 
time=`date`
echo "web server pull at webserver at time: $time."
echo "================================================"


儲存後賦予可執行許可權:

1 chmod +x hooks/post-receive

這樣在開發者提交程式碼的時候,就會自動部署。

在這裡補充說明下: 因為我建立git倉庫時用的是git使用者 但是在自動部署時站點伺服器採用的是nginx伺服器的  git使用者屬於git組 nginx屬於nginx組  所以在這裡就是把post-receive設定成nginx組 如果不設定的話在站點目錄下是沒有辦法更新檔案的(會提示沒有許可權操作)


自動部署的時候,我這裡使用的是git fetch,也可以使用git pull實現,這裡兩個的區別主要是pull事先fetch後然後再用merge,來合併本地和遠端的程式碼。但是有個問題,如果開發者在提交過程出現失誤,使用git reset復位後,現在遠端的程式碼版本低於web端的程式碼版本,再使用pull的時候就不能實現和開發者本地的程式碼的同步。所以這裡使用fetch後,在強制使用reset實現web端的程式碼版本指標和git服務端的一致。由於沒有使用merge,所以以後web端的程式碼就不能在伺服器上直接更改了,對web端程式碼的各種改變都應該使用開發者電腦進行程式碼提交,不然會報錯。

轉載自:http://m.blog.csdn.net/blog/liangpz521/40583539