- defaults:
    name: reproducible
    disabled: false
    project-type: freestyle
    properties:
      - sidebar: &sb1
          url: https://jenkins.debian.net/userContent/about.html
          text: About jenkins.debian.net
          icon: /userContent/images/debian-swirl-24x24.png
      - sidebar: &sb2
          url: https://jenkins.debian.net/view/reproducible
          text: reproducible builds jobs
          icon: /userContent/images/debian-jenkins-24x24.png
      - sidebar: &sb3
          url: http://www.profitbricks.co.uk
          text: Sponsored by Profitbricks
          icon: /userContent/images/profitbricks-24x24.png
    description: &desc '{my_description}<br>Job configuration source is <a href="https://anonscm.debian.org/git/qa/jenkins.debian.net.git/tree/job-cfg/reproducible.yaml">reproducible.yaml</a>.<br>Results are available at <a href="https://tests.reproducible-builds.org/">https://tests.reproducible-builds.org</a>.'
    triggers:
      - timed: '{my_timed}'
    logrotate:
      daysToKeep: 90
      numToKeep: 30
      artifactDaysToKeep: -1
      artifactNumToKeep: -1
    builders:
      - shell: '{my_shell}'
    publishers:
      - logparser: &logparse
          parse-rules: '/srv/jenkins/logparse/reproducible.rules'
          unstable-on-warning: 'true'
          fail-on-error: 'true'
      - email:
          recipients: '{my_recipients}'
    node: '{my_node}'

- defaults:
    name: reproducible_git
    disabled: false
    project-type: freestyle
    properties:
      - sidebar: *sb1
      - sidebar: *sb2
      - sidebar: *sb3
    description: *desc
    triggers:
      - timed: '{my_timed}'
      - pollscm:
          cron: '{my_scmpoll}'
    logrotate:
      daysToKeep: 90
      numToKeep: 20
      artifactDaysToKeep: -1
      artifactNumToKeep: -1
    builders:
      - shell: '{my_shell}'
    publishers:
      - logparser: *logparse
      - email:
          recipients: '{my_recipients}'
    scm:
      - git:
          url: '{my_gitrepo}'
          branches:
            - master
    node: '{my_node}'

- defaults:
    name: reproducible_builder
    disabled: false
    project-type: freestyle
    description: *desc
    properties:
      - sidebar: *sb1
      - sidebar: *sb2
      - sidebar: *sb3
      - priority-sorter:
          priority: '150'
      - throttle:
          max-total: 58
          max-per-node: 58
          enabled: true
          option: category
          categories:
            - reproducible
    triggers:
      - timed: '{my_timed}'
    wrappers:
      - timeout:
          timeout: 2640 # (24+18+2)*60
    logrotate:
      daysToKeep: 3
      numToKeep: 300
      artifactDaysToKeep: -1
      artifactNumToKeep: -1
    builders:
      - shell: '{my_shell}'
    publishers:
      - email:
          recipients: '{my_recipients}'
          notify-every-unstable-build: false
    node: '{my_node}'

- defaults:
    name: reproducible_builder_trigger
    disabled: false
    project-type: freestyle
    description: *desc
    properties:
      - sidebar: *sb1
      - sidebar: *sb2
      - sidebar: *sb3
      - priority-sorter:
          priority: '150'
      - throttle:
          max-total: 58
          max-per-node: 58
          enabled: true
          option: category
          categories:
            - reproducible
    triggers:
      - timed: '{my_timed}'
    wrappers:
      - timeout:
          timeout: 1560
    logrotate:
      daysToKeep: 3
      numToKeep: 300
      artifactDaysToKeep: -1
      artifactNumToKeep: -1
    builders:
      - shell: '{my_shell}'
    publishers:
      - logparser: *logparse
      - email:
          recipients: '{my_recipients}'
          notify-every-unstable-build: false
      - trigger:
          project: '{my_trigger}'
    node: '{my_node}'

- defaults:
    name: reproducible_other_projects
    disabled: false
    project-type: freestyle
    description: *desc
    properties:
      - sidebar: *sb1
      - sidebar: *sb2
      - sidebar: *sb3
      - throttle:
          max-total: 9
          max-per-node: 9
          enabled: true
          option: category
          categories:
            - reproducible      # no special category yet
    triggers:
      - timed: '{my_timed}'
    logrotate:
      daysToKeep: 90
      numToKeep: 30
      artifactDaysToKeep: -1
      artifactNumToKeep: -1
    builders:
      - shell: '{my_shell}'
    publishers:
      - logparser:
          parse-rules: '/srv/jenkins/logparse/reproducible-extra.rules'
          unstable-on-warning: 'true'
          fail-on-error: 'true'
      - email:
          recipients: '{my_recipients}'
    node: '{my_node}'

