about summary refs log tree commit diff
path: root/ci
diff options
context:
space:
mode:
authorTakashi Matsuo <tmatsuo@google.com>2019-07-12T22·43-0700
committerGitHub <noreply@github.com>2019-07-12T22·43-0700
commit015e0a3dafe4f7bdd0a4360c8a07248ab34aba2c (patch)
tree0ee347c16f3f1202bbb547f6dde205bad72bbe0f /ci
parentd6e90be651ccc153840fd6a118ae6f50fb0fd9f5 (diff)
Use gcr to cache the docker images (#7)
* Use gcr to cache the docker images

* Remove sudo from docker command
Diffstat (limited to 'ci')
-rwxr-xr-xci/kokoro/create-docker-image.sh35
-rwxr-xr-xci/kokoro/define-docker-variables.sh24
-rwxr-xr-xci/kokoro/docker/build.sh81
3 files changed, 64 insertions, 76 deletions
diff --git a/ci/kokoro/create-docker-image.sh b/ci/kokoro/create-docker-image.sh
deleted file mode 100755
index 82882072fed6..000000000000
--- a/ci/kokoro/create-docker-image.sh
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/usr/bin/env bash
-# Copyright 2019 Google LLC
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-set -eu
-
-# Create a Docker image with all the dependencies necessary to build the
-# project.
-if [[ -z "${PROJECT_ROOT+x}" ]]; then
-  readonly PROJECT_ROOT="$(cd "$(dirname "$0")/../.."; pwd)"
-fi
-source "${PROJECT_ROOT}/ci/kokoro/define-docker-variables.sh"
-
-cd "${PROJECT_ROOT}"
-
-# If there's a version specific Dockerfile, we use it.
-if [[ -f "ci/kokoro/Dockerfile.${DISTRO}-${DISTRO_VERSION}" ]]; then
-  sudo docker build -t "${IMAGE}:tip" \
-      -f "ci/kokoro/Dockerfile.${DISTRO}-${DISTRO_VERSION}" ci
-else
-  sudo docker build -t "${IMAGE}:tip" \
-      --build-arg DISTRO_VERSION="${DISTRO_VERSION}" \
-      -f "ci/kokoro/Dockerfile.${DISTRO}" ci
-fi
diff --git a/ci/kokoro/define-docker-variables.sh b/ci/kokoro/define-docker-variables.sh
deleted file mode 100755
index 7a659c7a78c0..000000000000
--- a/ci/kokoro/define-docker-variables.sh
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/usr/bin/env bash
-# Copyright 2019 Google LLC
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-set -eu
-
-if [[ -n "${IMAGE+x}" ]]; then
-  echo "IMAGE is already defined."
-else
-  readonly IMAGE="apisci-${DISTRO}-${DISTRO_VERSION}"
-  readonly BUILD_OUTPUT="cmake-out/${IMAGE}-${BUILD_NAME}"
-  readonly BUILD_HOME="cmake-out/home/${IMAGE}-${BUILD_NAME}"
-fi
diff --git a/ci/kokoro/docker/build.sh b/ci/kokoro/docker/build.sh
index b42c49de29eb..87edff52879e 100755
--- a/ci/kokoro/docker/build.sh
+++ b/ci/kokoro/docker/build.sh
@@ -86,7 +86,15 @@ fi
 if [[ -z "${PROJECT_ROOT+x}" ]]; then
   readonly PROJECT_ROOT="$(cd "$(dirname "$0")/../../.."; pwd)"
 fi
-source "${PROJECT_ROOT}/ci/kokoro/define-docker-variables.sh"
+
+if [[ -z "${PROJECT_ID+x}" ]]; then
+  readonly PROJECT_ID="cloud-devrel-kokoro-resources"
+fi
+
+# Determine the image name.
+readonly IMAGE="gcr.io/${PROJECT_ID}/cpp-cmakefiles/${DISTRO}-${DISTRO_VERSION}"
+readonly BUILD_OUTPUT="cmake-out/${BUILD_NAME}"
+readonly BUILD_HOME="cmake-out/home/${BUILD_NAME}"
 
 echo "================================================================"
 cd "${PROJECT_ROOT}"
@@ -94,28 +102,66 @@ echo "Building with $(nproc) cores $(date) on ${PWD}."
 
 echo "================================================================"
 echo "Capture Docker version to troubleshoot $(date)."
-sudo docker version
+docker version
 echo "================================================================"
 
+has_cache="false"
+
+if [[ -n "${KOKORO_JOB_NAME:-}" ]]; then
+  # Download the docker image from the previous build on kokoro for speed.
+  echo "================================================================"
+  echo "Downloading Docker image $(date)."
+  gcloud auth configure-docker
+  if docker pull "${IMAGE}:latest"; then
+    echo "Existing image successfully downloaded."
+    has_cache="true"
+  fi
+  echo "================================================================"
+fi
+
+docker_build_flags=(
+  "-t" "${IMAGE}:latest"
+)
+
+if [[ -f "ci/kokoro/Dockerfile.${DISTRO}-${DISTRO_VERSION}" ]]; then
+  docker_build_flags+=("-f" "ci/kokoro/Dockerfile.${DISTRO}-${DISTRO_VERSION}")
+else
+  docker_build_flags+=(
+    "-f" "ci/kokoro/Dockerfile.${DISTRO}"
+    "--build-arg" "DISTRO_VERSION=${DISTRO_VERSION}"
+  )
+fi
+
+if "${has_cache}"; then
+  docker_build_flags+=("--cache-from=${IMAGE}:latest")
+fi
+
+update_cache="false"
 echo "================================================================"
 echo "Creating Docker image with all the development tools $(date)."
-# We do not want to print the log unless there is an error, so disable the -e
-# flag. Later, we will want to print out the emulator(s) logs *only* if there
-# is an error, so disabling from this point on is the right choice.
-set +e
-mkdir -p "${BUILD_OUTPUT}"
-readonly CREATE_DOCKER_IMAGE_LOG="${BUILD_OUTPUT}/create-build-docker-image.log"
-echo "Logging to ${CREATE_DOCKER_IMAGE_LOG}"
-if ! "${PROJECT_ROOT}/ci/retry-command.sh" \
-       "${PROJECT_ROOT}/ci/kokoro/create-docker-image.sh" \
-         >"${CREATE_DOCKER_IMAGE_LOG}" 2>&1 </dev/null; then
-  cat "${CREATE_DOCKER_IMAGE_LOG}"
-  exit 1
+if ci/retry-command.sh docker build "${docker_build_flags[@]}" ci; then
+  update_cache="true"
+  echo "Docker image created $(date)."
+  docker image ls | grep "${IMAGE}"
+else
+  echo "Failed creating Docker image $(date)."
+  if "${has_cache}"; then
+    echo "Continue the build with the cache."
+  else
+    exit 1   
+  fi
 fi
-echo "Docker image created $(date)."
-sudo docker image ls
 echo "================================================================"
 
+if [[ -n "${KOKORO_JOB_NAME:-}" ]]; then
+  # Upload the docker image for speeding up the future builds.
+  echo "================================================================"
+  echo "Uploading Docker image $(date)."
+  docker push "${IMAGE}:latest" || true
+  echo "================================================================"
+fi
+
+
 echo "================================================================"
 echo "Running the full build $(date)."
 # The default user for a Docker container has uid 0 (root). To avoid creating
@@ -130,6 +176,7 @@ fi
 
 # Make sure the user has a $HOME directory inside the Docker container.
 mkdir -p "${BUILD_HOME}"
+mkdir -p "${BUILD_OUTPUT}"
 
 # We use an array for the flags so they are easier to document.
 docker_flags=(
@@ -213,6 +260,6 @@ if [[ -t 0 ]]; then
   docker_flags+=("-it")
 fi
 
-sudo docker run "${docker_flags[@]}" "${IMAGE}:tip" \
+docker run "${docker_flags[@]}" "${IMAGE}:latest" \
     "/v/${in_docker_script}" "${CMAKE_SOURCE_DIR}" \
     "${BUILD_OUTPUT}"