我使用gitolite和post-receive hook来部署网站。
目前脚本非常简单,但我们想添加更复杂的东西,比如测试,部署,编译步骤等。
为了做到这一点,我想将post-receive挂钩拆分成多个单独的文件。即post-receive.deploy,post-receive.compile,post-receive.test等。一个中央post-receive挂钩按顺序调用它们。这样我们就可以更轻松地管理这些步骤。
问题是;如何从中央接收后挂钩调用单独的(子)挂钩?我甚至无法执行它们,据我所知,我需要将STDIN传递给子钩子。就shell脚本而言,我几乎是一个n00b。
答案 0 :(得分:2)
您可以将post-receive
挂钩作为包装脚本,如下所示:
#!/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读取输入并将其保存在变量中,以便它可以重放每个声明的钩子的输入。