繁体   English   中英

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

[英]Jenkins multibranch pipeline only for subfolder

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

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

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

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

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

是什么阻止我执行此操作

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

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

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

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

/詹金斯档案

#!/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)的 Pipeline 项目。

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

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

此处配置的示例图像

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

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

编辑:Gerrit Code Review 插件配置

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

Gerrit 代码审查配置示例

尽管这不能完全回答您的问题,但我还是建议您远离Mono Repo方法,并使用多个Single Repos。 Jenkins管道不是为单存储库构建的,并且根据Jenkins路线图 ,这不会改变。

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

只要您没有支持多仓库的一流公民的CI / CD服务器(Jenkins,Bamboo或TeamCity都不支持),我都会选择单一仓库。

如果您仍然希望将所有内容都放在一个位置,请查看git子模块。 但是,它们有其自身的缺点并增加了复杂性。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM