jenkinsjenkins-job-builder

Jenkins job builder: conditionally include builder and publisher


I have a set of Jenkins jobs that are substantially the same. I have created a job template that creates them all. However, some have builders that others don't (i.e. the first in the chain doesn't copy artifacts from another project) and others have publishers that others don't (they don't all have JUnit tests).

I would like to conditionally include these modules depending on a variable, but I can't find a way of doing this:

Is this possible? I would like to include the comment section below in some of the jobs.

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

Solution

  • Well, here is the workaround:

    Define a new module (in this case it will be a builder) with a different name to the original. If the omit tag is present, don't do anything; otherwise, do what would have happened anyway.

    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)
    

    Register it to jjb in setup.py:

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

    Then, in your yaml, you can use the optional-copy module and the omit property:

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