Benutzerdefinierte Post-Receive-Datei mit GitLab

Ich versuche, meinen von GitLab automatisch generierten Post-Receive-Hook durch eine neue Datei zu ersetzen, die die Mail-Unterstützung aktiviert und daher "Post Receive" auslösen muss.

Dies ist die vorherige Version meiner Datei:

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

Wenn ich diese Datei durch eine neue ersetze, die die oben genannten Zeilen am Ende der Datei enthält, sagt GitLab: "Projekt hat ungültige Post-Receive-Datei" im Admin-Bereich, aber E-Mails werden korrekt gesendet.

Wissen Sie, wie Sie mit dem Problem der Unterstützung für mehrere Post-Receive-Vorgänge umgehen können? Im Moment weiß ich nicht, ob der gitlab-spezifische Teil der Datei überhaupt korrekt ausgeführt wird.

Danke für die Hilfe!

Aktualisieren:

Die Skripte in den Ordnern werden jetzt mit der unten angegebenen Lösung aufgerufen (Pull-Anfrage). Aber ich verstehe nicht, warum das Standard-"Post-Receive-Email" -Skript keine Mails sendet, wenn es im Verzeichnis enthalten ist. Es funktioniert einwandfrei, wenn es direkt nach dem Empfang aufgerufen wird.

Ich weiß nicht, warum ich die Reihenfolge ändern muss, aber das Folgende funktioniert für mich (auch wenn ich nicht weiß, ob Resque-Jobs jetzt ordnungsgemäß erstellt wurden):

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

Antworten auf die Frage(3)

Ihre Antwort auf die Frage