From 272b9306c45c18effa5d92ef2e5bfa6263c88430 Mon Sep 17 00:00:00 2001 From: Joe Beda Date: Thu, 9 Oct 2014 14:08:34 -0700 Subject: [PATCH] Uniquify docker names If you have two repos that are both building at the same time we don't want to have them stomp on each other as they deal with docker. Work around this by hashing the KUBE_ROOT and mixing that in to the name. --- build/common.sh | 61 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 44 insertions(+), 17 deletions(-) diff --git a/build/common.sh b/build/common.sh index fd9e9cd2be0..6fdff99596b 100644 --- a/build/common.sh +++ b/build/common.sh @@ -22,6 +22,9 @@ set -o pipefail KUBE_ROOT=$(dirname "${BASH_SOURCE}")/.. cd "${KUBE_ROOT}" +# This'll canonicalize the path +KUBE_ROOT=$PWD + source hack/config-go.sh # Incoming options @@ -39,8 +42,10 @@ readonly KUBE_GCS_MAKE_PUBLIC="${KUBE_GCS_MAKE_PUBLIC:-y}" # Constants readonly KUBE_BUILD_IMAGE_REPO=kube-build -readonly KUBE_BUILD_IMAGE_TAG=build -readonly KUBE_BUILD_IMAGE="${KUBE_BUILD_IMAGE_REPO}:${KUBE_BUILD_IMAGE_TAG}" +# These get set in verify_prereqs with a unique hash based on KUBE_ROOT +# KUBE_BUILD_IMAGE_TAG= +# KUBE_BUILD_IMAGE="${KUBE_BUILD_IMAGE_REPO}:${KUBE_BUILD_IMAGE_TAG}" +# KUBE_BUILD_CONTAINER_NAME=kube-build- readonly KUBE_GO_PACKAGE="github.com/GoogleCloudPlatform/kubernetes" @@ -53,7 +58,6 @@ readonly LOCAL_OUTPUT_ROOT="${KUBE_ROOT}/_output" readonly LOCAL_OUTPUT_BUILD="${LOCAL_OUTPUT_ROOT}/build" readonly REMOTE_OUTPUT_ROOT="/go/src/${KUBE_GO_PACKAGE}/_output" readonly REMOTE_OUTPUT_DIR="${REMOTE_OUTPUT_ROOT}/build" -readonly DOCKER_CONTAINER_NAME=kube-build readonly DOCKER_MOUNT_ARGS=(--volume "${LOCAL_OUTPUT_BUILD}:${REMOTE_OUTPUT_DIR}") readonly KUBE_CLIENT_BINARIES=( @@ -88,7 +92,14 @@ readonly RELEASE_DIR="${LOCAL_OUTPUT_ROOT}/release-tars" # --------------------------------------------------------------------------- # Basic setup functions -# Verify that the right utilities and such are installed for building Kube. +# Verify that the right utilities and such are installed for building Kube. Set +# up some dynamic constants. +# +# Vars set: +# KUBE_BUILD_IMAGE_TAG +# KUBE_BUILD_IMAGE +# KUBE_BUILD_CONTAINER_NAME +# KUBE_ROOT_HASH function kube::build::verify_prereqs() { if [[ -z "$(which docker)" ]]; then echo "Can't find 'docker' in PATH, please fix and retry." >&2 @@ -122,6 +133,11 @@ function kube::build::verify_prereqs() { } >&2 return 1 fi + + KUBE_ROOT_HASH=$(kube::build::short_hash "$KUBE_ROOT") + KUBE_BUILD_IMAGE_TAG="build-${KUBE_ROOT_HASH}" + KUBE_BUILD_IMAGE="${KUBE_BUILD_IMAGE_REPO}:${KUBE_BUILD_IMAGE_TAG}" + KUBE_BUILD_CONTAINER_NAME="kube-build-${KUBE_ROOT_HASH}" } # --------------------------------------------------------------------------- @@ -181,6 +197,22 @@ function kube::build::docker_image_exists() { docker images | grep -Eq "^${1}\s+${2}\s+" } +# Takes $1 and computes a short has for it. Useful for unique tag generation +function kube::build::short_hash() { + [[ $# -eq 1 ]] || { + echo "!!! Internal error. No data based to short_hash." >&2 + exit 2 + } + + local short_hash + if which md5 >/dev/null 2>&1; then + short_hash=$(md5 -q -s "$1") + else + short_hash=$(echo -n "$1" | md5sum) + fi + echo ${short_hash:0:5} +} + # --------------------------------------------------------------------------- # Building @@ -312,18 +344,18 @@ function kube::build::run_build_command() { kube::build::prepare_output local -ra docker_cmd=( - docker run "--name=${DOCKER_CONTAINER_NAME}" + docker run "--name=${KUBE_BUILD_CONTAINER_NAME}" --interactive --tty "${DOCKER_MOUNT_ARGS[@]}" "${KUBE_BUILD_IMAGE}") # Remove the container if it is left over from some previous aborted run - docker rm "${DOCKER_CONTAINER_NAME}" >/dev/null 2>&1 || true + docker rm "${KUBE_BUILD_CONTAINER_NAME}" >/dev/null 2>&1 || true "${docker_cmd[@]}" "$@" # Remove the container after we run. '--rm' might be appropriate but it # appears that sometimes it fails. See # https://github.com/docker/docker/issues/3968 - docker rm "${DOCKER_CONTAINER_NAME}" >/dev/null 2>&1 || true + docker rm "${KUBE_BUILD_CONTAINER_NAME}" >/dev/null 2>&1 || true } # If the Docker server is remote, copy the results back out. @@ -339,11 +371,11 @@ function kube::build::copy_output() { # container pointed at the same volume, tar the output directory and ship # that tar over stdou. local -ra docker_cmd=( - docker run -a stdout "--name=${DOCKER_CONTAINER_NAME}" + docker run -a stdout "--name=${KUBE_BUILD_CONTAINER_NAME}" "${DOCKER_MOUNT_ARGS[@]}" "${KUBE_BUILD_IMAGE}") # Kill any leftover container - docker rm "${DOCKER_CONTAINER_NAME}" >/dev/null 2>&1 || true + docker rm "${KUBE_BUILD_CONTAINER_NAME}" >/dev/null 2>&1 || true echo "+++ Syncing back _output directory from boot2docker VM" rm -rf "${LOCAL_OUTPUT_BUILD}" @@ -354,13 +386,13 @@ function kube::build::copy_output() { # Remove the container after we run. '--rm' might be appropriate but it # appears that sometimes it fails. See # https://github.com/docker/docker/issues/3968 - docker rm "${DOCKER_CONTAINER_NAME}" >/dev/null 2>&1 || true + docker rm "${KUBE_BUILD_CONTAINER_NAME}" >/dev/null 2>&1 || true # I (jbeda) also tried getting rsync working using 'docker run' as the # 'remote shell'. This mostly worked but there was a hang when # closing/finishing things off. Ug. # - # local DOCKER="docker run -i --rm --name=${DOCKER_CONTAINER_NAME} ${DOCKER_MOUNT} ${KUBE_BUILD_IMAGE}" + # local DOCKER="docker run -i --rm --name=${KUBE_BUILD_CONTAINER_NAME} ${DOCKER_MOUNT} ${KUBE_BUILD_IMAGE}" # DOCKER+=" bash -c 'shift ; exec \"\$@\"' --" # rsync --blocking-io -av -e "${DOCKER}" foo:${REMOTE_OUTPUT_DIR}/ ${LOCAL_OUTPUT_BUILD} fi @@ -523,12 +555,7 @@ function kube::release::gcs::verify_prereqs() { # Create a unique bucket name for releasing Kube and make sure it exists. function kube::release::gcs::ensure_release_bucket() { local project_hash - if which md5 > /dev/null 2>&1; then - project_hash=$(md5 -q -s "$GCLOUD_PROJECT") - else - project_hash=$(echo -n "$GCLOUD_PROJECT" | md5sum) - fi - project_hash=${project_hash:0:5} + project_hash=$(kube::build::short_hash "$GCLOUD_PROJECT") KUBE_GCS_RELEASE_BUCKET=${KUBE_GCS_RELEASE_BUCKET-kubernetes-releases-${project_hash}} KUBE_GCS_RELEASE_PREFIX=${KUBE_GCS_RELEASE_PREFIX-devel/} KUBE_GCS_DOCKER_REG_PREFIX=${KUBE_GCS_DOCKER_REG_PREFIX-docker-reg/}