在 Jenkins Delarative Pipeline 中,如何评估特定目录是否被更改



Jenkins Declarative Pipeline 的条件是围绕分支构建的。 我想评估是否在任何分支中更改了特定文件夹,然后运行这些阶段。

像这样:

stage {
when {
folderX changed
}
}

为了让您更好地了解我为什么需要此功能,让我详细说明一下。 我正在从事的项目存在于几个模块(假设微服务(中。尽管每个模块都可以有自己的分支甚至存储库,但我们选择将它们放在自己的文件夹中,因此我们始终可以在主目录中保持所有内容干净。 我们的 Jenkins pipleine 为每个模块都有一个舞台。但是,如果该文件夹中没有任何更改,我们不希望重建每个模块。

我终于通过我在这里找到的脚本块解决了这个问题:

when{ expression {
def changeLogSets = currentBuild.changeSets
for (int i = 0; i < changeLogSets.size(); i++) {
def entries = changeLogSets[i].items
for (int j = 0; j < entries.length; j++) {
def entry = entries[j]
def files = new ArrayList(entry.affectedFiles)
for (int k = 0; k < files.size(); k++) {
def file = files[k]
if(file.path.contains("FolderOfInterest")){
return true
}
}
}
}
return false
}   
}

这里有几个问题:

  1. 您建议的功能不存在。您可以在 jenkins 问题跟踪器中提交票证。

  2. 另外,我认为您是在建议要查看跨分支的代码更改。这不是管道的标准用例。通常,你想要构建一个项目的特定分支(例如,当它发生变化时(,所以你会感到中度到强烈的痛苦,试图做你的建议。

如果您想从 Jenkisfile 中查看当前分支上发生了哪些更改,您可以使用currentBuild.changeSets(文档(。如果您想像您似乎建议的那样使用声明性管道,您可以在script块中将其与if语句等结合使用。

坚持下去,你就会弄清楚的。祝你好运!

最新更新