如何在作业级别覆盖jenkins_job_builder中的环境变量?

时间:2018-05-04 14:27:53

标签: jenkins-job-builder

我试图找到一种方法来继承/覆盖通过jenkins-job-builder(jjb)定义的jenkins作业中的环境变量。

这是一个不起作用的模板:

#!/usr/bin/env jenkins-jobs test
- defaults: &sample_defaults
    name: sample_defaults

- job-template:
    name: 'sample-{product_version}'
    project-type: pipeline
    dsl: ''
    parameters:
      - string:
          name: FOO
          default: some-foo-value-defined-at-template-level
      - string:
          name: BAR
          default: me-bar

- project:
    defaults: sample_defaults
    name: sample-{product_version}
    parameters:
      - string:
          name: FOO
          value: value-defined-at-project-level
    jobs:
      - 'sample-{product_version}':
          product_version:
              - '1.0':
                   parameters:
                     - string:
                         name: FOO
                         value: value-defined-at-job-level-1
              - '2.0':
                # this job should have:
                # FOO=value-defined-at-project-level
                # BAR=me-bar

请注意,能够在作业或项目级别而不是模板上覆盖这些参数是关键。

要求 *能够添加这样的环境变量,而不必为每个变量添加一个JJB变量 *不应强迫用户在模板或作业级别定义这些内容 *那些var需要最终在运行时作为环境变量暴露给管道和自由式作业。 *语法是灵活的,但字典方法将受到高度赞赏,如:

vars:
  FOO: xxx
  BAR: yyy

1 个答案:

答案 0 :(得分:1)

首先要了解的是JJB如何优先考虑从哪里获取变量。

  1. 工作组部分定义
  2. 项目部分定义
  3. 作业模板变量定义
  4. 默认定义
  5. (这不是一个详尽的列表,但它涵盖了我使用的功能)

    从这个列表中我们可以立即看到,如果我们想让作业模板具有覆盖能力,那么使用JJB 默认配置是没用的,因为它在JJB决定拉到何处时具有最低优先级从

    另一方面,工作组的优先级最高。遗憾的是,如果您在作业组中定义一个变量,并打算在项目级别覆盖它,那么您就不幸了。出于这个原因,我避免在作业组中设置变量,除非我想对一组作业强制执行设置。

    声明变量默认值

    除此之外,JJB允许我们为作业模板中的参数定义默认值有两种方式:

    方法1)使用{var | default}

    在这个方法中,我们可以定义默认值以及变量的定义。例如:

    - job-template:
        name: '{project-name}-verify'
        parameters:
          - string:
              name: BRANCH
              default: {branch|master}
    

    但是,如果您需要在多个位置使用相同的JJB变量,此方法会分崩离析,因为您将有多个位置来定义模板的默认值。例如:

    - job-template:
        name: '{project-name}-verify'
        parameters:
          - string:
              name: BRANCH
              default: {branch|master}
    
        scm:
          - git:
             refspec: 'refs/heads/{branch|master}'
    

    正如你所看到的,我们现在有两个地方,我们宣布{branch | master}不理想。

    方法2)在作业模板本身中定义默认变量值

    使用此方法,我们仅在作业模板本身中声明变量的默认值一次。我喜欢将我的工作模板分开:

    - job-template:
        name: '{project-name}-verify'
    
        #####################
        # Variable Defaults #
        #####################
    
        branch: master
    
        #####################
        # Job Configuration #
        #####################
    
        parameters:
          - string:
              name: BRANCH
              default: {branch}
    
        scm:
          - git:
             refspec: 'refs/heads/{branch}'
    

    在这种情况下,作业模板仍有2个分支定义。但是,我们还为文件顶部的{branch}变量提供了默认值。就一次。如果作业未使用模板传入,则该值将为作业所用的值。

    覆盖作业模板变量

    当项目现在想要使用作业模板时,我喜欢根据情况使用2种方法中的一种。

    - project:
        name: foo
        jobs:
          - '{project-name}-merge'
          - '{project-name}-verify'
    
        branch: master
    

    这是大多数人使用的标准方式,它会为列表中的每个作业模板设置 branch:master 。但是,有时您可能希望仅为列表中的1个作业提供替代值。在这种情况下,更具体的声明优先。

    - project:
        name: foo
        jobs:
          - '{project-name}-merge':
              branch: production
          - '{project-name}-verify'
    
        branch: master
    

    在这种情况下,验证作业将获得值“master”,但合并作业将获得分支值“production”。