Jenkins job builder:有条件地包含 builder 和 publisher

Jenkins job builder: conditionally include builder and publisher

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

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

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

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

好吧,这是解决方法:

使用与原始名称不同的名称定义一个新模块(在本例中为生成器)。如果 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}"

我有一个不需要扩展作业生成器的解决方法来解决你的问题。 但它需要 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|[]}"