關於在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