当前位置: 首页 > 面试题库 >

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

酆俊远
2023-03-14
问题内容

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

目前,我们使用以下

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

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


问题答案:

我找到了一种似乎对我们有用的解决方案。它围绕着获取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逐步进行。



 类似资料:
  • 我正在尝试弄清楚如何确定是什么导致构建从脚本化Jenkinsfile中运行。原因是我在docker容器中有一个脚本,我想在cron作业中运行它,所以当cron作业触发时,我只希望它运行容器,但当我推送更改时,我希望它检查代码、重建容器、运行静态代码分析、运行测试等。在cron运行中不需要所有这些。 我如何能得到原因?我尝试了< code > current build . get causes()

  • 问题内容: 我有一台托管的Jenkins服务器,并试图从那里获取所有使用Jenkins REST API的作业的构建详细信息(如结果,时间戳,持续时间等),然后将其保存在我的数据库中。 现在,我正在从Java代码中调用以下API,以获取所有作业(约200个作业): 然后,我使用以下命令获取作业详细信息和每个作业的所有构建: 最后,对于每个构建(我必须仅获取最近的50个),我必须调用它来获取构建详细

  • 问题内容: 是否有任何内置变量可以访问当前正在执行的构建的文本? 我尝试使用,但没有任何运气。 问题答案: 实际上,可以使用或更好(不建议弃用)(对于最后100行),请参考:http : //javadoc.jenkins- ci.org/hudson/model/Run.html#getLog-int-

  • 我想得到两年之间的所有月份,以及两年之间的所有月份,他们的所有数据都将相加,以得到每年的销售额。 以下是我的表格截图: 截图 例如,我想获得2016年至2017年的年销售额,我需要将名称中包含2016年和2017年的所有列相加,以获得年销售额。我知道这张表不是正常的或正常的。但是这张桌子不是我的。 以下是获取两个日期之间月份的示例代码:

  • 我希望以(或)的格式,以60秒为增量生成两个日期之间的日期+时间列表。 到目前为止,我已经能够使用对象生成两个日期之间的所有日期: } 但是,我希望修改它,以便它每次使用对象以60秒的增量生成(即,它将生成1440个值,而不是每天生成一个值,因为假设开始和结束时间只有一天,每小时有60分钟,每天24小时) 谢谢

  • 我必须用下面的长字符串。如何提取介于“url=”和“,”之间的所有值,以便获得以下数组? 我尝试了以下方法,但它只给我第一次出现,但我需要它们。谢谢!