Вызов одного git hook из другого hook

Я использую Gitolite с крюком пост-получения для развертывания веб-сайта.

В настоящее время сценарий очень прост, но мы хотим добавить более сложные вещи, такие как тестирование, развертывание, этапы компиляции и т. Д.

Чтобы сделать это, я хотел бы разделить хук пост-получения на несколько отдельных файлов. то есть post-receive.deploy, post-receive.compile, post-receive.test и т. д. И один центральный хук post-receive, чтобы вызывать их последовательно. Таким образом, мы могли бы легче управлять шагами.

Вопрос есть; как мне вызвать отдельные (суб) хуки от центральной пост-получения хука? Я даже не могу заставить их исполниться, и, как я понимаю, мне нужно передать STDIN на вспомогательные хуки. Я в значительной степени n00b, что касается сценариев оболочки.

1 ответ

Решение

Вы можете иметь свой post-receive hook будет скрипт-оберткой, подобный следующему:

#!/bin/sh

log() { printf %s\\n "$*"; }
warn() { log "WARNING: $@" >&2; }

mydir=${0%/*}
add_hook() {
    case $1 in
        /*) h=$1;;
        *) h=${mydir}/$1;;
    esac
    [ -x "${h}" ] || {
        warn "ignoring hook '$1' (not executable)"
        continue
    }
    # XXX ${h} must not contain anything in ${IFS}
    hooks="${hooks} ${h}"
}
run_hooks() {
    # read input from Git, preserving trailing newlines if any
    input=$(cat && echo eoi)
    input=${input%eoi}

    for h in ${hooks}; do
        # no need to break the loop if a hook returns error -- the
        # exit codes are ignored
        printf %s "${input}" | "${h}" "$@"
    done
}

add_hook git_multimail.py
add_hook some-other-post-receive-hook
add_hook yet-another-post-receive-hook

run_hooks "$@"

С помощью этой обёртки вы объявляете все крючки, которые хотите запустить через add_hook функция. Когда run_hooks Когда вызывается функция, оболочка читает входные данные из Git и сохраняет их в переменной, чтобы можно было воспроизвести ввод для каждого объявленного хука.

Другие вопросы по тегам