Closed
Description
Currently the best way to handle a large app that takes ages to build is to have two separate instances of the stack: builders and runners, and https://github.com/buildkite-plugins/docker-compose-buildkite-plugin to have a build
step that runs before the steps.
The builder doesn't autoscale, sits there with a warm docker cache, and pushes to a registry. The test steps run on the runners
queue, and pulls from docker hub without doing any git clone at all.
The pipeline looks like this:
steps:
- name: ":docker: :package:"
plugins:
docker-compose:
build: app
image-repository: index.docker.io/myorg/myapp
agents:
queue: elastic-builders
- wait
- name: ":spec: %n"
command: ".buildkite/steps/knapsack"
plugins:
docker-compose:
run: app
agents:
queue: elastic-runners
parallelism: 75
A simpler setup would be to use something like http://blog.runnable.com/post/145362675491/distributing-docker-cache-across-hosts to make the cache mostly invisible, and require no separate queue or pipeline config changes.