Centos:基於Git的代碼自動部署

關於在Centos上使用Git作代碼管理和自動部署的方案,網上已經有很多教程了。近幾天在部署環境的時候碰了很多坑,很大部分都是因爲權限太亂致使的,這裏詳細寫一下流程。html

 

1. 自動部署原理git

先講實現方法和原理。Git服務和倉庫都是在服務器上的,服務器上的Web目錄和本地都有完整的代碼。Git有個叫hook的機制,能夠在代碼更新時執行回調(執行一段shell)。通常執行流程是開發完成後,經過git push將代碼傳到服務器git倉庫上,這時git hook自動到Web目錄git pull,將Web目錄下的代碼更新。這樣就完成了自動部署。web

 

2. 配置用戶shell

本例Centos版本爲7.0,,以apache做服務器。若沒有安裝git或apache,先安裝:apache

# yum install httpd
# yum install git

修改git用戶權限(執行命令權限、用戶目錄、組、改密碼):vim

# usermod git -s /bin/bash -d /home/git -g apache
# passwd git

若是安裝完git後沒有git用戶,把以上一句 usermod 改爲 useradd 就好了。以上命令設置了git用戶的家目錄和組,把git歸屬到apache組是由於須要git管理網站目錄的文件,同組方便操做。這裏要注意的是網上不少教程使用/bin/git-shell做爲命令權限,但我的認爲不推薦,由於後續還要使用git用戶作一些操做,須要基本的shell命令。bash

 

3. 建立倉庫和網站代碼服務器

使用git用戶身份,新建git倉庫:post

# su git
$ git init --bare ~/repo/website.git

以上表示在git用戶的家目錄repo文件夾中,創建website.git倉庫。網站

到網站目錄(/var/www/html),克隆一份website代碼:

$ cd /var/www/html
$ git clone ~repo/website.git

這樣網站目錄就有一份倉庫的完整代碼。

接下來寫hook文件:

$ cd ~/repo/website.git/hooks
$ vim post-receive

在post-receive鉤子文件裏寫如下內容[1]:

#!/bin/sh
unset GIT_DIR
cd /var/www/html/website
git pull

編輯後保存退出。以上命令表示cd到網站目錄,並git pull更新。隨後還要把post-receive改爲可執行:

$ chmod 775 post-receive

能夠看到,以上大部分命令都是以git身份執行的,是由於涉及不少文件操做,若是用其餘用戶執行則要改權限,以及chown把文件歸屬給git用戶。

 

最後最後,完成全部操做,才把git的命令權限改回去(用root身份):

# usermod -s /bin/git-shell

git用戶專門管理git的全部事務,而不能用於登陸系統。至於公鑰密鑰的配置,請自行參考其餘資料。

若是要防止.git被訪問,httpd.conf加入如下限制:

<Files ~ "\.git">
    Require all denied
</Files>

附上git倉庫的地址,用於遠程開發克隆,把serverHost換成服務器地址:

git@serverHost:~/repo/website.git

 

參考資料及引用:

[1] git hook分類:CSDN博客. git鉤子. http://blog.csdn.net/hongchangfirst/article/details/46693237

相關文章
相關標籤/搜索