为 Jenkins 工作流(管道)构建设置构建号

Set build number for Jenkins workflow (pipeline) builds

我正在将 jenkins-workflow 作业迁移到新的基于模板的工作流作业。因为内部版本号用作工作流生成的构建工件版本的一部分,所以我必须使用比旧工作流大的数字开始新工作流的内部版本号。不幸的是 'Next Build Number' 插件不适用于工作流管道。

有人知道这样做的好方法吗?

在 Jenkins 脚本控制台中尝试 运行 下面的脚本。将 "workFlow" 更改为您的作业名称

def job = Jenkins.instance.getItem("workFlow")
job.nextBuildNumber = 10
job.saveNextBuildNumber()

我还找到了另一种方法 'jenkins-cli'。它适用于无法访问脚本控制台的锁定安装 (Cloudbees Enterprise Jenkins)

java -jar jenkins-cli.jar   -s https://instanceURL/ \
          set-next-build-number workflow-name  33

或者,您可以将这样的片段添加到您的 Pipeline/Workflow 作业 DSL 脚本(又名 Jenkinsfile):

offset = 5
currentBuild.displayName = "#" + (currentBuild.number + offset)

不幸的是,上面列出的方法在使用文件夹时对我不起作用。我在 Jenkins 脚本控制台中使用了以下内容:

job = Jenkins.getInstance().getItemByFullName("BSKAzureConversion-Jobs/master", Job.class)
job.nextBuildNumber = 92
job.save()

一些注意事项:

  • Jenkins 作业和文件夹不可序列化。需要使用@NonCPS
  • 禁用 Groovy 沙盒,因为像 Jenkins.instance 这样的全局变量无法访问
  • Jenkins.instance.getItem() 不适用于文件夹。使用 Jenkins.instance.getItemByFullNameenv.JOB_NAME
  • 设置job.nextBuildNumber将在后续构建生效,所以继续开始下一个
  • 确保您 return 离开您的管道,这样初始构建就不会继续使用错误的构建号

代码:

@NonCPS
def updateBuildNumber(build_number) {
  def job = Jenkins.instance.getItemByFullName(env.JOB_NAME, Job.class)
  job.nextBuildNumber = build_number
  job.saveNextBuildNumber()
  build env.JOB_NAME
  return true
}

我使用了@Jayan 的答案并对其进行了修改以支持从该工作流中获取一个分支,因为 getItem("workflow/job/mybranch") 没有工作

def job = Jenkins.instance.getItem("workFlow").getItemByBranchName("mybranch")
job.nextBuildNumber = 10
job.saveNextBuildNumber()