如何使用一个小的cron,bash +基于make的脚本(例如,比Hudson小得多且不那么健壮)build-bot轮询一个git repo并检测它是否应该立即构建 - 例如如果在远程git repo的周期性拉动中,它已检索到新代码?
目前,它看起来像这样:
git fetch > build_log.txt 2>&1
if [ $? -eq 0 ]
then
echo "Fetch from git done";
git merge FETCH_HEAD >> build_log.txt 2>&1 ;
if [ $? -eq 0 ]
then
echo "Merge via git done"; ...
# builds unconditionally at the moment
fi
fi
答案 0 :(得分:16)
您可以记录分支的提示,以便在轮询之间进行构建,并在提示更改时进行构建 - 即分支更改时。
git rev-parse <branch_name>
将检索分支中最新提交的sha1。将命令的输出与存储的输出进行比较,以及何时更改:
这使您可以定位特定分支,并且仅在该分支更改时进行构建。否则,如果您希望构建任何分支更改,您只需检查git fetch
的输出是否为空(当没有更新时,git fetch
不返回任何内容)。< / p>
这是您的脚本版本,仅在主版本更改时生成(如果实验分支的更改未触发主版本的新版本,则不会更改):
if [ ! -f prev_head ]; # initialize if this is the 1st poll
then
git rev-parse master > prev_head
fi
# fetch & merge, then inspect head
git fetch > build_log.txt 2>&1
if [ $? -eq 0 ]
then
echo "Fetch from git done";
git merge FETCH_HEAD >> build_log.txt 2>&1 ;
git rev-parse master > latest_head
if ! diff latest_head prev_head > /dev/null ;
then
echo "Merge via git done"; ...
cat latest_head > prev_head # update stored HEAD
# there has been a change, build
fi
fi
答案 1 :(得分:4)
如果您可以控制远程仓库,则可以考虑通过hooks而不是轮询进行操作。这样,只有在需要构建新内容时才会调用脚本。
答案 2 :(得分:3)
如果没有提取任何内容,那么“get fetch”将不输出任何行,因此只需检查build_log.txt上的零文件大小:
git fetch > build_log.txt 2>&1
if [ -s build_log.txt ]
then
# build
fi
答案 3 :(得分:1)
您还可以定位特定的分支,而无需维护最新的头或使用临时文件:
if [[ $(git fetch 2>&1 | grep master) ]]; then
# build
fi