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

时间:2013-07-02 15:02:58

标签: jenkins automation continuous-integration

我确实要求开发团队设置构建系统,以便每个构建版本都有一个唯一的内部版本号。

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:16)

您可以在运行之前使用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

答案 1 :(得分:9)

我拿了dnozay's answer,但至少对于Jenkins 1.586来说,这对我来说并不是很好。以下是我遇到的问题:

  1. Jenkins构建历史记录中的内部版本号与我在作业中使用的BUILD_NUMBER变量不同。此时似乎设置BUILD_NUMBER,即使设置了Override Build Parameters,也为时已晚。
  2. 下一个内部版本号将是当前+2,而不是当前+ 1.我认为这是因为nextBuildNumber由此脚本和Jenkins增加。
  3. 所以这是基于他答案的更新版本:

    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开始。

答案 2 :(得分:0)

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

例如,您可以使用此RegEx:

At revision (\d)+

和这个替换字符串

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

您可以设置构建的说明。

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


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