如何根据SVN仓库中更新的特定文件触发Jenkins作业的构建?

时间:2017-06-30 16:58:31

标签: svn jenkins continuous-integration

我对Jenkins和CI一般都很陌生。

我们当前的SVN设置包括一个包含各种项目的大型存储库,这些项目在子目录中组织,我们希望每当每个项目的特定文件是自动开始构建(并在将来测试)致力于SVN回购。

我目前在詹金斯的工作设置/工作流程是这样的。

  • 每分钟轮询SVN并更新本地源副本的一个主要工作
  • N个作业(每个项目一个)使用FSTrigger插件每分钟轮询本地源副本,观察特定文件的变化(每个项目明显不同),如果发现它已更改,则触发构建具体项目

这一切都正常,但从提交SVN到Jenkins更新本地副本的时刻有一分钟的延迟,另一分钟让FSTrigger插件扫描“触发器文件”中的更改

我刚刚在SVN中实现了一个post-commit钩子来解决第一个延迟,所以现在不再对SVN repo进行轮询。

现在我真的想摆脱每分钟FSTrigger插件轮询引起的第二次延迟(轮询是,顺便说一下,这是一种糟糕的技术)。

根据刚刚更新的文件,有没有办法让第一个作业“调用/触发”其他文件,因为我的触发条件是一个特定的文件被提交(更新)到我的每个项目的SVN仓库?

1 个答案:

答案 0 :(得分:2)

你想要与FSTrigger插件分手。正如你所说,民意调查很糟糕。

您希望在提交后挂钩中使用一些逻辑来查看该提交中更改的路径,并触发启动相应构建的请求。

我不再使用jenkins或svn,所以我无法进行真正的测试。类似的东西:

svnlook changed -t "$TXN" "$REPOS可以让你改变路径。

然后向jenkins发出请求,根据您在svnlook输出中找到的路径来构建作业:

curl --user $JENKINS_USER:$JENKINS_API_TOKEN http://jenkins/job/build-name/build

OP注意:这是我在post-commit hook中实现它的方式:

REPOS="$1"
REV="$2"
svnlook changed --revision $REV $REPOS |
  #logic to filter the trigger file and to create the job name from it |
  while read -r JOBNAME ; do
    /usr/bin/wget \
      --output-document "-" \
      --timeout=30 \
      --tries=1 \
      http://JENKINS_SERVER/job/$JOBNAME/build
done

效果很好!