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.