關於在Centos上使用Git做代碼管理和自動部署的方案,網上已經有不少教程了。近幾天在部署環境的時候碰了不少坑,很大部分都是由於權限太亂導致的,這里詳細寫一下流程。
1. 自動部署原理
先講實現方法和原理。Git服務和倉庫都是在服務器上的,服務器上的Web目錄和本地都有完整的代碼。Git有個叫hook的機制,可以在代碼更新時執行回調(執行一段shell)。一般執行流程是開發完成后,通過git push將代碼傳到服務器git倉庫上,這時git hook自動到Web目錄git pull,將Web目錄下的代碼更新。這樣就完成了自動部署。
2. 配置用戶
本例Centos版本為7.0,,以apache作服務器。若沒有安裝git或apache,先安裝:
# yum install httpd # yum install git
修改git用戶權限(執行命令權限、用戶目錄、組、改密碼):
# 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命令。
3. 創建倉庫和網站代碼
使用git用戶身份,新建git倉庫:
# 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