【问题标题】:How to convince jenkins to share a build number for several jobs?如何说服詹金斯分享多个工作的内部版本号?
【发布时间】:2013-07-02 15:02:57
【问题描述】:

开发团队确实要求我设置构建系统,以便每个构建对于所有分支都有一个唯一的构建号。

jenkins 使用每个分支的作业进行构建。

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

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

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

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

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

【问题讨论】:

    标签: jenkins automation continuous-integration


    【解决方案1】:

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

    【讨论】:

    • 非常感谢!为我工作。就我而言,我使用的是 CloudBees 文件夹插件,这让我省去了按模式查找的麻烦。相反,我使用 getItems() 方法并使用“currentJob”删除当前作业:-)。
    【解决方案2】:

    我接受了dnozay's answer,但至少对于 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 开头。

    【讨论】:

      【解决方案3】:

      查看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)来安排每个参数化作业。

      【讨论】:

        猜你喜欢
        • 2014-01-21
        • 1970-01-01
        • 1970-01-01
        • 2017-12-15
        • 1970-01-01
        • 2018-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多