【问题标题】:Jenkins job builder: conditionally include builder and publisherJenkins job builder:有条件地包括builder和publisher
【发布时间】:2018-07-19 09:57:59
【问题描述】:

我有一组基本相同的 Jenkins 工作。我创建了一个工作模板来创建它们。但是,有些人拥有其他人没有的构建器(即链中的第一个不从另一个项目复制工件),而另一些人则拥有其他人没有的发布者(他们并非都具有 JUnit 测试)。

我想根据变量有条件地包含这些模块,但我找不到这样做的方法:

  • 我无法使用 jinja2 模板在列表中包含或排除一项
  • 包含空变量通常会导致构建失败
  • 我可以包含 yaml 文件,但我需要包含所有构建器部分,并且每个作业都需要一个,这意味着很多重复

这可能吗?我想在一些工作中加入下面的评论部分。

43     builders:                                                                   
44         - shell: |   
45             echo Removing working directory from previous run                  
46             rm -rf ${{WORKSPACE}}/css-build/working                             
47 #        - copyartifact:                                                        
48 #            project: "{previous-project}"                                      
49 #            whichbuild: last-successful                                        
50 #            optional: "{copy-optional}"                                        
51         - shell: |                                                              
52             {init-shell}                                                        
53             ${{WORKSPACE}}/css-build/build-util.sh {shell-args} ${{WORKSPACE}}/{location} -w ${{WORKSPACE}}/css-b    uild/working

【问题讨论】:

标签: jenkins jenkins-job-builder


【解决方案1】:

好吧,这是解决方法:

定义一个与原始名称不同的新模块(在这种情况下它将是一个构建器)。如果存在omit 标签,不要做任何事情;否则,无论如何都会发生的事情。

def optional_copy(registry, xml_parent, data):
    if data['omit'].lower() == 'true':
        return
    else:
        new_data = collections.OrderedDict()
        new_data['copyartifact'] = data
        registry.dispatch('builder', xml_parent, new_data)

setup.py注册jjb:

setup(
        name='JJB config',
        py_modules = ['optionals'],
        entry_points={
            'jenkins_jobs.builders': [
             'optional-copy=optionals:optional_copy'
             ]
        }
    )

然后,在您的 yaml 中,您可以使用 optional-copy 模块和 omit 属性:

builders:
 - shell: |
      echo Removing working directory from previous run
      rm -rf "{working-dir}"
 - optional-copy:
       omit: "{omit-copy}"
       project: "{prev}"
       whichbuild: last-successful
 - shell: |
      {init-shell}
      ${{WORKSPACE}}/css-build/build-util.sh -u {diirt-version} {shell-args} -p ${{WORKSPACE}}/{location} -w "{working-dir}"

【讨论】:

    【解决方案2】:

    对于您的问题,我有一个不需要扩展作业生成器的解决方法。 但它需要 jenkins 上的 Conditional build step plugin 的可用性。

    可选构建器示例:

    - job-template
        id: my-custom-template
        builders:
        - conditional-step:
            condition-kind: always
            steps: "{obj:optional_builders|[]}"
    

    有了这个,您可以使用optional_builders 变量(如果您愿意的话)将构建器添加到您的工作中。

    jobs:
    #With optional_builders
    - my-custom-template:
        optional_builders:
        - copyartifact:                                                        
            project: "{previous-project}"                                      
            whichbuild: last-successful                                 
    
    #Without optional_builders
    - my-custom-template:
    

    可选发布者示例:

    publishers:
    - conditional-publisher:
      - condition-kind: always
        action: "{obj:optional_publishers|[]}"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多