Chaining Git hooks

Jak wielu z Was zapewne wie, w git może być tylko jeden typ Hooka. Jeśli trzeba ocenić dwa Hooki aktualizacji. Adminowi git pozostało dwa unmanagable rozwiązania:

  1. Scal Skrypty Hooka razem
  2. łańcuch ręcznie z exec

Szukam eleganckiego rozwiązania (napisanego w BASH), coś w rodzaju folderu hooks/update.d lub hooks/post-receive.d, które pozwoli na luźne łączenie hooków. Łańcuch powinien przestać jak tylko hak zawodzi.

Znalazłem akceptowalne rozwiązanie napisane w Perlu pod tym adresem URL http://blog.bluefeet.net/2011/08/chained-git-hooks

Problem: mój serwer uruchamia różne wersje Perla i dostaję niedopasowania wersji perllib. Zawiedzie.

Author: Sebastian Paaske Tørholm, 2012-01-04

3 answers

Po dalszych badaniach i testach, oto rozwiązanie robocze:

Utwórz plik {[2] } w następujący sposób

#!/bin/bash
#
# author: orefalo

hookname=`basename $0`


FILE=`mktemp`
trap 'rm -f $FILE' EXIT
cat - > $FILE

for hook in $GIT_DIR/hooks/$hookname.*
do
    if test -x "$hook"; then
#       echo $hook
        cat $FILE | $hook "$@"
        status=$?

        if test $status -ne 0; then
            echo Hook $hook failed with error code $status
            exit $status
        fi
    fi
done

Teraz połącz każdy hak, który wymaga łańcuchowania, na przykład

  • ln-s Hook-chain update
  • ln-s Hook-chain post-receive
Na koniec utwórz łańcuchy, zmieniając ich nazwę na hookname.action
 -rwxr-xr-x. 1 git  git  6710  functions
 -rwxr-xr-x. 1 git  git   280  hook-chain
 -rwxr-xr-x. 1 git  git  1524  post-mirror
 lrwxrwxrwx. 1 root root   10  post-receive -> hook-chain
 -rwxr-xr-x. 1 git  git  8763  post-receive.1email
 -rwxr-xr-x. 1 git  git  1745  post-receive.2github
 -rwxr-xr-x. 1 git  git   473  post-upload-pack
 -rwxr-xr-x. 1 git  git   346  pre-receive
 lrwxrwxrwx. 1 root root   10  update -> hook-chain
 -rwxr-xr-x. 1 git  git  2975  update.1acl
 -rwxr-xr-x. 1 git  git   328  update.2github

Na przykład w powyższym przykładzie, hak aktualizacji uruchomi aktualizację .1acl Aktualizacja.2github .

Post-receive hook z run post-receive.1email , po którym następuje post-receive.2github

 32
Author: Olivier Refalo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-05 02:07:09

Dla tych, którzy nie chcą klikać na każdy link w komentarzach poniżej inna odpowiedź, Oto praktycznie niezmodyfikowana wersja skryptu autorstwa @HenrikN:

#!/bin/bash

# Runs all executable hookname-* hooks and exits after,
# if any of them was not successful.
#
# Based on
# http://osdir.com/ml/git/2009-01/msg00308.html

data=$(cat)
exitcodes=()
hookname=$(basename $0)

# Run each hook, passing through STDIN and storing the exit code.
# We don't want to bail at the first failure, as the user might
# then bypass the hooks without knowing about additional issues.

for hook in $GIT_DIR/hooks/$hookname-*; do
  test -x "$hook" || continue
  echo "$data" | "$hook"
  exitcodes+=($?)
done

# If any exit code isn't 0, bail.

for i in "${exitcodes[@]}"; do
  [ "$i" == 0 ] || exit $i
done
 3
Author: sanmai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:53:30

Stworzyłem skrypt powłoki oparty na postach OP i Olivier Refalo (z pewnymi modyfikacjami):

Https://gist.github.com/amirbawab/e9f42ef8d441316707d9b90777e5718b

Skrypt wygeneruje plik Hooka, który wykona Skrypty wewnątrz $hook_file_name.d/$hook_file_name.*

Na przykład: dla commit-msg hook, skrypt wygeneruje commit-msg plik w .git/hooks, który wykona wszystkie skrypty w commit-msg.d/.

Pliki w commit-msg.d powinny pasować do wzorca commit-msg.*, aby umożliwić umieszczenie powłoki helpera pliki w tym folderze bez ich wykonywania.

Użycie skryptu: ./extend_git_hooks.sh [REPO_PATH]

 0
Author: CMPS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-18 04:40:10