grr*_*sel 6 git shell build-automation continuous-integration
如何使用一个小的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
Run Code Online (Sandbox Code Playgroud)
she*_*mer 16
您可以记录分支的提示以在轮询之间进行构建,并在提示更改时(即分支已更改时)进行构建.
git rev-parse <branch_name>
Run Code Online (Sandbox Code Playgroud)
将检索分支中最新提交的sha1.将命令的输出与存储的输出进行比较,以及何时更改:
这使您可以定位特定分支,并仅在分支更改时进行构建.否则,如果要在任何分支更改时进行构建,只需检查输出是否git fetch为空(当没有更新时,不git fetch返回任何内容).
这是您的脚本版本,仅在主版本更改时构建(如果实验分支的更改未触发主版本的新版本,则不会更改):
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
Run Code Online (Sandbox Code Playgroud)
如果未获取任何内容,则“get fetch”将不输出任何行,因此只需检查 build_log.txt 上的零文件大小:
git fetch > build_log.txt 2>&1
if [ -s build_log.txt ]
then
# build
fi
Run Code Online (Sandbox Code Playgroud)