From 8ffaf8d925f7c6fae90792c256973120182eebd0 Mon Sep 17 00:00:00 2001 From: Aaron Ogata Date: Tue, 11 Aug 2020 07:53:05 -0700 Subject: [PATCH] minimize file dependencies for bundle caching refs DE-187 [change-merged] [build-registry-path=jenkins/canvas-lms-de-187-test] Test Plan: Ensure that the cache is used for bundle install when a gem changes and the build is run on a different node. Change-Id: I43f83338a25a0774030495904b75d0825abcc5bb Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/244748 QA-Review: Aaron Ogata Tested-by: Service Cloud Jenkins Reviewed-by: Ryan Norton Product-Review: Aaron Ogata --- Dockerfile | 3 ++- Dockerfile.jenkins | 16 ++++++++++++++-- build/Dockerfile.template | 24 +++++++++++++++++++++++- build/dockerfile_writer.rb | 4 ++++ 4 files changed, 43 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index fbb40c03aeb..b0d74bc10f1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,6 +4,7 @@ ARG RUBY=2.6 + FROM instructure/passenger-nginx-alpine:${RUBY} AS dependencies LABEL maintainer="Instructure" @@ -22,7 +23,7 @@ WORKDIR $APP_HOME COPY --chown=docker:docker config/canvas_rails_switcher.rb ${APP_HOME}/config/canvas_rails_switcher.rb COPY --chown=docker:docker Gemfile ${APP_HOME} COPY --chown=docker:docker Gemfile.d ${APP_HOME}Gemfile.d -COPY --chown=docker:docker gems ${APP_HOME}gems +COPY --chown=docker:docker gems ${APP_HOME}gems ENV GEM_HOME /home/docker/.gem/$RUBY_VERSION ENV PATH $GEM_HOME/bin:$PATH ENV BUNDLE_APP_CONFIG /home/docker/.bundle diff --git a/Dockerfile.jenkins b/Dockerfile.jenkins index 192be97d0e4..7e5e287f362 100644 --- a/Dockerfile.jenkins +++ b/Dockerfile.jenkins @@ -1,9 +1,20 @@ +# syntax = docker/dockerfile:1.0-experimental # GENERATED FILE, DO NOT MODIFY! # To update this file please edit the relevant template and run the generation -# task `build/dockerfile_writer.rb --env development --compose-file docker-compose.yml,docker-compose.override.yml --in build/Dockerfile.template --out Dockerfile.jenkins` +# task `build/dockerfile_writer.rb --env jenkins --compose-file docker-compose.yml,docker-compose.override.yml --in build/Dockerfile.template --out Dockerfile.jenkins` ARG RUBY=2.6 +FROM busybox AS cache-helper-collect-gems +RUN mkdir -p /tmp/dst /tmp/dst +WORKDIR /tmp/src +RUN --mount=target=/tmp/src find gems -name "Gemfile" -exec cp --parents {} /tmp/dst \; +RUN --mount=target=/tmp/src find gems -name "Gemfile.d" -exec cp -rf --parents {} /tmp/dst \; +RUN --mount=target=/tmp/src find gems -name "Gemfile.lock" -exec cp --parents {} /tmp/dst \; +RUN --mount=target=/tmp/src find gems -name "*.gemspec" -exec cp --parents {} /tmp/dst \; +RUN --mount=target=/tmp/src find gems -name "gem_version.rb" -exec cp --parents {} /tmp/dst \; +RUN --mount=target=/tmp/src find gems -name "version.rb" -exec cp --parents {} /tmp/dst \; + FROM instructure/passenger-nginx-alpine:${RUBY} AS dependencies LABEL maintainer="Instructure" @@ -22,7 +33,7 @@ WORKDIR $APP_HOME COPY --chown=docker:docker config/canvas_rails_switcher.rb ${APP_HOME}/config/canvas_rails_switcher.rb COPY --chown=docker:docker Gemfile ${APP_HOME} COPY --chown=docker:docker Gemfile.d ${APP_HOME}Gemfile.d -COPY --chown=docker:docker gems ${APP_HOME}gems +COPY --chown=docker:docker --from=cache-helper-collect-gems /tmp/dst ${APP_HOME} ENV GEM_HOME /home/docker/.gem/$RUBY_VERSION ENV PATH $GEM_HOME/bin:$PATH ENV BUNDLE_APP_CONFIG /home/docker/.bundle @@ -121,6 +132,7 @@ RUN set -eux; \ USER docker COPY --chown=docker:docker babel.config.js ${APP_HOME} COPY --chown=docker:docker build/new-jenkins ${APP_HOME}build/new-jenkins +COPY --chown=docker:docker gems ${APP_HOME}gems COPY --chown=docker:docker package.json ${APP_HOME} COPY --chown=docker:docker packages ${APP_HOME}packages COPY --chown=docker:docker script ${APP_HOME}script diff --git a/build/Dockerfile.template b/build/Dockerfile.template index 9d590fd1ade..9f5b961b0de 100644 --- a/build/Dockerfile.template +++ b/build/Dockerfile.template @@ -1,6 +1,21 @@ +<% if jenkins? -%> +# syntax = docker/dockerfile:1.0-experimental +<% end -%> <%= generation_message %> ARG RUBY=2.6 +<% if jenkins? -%> +FROM busybox AS cache-helper-collect-gems +RUN mkdir -p /tmp/dst /tmp/dst +WORKDIR /tmp/src +RUN --mount=target=/tmp/src find gems -name "Gemfile" -exec cp --parents {} /tmp/dst \; +RUN --mount=target=/tmp/src find gems -name "Gemfile.d" -exec cp -rf --parents {} /tmp/dst \; +RUN --mount=target=/tmp/src find gems -name "Gemfile.lock" -exec cp --parents {} /tmp/dst \; +RUN --mount=target=/tmp/src find gems -name "*.gemspec" -exec cp --parents {} /tmp/dst \; +RUN --mount=target=/tmp/src find gems -name "gem_version.rb" -exec cp --parents {} /tmp/dst \; +RUN --mount=target=/tmp/src find gems -name "version.rb" -exec cp --parents {} /tmp/dst \; +<% end -%> + FROM instructure/passenger-nginx-alpine:${RUBY} AS dependencies LABEL maintainer="Instructure" @@ -19,7 +34,11 @@ WORKDIR $APP_HOME COPY --chown=docker:docker config/canvas_rails_switcher.rb ${APP_HOME}/config/canvas_rails_switcher.rb COPY --chown=docker:docker Gemfile ${APP_HOME} COPY --chown=docker:docker Gemfile.d ${APP_HOME}Gemfile.d -COPY --chown=docker:docker gems ${APP_HOME}gems +<% if jenkins? -%> +COPY --chown=docker:docker --from=cache-helper-collect-gems /tmp/dst ${APP_HOME} +<% else -%> +COPY --chown=docker:docker gems ${APP_HOME}gems +<% end -%> ENV GEM_HOME /home/docker/.gem/$RUBY_VERSION ENV PATH $GEM_HOME/bin:$PATH ENV BUNDLE_APP_CONFIG /home/docker/.bundle @@ -118,6 +137,9 @@ RUN set -eux; \ USER docker COPY --chown=docker:docker babel.config.js ${APP_HOME} COPY --chown=docker:docker build/new-jenkins ${APP_HOME}build/new-jenkins +<% if jenkins? -%> +COPY --chown=docker:docker gems ${APP_HOME}gems +<% end -%> COPY --chown=docker:docker package.json ${APP_HOME} COPY --chown=docker:docker packages ${APP_HOME}packages COPY --chown=docker:docker script ${APP_HOME}script diff --git a/build/dockerfile_writer.rb b/build/dockerfile_writer.rb index 640f8abcb12..5921b9ef318 100755 --- a/build/dockerfile_writer.rb +++ b/build/dockerfile_writer.rb @@ -38,6 +38,10 @@ class DockerfileWriter env == "development" end + def jenkins? + env == "jenkins" + end + def generation_message <<~STR # GENERATED FILE, DO NOT MODIFY!