2014-09-04 132 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