gitLab 全局hooks和custom_hooks,以及服務器端自動更新和備份(二)


1.利用custom_hooks的post-receive鈎子,實現自動更新

打開另外一個終端,以管理員身份進入/home/hp/文件夾,新建一個文件夾git_backup,直接git clone一個項目下來,這里我clone的是自己的測試項目test。

打開之前的終端在custom_hooks文件夾下添加post-receive的shell腳本,沒有后綴(以我的電腦路徑為例:/var/opt/gitlab/git-data/repositories/root/Test.git/custom_hooks):

修改權限:chmod 777 post-receive

也可以修改為其他權限,但要保證它可以執行(gitlab官網上說,需要修改其所有者為git,我的電腦上不這樣修改也可以執行,具體參看我的上一篇文章)。

#!/bin/sh
echo "custom post receive -------------->>"
dst=/home/hp/git_backup/Test
cd ${dst}
unset GIT_DIR
git --work-tree=${dst} pull origin master

切換到另外一個終端,修改/home/hp/Test目錄及其所包含的文件屬性

為了簡化操作,我直接修改其屬性(可以不需要這么多權限,起碼要保證它可以執行),命令為: chmod -R 777 Test

2.用客戶端git來測試

此時的客戶端git和服務器端在同一台電腦上,只是目錄不同,

客戶端git目錄在/home/hp/gitTest/Test

服務器git目錄在/home/hp/git_backup/Test,如果是在兩台電腦上就可以看到更清楚。

在客戶端git目錄下修改了文件,然后提交git commit -a,添加注釋后提交到本地庫,然后git push,就可以看到服務器端的custom_hooks的post-receive鈎子被調用,執行了pull操作,這樣就達到了自動更新服務器/home/hp/gitTest/Test的git庫的目的。

 

以下部分可以跳過,我踩過的坑,記錄一下————————————————————————————————————

3. 利用全局hooks中的post-receive實現批量更新

當時把hooks目錄下的三個ruby版的鈎子屏蔽了,此時每個項目對應的custome_hooks里的鈎子不能生效,只能嘗試用一種笨辦法解決,就是用hooks文件下的全局鈎子。如果在客戶端push之后,post-receive被調用,這這里能調用每個項目的shell腳本去pull一遍,這樣不就可以實現自動更新了么?

  思路:這里的post-receive可以是shell腳本,該腳本要實現的功能就是調用某一個目錄下的所有shell腳本,並且執行一遍。

每個shell腳本要做的事情就是更新對應項目的文件。注意:hooks文件夾下原來的三個鈎子文件不要刪除,大家先做好備份,直接改后綴名,加上.simple

  思路有了,現在這用這樣的笨辦法解決:先建一個測試文件post-receive如下,修改其權限可執行

#!/bin/sh

for file in /home/hp/post_hooks_dir/* do sh $file done 

采用的是絕對路徑,你可以在某個地方新建一個文件夾,然后用shell腳本去遍歷你自己的目錄,然后執行該目錄下的shell腳本。

如果收到了remote: error: cannot open .git/FETCH_HEAD: Permission denied
這樣的報錯,就自己去修改需要更新的git倉庫的文件的屬性。

正常是是這樣信息:

 

4.在原來的ruby版本的鈎子執行我們的shell腳本

把3中的shell腳本寫成一行,在ruby中調用,這樣就可以不影響原來的ruby全局鈎子。

參考寫成一行的方法:http://blog.sina.com.cn/s/blog_ac843e330101c55g.html

在ruby中執行shell命令:http://www.jb51.net/article/59939.htm

我們采用的是system方法來執行shell命令

為不能刪除hooks文件下的ruby鈎子:http://blog.everants.com/jie-jue-gitlabbu-xian-shi-push-eventhe-xin-fen-zhi/

 可以采用在post-recevie的鈎子里執行我們的shell腳本,就可以了。

在post-receive里添加一行

system 'for file in /home/hp/post_hooks_dir/* ;do sh $file;done'

這里的目錄就是你自定義的目錄/home/hp/post_hooks_dir/,用來統一存放所有需要執行的腳本,實現工程的自動更新。建議是按照工程名,建立同名的shell腳本,每個shell腳本的內容可以參考本文1中的,只需要自己改對應的文件路徑即可。這樣全局鈎子,每次從客戶端有push過來時,會調用hooks里的post-receive鈎子,這個鈎子里會去執行我們的那句shell腳本,然后這個腳本會去/home/hp/post_hooks_dir/執行所有腳本(每個腳本對應一個項目,進行git pull origin master)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM