小编典典

Jenkinsfile-获取构建之间的所有更改

jenkins

关于这个问题,有没有办法在使用多分支管道时从中获取等效信息?具体来说-自上次成功构建以来的提交列表。

目前,我们使用以下

def scmAction = build?.actions.find { action -> 
    action instanceof jenkins.scm.api.SCMRevisionAction
}
return scmAction?.revision?.hash

但这仅在推送了多个提交时才返回触发构建的最后一个提交。我接受一个新分支的第一个构建可能是ambiguious但得到触发构建提交列表 时可能 会非常有用。


阅读 467

收藏
2020-07-25

共1个答案

小编典典

我找到了一种似乎对我们有用的解决方案。它围绕着获取currentBuild提交哈希值,然后是lastSuccessfulBuild提交哈希值。首先,我们编写了一个实用程序方法来获取给定Jenkins构建对象的提交哈希:

def commitHashForBuild(build) {
  def scmAction = build?.actions.find { action -> action instanceof jenkins.scm.api.SCMRevisionAction }
  return scmAction?.revision?.hash
}

然后使用它来获取lastSuccessfulBuild的哈希值:

def getLastSuccessfulCommit() {
  def lastSuccessfulHash = null
  def lastSuccessfulBuild = currentBuild.rawBuild.getPreviousSuccessfulBuild()
  if ( lastSuccessfulBuild ) {
    lastSuccessfulHash = commitHashForBuild(lastSuccessfulBuild)
  }
  return lastSuccessfulHash
}

最后将两者结合在一个sh函数中以获取提交列表

  def lastSuccessfulCommit = getLastSuccessfulCommit()
  def currentCommit = commitHashForBuild(currentBuild.rawBuild)
  if (lastSuccessfulCommit) {
    commits = sh(
      script: "git rev-list $currentCommit \"^$lastSuccessfulCommit\"",
      returnStdout: true
    ).split('\n')
    println "Commits are: $commits"
  }

然后,您可以根据需要使用commits数组在Git中查询各种内容。例如,您可以使用此数据获取自上次成功构建以来所有已更改文件的列表。

我已将其放入一个完整的示例Jenkinsfile
Gist中,以显示它如何在上下文中融合在一起。

可能的改进是使用Java / Groovy本机Git库,而不是sh逐步进行。

2020-07-25