我正在使用 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/