自上次成功构建jenkins管道以来如何获得更改?

Cap*_*ect 13 jenkins jenkins-pipeline

任何人都有一个Jenkins管道脚本可以填充自上次成功构建变量以来的所有更改?我正在使用git和multibranch管道作业.

Cap*_*ect 17

好吧,我设法凑齐了一些东西.我很确定你可以更好地迭代阵列,但这就是我现在所拥有的:

node('Android') {
  passedBuilds = []

  lastSuccessfulBuild(passedBuilds, currentBuild);

  def changeLog = getChangeLog(passedBuilds)
  echo "changeLog ${changeLog}"
}

def lastSuccessfulBuild(passedBuilds, build) {
  if ((build != null) && (build.result != 'SUCCESS')) {
      passedBuilds.add(build)
      lastSuccessfulBuild(passedBuilds, build.getPreviousBuild())
   }
}

@NonCPS
def getChangeLog(passedBuilds) {
    def log = ""
    for (int x = 0; x < passedBuilds.size(); x++) {
        def currentBuild = passedBuilds[x];
        def changeLogSets = currentBuild.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]
                log += "* ${entry.msg} by ${entry.author} \n"
            }
        }
    }
    return log;
  }
Run Code Online (Sandbox Code Playgroud)


and*_*ens 11

基于CaptRespect的答案,我提出了以下脚本用于声明性管道:

def changes = "Changes:\n"
build = currentBuild
while(build != null && build.result != 'SUCCESS') {
    changes += "In ${build.id}:\n"
    for (changeLog in build.changeSets) {
        for(entry in changeLog.items) {
            for(file in entry.affectedFiles) {
                changes += "* ${file.path}\n"
            }
        }
    }
    build = build.previousBuild
}
echo changes
Run Code Online (Sandbox Code Playgroud)

这在stage->when->expression部分仅在某些文件被更改时运行阶段时非常有用.虽然我还没有达到那个部分,但我很乐意从中创建一个共享库,并且可以通过它传递一些通配模式来检查.

编辑:检查文档 btw,以防你想深入研究一下.您应该能够将所有object.getSomeProperty()呼叫转换为just entry.someProperty.