Jenkins

Pool: ODLVEX

Note

CentOS 7 based minions are deprecated; prefer Ubuntu 22.04 or CentOS Stream 8 where available.

Selected minion types (deprecated examples):

  • centos7-builder-* (2c-1g, 2c-2g, 2c-8g, 4c-4g, 8c-8g, autorelease-4c-16g)

    • Packer: packer/templates/builder.json

    • Playbook: packer/common-packer/provision/baseline.yaml

    • Note: Deprecated CentOS 7 general build / autorelease images. Use Ubuntu 22.04 builder going forward.

  • centos7-robot-2c-2g

    • Packer: packer/templates/robot.json

    • Playbook: packer/provision/robot.yaml

    • Note: Deprecated robot test runner (CentOS 7); migrate to updated robot images when available.

  • ubuntu1804-mininet-ovs-28-2c-2g

    • Packer: packer/templates/mininet-ovs-2.8.json

    • Playbook: packer/provision/mininet-ovs-2.8.yaml

    • Note: Legacy Ubuntu 18.04 + OVS 2.8 for historical CSIT; prefer Ubuntu 22.04 mininet-ovs-217.

  • centos7-devstack-2c-4g

    • Packer: packer/templates/devstack.json

    • Playbook: packer/provision/devstack.yaml

    • Note: Deprecated DevStack OpenStack test image (CentOS 7); prefer Ubuntu 22.04 devstack.

  • centos7-docker-2c-4g

    • Packer: packer/templates/docker.json

    • Playbook: packer/common-packer/provision/docker.yaml

    • Note: Deprecated CentOS 7 docker image; prefer Ubuntu 20.04/22.04 docker labels.

Jenkins Master

The jenkins-master is the home for all project’s Jenkins jobs. All maintenance and configuration of these jobs must be done via JJB through the releng-builder-repo. Project contributors can no longer edit the Jenkins jobs directly on the server.

Build Minions

The Jenkins jobs are run on build minions (executors) which are created on an as-needed basis. If no idle build minions are available a new VM is brought up. This process can take up to 2 minutes. Once the build minion has finished a job, it will be destroyed.

Our Jenkins master supports many types of dynamic build minions. If you are creating custom jobs then you will need to have an idea of what type of minions are available. The following are the current minion types and descriptions. Minion Template Names are needed for jobs that take advantage of multiple minions as they must be specifically called out by template name instead of label.

Adding New Components to the Minions

If your project needs something added to one of the minions, you can help us get things added faster by doing one of the following:

  • Submit a patch to RelEng/Builder for the appropriate jenkins-scripts definition which configure software during minion boot up.

  • Submit a patch to RelEng/Builder for the packer/provision scripts that configures software during minion instance imaging.

  • Submit a patch to RelEng/Builder for the Packer’s templates in the packer/templates directory that configures a new instance definition along with changes in packer/provision.

Going the first route will be faster in the short term as we can inspect the changes and make test modifications in the sandbox to verify that it works.

Note

The first route may add additional setup time considering this is run every time the minion is booted.

The second and third routes, however, is better for the community as a whole as it will allow others to utilize our Packer setups to replicate our systems more closely. It is, however, more time consuming as an image snapshot needs to be created based on the updated Packer definitions before it can be attached to the Jenkins configuration on sandbox for validation testing.

In either case, the changes must be validated in the sandbox with tests to make sure that we don’t break current jobs and that the new software features are operating as intended. Once this is done the changes will be merged and the updates applied to the RelEng Jenkins production silo. Any changes to files under releng/builder/packer will be validated and images would be built triggered by verify-packer and merge-packer jobs.

Please note that the combination of a Packer definitions from vars, templates and the provision scripts is what defines a given minion. For instance, a minion may be defined as centos7-builder which is a combination of Packer OS image definitions from vars/centos.json, Packer template definitions from templates/builder.json and spinup scripts from provision/builder.sh. This combination provides the full definition of the realized minion.

Jenkins starts a minion using the latest image which is built and linked into the Jenkins configuration. Once the base instance is online Jenkins checks out the RelEng/Builder repo on it and executes two scripts. The first is provision/baseline.sh, which is a baseline for all of the minions.

The second is the specialized script, which handles any system updates, new software installs or extra environment tweaks that don’t make sense in a snapshot. Examples could include installing new package or setting up a virtual environment. It is imperative to ensure modifications to these spinup scripts have considered time taken to install the packages, as this could increase the build time for every job which runs on the image. After all of these scripts have executed Jenkins will finally attach the minion as an actual minion and start Pool: ODLVEX ————

CentOS 7 (deprecated) build templates

Jenkins Labels

