0

我正在尝试找到一种方法来继承/覆盖通过 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
4

1 回答 1

1

首先要了解的是 JJB 如何优先考虑它将从何处提取变量。

  1. 作业组部分定义
  2. 项目部分定义
  3. 作业模板变量定义
  4. 默认定义

(这不是一个详尽的列表,但它涵盖了我使用的功能)

从这个列表中我们可以立即看到,如果我们想让作业模板具有可覆盖性,那么使用 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 个位置。

方法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} 变量提供了默认值。就一次。如果项目没有使用模板传入,这将是作业的值。

覆盖作业模板变量

当一个项目现在想要使用工作模板时,我喜欢根据情况使用两种方法之一。

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

    branch: master

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

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

    branch: master

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

于 2018-05-04T15:02:40.693 回答