- defaults:
    name: reproducible_other_projects_git
    disabled: false
    project-type: freestyle
    description: *desc
    properties:
      - sidebar: *sb1
      - sidebar: *sb2
      - sidebar: *sb3
      - throttle:
          max-total: 9
          max-per-node: 9
          enabled: true
          option: category
          categories:
            - reproducible      # no special category yet
    triggers:
      - timed: '{my_timed}'
      - pollscm:
          cron: '*/6 * * * *'
    logrotate:
      daysToKeep: 90
      numToKeep: 30
      artifactDaysToKeep: -1
      artifactNumToKeep: -1
    builders:
      - shell: '{my_shell}'
    publishers:
      - logparser:
          parse-rules: '{my_parse_rules}'
          unstable-on-warning: 'true'
          fail-on-error: 'true'
      - email:
          recipients: '{my_recipients}'
    scm:
      - git:
          url: '{my_gitrepo}'
          branches:
            - '{my_gitbranches}'
    node: '{my_node}'


- defaults:
    name: reproducible_other_projects_trigger
    disabled: false
    project-type: freestyle
    description: *desc
    properties:
      - sidebar: *sb1
      - sidebar: *sb2
      - sidebar: *sb3
      - throttle:
          max-total: 9
          max-per-node: 9
          enabled: true
          option: category
          categories:
            - reproducible      # no special category yet
    triggers:
      - timed: '{my_timed}'
    logrotate:
      daysToKeep: 90
      numToKeep: 30
      artifactDaysToKeep: -1
      artifactNumToKeep: -1
    builders:
      - shell: '{my_shell}'
    publishers:
      - logparser:
          parse-rules: '/srv/jenkins/logparse/reproducible-extra.rules'
          unstable-on-warning: 'true'
          fail-on-error: 'true'
      - email:
          recipients: '{my_recipients}'
      - trigger:
          project: '{my_trigger}'
    node: '{my_node}'


- job-template:
    defaults: reproducible
    name: '{name}_{my_task}'

- job-template:
    defaults: reproducible
    name: '{name}_{my_task}_{my_arch}_{my_hname}'

- job-template:
    defaults: reproducible
    name: '{name}_setup_schroot_{my_distro}_{my_arch}_{my_hname}'

- job-template:
    defaults: reproducible_builder
    name: '{name}_builder_{my_arch}_{my_num}'

- job-template:
    defaults: reproducible_git
    name: '{name}_html_{my_reponame}'

- job-template:
    defaults: reproducible_other_projects
    name: '{name}_{otherproject}'

- job-template:
    defaults: reproducible_other_projects_git
    name: '{name}_{otherproject_git}'

- job-template:
    defaults: reproducible_other_projects_trigger
    name: '{name}_{otherproject_triggering}'

- job-template:
    defaults: reproducible_builder_trigger
    name: '{name}_builder_{otherproject}_{my_num}'

