在我的脚本化管道中,我希望自上次成功构建以来获得更改,并且要基于已更改的文件来启用或禁用管道的某些部分。我正在使用全局共享库,其中包含一些其他步骤和整个管道的定义。要打印自上次成功构建以来的更改,我正在使用以下代码:
def showChanges(def build) {
if ((build != null) && (build.result != 'SUCCESS')) {
def changeLogSets = build.rawBuild.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]
echo "${entry.commitId} by ${entry.author} on ${new Date(entry.timestamp)}: ${entry.msg}"
def files = new ArrayList(entry.affectedFiles)
for (int k = 0; k < files.size(); k++) {
def file = files[k]
echo " ${file.editType.name} ${file.path}"
}
}
}
showChanges(build.getPreviousBuild())
}
}
但是,当我在全局库中进行一些更改时,它仅打印此更改,而不打印主存储库中发生的更改。 changeSet不包含有关主克隆存储库中已更改文件的信息。
答案 0 :(得分:0)
这是因为Jenkins将管道中引用的所有存储库和共享库中的所有更改都加载到rawBuild.changeSets
中。除了手动过滤存储库之外,您无能为力。例如,如果您只希望来自my_awesome_repo
存储库的更改:
changeSets = rawBuild.changeSets.findAll { changeSet->
try {
changeSet.getBrowser().getRepoUrl() =~ /my_awesome_repo/
} catch(groovy.lang.MissingMethodException e) {
false // repository has no `browser` property
}
}