如何构建一个git polling build bot?

时间:2011-08-23 19:32:36

标签: git shell continuous-integration build-automation

如何使用一个小的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

4 个答案:

答案 0 :(得分:16)

您可以记录分支的提示,以便在轮询之间进行构建,并在提示更改时进行构建 - 即分支更改时。

git rev-parse <branch_name>

将检索分支中最新提交的sha1。将命令的输出与存储的输出进行比较,以及何时更改:

  1. 更新存储的sha1
  2. 执行构建
  3. 这使您可以定位特定分支,并且仅在该分支更改时进行构建。否则,如果您希望构建任何分支更改,您只需检查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