jenkins - 如何将 Jenkins 构建步骤限制为仅给定的变更集?

标签 jenkins jenkins-pipeline pipeline changeset

我正在使用 Jenkins 声明性管道,并且仅当仅在指定目录中进行更改时,我才尝试执行特定的构建阶段。

所以我的目录层次结构看起来像这样:

root
 ├─ some-directory
 |   ├─ sub-directory
 |   |   └─ file-1
 |   ├─ file-1
 |   └─ file-2
 ├─ another-directory
 |   ├─ file-1
 |   └─ file-2
 ├─ file-x
 └─ file-y

这是当前的代码:
stage ("Deploy branches") {
    agent any

    when { 
        allOf {
            not { branch 'master' }
            changeset "some-directory/**"
        }
    }

    steps {
        // do stuff
    }
}

每当“某个目录”中的某些内容发生更改时以及“某个目录”之外的某些内容发生更改时,都会进行部署。如果仅更改“某个目录”的内容,我希望此步骤运行。

这是什么the Jenkins docs说一下“变更集”指令:

changeset

Execute the stage if the build’s SCM changeset contains one or more files matching the given string or glob. Example: when { changeset "**/*.js" }

By default the path matching will be case insensitive, this can be turned off with the caseSensitive parameter, for example: when { changeset glob: "ReadMe.*", caseSensitive: true }



“如果变更集包含一个或多个与给定字符串或全局匹配的文件。”意味着管道按设计工作,但我想要的是

“如果变更集中的文件只匹配给定的字符串或 glob。”

不幸的是,我在文档或互联网上的其他地方找不到任何关于此的信息。

你对我如何使这成为可能有什么建议吗?

最佳答案

我相信changeset不能做你想要达到的目标;但它可以替换为 expression计算 Git 差异并进行相关过滤。我有一个类似的问题,它对我来说很好。
以下应该适用于您的用例:

stage ("Deploy branches") {
    agent any

    when { 
        allOf {
            not { branch 'master' }
            changeset "some-directory/**"
            expression {  // there are changes in some-directory/...
                sh(returnStatus: true, script: 'git diff  origin/master --name-only | grep --quiet "^some-directory/.*"') == 0
            }
            expression {   // ...and nowhere else.
                sh(returnStatus: true, script: 'git diff origin/master --name-only | grep --quiet --invert-match "^some-directory/.*"') == 1
            }
        }
    }

    steps {
        // do stuff
    }
}
(这对与 origin/master 的比较进行了硬编码,这是我的用例;如果这不够复杂,可能可以使用一些包含拉取请求目标分支的 Jenkins 变量。)

关于jenkins - 如何将 Jenkins 构建步骤限制为仅给定的变更集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57876927/

相关文章:

Azure Devops - 如何防止多个管道同时运行?

jenkins - 如何在 Jenkins 的构建页面上直接显示信息?

jenkins - Jenkins 管道sh似乎不尊重shell命令中的管道

python - 如何在Python中结合文本特征和分类特征?

jenkins-pipeline - Jenkins 声明式管道作业 - 如何在从属设备之间分配并行步骤?

Jenkins 管道 boolean 参数评估

linux - 在 nc 连接和括号中的命令中使用来自管道命令的标准输出

jenkins - Jenkins:控制台输出字符

Jenkins - 将构建发布到文件夹

GitHub 组织 repo + Jenkins(GitHub 插件)集成