- project:
    name: reproducible
    my_recipients: 'qa-jenkins-scm@lists.alioth.debian.org'
    my_node: '{my_hname}'
    my_scmpoll: '*/6 * * * *'
    my_disabled: 'false'
    jobs:
        - '{name}_{my_task}_{my_arch}_{my_hname}':
            my_task:
                - 'maintenance':
                    my_description: 'Do some maintenance: check for old directories laying around, do backups, update pbuilder and schroots, etc.'
                    my_timed: '5 0,3,6,9,12,15,18,21 * * *'
            my_shell: '/srv/jenkins/bin/reproducible_maintenance.sh'
            my_hname:
                - 'jenkins':        { my_arch: 'amd64' }
            my_node: ''

        - '{name}_{my_task}_{my_arch}_{my_hname}':
            my_task:
                - 'maintenance':
                    my_description: 'Do some maintenance: check for old directories laying around, do backups, update pbuilder and schroots, etc.'
                    my_timed: '5 0,3,6,9,12,15,18,21 * * *'
            my_hname:
                - 'bbx15':          { my_arch: 'armhf' }
                - 'bpi0':           { my_arch: 'armhf' }
                - 'cbxi4a':         { my_arch: 'armhf' }
                - 'cbxi4b':         { my_arch: 'armhf' }
                - 'cbxi4pro0':      { my_arch: 'armhf' }
                - 'cb3a':           { my_arch: 'armhf' }
                - 'ff2a':           { my_arch: 'armhf' }
                - 'ff2b':           { my_arch: 'armhf' }
                - 'ff4a':           { my_arch: 'armhf' }
                - 'hb0':            { my_arch: 'armhf' }
                - 'jtk1a':          { my_arch: 'armhf' }
                - 'wbq0':           { my_arch: 'armhf' }
                - 'odxu4':          { my_arch: 'armhf' }
                - 'odxu4b':         { my_arch: 'armhf' }
                - 'odxu4c':         { my_arch: 'armhf' }
                - 'odu3a':          { my_arch: 'armhf' }
                - 'opi2b':          { my_arch: 'armhf' }
                - 'opi2c':          { my_arch: 'armhf' }
                - 'wbd0':           { my_arch: 'armhf' }
                - 'rpi2b':          { my_arch: 'armhf' }
                - 'rpi2c':          { my_arch: 'armhf' }
                - 'profitbricks1':  { my_arch: 'amd64' }
                - 'profitbricks2':  { my_arch: 'i386' }
                - 'profitbricks3':  { my_arch: 'amd64' }
                - 'profitbricks4':  { my_arch: 'amd64' }
                - 'profitbricks5':  { my_arch: 'amd64' }
                - 'profitbricks6':  { my_arch: 'i386' }
            my_shell: '/srv/jenkins/bin/jenkins_master_wrapper.sh'

        - '{name}_{my_task}_{my_arch}_{my_hname}':
            my_task:
                - 'setup_pbuilder_testing':
                    my_description: 'Setup pbuilder for reproducible builds of packages from testing as described in https://wiki.debian.org/ReproducibleBuilds#Usage_example'
                    my_timed: '23 7 * * *'
                - 'setup_pbuilder_unstable':
                    my_description: 'Setup pbuilder for reproducible builds of packages from testing as described in https://wiki.debian.org/ReproducibleBuilds#Usage_example'
                    my_timed: '42 7 * * *'
                - 'setup_pbuilder_experimental':
                    my_description: 'Setup pbuilder for reproducible builds of packages from experimental as described in https://wiki.debian.org/ReproducibleBuilds#Usage_example'
                    my_timed: '33 7 * * *'
                - 'setup_schroot_unstable':
                    my_description: 'Setup unstable schroot for fetching source packages for the builder jobs.'
                    my_timed: '20 1 * * *'
                - 'setup_schroot_testing':
                    my_description: 'Setup testing schroot for fetching source packages for the builder jobs.'
                    my_timed: '0 1 * * *'
                - 'setup_schroot_experimental':
                    my_description: 'Setup experimental schroot for fetching source packages for the builder jobs.'
                    my_timed: '40 1 * * *'
            my_hname:
                - 'bbx15':          { my_arch: 'armhf' }
                - 'bpi0':           { my_arch: 'armhf' }
                - 'cbxi4a':         { my_arch: 'armhf' }
                - 'cbxi4b':         { my_arch: 'armhf' }
                - 'cbxi4pro0':      { my_arch: 'armhf' }
                - 'cb3a':           { my_arch: 'armhf' }
                - 'ff2a':           { my_arch: 'armhf' }
                - 'ff2b':           { my_arch: 'armhf' }
                - 'ff4a':           { my_arch: 'armhf' }
                - 'hb0':            { my_arch: 'armhf' }
                - 'jtk1a':          { my_arch: 'armhf' }
                - 'wbq0':           { my_arch: 'armhf' }
                - 'odxu4':          { my_arch: 'armhf' }
                - 'odxu4b':         { my_arch: 'armhf' }
                - 'odxu4c':         { my_arch: 'armhf' }
                - 'odu3a':          { my_arch: 'armhf' }
                - 'opi2b':          { my_arch: 'armhf' }
                - 'opi2c':          { my_arch: 'armhf' }
                - 'wbd0':           { my_arch: 'armhf' }
                - 'rpi2b':          { my_arch: 'armhf' }
                - 'rpi2c':          { my_arch: 'armhf' }
                - 'profitbricks1':  { my_arch: 'amd64' }
                - 'profitbricks2':  { my_arch: 'i386' }
                - 'profitbricks5':  { my_arch: 'amd64' }
                - 'profitbricks6':  { my_arch: 'i386' }
            my_shell: '/srv/jenkins/bin/jenkins_master_wrapper.sh'

        - '{name}_setup_schroot_{my_distro}_{my_arch}_{my_hname}':
            my_distro:
                - 'unstable_diffoscope':
                    my_description: 'Setup schroot for running diffoscope in a unstable environment (this is needed to be able to correctly investigate haskell binaries...)'
                    my_timed: '42 0 * * *'
                    my_shell: '/srv/jenkins/bin/schroot-create.sh reproducible reproducible-unstable-diffoscope unstable diffoscope locales-all'
                - 'testing_diffoscope':
                    my_description: 'Setup schroot for running diffoscope in a testing environment (this is needed to be able to correctly investigate haskell binaries...)'
                    my_timed: '23 0 * * *'
                    my_shell: '/srv/jenkins/bin/schroot-create.sh reproducible reproducible-testing-diffoscope testing diffoscope locales-all'
                - 'unstable':
                    my_timed: '42 1 * * *'
                    my_shell: '/srv/jenkins/bin/schroot-create.sh reproducible reproducible-{my_distro} {my_distro} botch'
                - 'testing':
                    my_timed: '42 1 * * *'
                - 'experimental':
                    my_timed: '33 1 * * *'
            my_description: 'Setup {my_distro} schroot for fetching source packages for the builder jobs.'
            my_shell: '/srv/jenkins/bin/schroot-create.sh reproducible reproducible-{my_distro} {my_distro}'
            my_hname:
                - 'jenkins':        { my_arch: 'amd64' }
            my_node: ''

        - '{name}_{my_task}_{my_arch}_{my_hname}':
            my_task:
                - 'setup_schroot_unstable_diffoscope':
                    my_description: 'Setup schroot for running diffoscope in a unstable environment'
                    my_timed: '42 0 * * *'
                    my_shell: '/srv/jenkins/bin/jenkins_master_wrapper.sh'
            my_hname:
                - 'profitbricks3':  { my_arch: 'amd64' }

        - '{name}_{my_task}':
            my_task:
                - 'scheduler':
                    my_description: 'Schedule packages to be tested for reproducibility.'
                    my_timed: '55 * * * *'
                    my_shellext: ".py"
                - 'html_dashboard':
                    my_description: 'Generate HTML dashboard with graphs for reproducible builds.'
                    my_timed: '*/10 * * * *'
                - 'html_pkg_sets':
                    my_description: 'Generate HTML results (package sets with graphs) for reproducible builds.'
                    my_timed: '*/15 * * * *'
                    my_shellext: ".py"
                - 'html_indexes':
                    my_description: 'Generate HTML results (indexes) for reproducible builds.'
                    my_timed: '*/15 * * * *'
                    my_shellext: ".py"
                - 'html_dd_list':
                    my_description: 'Generate HTML results (dd-list) for reproducible builds.'
                    my_timed: '55 */2 * * *'
                    my_shellext: ".py"
                - 'html_all_packages':
                    my_description: 'Generate HTML results (for all packages) for reproducible builds. This job is rather redudant and just run to give a fuzzy warm feeling all pages are good.'
                    my_timed: '37 13 * * 1'
                    my_shellext: ".py"
                - 'html_repository_comparison':
                    my_description: 'Generate HTML results (repository_comparison) for reproducible builds.'
                    my_timed: '0 1 * * *'
                - 'html_breakages':
                    my_description: 'Generate an HTML page with CI issues (packages with incoherent status or files that should or should not be there).'
                    my_timed: '30 0,12 * * *'
                    my_shellext: ".py"
                - 'html_rsync_remote_results':
                    my_description: 'rsync the results from some remote jobs to the main node.'
                    my_timed: ''
                - 'html_live_status':
                    my_description: 'Generate an HTML page showing the live status of all builds happening or scheduled by humans.'
                    my_timed: 'H/6 * * * *'
                    my_shellext: ".py"
                - 'create_meta_pkg_sets':
                    my_description: 'Create meta package sets for later consumption when generating HTML stats.'
                    my_timed: '0 6 * * H/3'
                - 'nodes_info':
                    my_description: 'Collect various information from build nodes used for reproducible builds.'
                    my_timed: '0 0 * * *'
                - 'json':
                    my_description: 'Generate https://reproducible.debian.net/userContent/reproducible.json for consumption by tracker.debian.org.'
                    my_timed: '1 * * * *'
                    my_shellext: ".py"
                - 'html_archlinux':
                    my_description: 'Build a simple webpage for Arch Linux reproducibility tests'
                    my_timed: ''
                    my_disabled: 'true'
                - 'html_fedora-23_x86_64':
                    my_description: 'Build a simple webpage for Fedora 23 reproducibility tests'
                    my_timed: ''
                    my_shell: '/srv/jenkins/bin/reproducible_html_rpms.sh fedora-23 x86_64'
                - 'diffoscope_pypi':
                    my_description: 'Test whether PyPI has the latest diffoscope.'
                    my_timed: '23 23 * * *'
                    my_shell: '/srv/jenkins/bin/diffoscope_distribution_test.sh PyPI'
                - 'diffoscope_freebsd':
                    my_description: 'Test whether FreeBSD has the latest diffoscope.'
                    my_timed: '25 23 1 * *'
                    my_shell: '/srv/jenkins/bin/diffoscope_distribution_test.sh FreeBSD'
                - 'diffoscope_netbsd':
                    my_description: 'Test whether NetBSD has the latest diffoscope.'
                    my_timed: '27 23 1 * *'
                    my_shell: '/srv/jenkins/bin/diffoscope_distribution_test.sh NetBSD'
                - 'diffoscope_macports':
                    my_description: 'Test whether MacPorts has the latest diffoscope.'
                    my_timed: '29 23 1 * *'
                    my_shell: '/srv/jenkins/bin/diffoscope_distribution_test.sh MacPorts'
            my_shellext: ".sh"
            my_shell: '/srv/jenkins/bin/reproducible_{my_task}{my_shellext}'
            my_hname: ''

        - '{name}_html_{my_reponame}':
            my_reponame:
                - 'notes':
                    my_description: 'Generate HTML results ({my_reponame}) for reproducible builds, triggered by changes to the <a href="https://anonscm.debian.org/git/reproducible/{my_reponame}.git" target="_blank">{my_reponame}.git</a> repository.'
                    my_timed: '57 0 * * *'
                    my_scmpoll: 'H/1 H/1 * * *'
                    my_shell: '/srv/jenkins/bin/reproducible_{my_reponame}.py && /srv/jenkins/bin/reproducible_html_{my_reponame}.py'
                - 'source-date-epoch-spec':
                    my_description: 'Generate the HTML of the reproducible builds SOURCE_DATE_EPOCH specification, triggered by changes to the <a href="https://anonscm.debian.org/git/reproducible/{my_reponame}.git" target="_blank">{my_reponame}.git</a> repository.'
                    my_timed: ''
                    my_shell: '/srv/jenkins/bin/reproducible_html_specs.sh {my_reponame}'
                    my_recipients: 'jenkins+debian-reproducible qa-jenkins-scm@lists.alioth.debian.org'
            my_gitrepo: 'git://git.debian.org/git/reproducible/{my_reponame}.git'
            my_hname: ''

        - '{name}_builder_{my_arch}_{my_num}':
            my_description: 'Try to reproducibly build a scheduled package. This is one of several builder jobs.'
            my_arch: 'amd64'
            my_num:
                -  '1': &bd_amd_1_5 { my_node1: 'profitbricks-build1', my_node2: 'profitbricks-build5' }
                -  '2': &bd_amd_5_1 { my_node1: 'profitbricks-build5', my_node2: 'profitbricks-build1' }
                -  '3': *bd_amd_1_5
                -  '4': *bd_amd_5_1
                -  '5': *bd_amd_1_5
                -  '6': *bd_amd_5_1
                -  '7': *bd_amd_1_5
                -  '8': *bd_amd_5_1
                -  '9': *bd_amd_1_5
                - '10': *bd_amd_5_1
                - '11': *bd_amd_1_5
                - '12': *bd_amd_5_1
                - '13': *bd_amd_1_5
                - '14': *bd_amd_5_1
                - '15': *bd_amd_1_5
                - '16': *bd_amd_5_1
            my_shell: '/srv/jenkins/bin/reproducible_build.sh {my_node1}-{my_arch} {my_node2}-{my_arch}'
            my_timed: '* * * * *'
            my_hname: ''

        - '{name}_builder_{my_arch}_{my_num}':
            my_description: 'Try to reproducibly build a scheduled package. This is one of several builder jobs.'
            my_arch: 'i386'
            my_num:
                -  '1': &bd_amd_2_6 { my_node1: 'profitbricks-build2', my_node2: 'profitbricks-build6' }
                -  '2': &bd_amd_6_2 { my_node1: 'profitbricks-build6', my_node2: 'profitbricks-build2' }
                -  '3': *bd_amd_2_6
                -  '4': *bd_amd_6_2
                -  '5': *bd_amd_2_6
                -  '6': *bd_amd_6_2
                -  '7': *bd_amd_2_6
                -  '8': *bd_amd_6_2
                -  '9': *bd_amd_2_6
                - '10': *bd_amd_6_2
                - '11': *bd_amd_2_6
                - '12': *bd_amd_6_2
                - '13': *bd_amd_2_6
                - '14': *bd_amd_6_2
                - '15': *bd_amd_2_6
                - '16': *bd_amd_6_2
            my_shell: '/srv/jenkins/bin/reproducible_build.sh {my_node1}-{my_arch} {my_node2}-{my_arch}'
            my_timed: '* * * * *'
            my_hname: ''

        # could have all archs in one block, but it seems cleaner this way
        # to choose new jobs:
        #       for i in bbx15 bpi0 cbxi4a cbxi4b cbxi4pro0 cb3a ff2a ff2b ff4a hb0 jtk1a odxu4 odxu4b odxu4c odu3a opi2b opi2c rpi2b rpi2c wbd0 wbq0 ; do echo "$i: " ; grep my_node1 job-cfg/reproducible.yaml|grep armhf|grep $i-armhf ; echo ; done
        #       8 jobs for quad-cores with 4 gb ram
        #       6 jobs for octo-cores with 2 gb ram
        #       6 jobs for quad-cores with 2 gb ram
        #       3 jobs for dual-cores with 1 gb ram
        #       3 jobs for quad-cores with 1 gb ram
        - '{name}_builder_{my_arch}_{my_num}':
            my_description: 'Try to reproducibly build a scheduled package. This is one of several builder jobs.'
            my_arch: 'armhf'
            my_num:
                -  '1': { my_node1: 'bbx15-armhf-rb',     my_node2: 'odxu4-armhf-rb'     }
                -  '2': { my_node1: 'wbq0-armhf-rb',      my_node2: 'cbxi4pro0-armhf-rb' }
                -  '3': { my_node1: 'hb0-armhf-rb',       my_node2: 'odxu4-armhf-rb'     }
                -  '4': { my_node1: 'ff4a-armhf-rb',      my_node2: 'wbq0-armhf-rb'      }
                -  '5': { my_node1: 'cbxi4pro0-armhf-rb', my_node2: 'bpi0-armhf-rb'      }
                -  '6': { my_node1: 'ff4a-armhf-rb',      my_node2: 'cbxi4pro0-armhf-rb' }
                -  '7': { my_node1: 'wbq0-armhf-rb',      my_node2: 'odxu4-armhf-rb'     }
                -  '8': { my_node1: 'hb0-armhf-rb',       my_node2: 'wbq0-armhf-rb'      }
                -  '9': { my_node1: 'ff4a-armhf-rb',      my_node2: 'bpi0-armhf-rb'      }
                - '10': { my_node1: 'odxu4-armhf-rb',     my_node2: 'rpi2b-armhf-rb'     }
                - '11': { my_node1: 'odxu4-armhf-rb',     my_node2: 'wbd0-armhf-rb'      }
                - '12': { my_node1: 'wbd0-armhf-rb',      my_node2: 'cbxi4pro0-armhf-rb' }
                - '13': { my_node1: 'cbxi4pro0-armhf-rb', my_node2: 'rpi2b-armhf-rb'     }
                - '14': { my_node1: 'cbxi4a-armhf-rb',    my_node2: 'odxu4b-armhf-rb'    }
                - '15': { my_node1: 'rpi2b-armhf-rb',     my_node2: 'odxu4c-armhf-rb'    }
                - '16': { my_node1: 'odxu4b-armhf-rb',    my_node2: 'wbd0-armhf-rb'      }
                - '17': { my_node1: 'odxu4c-armhf-rb',    my_node2: 'hb0-armhf-rb'       }
                - '18': { my_node1: 'odxu4b-armhf-rb',    my_node2: 'odu3a-armhf-rb'     }
                - '19': { my_node1: 'odxu4c-armhf-rb',    my_node2: 'opi2c-armhf-rb'     }
                - '20': { my_node1: 'opi2b-armhf-rb',     my_node2: 'odxu4b-armhf-rb'    }
                - '21': { my_node1: 'ff2a-armhf-rb',      my_node2: 'odxu4c-armhf-rb'    }
                - '22': { my_node1: 'ff2a-armhf-rb',      my_node2: 'rpi2c-armhf-rb'     }
                - '23': { my_node1: 'rpi2c-armhf-rb',     my_node2: 'odxu4b-armhf-rb'    }
                - '24': { my_node1: 'rpi2c-armhf-rb',     my_node2: 'odxu4c-armhf-rb'    }
                - '25': { my_node1: 'odxu4b-armhf-rb',    my_node2: 'ff2b-armhf-rb'      }
                - '26': { my_node1: 'jtk1a-armhf-rb',     my_node2: 'ff2a-armhf-rb'      }
                - '27': { my_node1: 'odxu4c-armhf-rb',    my_node2: 'cbxi4a-armhf-rb'    }
                - '28': { my_node1: 'jtk1a-armhf-rb',     my_node2: 'ff2b-armhf-rb'      }
                - '29': { my_node1: 'ff2b-armhf-rb',      my_node2: 'jtk1a-armhf-rb'     }
                - '30': { my_node1: 'ff2b-armhf-rb',      my_node2: 'cbxi4b-armhf-rb'    }
                - '31': { my_node1: 'ff2b-armhf-rb',      my_node2: 'opi2b-armhf-rb'     }
                - '32': { my_node1: 'jtk1a-armhf-rb',     my_node2: 'cbxi4b-armhf-rb'    }
                - '33': { my_node1: 'ff2a-armhf-rb',      my_node2: 'opi2b-armhf-rb'     }
                - '34': { my_node1: 'cbxi4a-armhf-rb',    my_node2: 'opi2b-armhf-rb'     }
                - '35': { my_node1: 'cbxi4a-armhf-rb',    my_node2: 'ff2b-armhf-rb'      }
                - '36': { my_node1: 'jtk1a-armhf-rb',     my_node2: 'cbxi4a-armhf-rb'    }
                - '37': { my_node1: 'cbxi4b-armhf-rb',    my_node2: 'wbq0-armhf-rb'      }
                - '38': { my_node1: 'cbxi4b-armhf-rb',    my_node2: 'jtk1a-armhf-rb'     }
                - '39': { my_node1: 'cbxi4b-armhf-rb',    my_node2: 'cbxi4a-armhf-rb'    }
                - '40': { my_node1: 'opi2b-armhf-rb',     my_node2: 'cbxi4b-armhf-rb'    }
                - '41': { my_node1: 'opi2b-armhf-rb',     my_node2: 'cbxi4b-armhf-rb'    }
                - '42': { my_node1: 'cbxi4b-armhf-rb',    my_node2: 'cbxi4a-armhf-rb'    }
                - '43': { my_node1: 'cbxi4a-armhf-rb',    my_node2: 'opi2c-armhf-rb'     }
                - '44': { my_node1: 'bbx15-armhf-rb',     my_node2: 'ff4a-armhf-rb'      }
                - '45': { my_node1: 'ff4a-armhf-rb',      my_node2: 'bbx15-armhf-rb'     }
                - '46': { my_node1: 'wbq0-armhf-rb',      my_node2: 'bbx15-armhf-rb'     }
                - '47': { my_node1: 'cbxi4pro0-armhf-rb', my_node2: 'bbx15-armhf-rb'     }
                - '48': { my_node1: 'bbx15-armhf-rb',     my_node2: 'ff4a-armhf-rb'      }
                - '49': { my_node1: 'bpi0-armhf-rb',      my_node2: 'ff4a-armhf-rb'      }
                - '50': { my_node1: 'odxu4-armhf-rb',     my_node2: 'odu3a-armhf-rb'     }
                - '51': { my_node1: 'odu3a-armhf-rb',     my_node2: 'cb3a-armhf-rb'      }
                - '52': { my_node1: 'opi2c-armhf-rb',     my_node2: 'cb3a-armhf-rb'      }
                - '53': { my_node1: 'cb3a-armhf-rb',      my_node2: 'ff4a-armhf-rb'      }
                - '54': { my_node1: 'odu3a-armhf-rb',     my_node2: 'opi2c-armhf-rb'     }
                - '55': { my_node1: 'opi2c-armhf-rb',     my_node2: 'odu3a-armhf-rb'     }
                - '56': { my_node1: 'odu3a-armhf-rb',     my_node2: 'ff2a-armhf-rb'      }
                - '57': { my_node1: 'opi2c-armhf-rb',     my_node2: 'ff2a-armhf-rb'      }

            my_shell: '/srv/jenkins/bin/reproducible_build.sh {my_node1} {my_node2}'
            my_timed: '* * * * *'
            my_hname: ''

        - '{name}_{otherproject_triggering}':
            otherproject_triggering:
                - 'lede':
                    my_description: 'Rebuild LEDE (some targets, some packages) twice (with variations) and investigate regarding reproducibility.'
                    my_timed: '42 23 * * 4'
                    my_shell: '/srv/jenkins/bin/reproducible_lede.sh master'
                - 'openwrt':
                    my_description: 'Rebuild OpenWrt (some targets, some packages) twice (with variations) and investigate regarding reproducibility.'
                    my_timed: '42 23 * * 2'
                    my_shell: '/srv/jenkins/bin/reproducible_openwrt.sh master'
            my_trigger: 'reproducible_html_rsync_remote_results'
            my_hname: ''
            my_recipients: 'jenkins+reproducible-builds qa-jenkins-scm@lists.alioth.debian.org lynxis@fe80.eu'

        - '{name}_{otherproject_triggering}':
            otherproject_triggering:
                - 'coreboot':
                    my_description: 'Rebuild all coreboot ROMs twice (with variations) and investigate regarding reproducibility.'
                    my_timed: '42 23 * * 1'
                    my_recipients: 'jenkins+reproducible-builds qa-jenkins-scm@lists.alioth.debian.org lynxis@fe80.eu'
                - 'netbsd':
                    my_description: 'Rebuild NetBSD (for some archs) twice (with variations) and investigate regarding reproducibility.'
                    my_timed: '42 23 * * 3'
            my_trigger: 'reproducible_html_rsync_remote_results'
            my_shell: '/srv/jenkins/bin/jenkins_master_wrapper.sh'
            my_hname: 'profitbricks3'
            my_recipients: 'jenkins+reproducible-builds qa-jenkins-scm@lists.alioth.debian.org'

        - '{name}_{otherproject}':
            otherproject:
                - 'freebsd':
                    my_description: 'Rebuild FreeBSD twice (with variations) and investigate regarding reproducibility.'
                    my_timed: '42 23 * * 4'
                    my_recipients: 'jenkins+reproducible-builds qa-jenkins-scm@lists.alioth.debian.org'
                    my_shell: '/srv/jenkins/bin/reproducible_freebsd.sh'
                - 'setup_schroot_archlinux_jenkins':
                    my_description: 'Setup an Arch Linux schroot to test Arch Linux packages for reproducibility.'
                    my_timed: '42 23 1 1 *'
                    my_shell: '/srv/jenkins/bin/reproducible_setup_archlinux_schroot.sh'
                    my_disabled: 'true'
                - 'setup_schroot_archlinux_profitbricks3':
                    my_description: 'Setup an Arch Linux schroot to test Arch Linux packages for reproducibility.'
                    my_timed: '42 23 1 1 *'
                    my_hname: 'profitbricks3'
                    my_disabled: 'true'
                - 'setup_schroot_archlinux_profitbricks4':
                    my_description: 'Setup an Arch Linux schroot to test Arch Linux packages for reproducibility.'
                    my_timed: '42 23 1 1 *'
                    my_hname: 'profitbricks4'
                    my_disabled: 'true'
                - 'setup_mock_fedora-23_x86_64_jenkins':
                    my_description: 'Setup mock for fedora-23 on X86_64 to test .rpm packages for reproducibility.'
                    my_timed: '42 23 1 1 *'
                    my_shell: '/srv/jenkins/bin/reproducible_setup_mock.sh fedora-23 x86_64'
                - 'setup_mock_fedora-23_x86_64_profitbricks3':
                    my_description: 'Setup mock for fedora-23 on X86_64 to test .rpm packages for reproducibility.'
                    my_timed: '42 23 1 1 *'
                    my_hname: 'profitbricks3'
                - 'setup_mock_fedora-23_x86_64_profitbricks4':
                    my_description: 'Setup mock for fedora-23 on X86_64 to test .rpm packages for reproducibility.'
                    my_timed: '42 23 1 1 *'
                    my_hname: 'profitbricks4'
            my_shell: '/srv/jenkins/bin/jenkins_master_wrapper.sh'
            my_hname: ''

        - '{name}_{otherproject_git}':
            otherproject_git:
                - 'setup_fdroid_build_environment_profitbricks7':
                    my_description: 'Setup a build environment for F-Droid.'
                    my_timed: '42 23 1 1 *'
                    my_hname: 'profitbricks7'
                    my_gitrepo: 'https://gitlab.com/fdroid/fdroidserver.git'
                    my_recipients: 'qa-jenkins-scm@lists.alioth.debian.org'
                - 'diffoscope_from_git_master':
                    my_description: 'Build diffoscope Debian package from git branch master.'
                    my_timed: '42 23 1 1 *'
                    my_hname: ''
                    my_gitrepo: 'git://anonscm.debian.org/git/reproducible/diffoscope.git'
                    my_gitbranches: 'origin/master'
                    my_shell: '/srv/jenkins/bin/chroot-run.sh sid debuild -uc -us'
                    my_parse_rules: '/srv/jenkins/logparse/debian-pkg-ci.rules'
                - 'diffoscope_from_git_branches':
                    my_description: 'Build diffoscope Debian package from git branches other than master.'
                    my_timed: '42 23 1 1 *'
                    my_hname: ''
                    my_gitrepo: 'git://anonscm.debian.org/git/reproducible/diffoscope.git'
                    my_gitbranches: ':^(?!origin/master$).*'
                    my_shell: '/srv/jenkins/bin/chroot-run.sh sid debuild -uc -us'
                    my_parse_rules: '/srv/jenkins/logparse/debian-pkg-ci.rules'
                - 'strip-nondeterminism_from_git_master':
                    my_description: 'Build strip-nondeterminism Debian package from git branch master.'
                    my_timed: '42 23 1 1 *'
                    my_hname: ''
                    my_gitrepo: 'git://anonscm.debian.org/git/reproducible/strip-nondeterminism.git'
                    my_gitbranches: 'origin/master'
                    my_shell: '/srv/jenkins/bin/chroot-run.sh sid gbp buildpackage'
                    my_parse_rules: '/srv/jenkins/logparse/debian-pkg-ci.rules'
                - 'strip-nondeterminism_from_git_branches':
                    my_description: 'Build strip-nondeterminism Debian package from git branches other than master.'
                    my_timed: '42 23 1 1 *'
                    my_hname: ''
                    my_gitrepo: 'git://anonscm.debian.org/git/reproducible/strip-nondeterminism.git'
                    my_gitbranches: ':^(?!origin/master$).*'
                    my_shell: '/srv/jenkins/bin/chroot-run.sh sid gbp buildpackage'
                    my_parse_rules: '/srv/jenkins/logparse/debian-pkg-ci.rules'
                - 'disorderfs_from_git_master':
                    my_description: 'Build disorderfs Debian package from git branch master.'
                    my_timed: '42 23 1 1 *'
                    my_hname: ''
                    my_gitrepo: 'git://anonscm.debian.org/git/reproducible/disorderfs.git'
                    my_gitbranches: 'origin/master'
                    my_shell: '/srv/jenkins/bin/chroot-run.sh sid gbp buildpackage'
                    my_parse_rules: '/srv/jenkins/logparse/debian-pkg-ci.rules'
                - 'disorderfs_from_git_branches':
                    my_description: 'Build disorderfs Debian package from git branches other than master.'
                    my_timed: '42 23 1 1 *'
                    my_hname: ''
                    my_gitrepo: 'git://anonscm.debian.org/git/reproducible/disorderfs.git'
                    my_gitbranches: ':^(?!origin/master$).*'
                    my_shell: '/srv/jenkins/bin/chroot-run.sh sid gbp buildpackage'
                    my_parse_rules: '/srv/jenkins/logparse/debian-pkg-ci.rules'
                - 'builds_website':
                    my_description: 'Build https://reproducible-builds.org on every git commit to https://anonscm.debian.org/git/reproducible/reproducible-website.git with jekyll.'
                    my_timed: ''
                    my_hname: ''
                    my_gitrepo: 'git://git.debian.org/git/reproducible/reproducible-website.git'
                    my_gitbranches: 'origin/master'
                    my_shell: 'jekyll build -s . -d /srv/reproducible-builds.org/www'
            my_gitbranches: 'master'
            my_recipients: 'jenkins+debian-reproducible qa-jenkins-scm@lists.alioth.debian.org'
            my_shell: '/srv/jenkins/bin/jenkins_master_wrapper.sh'
            my_parse_rules: '/srv/jenkins/logparse/reproducible-extra.rules'
            my_hname: ''

        - '{name}_builder_{otherproject}_{my_num}':
            otherproject:
                - 'archlinux':
                    my_num: 1
                    op_descname: 'an Arch Linux'
                    my_disabled: 'true'
                - 'archlinux':
                    my_num: 2
                    op_descname: 'an Arch Linux'
                    my_disabled: 'true'
                - 'fedora-23_x86_64':
                    my_num: 1
                    op_descname: 'a Fedora 23'
                    my_shell: '/srv/jenkins/bin/reproducible_build_rpm.sh fedora-23 x86_64'
                - 'fedora-23_x86_64':
                    my_num: 2
                    op_descname: 'a Fedora 23'
                    my_shell: '/srv/jenkins/bin/reproducible_build_rpm.sh fedora-23 x86_64'
                # when you add another fedora builder here
                # the loop in bin/reproducible_setup_mock.sh needs to be increased too
            my_description: 'Try to reproducibly build {op_descname} package.'
            my_shell: '/srv/jenkins/bin/reproducible_build_{otherproject}_pkg.sh'
            my_timed: '* * * * *'
            my_trigger: 'reproducible_html_{otherproject}'
            my_hname: ''