簡體   English   中英

使用GitLab自定義收發后文件

[英]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月)。

  1. 選擇一個需要自定義git鈎子的項目。
  2. 在GitLab服務器上,導航到項目的存儲庫目錄。
    對於手動安裝,路徑通常是/home/git/repositories/<group>/<project>.git
    對於Omnibus安裝,路徑通常是/var/opt/gitlab/git-data/repositories/<group>/<project>.git
  3. 在此位置創建一個名為custom_hook的新目錄。
  4. 在新的custom_hooks目錄中,創建一個名稱與鈎子類型匹配的文件。
    對於pre-receive掛鈎,文件名應該是pre-receive ,沒有擴展名。
  5. 使鈎子文件可執行,並確保它由git擁有。
  6. 編寫代碼以使git鈎子函數按預期方式運行。 鈎子可以是任何語言。 確保頂部的“shebang”正確反映語言類型。
    例如,如果腳本在Ruby中,則shebang可能是#!/usr/bin/env ruby

原始答案(2013年1月)

在GitLab使用更新后掛鈎時,這個(允許自定義掛鈎)已經使用pull請求555commit 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM