Dmatrix

Docker matrix. Parallel execution of each possible combination defined in your matrix file.

The matrix file can contain build_arg and env values which will be passed to Docker during the image build and execution of your command.

Inspired by the Travis Build Matrix.

Example

.matrix.yaml

matrix:
  build_arg:
    FROM_IMAGE:
      - ruby:2.4-alpine
      - ruby:2.5-alpine
      - ruby:2.6-alpine
    BUNDLE_GEMFILE:
      - gemfiles/factory_bot_4_8.gemfile
      - gemfiles/factory_bot_5.gemfile

This would produce six combinations. In this example the gemfiles are created with the Appraisal gem.

Dockerfile

ARG FROM_IMAGE=ruby:2.6-alpine
FROM $FROM_IMAGE

RUN apk update && \
    apk add git && \
    mkdir -p /app/lib/my_gem

WORKDIR /app

COPY Gemfile* my_gem.gemspec Appraisals /app/
COPY gemfiles/*.gemfile /app/gemfiles/
COPY lib/my_gem/version.rb /app/lib/my_gem/version.rb

ARG BUNDLE_GEMFILE=Gemfile
ENV BUNDLE_GEMFILE=$BUNDLE_GEMFILE

RUN bundle install --jobs=4 --retry=3

COPY . /app

Running a command

bundle exec dmatrix -- bundle exec rspec

Would use dmatrix to build & run bundle exec rspec in each combination your matrix defines.

Setup

# Gemfile

gem "dmatrix"

Create a .matrix.yaml file:

matrix:
  build_arg:
    ARG1:
      - abc
      - def
  env:
    ENV1:
      - 123
      - 456

N.B. the build_arg and env keys can both contain multiple variants.

Run:

bundle exec dmatrix -- <your command>

If not command is specified the default Docker command should run.