我试图找到一种方法来继承/覆盖通过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
答案 0 :(得分:1)
首先要了解的是JJB如何优先考虑从哪里获取变量。
(这不是一个详尽的列表,但它涵盖了我使用的功能)
从这个列表中我们可以立即看到,如果我们想让作业模板具有覆盖能力,那么使用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”。