利用Git Hooks簡單部署、更新Web應用

Harlan2016發表於2018-01-19

自己寫的網站,每次push程式碼後都要ssh進入伺服器手動同步程式碼,不喜歡這樣的重複勞動,索性使用git hooks來自動完成程式碼同步。每次在push了之後就會自動執行指令碼

1. 建立倉庫

/home/yourname/repos/目錄下,執行git init --bare test.git,在伺服器端初始化一個遠端的Git裸倉庫。裸倉庫裡只有git索引,不包含工作目錄。 通常來說,在Linux裡Web專案是放在/var/www目錄之下,我們在這目錄下clone上面建立的倉庫。

cd /var/www
git clone /home/yourname/repos/project.git
複製程式碼

2. 新增鉤子

在裸倉庫中Git鉤子存放於,hooks目錄,如果是普通的git資料夾,則存放於.git/hooks目錄內,每個Git倉庫都會這個資料夾,裡面放置一些例項指令碼,所有的例項指令碼都是shell指令碼,只要是正確命名的可執行指令碼都能使用,Ruby、Python或其他語言也是可行的。 hooks目錄內預設包含如下檔案。去掉檔案後面的.example即可使用,別忘了chmod +x新增可執行許可權。

➜  hooks git:(master) ls
applypatch-msg.sample     pre-commit.sample         prepare-commit-msg.sample
commit-msg.sample         pre-push.sample           update.sample
post-update.sample        pre-rebase.sample
pre-applypatch.sample     pre-receive.sample
複製程式碼

檔名已經清楚地表述了每個鉤子的作用。我們想做的是倉庫被push後自動部署,所以要用到的是post-update鉤子,修改的鉤子是在/home/yourname/repos/project.git倉庫裡的鉤子,不要修改到/var/www/project裡了

3. 修改鉤子

先用cp post-update.sample post-update複製一個新檔案,再編輯此檔案。每一行命令都已新增註釋

# 進入專案目錄
cd /var/www/project

# 獲取倉庫裡的新提交
git fetch /home/yourname/repos/project.git

# 將程式碼與倉庫同步,拋棄當前所有修改
git clean -f
git reset --hard origin/master

## 以下指令適用於laravel專案,可根據專案自由修改
# 更新依賴包
composer install
npm install
php artisan migrate

# 前端專案按生產環境生成前端檔案
npm run production
複製程式碼

最後一行命令如果遇到許可權問題,則需要將使用者新增到www-data中。使用命令usermod -G www-data yourname,並在最後一行新增chgrp www-data . -R

相關文章