Minion Template Names

Packer Template

Playbook

centos7-builder-2c-1g, centos7-builder-2c-2g, centos7-builder-2c-8g,centos7-builder-4c-4g, centos7-builder-8c-8g, centos7-autorelease-4c-16g

prd-centos7-builder-2c-1g, prd-centos7-builder-2c-2g, prd-centos7-builder-2c-8g,prd-centos7-builder-4c-4g, prd-centos7-builder-8c-8g, prd-centos7-autorelease-4c-16g

releng/builder/packer/templates/builder.json

releng/builder/packer/common-packer/provision/baseline.yaml

CentOS 7 build minions are deprecated. Use Ubuntu 22.04 (Jammy) orCentOS Stream 8 builder labels for all new jobs. Java 17 is default;Java 11 only for legacy needs.

-

-

-

CentOS 7 (deprecated) robot templates

Jenkins Labels

Minion Template Names

Packer Template

Playbook

centos7-robot-2c-2g

centos7-robot-2c-2g

releng/builder/packer/templates/robot.json

releng/builder/packer/provision/robot.yaml

Robot image contains only test execution dependencies (deprecated).Prefer Ubuntu 22.04 or CentOS Stream 8 robot images when available.

-

-

-

Additional deprecated templates

Jenkins Labels

Minion Template Names

Packer Template

Playbook

ubuntu1804-mininet-ovs-28-2c-2g

ubuntu1804-mininet-ovs-28-2c-2g

releng/builder/packer/templates/mininet-ovs-2.8.json

releng/builder/packer/provision/mininet-ovs-2.8.yaml

Ubuntu 18.04 with OVS 2.8 (deprecated; migrate to Ubuntu 22.04 mininet-ovs-217)

-

-

-

centos7-devstack-2c-4g

centos7-devstack-2c-4g

releng/builder/packer/templates/devstack.json

releng/builder/packer/provision/devstack.yaml

CentOS 7 DevStack image (deprecated). Prefer Ubuntu 22.04 devstack.

-

-

-

centos7-docker-2c-4g

centos7-docker-2c-4g

releng/builder/packer/templates/docker.json

releng/builder/packer/common-packer/provision/docker.yaml

CentOS 7 docker image (deprecated). Prefer Ubuntu 20.04/22.04 docker.

-

-

-

Pool: ODLVEX - HOT (Heat Orchestration Templates)

HOT integration spins up integration lab servers for CSIT jobs using Heat rather than jclouds (deprecated). Image names update on project-specific job templates via the {odl,docker,openstack,tools}_system_image variable using the format <platform> - <template> - <date-stamp>.

Cloud Images

Below is the historical list of published images available to Jenkins jobs. New projects should target the most recent Ubuntu 22.04 (Jammy) images (builder / docker / devstack / mininet) or CentOS Stream 8 where Ubuntu is not yet available. We have deprecated CentOS 7 images and plan to remove them after the final migration (date TBD).

Recommended (current) labels (see Jenkins node labels / job parameters for exact names):

  • Ubuntu 22.04 builder (Java 17 default)

  • Ubuntu 22.04 docker

  • Ubuntu 22.04 devstack (for OpenStack CSIT)

  • Ubuntu 22.04 mininet-ovs-217

  • CentOS Stream 8 builder (legacy support / transitional)

