Jenkins multibranch管道仅适用于子文件夹

时间:2018-02-12 16:24:00

标签: jenkins jenkins-pipeline jenkins-blueocean monorepo

我有不同应用程序的git monorepo。目前我在根文件夹中有单个Jenkinsfile,其中包含app alls的管道。当提交仅更改一个应用程序时,为所有应用程序执行完整管道非常耗时。

我们使用类似GitFlow的方法进行分支,因此Jenkins的Multibranch Pipeline工作非常适合我们的项目。

我正在寻找一种在Jenkins中拥有多个工作的方法,只有在相应应用程序的代码发生变化时才会触发每个工作。

我的完美解决方案如下所示:

我在Jenkins有几个Multibranch Pipeline作业。每个人只查找给定目录和子目录的更改。每个人都使用自己的Jenkins文件。乔布斯每隔X分钟拉一次git,如果现有分支中的相应目录有变化 - 启动构建;如果有新的分支对相应目录的更改 - 启动构建。

是什么阻止了我实施

  1. 我想方设法定义在Multibranch管道扫描执行期间必须忽略哪些文件夹的提交。 Multibranch管道的“附加行为”没有“轮询忽略对某些路径的提交”选项,而管道或Freestyle作业具有。但我想使用Multibranch管道。

  2. 描述的解决方案here对我不起作用,因为如果有新的分支只对“project1”进行更改,那么无论何时触发“project2”的Multibranch管道,它都会发现这个新的分支,建立它。无论是否对适当的代码进行了更改,我的Multibranch管道中的每个新分支的方法将至少执行一次。

  3. 感谢任何帮助或建议如何实现少数Multibranch管道在同一个git存储库上观看,但只在适当的代码片段发生变化时触发

4 个答案:

答案 0 :(得分:4)

这可以通过使用Multibranch build strategy extension plugin来完成。使用此插件,您可以定义一个规则,其中仅当更改属于子目录时,构建才启动。

  1. 安装插件
  2. 在多分支管道配置上,添加构建策略
  3. 选择构建包含区域策略
  4. 在字段上放置一个子文件夹,例如subfolder/**

Sample image of the configuration here

这样,仍然可以发现更改,但是如果构建不属于某个文件或文件夹集,它们将不会启动构建。

这是到目前为止我所知道的最好的方法。但我认为最好的方法是,即使更改没有被发现也是如此。

答案 1 :(得分:1)

我通过创建一个项目来解决此问题,该项目根据更改的文件构建其他项目。例如,从您的回购根目录:

/ Jenkinsfile

HashMap

然后,您将拥有其他带有自己的Jenkinsfile的Pipeline项目(即project-a / Jenkinsfile)。

答案 2 :(得分:0)

虽然这不能完全回答你的问题,但我建议你放弃单声道回购方法并使用多个单一回购。 Jenkins管道不是为单声道回购而构建的,根据Jenkins roadmap,这不会改变。

使用mono repo方法,除了已经提到的问题之外,还有一些问题需要解决。您如何保持构建的概述?当构建失败时,哪个应用程序现在实际上已被破坏?

只要您没有支持多重回购的CI / CD服务器,一等公民(Jenkins,Bamboo和TeamCity都不支持),我会继续使用单一回购。

如果您仍想将它们放在一个地方,请查看git子模块。但是,它们有其自身的缺点并增加了复杂性。

答案 3 :(得分:0)

我知道这篇文章已经很老了,但是我通过更改SVN信息库的“包括分支”参数解决了这个问题(也可以使用git repos的属性“按名称过滤(带通配符)”来完成) )。我不仅提供了实际的分支名称,还包括了子文件夹。因此,我使用了“ trunk / subfolder”,而不是仅提供“ trunk”。这将扫描限制为仅对该特定目录进行。请注意,我尚未完全测试此解决方案。