git hooks自動部署
一、 準備
1. 筆者的git庫和web服務器在同一臺機器上。
# cd /data/wwwroot/html //html目錄
# git clone /home/git/html . //首次需克隆遠程庫
# chown -R www.www .
//修改WEB權限為程序運行者
2. 由於hooks下的腳本一般是由git執行,所以git需要擁有相關目錄的寫入權限。
# usermod -a -G git www //將git用戶加入到www組
# find /data/wwwroot/html -type d -exec chmod 775 {} \; //修改WEB根目錄及以下目錄權限為775
二、 hooks腳本
# cat /home/git/html/hooks/post-receive
#!/bin/sh unset GIT_DIR LOG_PATH=/tmp/gitupdate.log DeployPath=/data/wwwroot/html cd $DeployPath git add . -A && git stash echo "------------Start Pull -----------" >> $LOG_PATH echo "Time:"`date ‘+%Y-%m-%d %T‘` >> $LOG_PATH git pull origin master&>> $LOG_PATH git stash pop exit 0
三、 驗證
1. 客戶端以git身份驗證上傳或修改文件,首次上傳文件以後發現並沒有同步,通過以上打印的日誌找到問題。
# cat /tmp/gitupdate.log
------------Start Pull -----------
Time:2017-01-13 16:49:44
error: cannot open .git/FETCH_HEAD: Permission denied
因為git賬戶更新文件會在.git目錄下記錄和創建一些文件,而我們git clone的時候使用的是root賬戶,修改權限:
# chown -R git.git /data/wwwroot/html/.git
2. 定時更新權限腳本
由於:
- 網站根目錄下會產生新的屬主為git的目錄和文件,導致www不具備寫入權限
- .git隱藏目錄下可能會生成新的文件,導致git更新失敗
- 手動幹預git後部分文件權限發生變化
這些情況都可能導致自動更新出現問題,為了解決這些權限導致的失敗隱患,特將更新權限寫為計劃任務,並根據情況決定多久執行一次,筆者定為1小時執行一次。
# crontab -l | grep chperm
0 */1 * * * /data/shell/chperm.sh
# cat /data/shell/chperm.sh
#!/bin/bash chown -R www.www /data/wwwroot/html find /data/wwwroot/html -type d -exec chmod 775 {} \; chown -R git.git /data/wwwroot/html/.git/
3. 改完後驗證正常。
# cat /tmp/gitupdate.log
------------Start Pull -----------
Time:2017-01-13 16:53:11
From /home/git/html
* branch master -> FETCH_HEAD
Updating 0591be6..1cdb27b
Fast-forward
tests/sunleitest1.txt | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 tests/sunleitest.txt
create mode 100644 tests/sunleitest1.txt
?
git hooks自動部署