This is a sample docker rails app to demonstrate how we can run our specs across multiple containers.
make setup # build docker image, sets up databases
make server # starts container rails server
make rspec # run all specs in a single container
make parallelspecs # invokes parallel test script; ./docker/parallel-specs.sh; fires multiples containers to runs tests listed in ./docker/parallel-specs.tsv
More commands in ./makefile
The script in ./bin/parallel is a shell tool for executing jobs in parallel.
./docker/parallel-specs.sh invokes ./docker/docker-spec-run.sh alsong with params from the rows listed in ./docker/parallel-specs.tsv with number of jobs defined by -j.
In our case, we have 4 rows in ./docker/parallel-specs.tsv so we would like to have -j4 that will fire 4 containers.
./docker/docker-spec-run.sh invokes actual docker-compose run command to start and run the spec, indirectly through ./docker/spec-runner.sh.
Through the process, we have to make sure of two things: make sure container names does not conflict and generate a new database for each container so that test run data won't collide. For this purpose, we have some code to build container name in ./docker/docker-spec-run.sh and code to create a new db from existing test db template and use that for rspec run in ./docker/spec-runner.sh.