如何说服詹金斯分享几个工作的内部版本号?

sor*_*rin 9 continuous-integration automation jenkins

我确实有开发团队的要求来设置构建系统,因此每个构建都将具有所有分支的唯一构建号.

构建是由jenkins使用每个分支的作业完成的.

有一个jenkins插件可以为作业设置下一个buildnumber但是这有点无用,至少有两个原因:

  • 它将设置单个作业的内部版本号,而您无法知道如何为所有分支设置它,因为它们可以随时删除或添加
  • 它没有为当前版本设置它

如何获取构建号:我们使用git/mercurial中的分支名称和修订号进行HTTP调用.基于此,集中式服务器正在为我们提供构建号作为响应.如果使用相同的参数调用它两次,您将得到相同的响应(所需的行为).

现在,我们如何调整jenkins以使用与我们相同的构建数字?显然我可以使用从脚本返回的内部版本号,但是作业编号会有所不同,我怀疑jenkins会知道我在脚本中触及了BUILD_NUMBER变量.

主要是,我需要的是一些我可以运行的作业前启动脚本,一个在将编号分配给作业之前运行的脚本.

dno*_*zay 17

您可以使用Environment Injector插件在运行之前评估Groovy脚本.我有几乎相同的要求,但对我来说,只有job_prefix_名称相同的作业共享相同的唯一nextBuildNumber(换句话说,job_prefix2_其名称中的其他作业共享不同nextBuildNumber).

在本Evaluated Groovy Script节中,请使用:

import jenkins.model.*

// Access to the Jenkins instance
jenkins_instance = jenkins.model.Jenkins.instance

// Select jobs that match.
job_name = "^job_prefix_.*"
allItems = jenkins_instance.items
chosenJobs = allItems.findAll{ job -> job.name.matches(job_name) }

// Get the max
build_number = chosenJobs.collect{ it -> it.nextBuildNumber }.max()

// Increase next build number
currentJob.nextBuildNumber = build_number + 1

// and use it.
def map = [BUILD_NUMBER: build_number]
return map
Run Code Online (Sandbox Code Playgroud)


and*_*ndi 9

我接受了dnozay的回答,但至少对于Jenkins 1.586,这对我来说效果不佳.以下是我遇到的问题:

  1. Jenkins构建历史中的内部版本号与BUILD_NUMBER我在作业中使用的变量不同.此时似乎设置BUILD_NUMBER,即使Override Build Parameters已设置,也为时已晚.
  2. 下一个内部版本号将是当前+2,而不是当前+ 1.我认为这是因为nextBuildNumber此脚本和Jenkins都会增加.

所以这是基于他的回答的更新版本:

import jenkins.model.*

// Access to the Jenkins instance
jenkinsInstance = jenkins.model.Jenkins.instance

// Select jobs that match.
jobName = "^job_prefix.*"
allItems = jenkinsInstance.items
chosenJobs = allItems.findAll{ job -> job.name.matches(jobName) }

// Get the max
buildNumber = chosenJobs.collect{ job -> job.nextBuildNumber }.max()

// Increase next build number for all matching jobs
chosenJobs.each{ job -> job.updateNextBuildNumber(buildNumber) }

return [:]
Run Code Online (Sandbox Code Playgroud)

同样,所有功劳都归于dnzay的原始剧本.

编辑:创建新作业时,必须在运行新作业之前运行旧作业,否则它们将从1开始.