[英]Custom post-receive file using GitLab
我正在嘗試替換我的后接收掛鈎,由GitLab自動生成一個新文件,該文件啟用郵件支持,因此必須觸發“post post”。
這是我文件的先前版本:
#!/usr/bin/env bash
# This file was placed here by GitLab. It makes sure that your pushed commits
# will be processed properly.
while read oldrev newrev ref
do
# For every branch or tag that was pushed, create a Resque job in redis.
repo_path=`pwd`
env -i redis-cli rpush "resque:gitlab:queue:post_receive" "{\"class\":\"PostRe
ceive\",\"args\":[\"$repo_path\",\"$oldrev\",\"$newrev\",\"$ref\",\"$GL_USER\"]}
" > /dev/null 2>&1
done
當我用一個新文件替換該文件時,該文件包含文件末尾的上述行,GitLab說:“項目在管理區域中有無效的接收后文件”,但電子郵件被正確發送。
你知道如何處理多個post-receive支持的問題。 目前我不知道文件的gitlab特定部分是否正確執行。
感謝幫助!
現在使用下面提到的解決方案(拉取請求)調用文件夾中的腳本。 但我不明白為什么標准的“post-receive-email”-script如果包含在目錄中則不發送任何郵件。 如果直接作為post-receive調用它,它可以正常工作。
不知道為什么我必須更改訂單,但以下工作對我來說(即使我不知道現在是否正確創建了resque作業:
#!/usr/bin/env bash
repo_path=`pwd`
if [ -d hooks/post-receive.secondary.d ]; then
for i in hooks/post-receive.secondary.d/*
do
[ -x "$i" ] || continue
# call the hooklet with the same arguments we got
path=$repo_path"/"$i
"$path" "$@" || {
# hooklet failed; we need to log it...
echo hooklet $i failed
perl -I$GL_BINDIR -Mgitolite -e "log_it('hooklet $i failed')"
# ...and send back some non-zero exit code ;-)
exit 1
}
done
fi
while read oldrev newrev ref
do
# For every branch or tag that was pushed, create a Resque job in redis.
env -i redis-cli rpush "resque:gitlab:queue:post_receive" "{\"class\":\"PostReceive\",\"args\":[\"$repo_path\",\"$oldrev\",\"$newrev\",\"$ref\",\"$GL_USER\"]}" > /dev/null 2>&1
done
exit 0
更新2014年,GitLab 不再使用gitolite:
如下面 Ciro Santilli所述 ,現在有一種設置自定義掛鈎的官方方法(GitLab 7.5.0 +,2014年11月)。
- 選擇一個需要自定義git鈎子的項目。
- 在GitLab服務器上,導航到項目的存儲庫目錄。
對於手動安裝,路徑通常是/home/git/repositories/<group>/<project>.git
。
對於Omnibus安裝,路徑通常是/var/opt/gitlab/git-data/repositories/<group>/<project>.git
。- 在此位置創建一個名為
custom_hook
的新目錄。- 在新的
custom_hooks
目錄中,創建一個名稱與鈎子類型匹配的文件。
對於pre-receive
掛鈎,文件名應該是pre-receive
,沒有擴展名。- 使鈎子文件可執行,並確保它由git擁有。
- 編寫代碼以使git鈎子函數按預期方式運行。 鈎子可以是任何語言。 確保頂部的“shebang”正確反映語言類型。
例如,如果腳本在Ruby中,則shebang可能是#!/usr/bin/env ruby
。
原始答案(2013年1月)
在GitLab使用更新后掛鈎時,這個(允許自定義掛鈎)已經使用pull請求555和commit 2245a6bbe解決了。
你需要在由gitolite和GitLab管理的git bare repo中聲明一個hooks/post-receive.secondary.d
。
將所有更新后的掛鈎放在那里。
您可以修改gitolite 在該模型后發布的更新后掛鈎:如果檢測到,它將調用所有更新后掛鈎。
問題是:
使用Gitolite V2,GitLab最終將該管理權委托給Gitolite,因為您可以聲明更新后的第二個鈎子 ,Gitolite本身會調用它。
使用Gitolite V3,不再有任何保留掛鈎 (除了gitolite-admin repo中的更新一個),因此沒有gitolite“輔助”機制。
但GitLab(現在使用post-receive hook)尚未更新其鈎子管理以考慮新的現實(gitolite不再允許二次鈎子)。
自定義掛鈎
GitLab最近添加了一個自定義鈎子功能,因為常規鈎子在內部使用: https : //github.com/gitlabhq/gitlabhq/blob/667c0a909bde1cf71f21d8ec9768e98b1c489030/doc/hooks/custom_hooks.md
基本上,你只需在你的Git custom_hooks
中創建一個custom_hooks
目錄並將鈎子放入其中,然后GitLab確保它們運行。
解決此特定問題的另一種可能方法是:
#!/usr/bin/env bash
while read oldrev newrev ref
do
# For every branch or tag that was pushed, create a Resque job in redis.
repo_path=`pwd`
env -i redis-cli rpush "resque:gitlab:queue:post_receive" "{\"class\":\"PostReceive\",\"args\":[\"$repo_path\",\"$oldrev\",\"$newrev\",\"$ref\",\"$GL_USER\"]}" > /dev/null 2>&1
/path/to/your/hook $oldrev $newrev $ref
done
就郵件通知而言,我建議使用此電子郵件掛鈎。 或者,您可以使用git-notifier並將/path/to/your/hook $oldrev $newrev $ref
替換為/path/to/git-notifier/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.