From 3b016bb0eee7d798c71fd2eb1afd40ec5cb24d90 Mon Sep 17 00:00:00 2001 From: Robert Prehn <3952444+prehnRA@users.noreply.github.com> Date: Thu, 10 Jun 2021 14:17:35 -0500 Subject: [PATCH] feat: Cache intermediate docker images --- .gitlab-ci.yml | 10 ++-------- Dockerfile | 4 ++-- script/ci-docker-build | 27 +++++++++++++++++++++++++++ script/ci-docker-prebuild | 17 +++++++++++++++++ 4 files changed, 48 insertions(+), 10 deletions(-) create mode 100755 script/ci-docker-build create mode 100755 script/ci-docker-prebuild diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1c6a4e95..bbc87698 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -36,15 +36,9 @@ build_image_for_commit: services: - name: docker:20.10-dind before_script: - - docker login "https://${CI_REGISTRY}" -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD - - docker pull $CI_REGISTRY_IMAGE:latest || true + - script/ci-docker-prebuild script: - # This enables fast parallel builds - - export DOCKER_BUILDKIT=1 - - docker build --cache-from $CI_REGISTRY_IMAGE:latest -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA . - # Push the commit SHA tagged version to registry. We will later choose to tag that as stable - # if everything passes. - - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA + - script/ci-docker-build # If tests pass, tag the commit and update package versions deploy_to_tags: diff --git a/Dockerfile b/Dockerfile index 12023f50..d9535972 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM elixir:1.10.4-alpine AS elixir1 +FROM elixir:1.10.4-alpine AS elixir-builder RUN mix local.hex --force \ && mix local.rebar --force @@ -37,7 +37,7 @@ COPY --from=0 /root/app/ /root/app/ RUN npm install RUN npm run deploy -FROM elixir1 +FROM elixir-builder RUN mix deps.compile diff --git a/script/ci-docker-build b/script/ci-docker-build new file mode 100755 index 00000000..0a80b6bd --- /dev/null +++ b/script/ci-docker-build @@ -0,0 +1,27 @@ +#!/bin/sh + +export DOCKER_BUILDKIT=1 + +docker build \ + --target elixir-builder \ + --cache-from $CI_REGISTRY_IMAGE:$PARENT_COMMIT-elixir-builder \ + --cache-from $CI_REGISTRY_IMAGE:latest-elixir-builder \ + -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA-elixir-builder . + +docker build \ + --target asset-builder \ + --cache-from $CI_REGISTRY_IMAGE:$PARENT_COMMIT-asset-builder \ + --cache-from $CI_REGISTRY_IMAGE:latest-asset-builder \ + -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA-asset-builder . + +docker build \ + --target asset-builder \ + --cache-from $CI_REGISTRY_IMAGE:$PARENT_COMMIT \ + --cache-from $CI_REGISTRY_IMAGE:latest \ + -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA . + +# Push the commit SHA tagged version to registry. We will later choose to tag that as stable +# if everything passes. +docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA-elixir-builder +docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA-asset-builder +docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA diff --git a/script/ci-docker-prebuild b/script/ci-docker-prebuild new file mode 100755 index 00000000..19c73c7d --- /dev/null +++ b/script/ci-docker-prebuild @@ -0,0 +1,17 @@ +#!/bin/sh + +PARENT_COMMIT=`git rev-list --parents -n 1 HEAD | cut -d' ' -f2` + +docker login "https://${CI_REGISTRY}" -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD + +docker pull $CI_REGISTRY_IMAGE:$PARENT_COMMIT-elixir-builder || \ + docker pull $CI_REGISTRY_IMAGE:latest-elixir-builder || \ + true + +docker pull $CI_REGISTRY_IMAGE:$PARENT_COMMIT-asset-builder || \ + docker pull $CI_REGISTRY_IMAGE:latest-asset-builder || \ + true + +docker pull $CI_REGISTRY_IMAGE:$PARENT_COMMIT || \ + docker pull $CI_REGISTRY_IMAGE:latest || \ + true