Jenkins 多分支管道仅用于子文件夹

mrz*_*iak 15 jenkins jenkins-pipeline monorepo jenkins-blueocean

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

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

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

对我来说完美的解决方案是这样的:

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

是什么阻止我执行此操作

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

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

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

gzz*_*zzo 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'
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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


fel*_*crs 7

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

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

此处配置的示例图像

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

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

编辑:Gerrit Code Review 插件配置

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

Gerrit 代码审查配置示例