詹金斯(Jenkins)的职业建设者:有条件地包括建设者和出版商

时间:2018-07-19 09:58:00

标签: jenkins jenkins-job-builder

我有一组詹金斯的工作基本相同。我已经创建了一个创建所有模板的作业模板。但是,有些开发人员没有其他开发人员(即,链中的第一个不会复制其他项目的构件),而有些则拥有其他开发人员没有的发布者(他们都没有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

2 个答案:

答案 0 :(得分:0)

好吧,这是解决方法:

定义一个与原始模块名称不同的新模块(在这种情况下,它将是一个生成器)。如果存在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}"

答案 1 :(得分:0)

对于您的问题,我有一种解决方法,它不需要扩展工作构建器。 但这需要在詹金斯上使用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|[]}"