Historical inventory:

  • ZZCI - CentOS 7 - builder - x86_64 - 20190403-205252.587

  • ZZCI - CentOS 7 - builder - x86_64 - 20220101-060058.758

  • ZZCI - CentOS 7 - builder - x86_64 - 20220401-060107.331

  • ZZCI - CentOS 7 - builder - x86_64 - 20220811-110452.412

  • ZZCI - CentOS 7 - builder - x86_64 - 20220830-004905.209

  • ZZCI - CentOS 7 - builder - x86_64 - 20220915-210350.650

  • ZZCI - CentOS 7 - builder - x86_64 - 20221016-222911.194

  • ZZCI - CentOS 7 - builder - x86_64 - 20221201-060105.225

  • ZZCI - CentOS 7 - builder - x86_64 - 20230301-060101.869

  • ZZCI - CentOS 7 - builder - x86_64 - 20230401-060117.151

  • ZZCI - CentOS 7 - builder - x86_64 - 20230501-060110.287

  • ZZCI - CentOS 7 - builder - x86_64 - 20231213-090206.813

  • ZZCI - CentOS 7 - builder - x86_64 - 20240101-060132.845

  • ZZCI - CentOS 7 - builder - x86_64 - 20240201-060121.705

  • ZZCI - CentOS 7 - builder - x86_64 - 20240221-041136.622

  • ZZCI - CentOS 7 - builder - x86_64 - 20240306-105309.257

  • ZZCI - CentOS 7 - builder - x86_64 - 20240401-060133.417

  • ZZCI - CentOS 7 - builder - x86_64 - 20240501-060129.055

  • ZZCI - CentOS 7 - builder - x86_64 - 20240601-060133.511

  • ZZCI - CentOS 7 - builder - x86_64 - 20240701-060130.538

  • ZZCI - CentOS 7 - devstack - x86_64 - 20220401-230107.511

  • ZZCI - CentOS 7 - devstack - x86_64 - 20220915-220248.057

  • ZZCI - CentOS 7 - devstack - x86_64 - 20221016-125752.520

  • ZZCI - CentOS 7 - devstack - x86_64 - 20230301-230109.257

  • ZZCI - CentOS 7 - devstack - x86_64 - 20230401-230106.445

  • ZZCI - CentOS 7 - devstack - x86_64 - 20231213-111336.211

  • ZZCI - CentOS 7 - devstack - x86_64 - 20240101-230119.558

  • ZZCI - CentOS 7 - devstack - x86_64 - 20240201-230120.693

  • ZZCI - CentOS 7 - devstack - x86_64 - 20240306-105306.072

  • ZZCI - CentOS 7 - devstack - x86_64 - 20240401-230144.262

  • ZZCI - CentOS 7 - devstack - x86_64 - 20240501-230129.155

  • ZZCI - CentOS 7 - devstack - x86_64 - 20240601-230133.464

  • ZZCI - CentOS 7 - devstack-rocky - 20190601-000116.015

  • ZZCI - CentOS 7 - devstack-rocky - 20190628-065204.973

  • ZZCI - CentOS 7 - devstack-rocky - x86_64 - 20191002-183226.559

  • ZZCI - CentOS 7 - devstack-rocky - x86_64 - 20200801-000156.903

  • ZZCI - CentOS 7 - devstack-rocky - x86_64 - 20200811-042113.395

  • ZZCI - CentOS 7 - devstack-rocky - x86_64 - 20200813-042753.841

  • ZZCI - CentOS 7 - devstack-rocky - x86_64 - 20220401-000109.037

  • ZZCI - CentOS 7 - devstack-rocky - x86_64 - 20220811-110620.848

  • ZZCI - CentOS 7 - devstack-rocky - x86_64 - 20220915-220323.497

  • ZZCI - CentOS 7 - devstack-rocky - x86_64 - 20221016-125827.911

  • ZZCI - CentOS 7 - devstack-rocky - x86_64 - 20221101-000109.537

  • ZZCI - CentOS 7 - devstack-stein - x86_64 - 20220401-010109.230

  • ZZCI - CentOS 7 - devstack-stein - x86_64 - 20220811-110634.575

  • ZZCI - CentOS 7 - devstack-stein - x86_64 - 20220915-222435.096

  • ZZCI - CentOS 7 - devstack-stein - x86_64 - 20221016-222956.928

  • ZZCI - CentOS 7 - devstack-stein - x86_64 - 20221101-010107.368

  • ZZCI - CentOS 7 - docker - x86_64 - 20220401-220102.840

  • ZZCI - CentOS 7 - docker - x86_64 - 20220811-110637.413

  • ZZCI - CentOS 7 - docker - x86_64 - 20220915-220324.722

  • ZZCI - CentOS 7 - docker - x86_64 - 20221016-223020.545

  • ZZCI - CentOS 7 - docker - x86_64 - 20221101-220103.978

  • ZZCI - CentOS 7 - docker - x86_64 - 20221201-220105.396

  • ZZCI - CentOS 7 - docker - x86_64 - 20230301-220107.956

  • ZZCI - CentOS 7 - docker - x86_64 - 20230401-220108.252

  • ZZCI - CentOS 7 - docker - x86_64 - 20230501-220111.311

  • ZZCI - CentOS 7 - docker - x86_64 - 20231213-111103.823

  • ZZCI - CentOS 7 - docker - x86_64 - 20240101-220119.494

  • ZZCI - CentOS 7 - docker - x86_64 - 20240201-220125.685

  • ZZCI - CentOS 7 - docker - x86_64 - 20240306-105301.772

  • ZZCI - CentOS 7 - docker - x86_64 - 20240401-220152.097

  • ZZCI - CentOS 7 - docker - x86_64 - 20240501-220134.070

  • ZZCI - CentOS 7 - docker - x86_64 - 20240601-220142.195

  • ZZCI - CentOS 7 - helm - x86_64 - 20220401-000138.473

  • ZZCI - CentOS 7 - helm - x86_64 - 20220811-110654.568

  • ZZCI - CentOS 7 - helm - x86_64 - 20220915-220356.090

  • ZZCI - CentOS 7 - helm - x86_64 - 20221016-223030.291

  • ZZCI - CentOS 7 - helm - x86_64 - 20221101-000135.064

  • ZZCI - CentOS 7 - helm - x86_64 - 20230301-000133.034

  • ZZCI - CentOS 7 - robot - 20190430-080312.962

  • ZZCI - CentOS 7 - robot - x86_64 - 20220401-220138.484

  • ZZCI - CentOS 7 - robot - x86_64 - 20220915-220357.338

  • ZZCI - CentOS 7 - robot - x86_64 - 20221016-223041.341

  • ZZCI - CentOS 7 - robot - x86_64 - 20221101-220138.675

  • ZZCI - CentOS 7 - robot - x86_64 - 20221201-220143.533

  • ZZCI - CentOS 7 - robot - x86_64 - 20230301-220131.480

  • ZZCI - CentOS 7 - robot - x86_64 - 20230501-220152.957

  • ZZCI - CentOS 7 - robot - x86_64 - 20240101-220154.458

  • ZZCI - CentOS 7 - robot - x86_64 - 20240201-220154.217

  • ZZCI - CentOS 7 - robot - x86_64 - 20240306-105302.366

  • ZZCI - CentOS 7 - robot - x86_64 - 20240401-220244.081

  • ZZCI - CentOS 7 - robot - x86_64 - 20240501-220214.317

  • ZZCI - CentOS 7 - robot - x86_64 - 20240601-220241.858

  • ZZCI - CentOS Stream 8 - builder - x86_64 - 20220303-223622.243

  • ZZCI - CentOS Stream 8 - builder - x86_64 - 20220405-005246.199

  • ZZCI - CentOS Stream 8 - builder - x86_64 - 20220411-013651.819

  • ZZCI - CentOS Stream 8 - builder - x86_64 - 20220411-025029.496

  • ZZCI - CentOS Stream 8 - builder - x86_64 - 20220601-071415.711

  • ZZCI - CentOS Stream 8 - builder - x86_64 - 20220629-035812.822

  • ZZCI - CentOS Stream 8 - builder - x86_64 - 20220701-160059.919

  • ZZCI - CentOS Stream 8 - builder - x86_64 - 20220801-160143.906

  • ZZCI - CentOS Stream 8 - builder - x86_64 - 20220811-073719.385

  • ZZCI - CentOS Stream 8 - builder - x86_64 - 20221016-222440.331

  • ZZCI - CentOS Stream 8 - builder - x86_64 - 20221101-160106.524

  • ZZCI - CentOS Stream 8 - builder - x86_64 - 20221201-160128.560

  • ZZCI - CentOS Stream 8 - builder - x86_64 - 20230301-160121.204

  • ZZCI - CentOS Stream 8 - builder - x86_64 - 20230401-160111.589

  • ZZCI - CentOS Stream 8 - builder - x86_64 - 20230501-160107.084

  • ZZCI - CentOS Stream 8 - builder - x86_64 - 20230727-135233.501

  • ZZCI - CentOS Stream 8 - builder - x86_64 - 20230801-160108.418

  • ZZCI - CentOS Stream 8 - builder - x86_64 - 20231213-094027.766

  • ZZCI - CentOS Stream 8 - builder - x86_64 - 20240117-011746.201

  • ZZCI - CentOS Stream 8 - builder - x86_64 - 20240201-160121.488

  • ZZCI - CentOS Stream 8 - builder - x86_64 - 20240309-064327.830

  • ZZCI - CentOS Stream 8 - builder - x86_64 - 20240401-160147.446

  • ZZCI - CentOS Stream 8 - builder - x86_64 - 20240501-160131.499

  • ZZCI - CentOS Stream 8 - builder - x86_64 - 20240601-160217.263

  • ZZCI - CentOS Stream 8 - robot - x86_64 - 20220811-231817.668

  • ZZCI - CentOS Stream 8 - robot - x86_64 - 20230301-010147.625

  • ZZCI - CentOS Stream 8 - robot - x86_64 - 20230401-010209.151

  • ZZCI - CentOS Stream 8 - robot - x86_64 - 20231213-111243.663

  • ZZCI - CentOS Stream 8 - robot - x86_64 - 20240101-010215.978

  • ZZCI - CentOS Stream 8 - robot - x86_64 - 20240116-014504.639

  • ZZCI - CentOS Stream 8 - robot - x86_64 - 20240201-010245.776

  • ZZCI - CentOS Stream 8 - robot - x86_64 - 20240309-064350.911

  • ZZCI - CentOS Stream 8 - robot - x86_64 - 20240401-010224.970

  • ZZCI - CentOS Stream 8 - robot - x86_64 - 20240501-010211.041

  • ZZCI - CentOS Stream 8 - robot - x86_64 - 20240601-010231.803

  • ZZCI - OPNFV - apex - compute - 0

  • ZZCI - OPNFV - apex - compute - 1

  • ZZCI - OPNFV - apex - controller - 0

  • ZZCI - Ubuntu 16.04 - docker - x86_64 - 20190614-042302.610

  • ZZCI - Ubuntu 16.04 - gbp - 20190521-223526.319

  • ZZCI - Ubuntu 16.04 - kubernetes - 20190206-080347.936

  • ZZCI - Ubuntu 16.04 - kubernetes - 20190211-225526.126

  • ZZCI - Ubuntu 16.04 - mininet-ovs-25 - 20190416-121328.240

  • ZZCI - Ubuntu 16.04 - mininet-ovs-26 - 20190521-223726.040

  • ZZCI - Ubuntu 16.04 - mininet-ovs-28 - 20190415-091034.881

  • ZZCI - Ubuntu 18.04 - docker - x86_64 - 20220201-040158.287

  • ZZCI - Ubuntu 18.04 - docker - x86_64 - 20220501-040104.357

  • ZZCI - Ubuntu 18.04 - docker - x86_64 - 20220601-040059.617

  • ZZCI - Ubuntu 18.04 - docker - x86_64 - 20220701-040013.395

  • ZZCI - Ubuntu 18.04 - docker - x86_64 - 20221001-040106.423

  • ZZCI - Ubuntu 18.04 - docker - x86_64 - 20221201-040108.330

  • ZZCI - Ubuntu 18.04 - docker - x86_64 - 20230101-040125.332

  • ZZCI - Ubuntu 18.04 - docker - x86_64 - 20230301-040106.351

  • ZZCI - Ubuntu 18.04 - docker - x86_64 - 20230401-040112.177

  • ZZCI - Ubuntu 18.04 - docker - x86_64 - 20230501-040105.925

  • ZZCI - Ubuntu 18.04 - docker - x86_64 - 20240101-040145.675

  • ZZCI - Ubuntu 18.04 - docker - x86_64 - 20240201-040120.975

  • ZZCI - Ubuntu 18.04 - docker - x86_64 - 20240301-040012.681

  • ZZCI - Ubuntu 18.04 - docker - x86_64 - 20240306-000749.151

  • ZZCI - Ubuntu 18.04 - docker - x86_64 - 20240326-112125.840

  • ZZCI - Ubuntu 18.04 - docker - x86_64 - 20240501-040132.905

  • ZZCI - Ubuntu 18.04 - docker - x86_64 - 20240601-040134.455

  • ZZCI - Ubuntu 18.04 - docker - x86_64 - 20240701-040125.149

  • ZZCI - Ubuntu 18.04 - docker - x86_64 - 20240801-040132.691

  • ZZCI - Ubuntu 18.04 - docker - x86_64 - 20240901-040206.174

  • ZZCI - Ubuntu 18.04 - docker - x86_64 - 20241201-040126.343

  • ZZCI - Ubuntu 18.04 - docker - x86_64 - 20250201-040221.796

  • ZZCI - Ubuntu 18.04 - helm - - 20210513-214525.779

  • ZZCI - Ubuntu 18.04 - helm - x86_64 - 20220501-140101.102

  • ZZCI - Ubuntu 18.04 - helm - x86_64 - 20220811-112321.717

  • ZZCI - Ubuntu 18.04 - helm - x86_64 - 20220915-235325.735

  • ZZCI - Ubuntu 18.04 - helm - x86_64 - 20221013-122339.021

  • ZZCI - Ubuntu 18.04 - helm - x86_64 - 20221101-140104.772

  • ZZCI - Ubuntu 18.04 - helm - x86_64 - 20221201-140107.142

  • ZZCI - Ubuntu 18.04 - helm - x86_64 - 20230301-140059.950

  • ZZCI - Ubuntu 18.04 - mininet-ovs-28 - x86_64 - 20220201-180056.429

  • ZZCI - Ubuntu 18.04 - mininet-ovs-28 - x86_64 - 20220501-180100.971

  • ZZCI - Ubuntu 18.04 - mininet-ovs-28 - x86_64 - 20220601-180059.980

  • ZZCI - Ubuntu 18.04 - mininet-ovs-28 - x86_64 - 20220701-180056.799

  • ZZCI - Ubuntu 18.04 - mininet-ovs-28 - x86_64 - 20220801-180111.774

  • ZZCI - Ubuntu 18.04 - mininet-ovs-28 - x86_64 - 20220915-223016.788

  • ZZCI - Ubuntu 18.04 - mininet-ovs-28 - x86_64 - 20221013-083654.129

  • ZZCI - Ubuntu 18.04 - mininet-ovs-28 - x86_64 - 20221101-180142.920

  • ZZCI - Ubuntu 18.04 - mininet-ovs-28 - x86_64 - 20221201-180114.186

  • ZZCI - Ubuntu 18.04 - mininet-ovs-28 - x86_64 - 20230301-180106.402

  • ZZCI - Ubuntu 18.04 - mininet-ovs-28 - x86_64 - 20230401-180107.945

  • ZZCI - Ubuntu 18.04 - mininet-ovs-28 - x86_64 - 20230501-180106.320

  • ZZCI - Ubuntu 18.04 - mininet-ovs-28 - x86_64 - 20230601-180106.003

  • ZZCI - Ubuntu 20.04 - builder - x86_64 - 20240820-011010.709

  • ZZCI - Ubuntu 20.04 - builder - x86_64 - 20240901-160214.010

  • ZZCI - Ubuntu 20.04 - builder - x86_64 - 20241101-160217.260

  • ZZCI - Ubuntu 20.04 - builder - x86_64 - 20241201-160151.330

  • ZZCI - Ubuntu 20.04 - builder - x86_64 - 20250101-160150.998

  • ZZCI - Ubuntu 20.04 - docker - x86_64 - 20240326-112013.773

  • ZZCI - Ubuntu 20.04 - docker - x86_64 - 20240401-160246.269

  • ZZCI - Ubuntu 20.04 - docker - x86_64 - 20240501-160207.164

  • ZZCI - Ubuntu 20.04 - docker - x86_64 - 20240601-160305.840

  • ZZCI - Ubuntu 20.04 - docker - x86_64 - 20240701-160316.313

  • ZZCI - Ubuntu 20.04 - docker - x86_64 - 20240801-160217.825

  • ZZCI - Ubuntu 20.04 - docker - x86_64 - 20241101-160234.899

  • ZZCI - Ubuntu 20.04 - docker - x86_64 - 20241201-160228.779

  • ZZCI - Ubuntu 20.04 - docker - x86_64 - 20250101-160216.847

  • ZZCI - Ubuntu 20.04 - docker - x86_64 - 20250201-160239.450

  • ZZCI - Ubuntu 20.04 - docker - x86_64 - 20250918-232438.133

  • ZZCI - Ubuntu 22.04 - builder - x86_64 - 20250201-010426.857

  • ZZCI - Ubuntu 22.04 - builder - x86_64 - 20250917-133034.447

  • ZZCI - Ubuntu 22.04 - devstack - x86_64 - 20231031-095146.118

  • ZZCI - Ubuntu 22.04 - docker - x86_64 - 20250201-170115.786

  • ZZCI - Ubuntu 22.04 - docker - x86_64 - 20250918-232437.783

  • ZZCI - Ubuntu 22.04 - mininet-ovs-217 - x86_64 - 20241024-123714.311

  • ZZCI - Ubuntu 22.04 - mininet-ovs-217 - x86_64 - 20241101-060158.442

  • ZZCI - Ubuntu 22.04 - mininet-ovs-217 - x86_64 - 20241201-060156.310

  • ZZCI - Ubuntu 22.04 - mininet-ovs-217 - x86_64 - 20250201-060151.911

  • ZZCI - Ubuntu 22.04 - mininet-ovs-217 - x86_64 - 20250917-133034.654

