如何构建一个git polling build bot?

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.将命令的输出与存储的输出进行比较,以及何时更改:

  1. 更新存储的sha1
  2. 执行构建

这使您可以定位特定分支,并仅在分支更改时进行构建.否则,如果要在任何分支更改时进行构建,只需检查输出是否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)


Ale*_*sky 3

如果未获取任何内容,则“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)

  • 对于单分支遥控器的特殊情况,该解决方案是最简洁的。但是,如果远程上的另一个分支发生更改,这将不会执行您想要的操作。Fetch 将输出任何可用的新分支,而不跟踪特定分支。 (3认同)