'With Jenkins Job Builder (JJB) is it possible to provide generic parameter defaults for re-used parameters?
I have a JJB project where I want to re-use parameter definitions by referencing them (see doc).
In general this works:
- defaults:
name: "some-defaults"
param_1:
string:
name: PARAM1
default: "some default value"
- job-template:
name: "first-job"
defaults: "some-defaults"
parameters:
- '{obj:param_1}'
this way I can re-use any object, which comes in handy when having to manage redundant lists of parameters.
But here comes the problem: as soon as I use parameters in those referenced objects (not to confuse with the parameters keyword), e.g. default: {some-dynamic-default-value}, those don't get resolved.
Here is a complete example:
- defaults:
name: "some-defaults"
param_1:
string:
name: PARAM1
description: Some Job Parameter
default: '{param1-default}'
param_2:
string:
name: PARAM2
description: Another Job Parameter
default: '{param2-default}'
- job-template:
name: "first-job"
defaults: "some-defaults"
param1-default: "SOME PARAM1 DEFAULT"
param2-default: "SOME PARAM2 DEFAULT"
parameters:
- '{obj:param_1}'
- '{obj:param_2}'
- job-template:
name: "second-job"
defaults: "some-defaults"
param1-default: "OTHER PARAM1 DEFAULT"
param2-default: "OTHER PARAM2 DEFAULT"
parameters:
- '{obj:param_1}'
- '{obj:param_2}'
- project:
name: "some-project"
jobs:
- "first-job"
- "second-job"
This file can be translated to Jenkins configs by running
jenkins-jobs test test.yml
But in the resulting XML you can see that the parameter reference (here '{param1-default}') does not get resolved:
...
<hudson.model.ParametersDefinitionProperty>
<parameterDefinitions>
<hudson.model.StringParameterDefinition>
<name>PARAM1</name>
<description>Some Job Parameter</description>
<defaultValue>{param1-default}</defaultValue>
<trim>false</trim>
</hudson.model.StringParameterDefinition>
</parameterDefinitions>
</hudson.model.ParametersDefinitionProperty>
...
Strangely if you do not define any value for param1-default JJB complains about param1-default being missing:
jenkins_jobs.errors.JenkinsJobsException: param1-default parameter missing to format {param1-default}
Given:
{'': '',
'defaults': 'some-defaults',
'name': 'some-project',
'param_1': OrderedDict([('string',
OrderedDict([('name', 'PARAM1'),
('description', 'Some Job Parameter'),
('default', '{param1-default}')]))]),
'param_2': OrderedDict([('string',
OrderedDict([('name', 'PARAM2'),
('description', 'Another Job Parameter'),
('default', '{param2-default}')]))]),
What am I doing wrong here? Is there a way to re-use objects like parameter definitions with variables in their contents and having them expanded?
Update: Since I missed the more general way to define reusable parameters (see my answer) I've updated the title accordingly.
Solution 1:[1]
Actually there is a way to provide parameters referenced via {obj:name} (see snippet) but instead one should use the more flexible way to define reusable parameters by using a parameter element. The following snippet demonstrates both ways:
- defaults:
name: "global"
some_shared_parameter:
# * can only be used in job templates
# * must use _ instead of -
# * default cannot be provided via template
string:
name: PARAMETER1
description: |
A single parameter which can be referenced via "obj:some-shared-parameter"
default: "{param1-default}"
- parameter:
# * default must be forwarded
# * can contain a _list_ of parameters
name: "another-shared-parameter"
parameters:
- string:
name: PARAMETER2
description: |
One or more parameters which can be referenced via "another-shared-parameter"
default: "{param2-default}"
- job-template:
name: "Testing/jjb-experiments/parameter-test"
id: "some-template"
project-type: pipeline
dsl: |
node("master") {{
println(params);
}}
param1-default: "template default for first parameter" # no effect
param2-default: "template default for second parameter"
parameters:
- "{obj:some_shared_parameter}"
- "another-shared-parameter":
param2-default: "{param2-default}"
- project:
name: "some-project"
param1-default: "project default for first parameter"
param2-default: "project default for second parameter"
jobs:
- "some-template":
param1-default: "job default for first parameter"
param2-default: "job default for second parameter"
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Dharman |