Creating Jenkins Jobs

Jenkins Job Builder takes simple descriptions of Jenkins jobs in YAML format and uses them to configure Jenkins.

Getting Jenkins Job Builder

OpenDaylight uses Jenkins Job Builder to translate our in-repo YAML job configuration into job descriptions suitable for consumption by Jenkins. When testing new Jenkins Jobs in the Jenkins Sandbox, you’ll need to use the jenkins-jobs executable to translate a set of jobs into their XML descriptions and upload them to the sandbox Jenkins server.

We document installing jenkins-jobs below.

Installing Jenkins Job Builder

We recommend using pip to assist with JJB installs, but we also document installing from a git repository manually. For both, we recommend using Python Virtual Environments to isolate JJB and its dependencies.

The builder/jjb/requirements.txt file contains the currently recommended JJB version. Because JJB is fairly unstable, it may be necessary to debug things by installing different versions. This is documented for both pip-assisted and manual installs.

Virtual Environments

For both pip-assisted and manual JJB installs, we recommend using Python Virtual Environments to manage JJB and its Python dependencies. The python-virtualenvwrapper tool can help you do so.

Documentation is available for installing python-virtualenvwrapper. On Linux systems with pip (typical), they amount to:

sudo pip install virtualenvwrapper

A virtual environment is simply a directory that you install Python programs into and then append to the front of your path, causing those copies to be found before any system-wide versions.

