tumbo/README.md
2019-12-30 13:54:27 +01:00

3.8 KiB

tumbo

Docker matrix build generator.

The basic idea is that you combine a config file with custom variables with templating (Jinja2) and tumbo will run your matrix build in docker.

🤔 Motivation

I wanted a tool that allowed me to build/push/run similar docker images easily. A basic example would be publishing a package on different version of python (e.g. 3.5-3.8) on different operating systems (maybe alpine and debian). With tumbo we can leverage the power of templating engines to automate this taks without needing to manually write 8 different Dockerfiles and run the commands for each manually.

📦 Install

pip install tumbo

🚀 Quickstart

spec.yml
variables:
    version:
        - 3.11
        - 3.10
        - 3.9
    name:
        - Alice
        - Bob

recipe: ./Dockerfile.j2

run: yes
parallel: no
Dockerfile.j2
FROM alpine:{{ version }}

CMD [ "echo", "Hi {{ name }} from {{ version }}" ]

And run

tumbo spec.yml

Tumbo will then generate 6 images, build and run them in all the combinations possible with the variables given.

🐣 Examples

Have a look at the examples folder. I think it's the fastest way to learn.

To run the simple example

# Clone the repo
https://github.com/cupcakearmy/tumbo.git
cd tumbo

pip install tumbo

tumbo examples/simple/spec.yml

📘 Config Reference

Variables

The variables to build the matrix. Simply specify an array for each variable. They will be available in the template.

variables:
    my_var:
        - a
        - b
        - c
    some_other:
        - 0.1.0
        - 0.1.2

Recipe

The template to compile the dockerfile. Can be a template itself if you don't want to write everything in the same file.

Simple
recipe: './Dockerfile.j2'
Template
variables:
    my_var:
        - a
        - b

recipe: './{{ my_var }}.j2'

Assuming my_var hast the values a and b it will render to ./a.j2 and ./b.j2 accordingly.

Context (Optional)

Default: directory of the config file.

Specify the directory where the templates and the dockerfiles will be built. Supports both absolute and relative paths.

context: ./build

Tag (Optional)

Default: Creates a tag that includes all variables. In most cases it will not be necessary to specify, but can be usefull if your are pushing images. Supports templating of course.

Important: The tag should be unique across the matrix, otherwise you will overwrite other tags. So always include all the variables you specified inside the image name

variables:
    var1:
        - a
        - b
    var2:
        - a
        - b
    var3:
        - a
        - b

tag: 'my-image-name:{{ var3 }}-{{ var1 }}-{{ var2 }}'

Parallel (Optional)

Default: yes

Whether the builds/push/runs should run in parallel or after each other.

no

Parallel off.

parallel: no
yes

Uses all the threads available on the machine.

parallel: yes
number

Uses how many thread you specify

parallel: 2

run (Optional)

Default: no

Wether to run the docker image after building. Can be usefull if running automated tests.

run: yes

push (Optional)

Default: no

Wether to push the docker image after building. Can be used to push images to the docker registry (or your own). See below on how to login.

run: yes

registry (Optional)

Default: Empty

Credentials for docker login. Used to push images and to specify a custom registry if necessary.

registry:
    username: my_user
    password: my_pass
    host: my_host