From 37c75aac41396d6eab5b62680c75ba8e8dbb0b6b Mon Sep 17 00:00:00 2001 From: Philip Hyunsu Cho Date: Thu, 4 Apr 2019 13:36:39 -0700 Subject: [PATCH] [CI] Add external Docker build cache (#4331) --- Jenkinsfile | 4 ++++ tests/ci_build/ci_build.sh | 34 +++++++++++++++++++++++++++++++--- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 04a918cfc..96268901e 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -24,6 +24,10 @@ pipeline { // Each stage specify its own agent agent none + environment { + DOCKER_CACHE_REPO = '492475357299.dkr.ecr.us-west-2.amazonaws.com' + } + // Setup common job properties options { ansiColor('xterm') diff --git a/tests/ci_build/ci_build.sh b/tests/ci_build/ci_build.sh index 942be875e..d5b0419f9 100755 --- a/tests/ci_build/ci_build.sh +++ b/tests/ci_build/ci_build.sh @@ -118,15 +118,30 @@ EOF # Build the docker container. echo "Building container (${DOCKER_IMG_NAME})..." -# --pull should be default + +# If enviornment variable DOCKER_CACHE_REPO is set, use an external Docker repo for build caching +if [[ -n "${DOCKER_CACHE_REPO}" ]] +then + # Login for Docker registiry + echo '$(python3 -m awscli ecr get-login --no-include-email --region us-west-2)' + $(python3 -m awscli ecr get-login --no-include-email --region us-west-2) + echo "docker pull ${DOCKER_CACHE_REPO}/${DOCKER_IMG_NAME}:${BRANCH_NAME} || true" + docker pull "${DOCKER_CACHE_REPO}/${DOCKER_IMG_NAME}:${BRANCH_NAME}" || true + CACHE_FROM_CMD="--cache-from ${DOCKER_CACHE_REPO}/${DOCKER_IMG_NAME}:${BRANCH_NAME}" +else + CACHE_FROM_CMD='' +fi + echo "docker build \ ${CI_DOCKER_BUILD_ARG} \ -t ${DOCKER_IMG_NAME} \ - -f ${DOCKERFILE_PATH} ${DOCKER_CONTEXT_PATH}" + -f ${DOCKERFILE_PATH} ${DOCKER_CONTEXT_PATH} \ + ${CACHE_FROM_CMD}" docker build \ ${CI_DOCKER_BUILD_ARG} \ -t "${DOCKER_IMG_NAME}" \ - -f "${DOCKERFILE_PATH}" "${DOCKER_CONTEXT_PATH}" + -f "${DOCKERFILE_PATH}" "${DOCKER_CONTEXT_PATH}" \ + ${CACHE_FROM_CMD} # Check docker build status if [[ $? != "0" ]]; then @@ -134,6 +149,19 @@ if [[ $? != "0" ]]; then exit 1 fi +# If enviornment variable DOCKER_CACHE_REPO is set, use an external Docker repo for build caching +if [[ -n "${DOCKER_CACHE_REPO}" ]] +then + echo "docker tag ${DOCKER_IMG_NAME} ${DOCKER_CACHE_REPO}/${DOCKER_IMG_NAME}:${BRANCH_NAME}" + docker tag "${DOCKER_IMG_NAME}" "${DOCKER_CACHE_REPO}/${DOCKER_IMG_NAME}:${BRANCH_NAME}" + echo "docker push ${DOCKER_CACHE_REPO}/${DOCKER_IMG_NAME}:${BRANCH_NAME}" + docker push "${DOCKER_CACHE_REPO}/${DOCKER_IMG_NAME}:${BRANCH_NAME}" + if [[ $? != "0" ]]; then + echo "ERROR: could not update Docker cache ${DOCKER_CACHE_REPO}/${DOCKER_IMG_NAME}:${BRANCH_NAME}" + exit 1 + fi +fi + # Run the command inside the container. echo "Running '${COMMAND[*]}' inside ${DOCKER_IMG_NAME}..."