Create a new virtual environment for JJB.

# virtualenvwrapper uses this dir for virtual environments
  $ echo $WORKON_HOME
  /home/daniel/.virtualenvs
  # Make a new virtual environment
  $ mkvirtualenv jjb
  # A new venv dir was created
  (jjb)$ ls -rc $WORKON_HOME | tail -n 1
  jjb
  # The new venv was added to the front of this shell's path
  (jjb)$ echo $PATH
  /home/daniel/.virtualenvs/jjb/bin:<my normal path>
  # Software installed to venv, like pip, is found before system-wide copies
  (jjb)$ command -v pip
  /home/daniel/.virtualenvs/jjb/bin/pip

With your virtual environment active, you should install JJB. Your install will be isolated to that virtual environment’s directory and only visible when the virtual environment is active.

You can easily leave and return to your venv. Make sure you activate it before each use of JJB.

(jjb)$ deactivate
$ command -v jenkins-jobs
# No jenkins-jobs executable found
$ workon jjb
(jjb)$ command -v jenkins-jobs
$WORKON_HOME/jjb/bin/jenkins-jobs

Installing JJB using pip

The recommended way to install JJB is via pip.

First, clone the latest version of the releng-builder-repo.

$ git clone --recursive https://git.opendaylight.org/gerrit/p/releng/builder.git

