0

我有一个 JJB 项目,我想通过引用它们来重用参数定义(参见 doc)。

一般来说,这有效:

- 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}'

通过这种方式,我可以重用任何对象,这在必须管理冗余参数列表时会派上用场。

但是问题来了:一旦我在那些引用的对象中使用参数(不要与parameters关键字混淆),例如default: {some-dynamic-default-value},那些不会得到解决。

这是一个完整的例子:

- 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"
      

该文件可以通过运行转换为 Jenkins 配置

jenkins-jobs test test.yml

但在生成的 XML 中,您可以看到参数引用(此处'{param1-default}')没有得到解析:

 ...
   <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>
 ...

奇怪的是,如果您没有为 JJB定义任何值,则会param1-default抱怨param1-default丢失:

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}')]))]),

我在这里做错了什么?有没有办法重用像参数定义这样的对象,其内容中有变量并扩展它们?

更新:由于我错过了定义可重用参数的更通用方法(请参阅我的答案),因此我相应地更新了标题。

4

1 回答 1

0

实际上,有一种方法可以提供通过引用的参数{obj:name}(参见代码段),但应该使用更灵活的方式通过使用parameter元素来定义可重用参数。以下代码段演示了这两种方式:

- 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"
于 2022-02-17T07:34:01.130 回答