如何获得的变化,因为上次成功构建在詹金斯管道



有人有一个Jenkins Pipeline脚本,可以填充所有的变化,因为以前的成功构建在一个变量?我正在使用git和多分支管道作业。

我设法拼凑了一些东西。我很确定你可以更好地迭代数组但我现在得到的是:

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;
  }

根据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

这在stage->when->expression部件中非常有用,仅当某些文件被更改时才运行阶段。虽然我还没有到那部分,但我很想从这里创建一个共享库,并使它有可能传递一些globbing模式来检查。

编辑:顺便检查一下文档,如果你想深入研究一下。您应该能够将所有object.getSomeProperty()调用转换为entry.someProperty

为了将更改作为字符串列表返回,而不仅仅是打印它们,您可以使用这个函数(基于@andsens的答案):

def getChangesSinceLastSuccessfulBuild() {
    def changes = []
    def build = currentBuild
    while (build != null && build.result != 'SUCCESS') {
        changes += (build.changeSets.collect { changeSet ->
            (changeSet.items.collect { item ->
                (item.affectedFiles.collect { affectedFile ->
                    affectedFile.path
                }).flatten()
            }).flatten()
        }).flatten()
        build = build.previousBuild
    }
    return changes.unique()
}

我是这样用的:

def listFilesForBuild(build) {
  def files = []
  currentBuild.changeSets.each {
    it.items.each {
      it.affectedFiles.each {
        files << it.path
      }
    }
  }
  files
}
def filesSinceLastPass() {
  def files = []
  def build = currentBuild
  while(build.result != 'SUCCESS') {
    files += listFilesForBuild(build)
    build = build.getPreviousBuild()
  }
  return files.unique()
}
def files = filesSinceLastPass()

有自上次成功以来的变化插件可以帮助你。

对于使用Accurev的人来说,这里是对andsens答案的改编。andsens的答案不能使用,因为Accurev插件没有实现getAffectedFiles。扩展ChangeLogSet的AccurevTransaction的文档。入门课程可以在这里找到。

import hudson.plugins.accurev.*
def changes = "Changes: n"
build = currentBuild
// Go through the previous builds and get changes until the
// last successful build is found.
while (build != null && build.result != 'SUCCESS') {
    changes += "Build ${build.id}:n"
    for (changeLog in build.changeSets) {
        for (AccurevTransaction entry in changeLog.items) {
            changes += "n    Issue: " + entry.getIssueNum()
            changes += "n    Change Type: " + entry.getAction()
            changes += "n    Change Message: " + entry.getMsg()
            changes += "n    Author: " + entry.getAuthor()
            changes += "n    Date: " + entry.getDate()
            changes += "n    Files: "
            for (path in entry.getAffectedPaths()) {
                changes += "n        " + path;
            }
            changes += "n"
        }
    }
    build = build.previousBuild
}
echo changes
writeFile file: "changeLog.txt", text: changes

最新更新