9

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

构建是由詹金斯使用每个分支的作业进行的。

有一个 jenkins 插件可以为工作设置下一个版本号,但这有点没用,至少有两个原因:

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

我们如何获得内部版本号:我们使用 git/mercurial 中的分支名称和修订号进行 HTTP 调用。基于此,集中式服务器向我们提供了一个内部版本号作为响应。如果您使用相同的参数调用它两次,您将得到相同的响应(期望的行为)。

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

主要是,我需要的是某种可以运行的作业启动前脚本,它会在将内部版本号分配给作业之前运行。

4

3 回答 3

18

您可以在运行之前使用Environment Injector Plugin评估 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
于 2013-09-24T00:32:33.497 回答
10

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

  1. Jenkins 构建历史中的构建号与BUILD_NUMBER我在工作中使用的变量不同。看来此时设置 BUILD_NUMBER,即使Override Build Parameters已设置,也为时已晚。
  2. 下一个内部版本号将是 current + 2,而不是 current + 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 [:]

再一次,所有的功劳都归功于 dnzay 的原始脚本。

编辑:创建新作业时,必须先运行旧作业,然后再运行新作业,否则它们将从 1 开始。

于 2014-11-21T08:03:20.597 回答
0

查看Build Name Setter PluginDescription Setter Plugin。他们使用 RegEx 和/或变量在构建之后根据构建输出设置构建属性。

例如,您可以使用这个 RegEx:

At revision (\d)+

和这个替换字符串

Build number is ${BUILD_NUMBER}; Subversion revision \1 

您可以设置构建的描述。

如果您的替换字符串不包含某个构建特有的内容(例如,${BUILD_NUMBER}),我建议您不要更改构建名称,因为同一个存储库修订版可能有多个构建。


现在,如何在同一个存储库修订版上构建多个作业是另一回事!似乎可以通过 HTTP POST 启动参数化构建。因此,您可以有一个由 SCM 更改触发的作业,并使用 HTTP 工具(例如 wget)来安排每个参数化作业。

于 2013-07-03T04:17:08.157 回答