1. 程式人生 > >git hooks自動部署

git hooks自動部署

git 身份驗證 code path tin 小時 receive iss span

一、 準備

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自動部署