Before actually installing JJB and its dependencies, make sure you’ve created and activated a virtual environment for JJB.

$ mkvirtualenv jjb

The recommended version of JJB to install is the version specified in the builder/jjb/requirements.txt file.

# From the root of the releng/builder repo
(jjb)$ pip install -r jjb/requirements.txt

To validate that JJB was successfully installed you can run this command:

(jjb)$ jenkins-jobs --version

Note: Only the version of JJB pinned in the merged jjb/requirements.txt is supported in CI. The ad-hoc override examples below are for local troubleshooting and should not be committed.

To change the version of JJB specified by builder/jjb/requirements.txt to install from the latest commit to the master branch of JJB’s git repository:

$ cat jjb/requirements.txt
-e git+https://opendev.org/jjb/jenkins-job-builder#egg=jenkins-job-builder

To install from a tag, like 1.4.0:

$ cat jjb/requirements.txt
-e git+https://opendev.org/jjb/jenkins-job-builder@1.4.0#egg=jenkins-job-builder

Updating releng/builder repo or global-jjb

Follow these steps to update the releng/builder repo. The repo uses a submodule from a global-jjb repo so that common source can be shared across different projects. This requires updating the releng/builder repo periodically to pick up the changes. New versions of jjb could also require updating the releng/builder repo. Follow the previous steps earlier for updating jenkins-jobs using the builder/jjb/requirements.txt file. Ensure that the version listed in the file is the currently supported version, otherwise install a different version or simply upgrade using pip install –upgrade jenkins-job-builder.

