re-use CSS compilation cached assets in pre-merge builds
refs DE-1379 [build-registry-path=jenkins/canvas-lms/de-1379-3] [change-merged] Change-Id: I1e33e24ee61afa114739cbd4acd9eddb163e1f76 Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/301709 Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com> QA-Review: Aaron Ogata <aogata@instructure.com> Product-Review: Aaron Ogata <aogata@instructure.com> Reviewed-by: Andrea Cirulli <andrea.cirulli@instructure.com> Build-Review: Andrea Cirulli <andrea.cirulli@instructure.com>
This commit is contained in:
parent
1211038fb4
commit
b286d9d0c5
|
@ -1,8 +1,11 @@
|
||||||
FROM local/webpack-builder
|
FROM local/webpack-builder
|
||||||
|
|
||||||
RUN --mount=type=bind,from=local/cache-helper,source=/tmp/dst,target=/cache-helper \
|
RUN \
|
||||||
|
--mount=type=bind,from=local/cache-helper,source=/tmp/dst,target=/cache-helper \
|
||||||
|
--mount=type=bind,from=local/webpack-assets-previous,target=/mount/webpack-assets-previous \
|
||||||
tar --no-same-owner -xf /cache-helper/webpack-runner-dependencies.tar -C ${APP_HOME} && \
|
tar --no-same-owner -xf /cache-helper/webpack-runner-dependencies.tar -C ${APP_HOME} && \
|
||||||
tar --no-same-owner -xf /cache-helper/webpack-runner.tar -C ${APP_HOME}
|
tar --no-same-owner -xf /cache-helper/webpack-runner.tar -C ${APP_HOME} && \
|
||||||
|
{ { cd /mount/webpack-assets-previous/usr/src/app && cp --parents -rf public/dist/brandable_css ${APP_HOME}; } || true; }
|
||||||
|
|
||||||
ARG JS_BUILD_NO_UGLIFY=0
|
ARG JS_BUILD_NO_UGLIFY=0
|
||||||
ARG RAILS_LOAD_ALL_LOCALES=0
|
ARG RAILS_LOAD_ALL_LOCALES=0
|
||||||
|
|
|
@ -8,10 +8,14 @@ function add_log {
|
||||||
echo "$1" >> tmp/docker-build.log
|
echo "$1" >> tmp/docker-build.log
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function compute_hash {
|
||||||
|
echo "$@" | md5sum | cut -d' ' -f1
|
||||||
|
}
|
||||||
|
|
||||||
function compute_tags {
|
function compute_tags {
|
||||||
local tags=$1; shift
|
local tags=$1; shift
|
||||||
local cachePrefix=$1; shift
|
local cachePrefix=$1; shift
|
||||||
local cacheId=$(echo "$@" | md5sum | cut -d' ' -f1)
|
local cacheId=$(compute_hash $@)
|
||||||
|
|
||||||
compute_tags_from_hash $tags $cachePrefix $cacheId
|
compute_tags_from_hash $tags $cachePrefix $cacheId
|
||||||
}
|
}
|
||||||
|
@ -42,6 +46,19 @@ function has_remote_tags {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function image_label_eq {
|
||||||
|
local imageName=$1; shift
|
||||||
|
local labelName=$1; shift
|
||||||
|
local expectedValue=$1; shift
|
||||||
|
local actualValue=$(docker inspect $imageName --format "{{ .Config.Labels.$labelName }}")
|
||||||
|
|
||||||
|
if [[ "$actualValue" != "$expectedValue" ]]; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
function pull_first_tag {
|
function pull_first_tag {
|
||||||
local -n selectedTag=$1; shift
|
local -n selectedTag=$1; shift
|
||||||
local loadTags=$@
|
local loadTags=$@
|
||||||
|
|
|
@ -36,7 +36,7 @@ WORKSPACE=${WORKSPACE:-$(pwd)}
|
||||||
# $WEBPACK_BUILDER_TAG: additional tag for the webpack-builder image
|
# $WEBPACK_BUILDER_TAG: additional tag for the webpack-builder image
|
||||||
# - set to patchset unique ID for builds to reference without knowing about the hash ID
|
# - set to patchset unique ID for builds to reference without knowing about the hash ID
|
||||||
|
|
||||||
export CACHE_VERSION="2022-09-23.1"
|
export CACHE_VERSION="2022-09-26.1"
|
||||||
export DOCKER_BUILDKIT=1
|
export DOCKER_BUILDKIT=1
|
||||||
|
|
||||||
source ./build/new-jenkins/docker-build-helpers.sh
|
source ./build/new-jenkins/docker-build-helpers.sh
|
||||||
|
@ -101,6 +101,16 @@ WEBPACK_ASSETS_PARTS=(
|
||||||
$WEBPACK_ASSETS_DOCKERFILE_MD5
|
$WEBPACK_ASSETS_DOCKERFILE_MD5
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# If any of these SHAs change - we don't want to use the previously cached webpack assets to prevent the
|
||||||
|
# cache from using stale dependencies.
|
||||||
|
WEBPACK_ASSETS_CACHE_ID_PARTS=(
|
||||||
|
"${WEBPACK_BUILDER_PARTS[@]}"
|
||||||
|
$WEBPACK_RUNNER_DEPENDENCIES_MD5
|
||||||
|
$WEBPACK_RUNNER_DOCKERFILE_MD5
|
||||||
|
$WEBPACK_ASSETS_DOCKERFILE_MD5
|
||||||
|
)
|
||||||
|
WEBPACK_ASSETS_CACHE_ID=$(compute_hash ${WEBPACK_ASSETS_CACHE_ID_PARTS[@]})
|
||||||
|
|
||||||
declare -A BASE_RUNNER_TAGS; compute_tags "BASE_RUNNER_TAGS" $BASE_RUNNER_PREFIX ${BASE_RUNNER_PARTS[@]}
|
declare -A BASE_RUNNER_TAGS; compute_tags "BASE_RUNNER_TAGS" $BASE_RUNNER_PREFIX ${BASE_RUNNER_PARTS[@]}
|
||||||
declare -A RUBY_RUNNER_TAGS; compute_tags "RUBY_RUNNER_TAGS" $RUBY_RUNNER_PREFIX ${RUBY_RUNNER_PARTS[@]}
|
declare -A RUBY_RUNNER_TAGS; compute_tags "RUBY_RUNNER_TAGS" $RUBY_RUNNER_PREFIX ${RUBY_RUNNER_PARTS[@]}
|
||||||
declare -A YARN_RUNNER_TAGS; compute_tags "YARN_RUNNER_TAGS" $YARN_RUNNER_PREFIX ${YARN_RUNNER_PARTS[@]}
|
declare -A YARN_RUNNER_TAGS; compute_tags "YARN_RUNNER_TAGS" $YARN_RUNNER_PREFIX ${YARN_RUNNER_PARTS[@]}
|
||||||
|
@ -172,6 +182,8 @@ if [ -z "${WEBPACK_ASSETS_SELECTED_TAG}" ]; then
|
||||||
WEBPACK_BUILDER_SELECTED_TAG=${WEBPACK_BUILDER_TAGS[SAVE_TAG]}
|
WEBPACK_BUILDER_SELECTED_TAG=${WEBPACK_BUILDER_TAGS[SAVE_TAG]}
|
||||||
|
|
||||||
add_log "built ${WEBPACK_BUILDER_SELECTED_TAG}"
|
add_log "built ${WEBPACK_BUILDER_SELECTED_TAG}"
|
||||||
|
|
||||||
|
tag_many starlord.inscloudgate.net/jenkins/core:focal local/webpack-assets-previous
|
||||||
else
|
else
|
||||||
RUBY_RUNNER_SELECTED_TAG=$(docker inspect $WEBPACK_BUILDER_SELECTED_TAG --format '{{ .Config.Labels.RUBY_RUNNER_SELECTED_TAG }}')
|
RUBY_RUNNER_SELECTED_TAG=$(docker inspect $WEBPACK_BUILDER_SELECTED_TAG --format '{{ .Config.Labels.RUBY_RUNNER_SELECTED_TAG }}')
|
||||||
YARN_RUNNER_SELECTED_TAG=$(docker inspect $WEBPACK_BUILDER_SELECTED_TAG --format '{{ .Config.Labels.YARN_RUNNER_SELECTED_TAG }}')
|
YARN_RUNNER_SELECTED_TAG=$(docker inspect $WEBPACK_BUILDER_SELECTED_TAG --format '{{ .Config.Labels.YARN_RUNNER_SELECTED_TAG }}')
|
||||||
|
@ -183,6 +195,18 @@ if [ -z "${WEBPACK_ASSETS_SELECTED_TAG}" ]; then
|
||||||
|
|
||||||
./build/new-jenkins/docker-with-flakey-network-protection.sh pull $RUBY_RUNNER_SELECTED_TAG
|
./build/new-jenkins/docker-with-flakey-network-protection.sh pull $RUBY_RUNNER_SELECTED_TAG
|
||||||
tag_many $RUBY_RUNNER_SELECTED_TAG local/ruby-runner ${RUBY_RUNNER_TAGS[SAVE_TAG]}
|
tag_many $RUBY_RUNNER_SELECTED_TAG local/ruby-runner ${RUBY_RUNNER_TAGS[SAVE_TAG]}
|
||||||
|
|
||||||
|
(
|
||||||
|
./build/new-jenkins/docker-with-flakey-network-protection.sh pull $WEBPACK_ASSETS_FUZZY_TAG
|
||||||
|
|
||||||
|
if ! image_label_eq $WEBPACK_ASSETS_FUZZY_TAG "WEBPACK_ASSETS_CACHE_ID" $WEBPACK_ASSETS_CACHE_ID; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
tag_many $WEBPACK_ASSETS_FUZZY_TAG local/webpack-assets-previous
|
||||||
|
) || (
|
||||||
|
tag_many starlord.inscloudgate.net/jenkins/core:focal local/webpack-assets-previous
|
||||||
|
)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
tag_many $WEBPACK_BUILDER_SELECTED_TAG local/webpack-builder ${WEBPACK_BUILDER_TAGS[SAVE_TAG]} ${WEBPACK_BUILDER_TAGS[UNIQUE_TAG]-}
|
tag_many $WEBPACK_BUILDER_SELECTED_TAG local/webpack-builder ${WEBPACK_BUILDER_TAGS[SAVE_TAG]} ${WEBPACK_BUILDER_TAGS[UNIQUE_TAG]-}
|
||||||
|
@ -194,6 +218,7 @@ if [ -z "${WEBPACK_ASSETS_SELECTED_TAG}" ]; then
|
||||||
|
|
||||||
docker build \
|
docker build \
|
||||||
--label "RUBY_RUNNER_SELECTED_TAG=$RUBY_RUNNER_SELECTED_TAG" \
|
--label "RUBY_RUNNER_SELECTED_TAG=$RUBY_RUNNER_SELECTED_TAG" \
|
||||||
|
--label "WEBPACK_ASSETS_CACHE_ID=$WEBPACK_ASSETS_CACHE_ID" \
|
||||||
--label "WEBPACK_BUILDER_SELECTED_TAG=$WEBPACK_BUILDER_SELECTED_TAG" \
|
--label "WEBPACK_BUILDER_SELECTED_TAG=$WEBPACK_BUILDER_SELECTED_TAG" \
|
||||||
--label "YARN_RUNNER_SELECTED_TAG=$YARN_RUNNER_SELECTED_TAG" \
|
--label "YARN_RUNNER_SELECTED_TAG=$YARN_RUNNER_SELECTED_TAG" \
|
||||||
--tag "${WEBPACK_ASSETS_TAGS[SAVE_TAG]}" \
|
--tag "${WEBPACK_ASSETS_TAGS[SAVE_TAG]}" \
|
||||||
|
|
|
@ -170,6 +170,7 @@ def premergeCacheImage() {
|
||||||
def patchsetImage(asyncStepsStr = '') {
|
def patchsetImage(asyncStepsStr = '') {
|
||||||
credentials.withStarlordCredentials {
|
credentials.withStarlordCredentials {
|
||||||
def cacheScope = configuration.isChangeMerged() ? env.IMAGE_CACHE_MERGE_SCOPE : env.IMAGE_CACHE_BUILD_SCOPE
|
def cacheScope = configuration.isChangeMerged() ? env.IMAGE_CACHE_MERGE_SCOPE : env.IMAGE_CACHE_BUILD_SCOPE
|
||||||
|
def webpackAssetsFuzzyTag = configuration.isChangeMerged() ? "" : "${env.WEBPACK_ASSETS_PREFIX}:${getFuzzyTagSuffix()}"
|
||||||
|
|
||||||
slackSendCacheBuild {
|
slackSendCacheBuild {
|
||||||
withEnv([
|
withEnv([
|
||||||
|
@ -184,6 +185,7 @@ def patchsetImage(asyncStepsStr = '') {
|
||||||
"RAILS_LOAD_ALL_LOCALES=${getRailsLoadAllLocales()}",
|
"RAILS_LOAD_ALL_LOCALES=${getRailsLoadAllLocales()}",
|
||||||
"RUBY_RUNNER_PREFIX=${env.RUBY_RUNNER_PREFIX}",
|
"RUBY_RUNNER_PREFIX=${env.RUBY_RUNNER_PREFIX}",
|
||||||
"WEBPACK_BUILDER_PREFIX=${env.WEBPACK_BUILDER_PREFIX}",
|
"WEBPACK_BUILDER_PREFIX=${env.WEBPACK_BUILDER_PREFIX}",
|
||||||
|
"WEBPACK_ASSETS_FUZZY_TAG=${webpackAssetsFuzzyTag}",
|
||||||
"WEBPACK_ASSETS_PREFIX=${env.WEBPACK_ASSETS_PREFIX}",
|
"WEBPACK_ASSETS_PREFIX=${env.WEBPACK_ASSETS_PREFIX}",
|
||||||
"YARN_RUNNER_PREFIX=${env.YARN_RUNNER_PREFIX}",
|
"YARN_RUNNER_PREFIX=${env.YARN_RUNNER_PREFIX}",
|
||||||
]) {
|
]) {
|
||||||
|
|
Loading…
Reference in New Issue