首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在jenkins pipeline中获得自上次成功构建以来的更改?

如何在jenkins pipeline中获得自上次成功构建以来的更改?
EN

Stack Overflow用户
提问于 2016-06-29 03:32:43
回答 6查看 25.1K关注 0票数 16

谁有一个Jenkins Pipeline脚本,可以将自上次成功构建以来的所有更改填充到一个变量中?我正在使用git和一个多分支管道作业。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2016-07-05 23:10:22

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

代码语言:javascript
复制
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;
  }
票数 17
EN

Stack Overflow用户

发布于 2017-08-04 21:03:54

根据CaptRespect的回答,我想出了以下脚本用于声明性管道:

代码语言:javascript
复制
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部件中,只有在某些文件发生更改时才运行阶段,这一点非常有用。不过,我还没有讲到这一部分,我很乐意从这个库中创建一个共享库,并向它传递一些要检查的全局模式。

编辑:Check the docs btw,如果你想更深入一点的话。您应该能够仅将所有object.getSomeProperty()调用转换为entry.someProperty

票数 12
EN

Stack Overflow用户

发布于 2020-05-06 09:55:19

这是我使用的:

代码语言:javascript
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38084806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档