自从上次成功构建以来,Jenkins在使用全局共享库时获得了更改

时间:2018-06-23 08:07:03

标签: jenkins continuous-integration jenkins-pipeline

在我的脚本化管道中,我希望自上次成功构建以来获得更改,并且要基于已更改的文件来启用或禁用管道的某些部分。我正在使用全局共享库,其中包含一些其他步骤和整个管道的定义。要打印自上次成功构建以来的更改,我正在使用以下代码:

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不包含有关主克隆存储库中已更改文件的信息。

1 个答案:

答案 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
  }
}