寫代碼的時候,git push到遠程代碼庫後,每每還要連到服務器上pull代碼才能進行測試。代碼push後自動更新測試服務器的代碼也算是一種剛需了。
git
git自己具有hook機制,能夠接收代碼前或者更新代碼後調用自定義的腳本。這個腳本在{{代碼倉庫}}/.git/hooks目錄下。以下圖:/home/htdocs/lost爲git代碼倉庫,lost下面.git/hooks目錄爲git的回調腳本。經常使用的有pre-commit改腳本在提交前執行,能夠作一些提交的驗證工做。還有一個post-receive,該腳本在代碼提交後執行,自動更新遠程服務器的代碼就用到這個腳本。vim
搭建git開發環境,gitlab估計是不二之選。gitlab託管的倉庫,代碼更新後怎麼觸發git的hooks腳本呢。7.5版本後的gitlab能夠這麼作。bash
在gitlab的git-data裏面的代碼bare倉庫裏面建立一個custom_hooks目錄,將git的hooks下面的腳本放到這裏便可。git-data的目錄根據安裝方式不同位置會不一樣。我是經過yum安裝包的方式安裝,目錄在這裏。/var/opt/gitlab/git-data/repositories/` username `/lost.git 。hooks腳本的完整路徑爲: /var/opt/gitlab/git-data/repositories/` username `/lost.git/custom_hooks服務器
腳本內容很簡單:ssh到目標服務器執行git pull 命令便可。post-receive要有可執行權限,屬主爲git。ssh
#vim post-receive ide
#!/usr/bin/env bash # function: deploy git repo to stgging server # author: Chenchao Gao # date: 2015/10/29 ssh root@10.10.10.1 "cd /home/htdocs/lost;unset GIT_DIR && git pull origin master" >>/tmp/git-hook.log 2>&1
代碼中的unset GIT_DIR是關鍵,取消GIT_DIR這個變量,不然cd的路徑將不能按預期工做。git pull origin master 是明確從遠程倉庫更新到本地的master分支。一般git pull便可,可是若是是第一次pull代碼,將會提示不能肯定merge哪一個分支的錯誤。gitlab
上面的代碼有一個小小的坑。gitlab調用這個腳本是用git這個用戶來執行的。因此ssh root@10.10.10.1這個用戶公鑰認證的話,應該是本地服務器git用戶到10.10.10.1的root用戶。不然將報公鑰認證失敗的錯誤!post