groovy 管道代码来获取Jenkins Job的构建号?

fnatzsnv  于 2023-10-15  发布在  Jenkins
关注(0)|答案(2)|浏览(159)

我知道Jenkins作业的作业号只是一个环境变量,所以如果我编写管道代码,

def jobNumber = env.BUILD_NUMBER

但是,如果我有两个作业需要job1的内部版本号,我该怎么做呢?下面是一些sample/pesudo代码。

job1:
// Set the current build's display name to the Gradle artifact version
dir(workSpace) {
  // Execute a Gradle task that gets the artifact version, e.g., 1.2.3
  currentBuild.displayName = sh(script: "./gradlew printVersion",
                                returnStdout: true).trim()
}

因此,如果你查看job1的页面,左窗格将包含它构建的各种Gradle版本,而不是典型的#BUILD_NUMBER

2.1.1
2.1.0
1.2.3
1.1.0

现在,我希望job2解析job1的构建,以获取与版本1.2.3关联的构建号。我怎么能这么做呢?谢谢.

8iwquhpp

8iwquhpp1#

虽然@chris的代码可以完成这项工作,但可以使用以下缩短的语法以更Groovy的方式实现构建:

// If version is not an exact match you can use: it.displayName.contains('gradle_version')
def buildNumber = Jenkins.instance.getItem('job_name').builds.find{it.displayName == 'gradle_version'}.number

如果您不确定版本是否存在,可以使用以下命令:

def build = Jenkins.instance.getItem('job_name').builds.find {it.displayName == 'gradle_version'}
assert build : "A build matching version gradle_version was not found"
def buildNumber = build.number

需要注意的是,find方法将返回第一个匹配条件的选项,在这种情况下,它是具有匹配Gradle版本的最新构建。
如果你需要的东西不同于最新的匹配版本,你可以使用findAll方法来获取所有匹配的构建,然后根据所需的逻辑选择相关的构建。

i86rm4rw

i86rm4rw2#

是的job1执行构建并显示Gradle工件版本。每个构建都存储一组构建构件,这些构件对于该构建是唯一的。当job2运行时,它会向用户显示job1构建的版本列表。根据用户的选择,job2部署job1构建的归档工件集。因此,当它运行时,我希望它能够读取job1的归档工件,特别是基于构建号的工件。
我在我们的Jenkins设置中找到了一个现有的工作,它做了类似的事情。我把它修改成我想做的。

import hudson.model.*
  Integer getBuildNumberFromVersion(final String version) {
    def buildJob = "fullPath/job1"
    Job job = null
    for (Job j in Hudson.instance.getAllItems(Job.class)) {
      if (j.fullName == buildJob) {
        job = j
        break
      }
    }
    if (job == null) {
      throw new Exception("Could not find $buildJob")
    }

    Integer buildNumber = -1
    for (build in job.getBuilds()) {
      if (build.displayName.contains(version)) {
        buildNumber = build.getNumber()
        break
      }
    }
    if (buildNumber == -1) {
      throw new Exception("Could not find matching build number for $version")
    }
    return buildNumber
  }

相关问题