2014-09-04 134 views
2

我使用带接收钩子的gitolite来部署网站。从另一个钩子调用一个git钩子

目前剧本是很简单的,但我们希望增加更多的复杂的东西,比如测试,部署,编译步骤等

为了做到这一点,我想分裂的后将钩子接收到多个独立文件中。即post-receive.deploy,post-receive.compile,post-receive.test等。还有一个中央post-receive hook按顺序调用它们。这样我们可以更轻松地管理步骤。

问题是;我如何从中央post-receive钩子调用单独的(子)钩子?我甚至无法让他们执行,据我所知,我需要将STDIN传递给子钩子。就壳shell脚本而言,我几乎是n00b。

+0

*我甚至无法让他们执行[...] *您是否已将所有这些脚本都设置为可执行文件? – Jubobs 2014-09-04 17:19:07

回答

2

你可以有你post-receive挂钩是一个包装脚本如下所示:

#!/bin/sh 

log() { printf %s\\n "$*"; } 
warn() { log "WARNING: [email protected]" >&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}" "[email protected]" 
    done 
} 

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

run_hooks "[email protected]" 

有了这个包装声明,你要通过add_hook函数运行任何挂钩。当调用run_hooks函数时,包装器从Git读取输入并将其保存在变量中,以便它可以重放每个声明钩子的输入。

+0

完美的作品! – Martijn 2014-09-05 08:08:11