6

GitLabによって自動生成された受信後フックを、メールサポートを有効にする新しいファイルに置き換えようとしているため、「受信後」をトリガーする必要があります。

これは私のファイルの以前のバージョンです:

#!/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 は管理領域に「プロジェクトには無効な受信後ファイルがあります」と表示しますが、電子メールは正しく送信されます。

複数の受信後のサポートの問題を処理する方法を知っていますか。現時点では、ファイルの gitlab 固有の部分が正しく実行されているかどうかはわかりません。

手伝ってくれてありがとう!

アップデート:

フォルダー内のスクリプトは、以下のソリューション (プル リクエスト) を使用して呼び出されるようになりました。しかし、ディレクトリに含まれている場合、標準の「post-receive-email」スクリプトがメールを送信しない理由がわかりません。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
4

3 に答える 3

6

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. この場所に s という新しいディレクトリを作成しますcustom_hook
  4. 新しいcustom_hooksディレクトリ内に、フック タイプに一致する名前のファイルを作成します。フックの場合、ファイル名
    には拡張子を付けないでください。pre-receivepre-receive
  5. フック ファイルを実行可能にして、それが git によって所有されていることを確認します。
  6. git フックが期待どおりに機能するようにコードを記述します。フックは任意の言語にすることができます。上部の「シバン」が言語タイプを正しく反映していることを確認してください。
    たとえば、スクリプトが Ruby の場合、シバンはおそらく#!/usr/bin/env ruby.

元の回答 (2013 年 1 月)

これ (カスタム フックを許可) は、GitLab が更新後のフックを使用していた時点で、プル リクエスト 555コミット 2245a6bbeで解決されました。

hooks/post-receive.secondary.dgitolite と GitLab が管理する git ベア リポジトリでa を宣言する必要があります。
更新後のすべてのフックをそこに入れます。

そのモデルに従って、 gitolite によって投稿された更新後のフックを変更できます。検出された場合、すべての更新後のフックが呼び出されます。


問題は次のとおりです。

Gitolite V2 では、Gitolite 自体が呼び出すpost-update.secondary hooks を宣言できるため、GitLab は最終的にその管理を Gitolite に委任しました。

Gitolite V3 では、 (gitolite-admin リポジトリの update フック以外に) 予約済みのフックがなくなったため、gitolite の「セカンダリ」メカニズムはありません。
しかし、GitLab (現在 post-receive フックを使用している) は、(gitolite がもうセカンダリ フックを許可しないという) 新しい現実を考慮して、フック管理をまだ更新していません。

于 2013-01-14T11:33:00.943 に答える
3

この特定の問題に対する別の可能な解決策は次のとおりです。

#!/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/

于 2013-02-11T13:00:39.037 に答える