The example below assumes the user has cloned releng/builder to ~/git/releng/builder. Update the repo, update the submodules and then submit a test to verify it works.

cd ~/git/releng/builder
git checkout master
git pull
git submodule update --init --recursive
jenkins-jobs --conf jenkins.ini test \
  jjb/ netvirt-csit-1node-openstack-queens-upstream-stateful-fluorine

Installing JJB Manually

This section documents installing JJB from its manually cloned repository.

Note that installing via pip is typically simpler.

Checkout the version of JJB’s source you’d like to build.

For example, using master:

$ git clone https://opendev.org/jjb/jenkins-job-builder

Using a tag, like 1.4.0:

$ git clone https://opendev.org/jjb/jenkins-job-builder
  $ cd jenkins-job-builder
  $ git checkout tags/1.4.0

Before actually installing JJB and its dependencies, make sure you’ve created and activated a virtual environment for JJB.

$ mkvirtualenv jjb

You can then use JJB’s requirements.txt file to install its dependencies. Note that we’re not using sudo to install as root, since we want to make use of the venv we’ve configured for our current user.

# In the cloned JJB repo, with the desired version of the code checked out
(jjb)$ pip install -r requirements.txt

Then install JJB from the repo with:

(jjb)$ pip install .

To validate that JJB was successfully installed you can run this command:

(jjb)$ jenkins-jobs --version

Jenkins Job Templates

