16

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

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

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

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

我在 Jenkins 有几个多分支管道工作。每一个都只查找给定目录和子目录的更改。每个人都使用自己的 Jenkinsfile。作业每 X 分钟拉一次 git,如果现有分支中的适当目录发生更改 - 启动构建;如果有对适当目录进行更改的新分支 - 启动构建。

是什么阻止了我的实施

  1. 我缺少一种方法来定义在多分支管道执行扫描期间必须忽略哪些文件夹的提交。Multibranch 管道的“其他行为”没有“轮询忽略对某些路径的提交”选项,而 Pipeline 或 Freestyle 作业有。但我想使用多分支管道。

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

感谢任何帮助或建议,我可以如何实现几个多分支管道来监视同一个 git 存储库,但仅在适当的代码更改时触发

4

3 回答 3

9

这可以通过使用Multibranch 构建策略扩展插件来完成。使用此插件,您可以定义仅在更改属于子目录时才启动构建的规则。

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

此处的配置示例图像

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

这是迄今为止我所知道的最好的方法。但我认为最好的方法是改变甚至没有被发现的情况。

编辑:Gerrit Code Review 插件配置

如果您使用的是 Gerrit Code Review 插件,您还可以通过使用自定义查询来防止发现新的更改:

Gerrit 代码审查配置示例

于 2020-01-27T11:43:03.530 回答
9

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

/詹金斯文件

#!/usr/bin/env groovy

pipeline {
    agent any
    options {
        timestamps()
    }
    triggers {
        bitbucketPush()
    }
    stages {
        stage('Build project A') {
            when {
                changeset "project-a/**"
            }
            steps {
                build 'project-a'
            }
        }
        stage('Build project B') {
            when {
                changeset "project-b/**"
            }
            steps {
                build 'project-b'
            }
        }
    }
}

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

于 2018-07-26T18:39:48.297 回答
0

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

于 2019-12-23T11:56:11.217 回答