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

Fre*_*sen 8 jenkins jenkins-pipeline

参考这个问题有没有办法从使用多分支管道时获得等效信息?特别是 - 自上次成功构建以来的提交列表.

目前我们使用以下内容

def scmAction = build?.actions.find { action -> 
    action instanceof jenkins.scm.api.SCMRevisionAction
}
return scmAction?.revision?.hash
Run Code Online (Sandbox Code Playgroud)

但是,如果多次提交被推送,这只会返回触发构建的最后一次提交.我接受一个新分支的第一个构建可能是ambiguious但得到触发构建提交列表时可能会非常有用.

Fre*_*sen 11

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

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

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

def getLastSuccessfulCommit() {
  def lastSuccessfulHash = null
  def lastSuccessfulBuild = currentBuild.rawBuild.getPreviousSuccessfulBuild()
  if ( lastSuccessfulBuild ) {
    lastSuccessfulHash = commitHashForBuild(lastSuccessfulBuild)
  }
  return lastSuccessfulHash
}
Run Code Online (Sandbox Code Playgroud)

最后将这两个结合在一个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"
  }
Run Code Online (Sandbox Code Playgroud)

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

我已经把它放到一个完整的例子Jenkinsfile Gist中,以展示它如何在上下文中组合在一起.

一个可能的改进是使用Java/Groovy本机Git库而不是shelling到一个sh步骤.