Jenkins多管道构建未检测到存储库中的更改

时间:2016-09-21 14:52:39

标签: jenkins-pipeline jenkins-2

我们在这个庄园中设置了Subversion存储库:

  • http://svn.vegicorp.net/svn/toast/api/trunk
  • http://svn.vegicorp.net/svn/toast/api/1.0
  • http://svn.vegicorp.net/svn/toast/data/trunk
  • http://svn.vegicorp.net/svn/toast/data/branches/1.2
  • http://svn.vegicorp.net/svn/toast/data/branches/1.3

我为整个 toast 项目设置了Jenkins Multi-Pipeline构建,包括所有子项目 - 每个子项目都是一个jar文件。我想要的是Jenkins每次在一个toast项目中更改任何文件时都会触发一个新的构建。那个项目应该重建。这样,如果我们在 toast 中创建一个新的子项目,或者在其中一个 toast 子项目中创建一个新的分支,Jenkins将自动为其创建一个新的构建。

这是我的Jenkins 多分支设置:

  

分支来源

     

的Subversion

     
      
  • 项目资源库基础http://svn.vegicorp.net/svn/toast
  •   
  • 凭据builder/*****
  •   
  • 包含分支*/trunk, */branches/*
  •   
  • 排除分支*/private
  •   
  • 属性策略所有分支都获得相同的属性
  •   
     

构建配置

     
      
  • 模式通过Jenkinsfile
  •   
     

构建触发器(未选择

     
      
  • 远程触发构建(例如,从脚本)对功能的帮助:触发*远程构建(例如,从脚本)
  •   
  • 定期构建功能帮助:定期构建
  •   
  • 在推广其他项目时构建
  •   
  • Maven依赖关系更新触发器功能帮助:Maven依赖关系更新触发器
  •   
  • 如果没有另行运行,则定期
  •   

请注意,构建触发器列表不包括投票SCM 。存储库中的更改不会触发任何构建。 Jenkinsfiles位于每个子项目的根目录中。如果我强制重新索引,则会构建所有已更改的子项目并找到所有新分支。我最初检查了定期并且每分钟都重新编制索引以获取更改,但这是klutzy,它似乎导致Jenkins消耗内存。

触发SCM更改的构建应该是非常基本的,但我没有看到这样的配置参数,就像我对标准作业一样。我似乎也无法进入子项目并将其设置为触发构建。

我必须要有一些非常非常简单的东西。

配置:

  • Jenkins 2.19
  • Pipeline 2.3
  • Pipeline API:2.3
  • Pipeline Groovy:2.17
  • 管道工作:2.6
  • Pipeline REST API插件:2.0
  • 管道共享Groovy库:2.3
  • 管道:Stage View插件:1.7
  • 管道:支持API 2.2
  • SCM API插件:1.2

3 个答案:

答案 0 :(得分:2)

我终于找到了答案。我在Jenkins' Jira Database中找到了一个提到这个确切问题的条目。该问题称为 SCM轮询未在Mercurial SCM的多分支管道中执行。其他用户也插话。

答案是Jenkins多分支项目不需要轮询SCM,因为对分支机构进行索引会为您做好准备:

  

分支项目(子项)不会孤立地进行轮询。相反,multibranch项目(父文件夹)将该函数作为分支索引的一部分包含在内。如果现有分支上有新头,将触发新的分支项目构建。您只需要在文件夹配置中选中定期(如果不是)。

所以,我需要设置分支的重建索引。我对这个解决方案不满意,因为它看起来很笨拙。我可以在SVN和Git中添加post-commit和post-push挂钩,以便在发生更改时触发构建,然后定期重新编制索引(比如每小时一次)。问题意味着配置这些挂钩然后使它们保持最新。每个项目都需要自己的POST操作,这意味着每次项目更改时都要更新存储库服务器。通过民意调查,我不必担心挂钩维修。

答案 1 :(得分:1)

您从未提及为您的存储库设置webhook,因此这可能是问题(或其中的一部分)。

Jenkins本身不仅可以知道何时对存储库进行了更改。需要将存储库配置为在进行更改时进行广播。 webhook定义了一个URL,存储库可以将各种信息发布到。将它指向Jenkins可以读取的URL,这允许Jenkins响应它收到的特定类型的信息。

例如,如果你使用github,你可以让詹金斯听一个网址,例如https://my-jenkins.com/github-webhook/。可以将Github配置为在打开PR或执行合并时立即发送POST。此POST不仅表示操作已执行,还包含有关操作的信息,例如SHA,分支名称,执行操作的用户等。

Jenkins和SVN都应该能够分别定义POST和监听的URL。

我的知识更专注于git。但这可能是开始使用SVN webhooks的好地方:http://help.projectlocker.com/knowledge_base/topics/how-do-i-use-subversion-webhooks

答案 2 :(得分:0)

也许您需要在基本目录中进行版本控制。尝试在此处输入测试文件http://svn.vegicorp.net/svn/toast/ test.txt 。这可能会使调查SCM选项显示出来。