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 <aogata@instructure.com>
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Ryan Norton <rnorton@instructure.com>
Product-Review: Aaron Ogata <aogata@instructure.com>
This commit is contained in:
Aaron Ogata 2020-08-11 07:53:05 -07:00
parent e2aebb07cb
commit 8ffaf8d925
4 changed files with 43 additions and 4 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -38,6 +38,10 @@ class DockerfileWriter
env == "development"
end
def jenkins?
env == "jenkins"
end
def generation_message
<<~STR
# GENERATED FILE, DO NOT MODIFY!