hosts: Set max_containers at 50

Myself (and other folks) applied this workaround directly in Jenkins GUI
for a while (a year or so). But recently, due to an issue (STG-4396) we
actually can't apply it via GUI, so have little choice but to encode it
here.

The motiviation and idea behind this workaround is following: x86_64-TF-02
is shared by both production and staging. And bother have max_containers
for it at 30. But that means that if production is running full-steam
(and most of the time it is, that's the purpose of production - to
run a lot of stuff almost all the time), then there's simply no room
for staging to run any container (it sees 30 running from production
already). But staging is used for development work and thus should
have "interactive priority" for its job (them to be able to start
quickly, but the jobs themselves should be "lightweight").

To achieve that aim, there's little choice but to set staging's
max_containers *higher* than production. For example, at 50,
staging would be able to run 50 - 30 = 20 containers even if
production is fully booked. Of course, such usage exactly depends
on the idea that the staging would run "interactive priority" jobs,
for narrow-focused development and testing. If that rule is not
followed, we may get "priority inversion", where staging will
suffocate production with its 50 concurrently running jobs. During
the time the workaround was applied manually, there was suitable
motion to establish staging usage discipline, and it's under
constant watch, so should be ok to promote manual workaround to
persistent workaround.

Signed-off-by: Paul Sokolovsky <paul.sokolovsky@linaro.org>
Change-Id: Ifb93e3caa64f72b94584b1c61a8b71d050a34dce
1 file changed
tree: 783b00f74fd50a56df051ef7e8bb12a4b7ebe755
  1. templates/
  2. .gitreview
  3. docker_ssh_buildslave.yml
  4. docker_templates_amd64.yml
  5. hosts
  6. mbed_tls_host_docker_vol.yml
  7. README.md
  8. yadp_builder.py
  9. yadp_builder_v2.py
README.md

Yet Another Docker Plugin config builder

Yet Another Docker Plugin (YADP) is extremely hard to manage, when running multiple slaves with multiple images. Due to the way Jenkins displays the configuration page. YADP provides a groovy script which builds a JSON array to populate the configuration in Jenkins.

This script uses YAML and Jinja2 to generate a java JSONARRAY to build the configuration, using a !include constructor in the YAML file, allowing the ability to template up docker_images, since many of our slaves run the same image, it lessens repetition.

Features

  1. Ability to !include inside YAML to lessen duplication
  2. Ability to include multiple YAML files with !include [file1.yml, file2.yml]
  3. Ability to include SSH settings via using launch_method:" along with ssh: or jnlp:

Usage

####hosts

- host1:
  cloud_name: host1.example.org
  docker-url: tcp://0.0.0.0:2375
  docker_templates: !include external_template_file.yml

- host2:
  cloud_name: host2.example.org
  docker-url: tcp://0.0.0.1:2375
  docker_templates:
    - xenial-amd64:
      docker_image_name: 'ubuntu:latest'
      max_instances: '1'
      labels: 'docker-ubuntu'
      launch_method: ssh
      ssh:
        launch_ssh_credentials_id: 'random-id'
        launch_ssh_port: '22'

- host3
  cloud_name: host3.example.org
  docker-url: tcp://0.0.0.0:2375
  docker_templates:
    !include [external_template_file.yml, external_template_file_2.yml]

Limitations

Due to the nature of YAML and populating the Java JSONARRAY, its important that YAML is phased correctly.

Most of the limitations surround docker_templates.

A list of limitations and pending improvements.

  1. Do not mix !include and templates under docker_templates.

Example of broken approach:

  • host1: cloud_name: host1.example.org docker-url: tcp://0.0.0.0:2375 docker_templates: !include external_template_file.yml
    • xenial-amd64: docker_image_name: 'ubuntu:latest' max_instances: '1' labels: 'docker-ubuntu'
  1. Do not add spaces under the image cloud_name, the must fall inline with the image name

Example of broken approach:

  • xenial-amd64: docker_image_name: 'ubuntu:latest' max_instances: '1' labels: 'docker-ubuntu'
  1. Docker labels could be "host" specific. If you are including a template file, the template has no link to the host, so its not possible to do "host based labels". Instead just create another template file with custom settings and include that file.