The OpenDaylight RelEng/Builder project provides jjb-templates that can be used to define basic jobs.

The Gerrit Trigger listed in the jobs are keywords that can be used to trigger the job to run manually by simply leaving a comment in Gerrit for the patch you wish to trigger against.

All jobs have a default build-timeout value of 360 minutes (6 hrs) but can be overridden via the opendaylight-infra-wrappers’ build-timeout property.

Job Categories & Triggers

Every patch uploaded (or updated) triggers the standard verify pipeline jobs. Draft changes and commit-message-only amendments are the only updates that do not trigger builds.

If you comment remerge on a change before it merges, Jenkins rebuilds the current branch HEAD and (historically) triggered all every-patch jobs. Use this to re-run a full set when a subset was manually triggered and you need a clean baseline.

Feature / subset test jobs follow the pattern test-{project}-{feature} and test-{project}-all (run broader functional suites). These are on-demand and do not vote on Gerrit.

Job Parameter Reference

Common parameters (lf-* and legacy templates):

  • java-version: openjdk17 (default) or openjdk11 (legacy) – selects JDK toolchain.

  • sonarcloud-java-version / sonar-jdk: JDK for Sonar scanner (defaults to java-version).

  • maven / mvn-version / maven-version: mvn39, mvn38 – selects configured Maven install.

  • mvn-settings: <project>-settings – custom settings.xml profile.

  • mvn-goals: e.g. clean install -DskipTests – build phases/properties.

  • mvn-opts: e.g. -Xmx2g – JVM flags via MAVEN_OPTS/JAVA_TOOL_OPTIONS.

  • build-timeout: minutes (default 360) – override via wrapper property.

  • dependencies: comma-separated upstream merge job names triggering integration jobs.

  • stream: release stream identifier (e.g. master, a named release).

  • branch: Git branch to build (multi-branch definitions).

  • java-opts / jvm-opts: additional JVM flags (runtime/integration phases).

  • archive-artifacts: patterns (e.g. target/*.log) to archive.

  • email-upstream: tokens for upstream dependency notifications.

  • python-version (lf-python): comma-separated Python versions (e.g. 3.10,3.11).

  • go-version (lf-go): Go toolchain (e.g. 1.22.x).

  • gradle-version (lf-gradle): Gradle distribution version (e.g. 8.6).

  • enable-sonar / sonar: true to include Sonar stage.

  • skip-tests / skip-integration-tests: booleans to bypass test phases.

Core Job Templates (summary)

  • {project}-distribution-check-{stream} (recheck): Builds integration/distribution, runs SingleFeatureTest, guards autorelease.

  • {project}-integration-{stream} (auto): Triggers on upstream dependency merges (project.cfg DEPENDENCIES); disabled if none.

  • {project}-merge-{stream} (remerge): Builds HEAD after merge (or manually) and publishes artifacts to Nexus.

  • {project}-sonar (run-sonar): Runs Sonar analysis; re-run verify afterward to restore vote.

  • {project}-validate-autorelease-{stream} (recheck): Quick sanity test ensuring no dependency on features absent from release.

  • {project}-verify-{stream}-{maven}-{java-version} (recheck): Per-patch build + unit/integration tests.

  • {project}-verify-node-{stream} (recheck): NodeJS project build/test (requires nodedir/nodever params; runs npm install & test).

  • {project}-verify-python-{stream} / {project}-verify-tox-{stream} (recheck): Tox-driven test execution (set toxdir if tox.ini not at repo root). Template names are aliases.

On-demand / Advanced Job Templates

Job Template

Gerrit Trigger

Purpose / Notes

integration-patch-test-{stream}

test-integration

Builds a distribution including the patch, then triggers a CSIT subset (see integration-test-jobs.yaml). High resource/time cost (~2h); use selectively. Does not vote.

integration-multipatch-test-{stream}

multipatch-build

Builds multiple patches in order (or by topic) across projects, then builds a distribution. Stores bundle URL (BUNDLE_URL) in console. Use multipatch-build-fast for quick builds. Does not vote.

Maven Properties

We provide a properties which your job can take advantage of if you want to do trigger a different configuration depending on job type. You can create a profile that activates on a property listed below. The JJB templated jobs will activate the profile during the build to run any custom code configuration you wish to run for this job type.

-Dmerge   : The Merge job sets this flag and is the same as setting the
            Maven property <merge>true</merge>.
-Dsonar   : The Sonar job sets this flag and is the same as setting the
            Maven property <sonar>true</sonar>.

Jenkins Sandbox

URL: https://jenkins.opendaylight.org/sandbox

Jenkins Sandbox documentation is available in the LF Jenkins Sandbox Guide.