0

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.

frans
  • 8,868
  • 11
  • 58
  • 132

1 Answers1

0

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"
Dharman
  • 30,962
  • 25
  • 85
  • 135
frans
  • 8,868
  • 11
  • 58
  • 132