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

标签 jenkins jenkins-pipeline

引用this question有没有办法从使用多分支管道时获取等效信息?具体来说 - 自上次成功构建以来的提交列表。

目前我们使用以下

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

但这只会在推送多个提交时返回触发构建的最后一次提交。我承认一个新分支的第一个构建可能是模棱两可的,但是在可能的情况下获取触发构建的提交列表将非常有用。

最佳答案

我找到了一个似乎对我们有用的解决方案。它围绕着获得 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 中查询各种内容的数组。例如。您可以使用此数据获取自上次成功构建以来所有更改文件的列表。

我已经把这个变成了一个完整的example Jenkinsfile要点来展示它如何在上下文中组合在一起。

一个可能的改进是使用 Java/Groovy native Git 库,而不是炮轰到 sh步。

关于Jenkinsfile - 获取构建之间的所有更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43334453/

相关文章:

ubuntu - 如何修复 jenkins UI 中损坏的图像和图标

android - 使用 Couchbase Lite 构建 Android 项目的 Jenkins 资源丢失错误

jenkins - 声明式 Jenkins 管道;如何声明变量并在脚本或邮件通知中使用它?

Jenkins Pipeline - 工作流 CPS 插件 JAR 依赖项

jenkins - 可视化 Jenkins 管道中的构建步骤

java - Jenkinsfile 写入 JSON 文件

java - 从另一个 Jenkins 构建中查找 Artifactory URL

Jenkins Pipeline,即使在运行失败时也获取 runWrapper 引用

jenkins - 有没有办法为 Jenkins 管道添加预构建步骤?

jenkins - Jenkins 中的 WorkflowScript.with