2014-10-14 14:51:50 +00:00
|
|
|
#!/bin/bash
|
2014-06-17 06:16:40 +00:00
|
|
|
|
2016-06-03 00:25:58 +00:00
|
|
|
# Copyright 2014 The Kubernetes Authors.
|
2014-06-17 06:16:40 +00:00
|
|
|
#
|
|
|
|
# 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.
|
|
|
|
|
2014-10-14 14:51:50 +00:00
|
|
|
# Common utilities, variables and checks for all build scripts.
|
2014-09-15 18:57:13 +00:00
|
|
|
set -o errexit
|
|
|
|
set -o nounset
|
|
|
|
set -o pipefail
|
2014-06-17 06:16:40 +00:00
|
|
|
|
2014-11-26 21:51:29 +00:00
|
|
|
DOCKER_OPTS=${DOCKER_OPTS:-""}
|
|
|
|
DOCKER_NATIVE=${DOCKER_NATIVE:-""}
|
|
|
|
DOCKER=(docker ${DOCKER_OPTS})
|
2015-02-20 23:55:39 +00:00
|
|
|
DOCKER_HOST=${DOCKER_HOST:-""}
|
2016-04-19 18:52:35 +00:00
|
|
|
DOCKER_MACHINE_NAME=${DOCKER_MACHINE_NAME:-"kube-dev"}
|
|
|
|
readonly DOCKER_MACHINE_DRIVER=${DOCKER_MACHINE_DRIVER:-"virtualbox --virtualbox-memory 4096 --virtualbox-cpu-count -1"}
|
2014-11-26 21:51:29 +00:00
|
|
|
|
2016-04-24 04:45:03 +00:00
|
|
|
# This will canonicalize the path
|
|
|
|
KUBE_ROOT=$(cd $(dirname "${BASH_SOURCE}")/.. && pwd -P)
|
2014-10-09 21:08:34 +00:00
|
|
|
|
2016-07-05 12:47:31 +00:00
|
|
|
source "${KUBE_ROOT}/hack/lib/init.sh"
|
2014-09-08 23:55:57 +00:00
|
|
|
|
2014-09-15 18:57:13 +00:00
|
|
|
# Incoming options
|
2014-10-01 18:42:45 +00:00
|
|
|
#
|
2014-10-07 20:49:18 +00:00
|
|
|
readonly KUBE_SKIP_CONFIRMATIONS="${KUBE_SKIP_CONFIRMATIONS:-n}"
|
2014-10-01 18:42:45 +00:00
|
|
|
readonly KUBE_GCS_UPLOAD_RELEASE="${KUBE_GCS_UPLOAD_RELEASE:-n}"
|
|
|
|
readonly KUBE_GCS_NO_CACHING="${KUBE_GCS_NO_CACHING:-y}"
|
|
|
|
readonly KUBE_GCS_MAKE_PUBLIC="${KUBE_GCS_MAKE_PUBLIC:-y}"
|
|
|
|
# KUBE_GCS_RELEASE_BUCKET default: kubernetes-releases-${project_hash}
|
2014-11-11 23:16:04 +00:00
|
|
|
readonly KUBE_GCS_RELEASE_PREFIX=${KUBE_GCS_RELEASE_PREFIX-devel}/
|
|
|
|
readonly KUBE_GCS_DOCKER_REG_PREFIX=${KUBE_GCS_DOCKER_REG_PREFIX-docker-reg}/
|
2015-09-30 17:15:59 +00:00
|
|
|
readonly KUBE_GCS_PUBLISH_VERSION=${KUBE_GCS_PUBLISH_VERSION:-}
|
2015-08-04 00:01:50 +00:00
|
|
|
readonly KUBE_GCS_DELETE_EXISTING="${KUBE_GCS_DELETE_EXISTING:-n}"
|
2014-09-15 18:57:13 +00:00
|
|
|
|
2016-08-15 23:20:15 +00:00
|
|
|
# Set KUBE_BUILD_PPC64LE to y to build for ppc64le in addition to other
|
|
|
|
# platforms.
|
|
|
|
# TODO(IBM): remove KUBE_BUILD_PPC64LE and reenable ppc64le compilation by
|
|
|
|
# default when
|
|
|
|
# https://github.com/kubernetes/kubernetes/issues/30384 and
|
|
|
|
# https://github.com/kubernetes/kubernetes/issues/25886 are fixed.
|
|
|
|
# The majority of the logic is in hack/lib/golang.sh.
|
|
|
|
readonly KUBE_BUILD_PPC64LE="${KUBE_BUILD_PPC64LE:-n}"
|
|
|
|
|
2014-09-15 18:57:13 +00:00
|
|
|
# Constants
|
|
|
|
readonly KUBE_BUILD_IMAGE_REPO=kube-build
|
2016-08-17 05:50:43 +00:00
|
|
|
readonly KUBE_BUILD_IMAGE_CROSS_TAG="$(cat ${KUBE_ROOT}/build/build-image/cross/VERSION)"
|
2016-02-09 03:21:44 +00:00
|
|
|
# KUBE_BUILD_DATA_CONTAINER_NAME=kube-build-data-<hash>"
|
2014-09-15 18:57:13 +00:00
|
|
|
|
2014-10-22 23:26:59 +00:00
|
|
|
# Here we map the output directories across both the local and remote _output
|
|
|
|
# directories:
|
2014-06-17 06:16:40 +00:00
|
|
|
#
|
2014-10-22 23:26:59 +00:00
|
|
|
# *_OUTPUT_ROOT - the base of all output in that environment.
|
|
|
|
# *_OUTPUT_SUBPATH - location where golang stuff is built/cached. Also
|
|
|
|
# persisted across docker runs with a volume mount.
|
|
|
|
# *_OUTPUT_BINPATH - location where final binaries are placed. If the remote
|
|
|
|
# is really remote, this is the stuff that has to be copied
|
|
|
|
# back.
|
2016-03-28 23:34:07 +00:00
|
|
|
# OUT_DIR can come in from the Makefile, so honor it.
|
|
|
|
readonly LOCAL_OUTPUT_ROOT="${KUBE_ROOT}/${OUT_DIR:-_output}"
|
2014-10-22 23:26:59 +00:00
|
|
|
readonly LOCAL_OUTPUT_SUBPATH="${LOCAL_OUTPUT_ROOT}/dockerized"
|
|
|
|
readonly LOCAL_OUTPUT_BINPATH="${LOCAL_OUTPUT_SUBPATH}/bin"
|
2016-05-15 05:58:23 +00:00
|
|
|
readonly LOCAL_OUTPUT_GOPATH="${LOCAL_OUTPUT_SUBPATH}/go"
|
2014-10-11 14:34:22 +00:00
|
|
|
readonly LOCAL_OUTPUT_IMAGE_STAGING="${LOCAL_OUTPUT_ROOT}/images"
|
2014-09-15 18:57:13 +00:00
|
|
|
|
2016-05-31 03:35:16 +00:00
|
|
|
# This is a symlink to binaries for "this platform" (e.g. build tools).
|
|
|
|
readonly THIS_PLATFORM_BIN="${LOCAL_OUTPUT_ROOT}/bin"
|
|
|
|
|
2014-10-22 23:26:59 +00:00
|
|
|
readonly REMOTE_OUTPUT_ROOT="/go/src/${KUBE_GO_PACKAGE}/_output"
|
|
|
|
readonly REMOTE_OUTPUT_SUBPATH="${REMOTE_OUTPUT_ROOT}/dockerized"
|
|
|
|
readonly REMOTE_OUTPUT_BINPATH="${REMOTE_OUTPUT_SUBPATH}/bin"
|
2016-05-15 05:58:23 +00:00
|
|
|
readonly REMOTE_OUTPUT_GOPATH="${REMOTE_OUTPUT_SUBPATH}/go"
|
2014-10-22 23:26:59 +00:00
|
|
|
|
2016-02-11 05:44:05 +00:00
|
|
|
readonly DOCKER_MOUNT_ARGS_BASE=(
|
2016-08-12 21:48:37 +00:00
|
|
|
# where the container build will drop output
|
|
|
|
--volume "${LOCAL_OUTPUT_BINPATH}:${REMOTE_OUTPUT_BINPATH}"
|
|
|
|
# timezone
|
2016-02-11 05:44:05 +00:00
|
|
|
--volume /etc/localtime:/etc/localtime:ro
|
|
|
|
)
|
2014-10-22 23:26:59 +00:00
|
|
|
|
2014-06-20 22:17:14 +00:00
|
|
|
# This is where the final release artifacts are created locally
|
2014-11-19 23:48:37 +00:00
|
|
|
readonly RELEASE_STAGE="${LOCAL_OUTPUT_ROOT}/release-stage"
|
2014-09-15 18:57:13 +00:00
|
|
|
readonly RELEASE_DIR="${LOCAL_OUTPUT_ROOT}/release-tars"
|
2015-04-30 22:25:28 +00:00
|
|
|
readonly GCS_STAGE="${LOCAL_OUTPUT_ROOT}/gcs-stage"
|
2014-06-20 22:17:14 +00:00
|
|
|
|
2016-02-07 18:35:14 +00:00
|
|
|
# Get the set of master binaries that run in Docker (on Linux)
|
2015-11-13 01:02:35 +00:00
|
|
|
# Entry format is "<name-of-binary>,<base-image>".
|
|
|
|
# Binaries are placed in /usr/local/bin inside the image.
|
2016-03-16 09:59:42 +00:00
|
|
|
#
|
2016-02-07 18:35:14 +00:00
|
|
|
# $1 - server architecture
|
|
|
|
kube::build::get_docker_wrapped_binaries() {
|
|
|
|
case $1 in
|
|
|
|
"amd64")
|
|
|
|
local targets=(
|
|
|
|
kube-apiserver,busybox
|
|
|
|
kube-controller-manager,busybox
|
|
|
|
kube-scheduler,busybox
|
2016-08-24 23:58:26 +00:00
|
|
|
kube-proxy,gcr.io/google_containers/debian-iptables-amd64:v4
|
2016-02-07 18:35:14 +00:00
|
|
|
);;
|
2016-04-04 20:33:32 +00:00
|
|
|
"arm")
|
2016-02-07 18:35:14 +00:00
|
|
|
local targets=(
|
2016-04-04 20:33:32 +00:00
|
|
|
kube-apiserver,armel/busybox
|
|
|
|
kube-controller-manager,armel/busybox
|
|
|
|
kube-scheduler,armel/busybox
|
2016-08-24 23:58:26 +00:00
|
|
|
kube-proxy,gcr.io/google_containers/debian-iptables-arm:v4
|
2016-02-07 18:35:14 +00:00
|
|
|
);;
|
|
|
|
"arm64")
|
|
|
|
local targets=(
|
|
|
|
kube-apiserver,aarch64/busybox
|
|
|
|
kube-controller-manager,aarch64/busybox
|
|
|
|
kube-scheduler,aarch64/busybox
|
2016-08-24 23:58:26 +00:00
|
|
|
kube-proxy,gcr.io/google_containers/debian-iptables-arm64:v4
|
2016-02-07 18:35:14 +00:00
|
|
|
);;
|
|
|
|
"ppc64le")
|
|
|
|
local targets=(
|
|
|
|
kube-apiserver,ppc64le/busybox
|
|
|
|
kube-controller-manager,ppc64le/busybox
|
|
|
|
kube-scheduler,ppc64le/busybox
|
2016-08-24 23:58:26 +00:00
|
|
|
kube-proxy,gcr.io/google_containers/debian-iptables-ppc64le:v4
|
2016-02-07 18:35:14 +00:00
|
|
|
);;
|
|
|
|
esac
|
|
|
|
|
|
|
|
echo "${targets[@]}"
|
|
|
|
}
|
2015-03-07 01:41:03 +00:00
|
|
|
|
2014-06-20 18:08:50 +00:00
|
|
|
# ---------------------------------------------------------------------------
|
|
|
|
# Basic setup functions
|
|
|
|
|
2016-02-07 18:35:14 +00:00
|
|
|
# Verify that the right utilities and such are installed for building Kube. Set
|
2014-10-09 21:08:34 +00:00
|
|
|
# up some dynamic constants.
|
|
|
|
#
|
|
|
|
# Vars set:
|
2014-10-22 23:26:59 +00:00
|
|
|
# KUBE_ROOT_HASH
|
2014-10-09 21:08:34 +00:00
|
|
|
# KUBE_BUILD_IMAGE_TAG
|
|
|
|
# KUBE_BUILD_IMAGE
|
|
|
|
# KUBE_BUILD_CONTAINER_NAME
|
2014-10-22 23:26:59 +00:00
|
|
|
# KUBE_BUILD_DATA_CONTAINER_NAME
|
|
|
|
# DOCKER_MOUNT_ARGS
|
2016-02-11 01:57:45 +00:00
|
|
|
# LOCAL_OUTPUT_BUILD_CONTEXT
|
2014-09-09 22:03:32 +00:00
|
|
|
function kube::build::verify_prereqs() {
|
2015-03-25 22:57:14 +00:00
|
|
|
kube::log::status "Verifying Prerequisites...."
|
2015-08-06 19:32:31 +00:00
|
|
|
kube::build::ensure_tar || return 1
|
2015-08-24 03:11:29 +00:00
|
|
|
kube::build::ensure_docker_in_path || return 1
|
|
|
|
if kube::build::is_osx; then
|
|
|
|
kube::build::docker_available_on_osx || return 1
|
2014-06-20 00:02:54 +00:00
|
|
|
fi
|
2015-08-24 03:11:29 +00:00
|
|
|
kube::build::ensure_docker_daemon_connectivity || return 1
|
2014-10-09 21:08:34 +00:00
|
|
|
|
2016-05-02 22:00:07 +00:00
|
|
|
KUBE_ROOT_HASH=$(kube::build::short_hash "${HOSTNAME:-}:${KUBE_ROOT}")
|
2014-10-09 21:08:34 +00:00
|
|
|
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}"
|
2014-10-22 23:26:59 +00:00
|
|
|
KUBE_BUILD_DATA_CONTAINER_NAME="kube-build-data-${KUBE_ROOT_HASH}"
|
|
|
|
DOCKER_MOUNT_ARGS=("${DOCKER_MOUNT_ARGS_BASE[@]}" --volumes-from "${KUBE_BUILD_DATA_CONTAINER_NAME}")
|
2016-02-11 01:57:45 +00:00
|
|
|
LOCAL_OUTPUT_BUILD_CONTEXT="${LOCAL_OUTPUT_IMAGE_STAGING}/${KUBE_BUILD_IMAGE}"
|
2014-06-20 00:02:54 +00:00
|
|
|
}
|
|
|
|
|
2014-09-15 18:57:13 +00:00
|
|
|
# ---------------------------------------------------------------------------
|
|
|
|
# Utility functions
|
|
|
|
|
2015-08-24 03:11:29 +00:00
|
|
|
function kube::build::docker_available_on_osx() {
|
|
|
|
if [[ -z "${DOCKER_HOST}" ]]; then
|
2016-06-22 12:40:55 +00:00
|
|
|
if [[ -S "/var/run/docker.sock" ]]; then
|
|
|
|
kube::log::status "Using Docker for MacOS"
|
|
|
|
return 0
|
|
|
|
fi
|
2016-07-18 18:10:12 +00:00
|
|
|
|
2015-08-24 03:11:29 +00:00
|
|
|
kube::log::status "No docker host is set. Checking options for setting one..."
|
|
|
|
if [[ -z "$(which docker-machine)" && -z "$(which boot2docker)" ]]; then
|
2016-07-07 17:52:38 +00:00
|
|
|
kube::log::status "It looks like you're running Mac OS X, yet none of Docker for Mac, docker-machine or boot2docker are on the path."
|
2015-08-24 03:11:29 +00:00
|
|
|
kube::log::status "See: https://docs.docker.com/machine/ for installation instructions."
|
|
|
|
return 1
|
|
|
|
elif [[ -n "$(which docker-machine)" ]]; then
|
|
|
|
kube::build::prepare_docker_machine
|
|
|
|
elif [[ -n "$(which boot2docker)" ]]; then
|
|
|
|
kube::build::prepare_boot2docker
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
function kube::build::prepare_docker_machine() {
|
|
|
|
kube::log::status "docker-machine was found."
|
2016-04-19 18:52:35 +00:00
|
|
|
docker-machine inspect "${DOCKER_MACHINE_NAME}" &> /dev/null || {
|
2015-08-24 03:11:29 +00:00
|
|
|
kube::log::status "Creating a machine to build Kubernetes"
|
2016-04-19 18:52:35 +00:00
|
|
|
docker-machine create --driver ${DOCKER_MACHINE_DRIVER} \
|
2016-03-03 05:03:35 +00:00
|
|
|
--engine-env HTTP_PROXY="${KUBERNETES_HTTP_PROXY:-}" \
|
|
|
|
--engine-env HTTPS_PROXY="${KUBERNETES_HTTPS_PROXY:-}" \
|
|
|
|
--engine-env NO_PROXY="${KUBERNETES_NO_PROXY:-127.0.0.1}" \
|
2016-02-04 09:38:07 +00:00
|
|
|
"${DOCKER_MACHINE_NAME}" > /dev/null || {
|
2015-08-24 03:11:29 +00:00
|
|
|
kube::log::error "Something went wrong creating a machine."
|
|
|
|
kube::log::error "Try the following: "
|
2016-01-08 18:55:31 +00:00
|
|
|
kube::log::error "docker-machine create -d ${DOCKER_MACHINE_DRIVER} ${DOCKER_MACHINE_NAME}"
|
2015-08-24 03:11:29 +00:00
|
|
|
return 1
|
|
|
|
}
|
|
|
|
}
|
2016-04-19 18:52:35 +00:00
|
|
|
docker-machine start "${DOCKER_MACHINE_NAME}" &> /dev/null
|
2016-01-08 18:55:31 +00:00
|
|
|
# it takes `docker-machine env` a few seconds to work if the machine was just started
|
2016-04-29 18:35:57 +00:00
|
|
|
local docker_machine_out
|
|
|
|
while ! docker_machine_out=$(docker-machine env "${DOCKER_MACHINE_NAME}" 2>&1); do
|
|
|
|
if [[ ${docker_machine_out} =~ "Error checking TLS connection" ]]; then
|
|
|
|
echo ${docker_machine_out}
|
|
|
|
docker-machine regenerate-certs ${DOCKER_MACHINE_NAME}
|
|
|
|
else
|
|
|
|
sleep 1
|
|
|
|
fi
|
2016-01-08 18:55:31 +00:00
|
|
|
done
|
|
|
|
eval $(docker-machine env "${DOCKER_MACHINE_NAME}")
|
|
|
|
kube::log::status "A Docker host using docker-machine named '${DOCKER_MACHINE_NAME}' is ready to go!"
|
2015-08-24 03:11:29 +00:00
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
|
|
|
function kube::build::prepare_boot2docker() {
|
|
|
|
kube::log::status "boot2docker cli has been deprecated in favor of docker-machine."
|
|
|
|
kube::log::status "See: https://github.com/boot2docker/boot2docker-cli for more details."
|
|
|
|
if [[ $(boot2docker status) != "running" ]]; then
|
|
|
|
kube::log::status "boot2docker isn't running. We'll try to start it."
|
|
|
|
boot2docker up || {
|
|
|
|
kube::log::error "Can't start boot2docker."
|
|
|
|
kube::log::error "You may need to 'boot2docker init' to create your VM."
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
fi
|
|
|
|
|
|
|
|
# Reach over and set the clock. After sleep/resume the clock will skew.
|
|
|
|
kube::log::status "Setting boot2docker clock"
|
|
|
|
boot2docker ssh sudo date -u -D "%Y%m%d%H%M.%S" --set "$(date -u +%Y%m%d%H%M.%S)" >/dev/null
|
|
|
|
|
|
|
|
kube::log::status "Setting boot2docker env variables"
|
|
|
|
$(boot2docker shellinit)
|
|
|
|
kube::log::status "boot2docker-vm has been successfully started."
|
|
|
|
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
2014-09-15 18:57:13 +00:00
|
|
|
function kube::build::is_osx() {
|
2014-10-14 14:51:50 +00:00
|
|
|
[[ "$(uname)" == "Darwin" ]]
|
2014-09-15 18:57:13 +00:00
|
|
|
}
|
|
|
|
|
2016-07-07 17:52:00 +00:00
|
|
|
function kube::build::is_gnu_sed() {
|
|
|
|
[[ $(sed --version 2>&1) == *GNU* ]]
|
|
|
|
}
|
|
|
|
|
2016-02-04 09:38:07 +00:00
|
|
|
function kube::build::update_dockerfile() {
|
2016-07-07 17:52:00 +00:00
|
|
|
if kube::build::is_gnu_sed; then
|
2016-02-06 08:49:35 +00:00
|
|
|
sed_opts=(-i)
|
2016-07-07 17:52:00 +00:00
|
|
|
else
|
|
|
|
sed_opts=(-i '')
|
2016-02-04 09:38:07 +00:00
|
|
|
fi
|
2016-03-03 05:03:35 +00:00
|
|
|
sed "${sed_opts[@]}" "s/KUBE_BUILD_IMAGE_CROSS_TAG/${KUBE_BUILD_IMAGE_CROSS_TAG}/" "${LOCAL_OUTPUT_BUILD_CONTEXT}/Dockerfile"
|
2016-02-04 09:38:07 +00:00
|
|
|
}
|
|
|
|
|
2015-08-24 03:11:29 +00:00
|
|
|
function kube::build::ensure_docker_in_path() {
|
|
|
|
if [[ -z "$(which docker)" ]]; then
|
|
|
|
kube::log::error "Can't find 'docker' in PATH, please fix and retry."
|
|
|
|
kube::log::error "See https://docs.docker.com/installation/#installation for installation instructions."
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
function kube::build::ensure_docker_daemon_connectivity {
|
|
|
|
if ! "${DOCKER[@]}" info > /dev/null 2>&1 ; then
|
|
|
|
{
|
|
|
|
echo "Can't connect to 'docker' daemon. please fix and retry."
|
|
|
|
echo
|
|
|
|
echo "Possible causes:"
|
|
|
|
echo " - On Mac OS X, DOCKER_HOST hasn't been set. You may need to: "
|
|
|
|
echo " - Create and start your VM using docker-machine or boot2docker: "
|
2016-01-08 18:55:31 +00:00
|
|
|
echo " - docker-machine create -d ${DOCKER_MACHINE_DRIVER} ${DOCKER_MACHINE_NAME}"
|
2015-08-24 03:11:29 +00:00
|
|
|
echo " - boot2docker init && boot2docker start"
|
|
|
|
echo " - Set your environment variables using: "
|
2016-01-08 18:55:31 +00:00
|
|
|
echo " - eval \$(docker-machine env ${DOCKER_MACHINE_NAME})"
|
2015-08-24 03:11:29 +00:00
|
|
|
echo " - \$(boot2docker shellinit)"
|
2016-06-22 21:27:41 +00:00
|
|
|
echo " - Update your Docker VM"
|
|
|
|
echo " - Error Message: 'Error response from daemon: client is newer than server (...)' "
|
|
|
|
echo " - docker-machine upgrade ${DOCKER_MACHINE_NAME}"
|
2015-08-24 03:11:29 +00:00
|
|
|
echo " - On Linux, user isn't in 'docker' group. Add and relogin."
|
|
|
|
echo " - Something like 'sudo usermod -a -G docker ${USER-user}'"
|
|
|
|
echo " - RHEL7 bug and workaround: https://bugzilla.redhat.com/show_bug.cgi?id=1119282#c8"
|
|
|
|
echo " - On Linux, Docker daemon hasn't been started or has crashed."
|
|
|
|
} >&2
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2015-07-02 19:44:11 +00:00
|
|
|
function kube::build::ensure_tar() {
|
|
|
|
if [[ -n "${TAR:-}" ]]; then
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
|
|
|
|
# Find gnu tar if it is available, bomb out if not.
|
|
|
|
TAR=tar
|
|
|
|
if which gtar &>/dev/null; then
|
|
|
|
TAR=gtar
|
|
|
|
else
|
|
|
|
if which gnutar &>/dev/null; then
|
|
|
|
TAR=gnutar
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
if ! "${TAR}" --version | grep -q GNU; then
|
|
|
|
echo " !!! Cannot find GNU tar. Build on Linux or install GNU tar"
|
|
|
|
echo " on Mac OS X (brew install gnu-tar)."
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2014-09-15 18:57:13 +00:00
|
|
|
function kube::build::clean_output() {
|
|
|
|
# Clean out the output directory if it exists.
|
2015-01-06 19:36:35 +00:00
|
|
|
if kube::build::has_docker ; then
|
|
|
|
if kube::build::build_image_built ; then
|
2015-03-25 22:57:14 +00:00
|
|
|
kube::log::status "Cleaning out _output/dockerized/bin/ via docker build image"
|
2015-01-06 19:36:35 +00:00
|
|
|
kube::build::run_build_command bash -c "rm -rf '${REMOTE_OUTPUT_BINPATH}'/*"
|
|
|
|
else
|
2015-03-25 22:57:14 +00:00
|
|
|
kube::log::error "Build image not built. Cannot clean via docker build image."
|
2015-01-06 19:36:35 +00:00
|
|
|
fi
|
2014-09-15 18:57:13 +00:00
|
|
|
|
2016-06-08 15:28:45 +00:00
|
|
|
kube::log::status "Removing data container ${KUBE_BUILD_DATA_CONTAINER_NAME}"
|
2015-01-06 19:36:35 +00:00
|
|
|
"${DOCKER[@]}" rm -v "${KUBE_BUILD_DATA_CONTAINER_NAME}" >/dev/null 2>&1 || true
|
|
|
|
fi
|
2014-10-22 23:26:59 +00:00
|
|
|
|
2016-06-08 15:28:45 +00:00
|
|
|
kube::log::status "Removing _output directory"
|
2014-09-15 18:57:13 +00:00
|
|
|
rm -rf "${LOCAL_OUTPUT_ROOT}"
|
|
|
|
}
|
|
|
|
|
2014-10-09 19:52:32 +00:00
|
|
|
# Make sure the _output directory is created and mountable by docker
|
|
|
|
function kube::build::prepare_output() {
|
2016-05-20 15:39:40 +00:00
|
|
|
# See auto-creation of host mounts: https://github.com/docker/docker/pull/21666
|
|
|
|
# if selinux is enabled, docker run -v /foo:/foo:Z will not autocreate the host dir
|
2014-10-22 23:26:59 +00:00
|
|
|
mkdir -p "${LOCAL_OUTPUT_SUBPATH}"
|
2016-05-20 15:39:40 +00:00
|
|
|
mkdir -p "${LOCAL_OUTPUT_BINPATH}"
|
2014-10-09 19:52:32 +00:00
|
|
|
# On RHEL/Fedora SELinux is enabled by default and currently breaks docker
|
|
|
|
# volume mounts. We can work around this by explicitly adding a security
|
|
|
|
# context to the _output directory.
|
2016-04-22 13:06:47 +00:00
|
|
|
# Details: http://www.projectatomic.io/blog/2015/06/using-volumes-with-docker-can-cause-problems-with-selinux/
|
2014-11-24 19:44:01 +00:00
|
|
|
if which selinuxenabled &>/dev/null && \
|
2014-10-09 19:52:32 +00:00
|
|
|
selinuxenabled && \
|
|
|
|
which chcon >/dev/null ; then
|
|
|
|
if [[ ! $(ls -Zd "${LOCAL_OUTPUT_ROOT}") =~ svirt_sandbox_file_t ]] ; then
|
2015-03-25 22:57:14 +00:00
|
|
|
kube::log::status "Applying SELinux policy to '_output' directory."
|
2014-11-12 21:52:38 +00:00
|
|
|
if ! chcon -Rt svirt_sandbox_file_t "${LOCAL_OUTPUT_ROOT}"; then
|
|
|
|
echo " ***Failed***. This may be because you have root owned files under _output."
|
|
|
|
echo " Continuing, but this build may fail later if SELinux prevents access."
|
|
|
|
fi
|
2014-10-09 19:52:32 +00:00
|
|
|
fi
|
2016-04-22 13:06:47 +00:00
|
|
|
number=${#DOCKER_MOUNT_ARGS[@]}
|
|
|
|
for (( i=0; i<number; i++ )); do
|
|
|
|
if [[ "${DOCKER_MOUNT_ARGS[i]}" =~ "${KUBE_ROOT}" ]]; then
|
2016-05-20 15:39:40 +00:00
|
|
|
## Ensure we don't label the argument multiple times
|
|
|
|
if [[ ! "${DOCKER_MOUNT_ARGS[i]}" == *:Z ]]; then
|
|
|
|
DOCKER_MOUNT_ARGS[i]="${DOCKER_MOUNT_ARGS[i]}:Z"
|
|
|
|
fi
|
2016-04-22 13:06:47 +00:00
|
|
|
fi
|
|
|
|
done
|
2014-10-09 19:52:32 +00:00
|
|
|
fi
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2015-01-06 19:36:35 +00:00
|
|
|
function kube::build::has_docker() {
|
|
|
|
which docker &> /dev/null
|
|
|
|
}
|
|
|
|
|
2014-10-07 20:49:18 +00:00
|
|
|
# Detect if a specific image exists
|
|
|
|
#
|
|
|
|
# $1 - image repo name
|
|
|
|
# #2 - image tag
|
|
|
|
function kube::build::docker_image_exists() {
|
|
|
|
[[ -n $1 && -n $2 ]] || {
|
2015-03-25 22:57:14 +00:00
|
|
|
kube::log::error "Internal error. Image not specified in docker_image_exists."
|
2014-10-07 20:49:18 +00:00
|
|
|
exit 2
|
|
|
|
}
|
|
|
|
|
|
|
|
# We cannot just specify the IMAGE here as `docker images` doesn't behave as
|
|
|
|
# expected. See: https://github.com/docker/docker/issues/8048
|
2015-07-07 12:09:45 +00:00
|
|
|
"${DOCKER[@]}" images | grep -Eq "^(\S+/)?${1}\s+${2}\s+"
|
2014-10-07 20:49:18 +00:00
|
|
|
}
|
|
|
|
|
2014-10-09 21:08:34 +00:00
|
|
|
# Takes $1 and computes a short has for it. Useful for unique tag generation
|
|
|
|
function kube::build::short_hash() {
|
|
|
|
[[ $# -eq 1 ]] || {
|
2015-03-25 22:57:14 +00:00
|
|
|
kube::log::error "Internal error. No data based to short_hash."
|
2014-10-09 21:08:34 +00:00
|
|
|
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
|
2015-04-30 22:25:28 +00:00
|
|
|
echo ${short_hash:0:10}
|
2014-10-09 21:08:34 +00:00
|
|
|
}
|
|
|
|
|
2014-12-06 17:11:46 +00:00
|
|
|
# Pedantically kill, wait-on and remove a container. The -f -v options
|
|
|
|
# to rm don't actually seem to get the job done, so force kill the
|
|
|
|
# container, wait to ensure it's stopped, then try the remove. This is
|
|
|
|
# a workaround for bug https://github.com/docker/docker/issues/3968.
|
|
|
|
function kube::build::destroy_container() {
|
|
|
|
"${DOCKER[@]}" kill "$1" >/dev/null 2>&1 || true
|
|
|
|
"${DOCKER[@]}" wait "$1" >/dev/null 2>&1 || true
|
|
|
|
"${DOCKER[@]}" rm -f -v "$1" >/dev/null 2>&1 || true
|
|
|
|
}
|
|
|
|
|
2015-10-09 17:59:21 +00:00
|
|
|
# Validate a ci version
|
|
|
|
#
|
|
|
|
# Globals:
|
|
|
|
# None
|
|
|
|
# Arguments:
|
|
|
|
# version
|
|
|
|
# Returns:
|
|
|
|
# If version is a valid ci version
|
2016-04-01 20:50:56 +00:00
|
|
|
# Sets: (e.g. for '1.2.3-alpha.4.56+abcdef12345678')
|
2015-11-18 23:52:15 +00:00
|
|
|
# VERSION_MAJOR (e.g. '1')
|
|
|
|
# VERSION_MINOR (e.g. '2')
|
|
|
|
# VERSION_PATCH (e.g. '3')
|
|
|
|
# VERSION_PRERELEASE (e.g. 'alpha')
|
|
|
|
# VERSION_PRERELEASE_REV (e.g. '4')
|
2016-04-01 20:50:56 +00:00
|
|
|
# VERSION_BUILD_INFO (e.g. '.56+abcdef12345678')
|
2015-11-18 23:52:15 +00:00
|
|
|
# VERSION_COMMITS (e.g. '56')
|
2015-10-09 17:59:21 +00:00
|
|
|
function kube::release::parse_and_validate_ci_version() {
|
2016-04-01 20:50:56 +00:00
|
|
|
# Accept things like "v1.2.3-alpha.4.56+abcdef12345678" or "v1.2.3-beta.4"
|
|
|
|
local -r version_regex="^v(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)-(beta|alpha)\\.(0|[1-9][0-9]*)(\\.(0|[1-9][0-9]*)\\+[0-9a-f]{7,40})?$"
|
2015-10-09 17:59:21 +00:00
|
|
|
local -r version="${1-}"
|
|
|
|
[[ "${version}" =~ ${version_regex} ]] || {
|
2015-11-05 23:30:59 +00:00
|
|
|
kube::log::error "Invalid ci version: '${version}', must match regex ${version_regex}"
|
2015-10-09 17:59:21 +00:00
|
|
|
return 1
|
|
|
|
}
|
2015-11-18 23:52:15 +00:00
|
|
|
VERSION_MAJOR="${BASH_REMATCH[1]}"
|
|
|
|
VERSION_MINOR="${BASH_REMATCH[2]}"
|
|
|
|
VERSION_PATCH="${BASH_REMATCH[3]}"
|
|
|
|
VERSION_PRERELEASE="${BASH_REMATCH[4]}"
|
|
|
|
VERSION_PRERELEASE_REV="${BASH_REMATCH[5]}"
|
|
|
|
VERSION_BUILD_INFO="${BASH_REMATCH[6]}"
|
|
|
|
VERSION_COMMITS="${BASH_REMATCH[7]}"
|
2015-10-09 17:59:21 +00:00
|
|
|
}
|
2014-12-06 17:11:46 +00:00
|
|
|
|
2014-06-20 18:08:50 +00:00
|
|
|
# ---------------------------------------------------------------------------
|
|
|
|
# Building
|
2014-06-17 06:16:40 +00:00
|
|
|
|
2014-09-15 18:57:13 +00:00
|
|
|
function kube::build::build_image_built() {
|
2014-10-07 20:49:18 +00:00
|
|
|
kube::build::docker_image_exists "${KUBE_BUILD_IMAGE_REPO}" "${KUBE_BUILD_IMAGE_TAG}"
|
|
|
|
}
|
|
|
|
|
2015-06-10 20:30:10 +00:00
|
|
|
# The set of source targets to include in the kube-build image
|
|
|
|
function kube::build::source_targets() {
|
|
|
|
local targets=(
|
2016-05-31 01:47:04 +00:00
|
|
|
$(find . -mindepth 1 -maxdepth 1 -not \( \
|
|
|
|
\( -path ./_\* -o -path ./.git\* \) -prune \
|
|
|
|
\))
|
2014-09-08 23:12:38 +00:00
|
|
|
)
|
2015-06-10 20:30:10 +00:00
|
|
|
echo "${targets[@]}"
|
|
|
|
}
|
|
|
|
|
|
|
|
# Set up the context directory for the kube-build image and build it.
|
|
|
|
function kube::build::build_image() {
|
2015-07-02 19:44:11 +00:00
|
|
|
kube::build::ensure_tar
|
|
|
|
|
2016-02-11 01:57:45 +00:00
|
|
|
mkdir -p "${LOCAL_OUTPUT_BUILD_CONTEXT}"
|
|
|
|
"${TAR}" czf "${LOCAL_OUTPUT_BUILD_CONTEXT}/kube-source.tar.gz" $(kube::build::source_targets)
|
2014-10-22 23:26:59 +00:00
|
|
|
|
|
|
|
kube::version::get_version_vars
|
2016-02-11 01:57:45 +00:00
|
|
|
kube::version::save_version_vars "${LOCAL_OUTPUT_BUILD_CONTEXT}/kube-version-defs"
|
2014-10-22 23:26:59 +00:00
|
|
|
|
2016-02-11 01:57:45 +00:00
|
|
|
cp build/build-image/Dockerfile "${LOCAL_OUTPUT_BUILD_CONTEXT}/Dockerfile"
|
2016-02-04 09:38:07 +00:00
|
|
|
kube::build::update_dockerfile
|
|
|
|
|
2016-02-11 01:57:45 +00:00
|
|
|
kube::build::docker_build "${KUBE_BUILD_IMAGE}" "${LOCAL_OUTPUT_BUILD_CONTEXT}" 'false'
|
2014-06-20 00:02:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
# Build a docker image from a Dockerfile.
|
|
|
|
# $1 is the name of the image to build
|
|
|
|
# $2 is the location of the "context" directory, with the Dockerfile at the root.
|
2016-01-20 01:28:48 +00:00
|
|
|
# $3 is the value to set the --pull flag for docker build; true by default
|
2014-09-09 22:03:32 +00:00
|
|
|
function kube::build::docker_build() {
|
|
|
|
local -r image=$1
|
|
|
|
local -r context_dir=$2
|
2016-01-20 01:28:48 +00:00
|
|
|
local -r pull="${3:-true}"
|
|
|
|
local -ra build_cmd=("${DOCKER[@]}" build -t "${image}" "--pull=${pull}" "${context_dir}")
|
2014-06-20 00:02:54 +00:00
|
|
|
|
2016-06-08 15:28:45 +00:00
|
|
|
kube::log::status "Building Docker image ${image}"
|
2014-10-01 16:37:45 +00:00
|
|
|
local docker_output
|
2014-10-06 20:25:27 +00:00
|
|
|
docker_output=$("${build_cmd[@]}" 2>&1) || {
|
|
|
|
cat <<EOF >&2
|
|
|
|
+++ Docker build command failed for ${image}
|
|
|
|
|
|
|
|
${docker_output}
|
|
|
|
|
|
|
|
To retry manually, run:
|
|
|
|
|
|
|
|
${build_cmd[*]}
|
|
|
|
|
|
|
|
EOF
|
2014-06-17 06:16:40 +00:00
|
|
|
return 1
|
2014-10-06 20:25:27 +00:00
|
|
|
}
|
2014-06-20 00:02:54 +00:00
|
|
|
}
|
|
|
|
|
2014-09-09 22:03:32 +00:00
|
|
|
function kube::build::clean_image() {
|
|
|
|
local -r image=$1
|
2014-09-08 23:12:38 +00:00
|
|
|
|
2015-03-25 22:57:14 +00:00
|
|
|
kube::log::status "Deleting docker image ${image}"
|
2014-11-26 21:51:29 +00:00
|
|
|
"${DOCKER[@]}" rmi ${image} 2> /dev/null || true
|
2014-09-08 23:12:38 +00:00
|
|
|
}
|
|
|
|
|
2014-09-15 18:57:13 +00:00
|
|
|
function kube::build::clean_images() {
|
2015-01-06 19:36:35 +00:00
|
|
|
kube::build::has_docker || return 0
|
|
|
|
|
2014-09-15 18:57:13 +00:00
|
|
|
kube::build::clean_image "${KUBE_BUILD_IMAGE}"
|
|
|
|
|
2015-03-25 22:57:14 +00:00
|
|
|
kube::log::status "Cleaning all other untagged docker images"
|
2014-11-26 21:51:29 +00:00
|
|
|
"${DOCKER[@]}" rmi $("${DOCKER[@]}" images -q --filter 'dangling=true') 2> /dev/null || true
|
2014-09-15 18:57:13 +00:00
|
|
|
}
|
|
|
|
|
2014-10-22 23:26:59 +00:00
|
|
|
function kube::build::ensure_data_container() {
|
2016-05-15 05:58:23 +00:00
|
|
|
# If the data container exists AND exited successfully, we can use it.
|
|
|
|
# Otherwise nuke it and start over.
|
|
|
|
local ret=0
|
|
|
|
local code=$(docker inspect \
|
|
|
|
-f '{{.State.ExitCode}}' \
|
|
|
|
"${KUBE_BUILD_DATA_CONTAINER_NAME}" 2>/dev/null || ret=$?)
|
|
|
|
if [[ "${ret}" == 0 && "${code}" != 0 ]]; then
|
|
|
|
kube::build::destroy_container "${KUBE_BUILD_DATA_CONTAINER_NAME}"
|
|
|
|
ret=1
|
|
|
|
fi
|
|
|
|
if [[ "${ret}" != 0 ]]; then
|
2016-06-08 15:28:45 +00:00
|
|
|
kube::log::status "Creating data container ${KUBE_BUILD_DATA_CONTAINER_NAME}"
|
2016-05-15 05:58:23 +00:00
|
|
|
# We have to ensure the directory exists, or else the docker run will
|
|
|
|
# create it as root.
|
|
|
|
mkdir -p "${LOCAL_OUTPUT_GOPATH}"
|
|
|
|
# We want this to run as root to be able to chown, so non-root users can
|
|
|
|
# later use the result as a data container. This run both creates the data
|
|
|
|
# container and chowns the GOPATH.
|
2014-10-22 23:26:59 +00:00
|
|
|
local -ra docker_cmd=(
|
2014-11-26 21:51:29 +00:00
|
|
|
"${DOCKER[@]}" run
|
2014-10-22 23:26:59 +00:00
|
|
|
--name "${KUBE_BUILD_DATA_CONTAINER_NAME}"
|
2016-06-08 15:31:35 +00:00
|
|
|
--hostname "${HOSTNAME}"
|
2016-08-12 21:48:37 +00:00
|
|
|
--volume "${REMOTE_OUTPUT_ROOT}" # white-out the whole output dir
|
|
|
|
--volume "${REMOTE_OUTPUT_GOPATH}" # make a non-root owned mountpoint
|
2014-10-22 23:26:59 +00:00
|
|
|
"${KUBE_BUILD_IMAGE}"
|
2016-08-12 21:48:37 +00:00
|
|
|
chown -R $(id -u).$(id -g) "${REMOTE_OUTPUT_ROOT}"
|
2014-10-22 23:26:59 +00:00
|
|
|
)
|
|
|
|
"${docker_cmd[@]}"
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2014-06-17 06:16:40 +00:00
|
|
|
# Run a command in the kube-build image. This assumes that the image has
|
|
|
|
# already been built. This will sync out all output data from the build.
|
2014-09-09 22:03:32 +00:00
|
|
|
function kube::build::run_build_command() {
|
2015-03-25 22:57:14 +00:00
|
|
|
kube::log::status "Running build command...."
|
2016-05-05 20:43:14 +00:00
|
|
|
[[ $# != 0 ]] || { echo "Invalid input - please specify a command to run." >&2; return 4; }
|
2014-06-17 06:16:40 +00:00
|
|
|
|
2014-10-22 23:26:59 +00:00
|
|
|
kube::build::ensure_data_container
|
2014-10-09 19:52:32 +00:00
|
|
|
kube::build::prepare_output
|
|
|
|
|
2014-10-10 20:33:11 +00:00
|
|
|
local -a docker_run_opts=(
|
|
|
|
"--name=${KUBE_BUILD_CONTAINER_NAME}"
|
2016-05-12 06:55:21 +00:00
|
|
|
"--user=$(id -u):$(id -g)"
|
2016-06-08 15:31:35 +00:00
|
|
|
"--hostname=${HOSTNAME}"
|
2015-06-10 20:30:10 +00:00
|
|
|
"${DOCKER_MOUNT_ARGS[@]}"
|
|
|
|
)
|
|
|
|
|
|
|
|
if [ -n "${KUBERNETES_CONTRIB:-}" ]; then
|
|
|
|
docker_run_opts+=(-e "KUBERNETES_CONTRIB=${KUBERNETES_CONTRIB}")
|
|
|
|
fi
|
2014-10-10 20:33:11 +00:00
|
|
|
|
2016-02-18 23:35:23 +00:00
|
|
|
docker_run_opts+=(
|
|
|
|
--env "KUBE_FASTBUILD=${KUBE_FASTBUILD:-false}"
|
|
|
|
--env "KUBE_BUILDER_OS=${OSTYPE:-notdetected}"
|
2016-08-15 23:20:15 +00:00
|
|
|
--env "KUBE_BUILD_PPC64LE=${KUBE_BUILD_PPC64LE}" # TODO(IBM): remove
|
2016-02-18 23:35:23 +00:00
|
|
|
)
|
|
|
|
|
2014-10-10 20:33:11 +00:00
|
|
|
# If we have stdin we can run interactive. This allows things like 'shell.sh'
|
|
|
|
# to work. However, if we run this way and don't have stdin, then it ends up
|
|
|
|
# running in a daemon-ish mode. So if we don't have a stdin, we explicitly
|
|
|
|
# attach stderr/stdout but don't bother asking for a tty.
|
|
|
|
if [[ -t 0 ]]; then
|
|
|
|
docker_run_opts+=(--interactive --tty)
|
|
|
|
else
|
|
|
|
docker_run_opts+=(--attach=stdout --attach=stderr)
|
|
|
|
fi
|
|
|
|
|
2014-10-06 20:25:27 +00:00
|
|
|
local -ra docker_cmd=(
|
2014-11-26 21:51:29 +00:00
|
|
|
"${DOCKER[@]}" run "${docker_run_opts[@]}" "${KUBE_BUILD_IMAGE}")
|
2014-06-17 06:16:40 +00:00
|
|
|
|
2014-12-06 17:11:46 +00:00
|
|
|
# Clean up container from any previous run
|
|
|
|
kube::build::destroy_container "${KUBE_BUILD_CONTAINER_NAME}"
|
2014-10-06 20:25:27 +00:00
|
|
|
"${docker_cmd[@]}" "$@"
|
2014-12-06 17:11:46 +00:00
|
|
|
kube::build::destroy_container "${KUBE_BUILD_CONTAINER_NAME}"
|
2014-06-17 06:16:40 +00:00
|
|
|
}
|
|
|
|
|
2014-10-17 20:56:16 +00:00
|
|
|
# Test if the output directory is remote (and can only be accessed through
|
|
|
|
# docker) or if it is "local" and we can access the output without going through
|
|
|
|
# docker.
|
|
|
|
function kube::build::is_output_remote() {
|
2014-10-22 23:26:59 +00:00
|
|
|
rm -f "${LOCAL_OUTPUT_SUBPATH}/test_for_remote"
|
|
|
|
kube::build::run_build_command touch "${REMOTE_OUTPUT_BINPATH}/test_for_remote"
|
2014-10-17 20:56:16 +00:00
|
|
|
|
2014-10-22 23:26:59 +00:00
|
|
|
[[ ! -e "${LOCAL_OUTPUT_BINPATH}/test_for_remote" ]]
|
2014-10-17 20:56:16 +00:00
|
|
|
}
|
|
|
|
|
2014-06-17 06:16:40 +00:00
|
|
|
# If the Docker server is remote, copy the results back out.
|
2014-09-09 22:03:32 +00:00
|
|
|
function kube::build::copy_output() {
|
2014-10-17 20:56:16 +00:00
|
|
|
if kube::build::is_output_remote; then
|
2014-11-26 21:51:29 +00:00
|
|
|
# At time of this code, docker cp does not work when copying from a volume.
|
|
|
|
# As a workaround, the binaries are first copied to a local filesystem,
|
|
|
|
# /tmp, then docker cp'd to the local binaries output directory.
|
|
|
|
# The fix for the volume bug has been accepted and once it's widely
|
|
|
|
# deployed the code below should be simplified to a simple docker cp
|
|
|
|
# Bug: https://github.com/docker/docker/pull/8509
|
|
|
|
local -a docker_run_opts=(
|
|
|
|
"--name=${KUBE_BUILD_CONTAINER_NAME}"
|
2016-05-12 06:55:21 +00:00
|
|
|
"--user=$(id -u):$(id -g)"
|
|
|
|
"${DOCKER_MOUNT_ARGS[@]}"
|
|
|
|
-d
|
|
|
|
)
|
2014-11-26 21:51:29 +00:00
|
|
|
|
|
|
|
local -ra docker_cmd=(
|
|
|
|
"${DOCKER[@]}" run "${docker_run_opts[@]}" "${KUBE_BUILD_IMAGE}"
|
|
|
|
)
|
2014-06-17 06:16:40 +00:00
|
|
|
|
2015-03-25 22:57:14 +00:00
|
|
|
kube::log::status "Syncing back _output/dockerized/bin directory from remote Docker"
|
2014-10-22 23:26:59 +00:00
|
|
|
rm -rf "${LOCAL_OUTPUT_BINPATH}"
|
|
|
|
mkdir -p "${LOCAL_OUTPUT_BINPATH}"
|
2016-05-31 03:35:16 +00:00
|
|
|
rm -f "${THIS_PLATFORM_BIN}"
|
|
|
|
ln -s "${LOCAL_OUTPUT_BINPATH}" "${THIS_PLATFORM_BIN}"
|
2014-06-17 06:16:40 +00:00
|
|
|
|
2014-12-06 17:11:46 +00:00
|
|
|
kube::build::destroy_container "${KUBE_BUILD_CONTAINER_NAME}"
|
2014-11-26 21:51:29 +00:00
|
|
|
"${docker_cmd[@]}" bash -c "cp -r ${REMOTE_OUTPUT_BINPATH} /tmp/bin;touch /tmp/finished;rm /tmp/bin/test_for_remote;/bin/sleep 600" > /dev/null 2>&1
|
|
|
|
|
|
|
|
# Wait until binaries have finished coppying
|
|
|
|
count=0
|
|
|
|
while true;do
|
2016-01-19 01:43:53 +00:00
|
|
|
if "${DOCKER[@]}" cp "${KUBE_BUILD_CONTAINER_NAME}:/tmp/finished" "${LOCAL_OUTPUT_BINPATH}" > /dev/null 2>&1;then
|
|
|
|
"${DOCKER[@]}" cp "${KUBE_BUILD_CONTAINER_NAME}:/tmp/bin" "${LOCAL_OUTPUT_SUBPATH}"
|
2014-11-26 21:51:29 +00:00
|
|
|
break;
|
|
|
|
fi
|
|
|
|
|
|
|
|
let count=count+1
|
|
|
|
if [[ $count -eq 60 ]]; then
|
|
|
|
# break after 5m
|
2015-03-25 22:57:14 +00:00
|
|
|
kube::log::error "Timed out waiting for binaries..."
|
2014-11-26 21:51:29 +00:00
|
|
|
break
|
|
|
|
fi
|
|
|
|
sleep 5
|
|
|
|
done
|
|
|
|
|
|
|
|
"${DOCKER[@]}" rm -f -v "${KUBE_BUILD_CONTAINER_NAME}" >/dev/null 2>&1 || true
|
2014-10-17 20:56:16 +00:00
|
|
|
else
|
2015-03-25 22:57:14 +00:00
|
|
|
kube::log::status "Output directory is local. No need to copy results out."
|
2014-06-17 06:16:40 +00:00
|
|
|
fi
|
|
|
|
}
|
2014-06-17 23:10:57 +00:00
|
|
|
|
2014-06-20 18:08:50 +00:00
|
|
|
# ---------------------------------------------------------------------------
|
2014-09-08 18:00:46 +00:00
|
|
|
# Build final release artifacts
|
2015-02-03 22:45:51 +00:00
|
|
|
function kube::release::clean_cruft() {
|
|
|
|
# Clean out cruft
|
|
|
|
find ${RELEASE_STAGE} -name '*~' -exec rm {} \;
|
|
|
|
find ${RELEASE_STAGE} -name '#*#' -exec rm {} \;
|
|
|
|
find ${RELEASE_STAGE} -name '.DS*' -exec rm {} \;
|
|
|
|
}
|
|
|
|
|
2016-02-05 13:42:33 +00:00
|
|
|
function kube::release::package_hyperkube() {
|
|
|
|
# If we have these variables set then we want to build all docker images.
|
|
|
|
if [[ -n "${KUBE_DOCKER_IMAGE_TAG-}" && -n "${KUBE_DOCKER_REGISTRY-}" ]]; then
|
2016-04-14 04:29:10 +00:00
|
|
|
for arch in "${KUBE_SERVER_PLATFORMS[@]##*/}"; do
|
2016-08-15 23:20:15 +00:00
|
|
|
kube::log::status "Building hyperkube image for arch: ${arch}"
|
|
|
|
REGISTRY="${KUBE_DOCKER_REGISTRY}" VERSION="${KUBE_DOCKER_IMAGE_TAG}" ARCH="${arch}" make -C cluster/images/hyperkube/ build
|
2016-04-04 20:33:32 +00:00
|
|
|
done
|
2016-02-05 13:42:33 +00:00
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2014-09-15 18:57:13 +00:00
|
|
|
function kube::release::package_tarballs() {
|
|
|
|
# Clean out any old releases
|
|
|
|
rm -rf "${RELEASE_DIR}"
|
2014-09-08 18:00:46 +00:00
|
|
|
mkdir -p "${RELEASE_DIR}"
|
2016-02-11 01:57:45 +00:00
|
|
|
kube::release::package_build_image_tarball &
|
2015-04-02 17:52:53 +00:00
|
|
|
kube::release::package_client_tarballs &
|
|
|
|
kube::release::package_server_tarballs &
|
|
|
|
kube::release::package_salt_tarball &
|
2015-12-08 22:32:23 +00:00
|
|
|
kube::release::package_kube_manifests_tarball &
|
2015-04-06 18:09:43 +00:00
|
|
|
kube::util::wait-for-jobs || { kube::log::error "previous tarball phase failed"; return 1; }
|
2015-04-02 17:52:53 +00:00
|
|
|
|
|
|
|
kube::release::package_full_tarball & # _full depends on all the previous phases
|
|
|
|
kube::release::package_test_tarball & # _test doesn't depend on anything
|
2015-04-06 18:09:43 +00:00
|
|
|
kube::util::wait-for-jobs || { kube::log::error "previous tarball phase failed"; return 1; }
|
2014-09-15 18:57:13 +00:00
|
|
|
}
|
|
|
|
|
2016-02-11 01:57:45 +00:00
|
|
|
# Package the build image we used from the previous stage, for compliance/licensing/audit/yadda.
|
|
|
|
function kube::release::package_build_image_tarball() {
|
|
|
|
kube::log::status "Building tarball: src"
|
|
|
|
"${TAR}" czf "${RELEASE_DIR}/kubernetes-src.tar.gz" -C "${LOCAL_OUTPUT_BUILD_CONTEXT}" .
|
|
|
|
}
|
|
|
|
|
2016-02-07 18:35:14 +00:00
|
|
|
# Package up all of the cross compiled clients. Over time this should grow into
|
2014-09-15 18:57:13 +00:00
|
|
|
# a full SDK
|
|
|
|
function kube::release::package_client_tarballs() {
|
2015-02-10 18:25:07 +00:00
|
|
|
# Find all of the built client binaries
|
2014-09-15 18:57:13 +00:00
|
|
|
local platform platforms
|
2014-10-22 23:26:59 +00:00
|
|
|
platforms=($(cd "${LOCAL_OUTPUT_BINPATH}" ; echo */*))
|
2015-04-02 20:46:39 +00:00
|
|
|
for platform in "${platforms[@]}"; do
|
2014-09-15 18:57:13 +00:00
|
|
|
local platform_tag=${platform/\//-} # Replace a "/" for a "-"
|
2015-04-02 20:46:39 +00:00
|
|
|
kube::log::status "Starting tarball: client $platform_tag"
|
2014-09-15 18:57:13 +00:00
|
|
|
|
2015-04-02 20:46:39 +00:00
|
|
|
(
|
|
|
|
local release_stage="${RELEASE_STAGE}/client/${platform_tag}/kubernetes"
|
|
|
|
rm -rf "${release_stage}"
|
|
|
|
mkdir -p "${release_stage}/client/bin"
|
2014-09-15 18:57:13 +00:00
|
|
|
|
2015-04-02 20:46:39 +00:00
|
|
|
local client_bins=("${KUBE_CLIENT_BINARIES[@]}")
|
|
|
|
if [[ "${platform%/*}" == "windows" ]]; then
|
|
|
|
client_bins=("${KUBE_CLIENT_BINARIES_WIN[@]}")
|
|
|
|
fi
|
2014-11-24 22:10:28 +00:00
|
|
|
|
2015-04-02 20:46:39 +00:00
|
|
|
# This fancy expression will expand to prepend a path
|
|
|
|
# (${LOCAL_OUTPUT_BINPATH}/${platform}/) to every item in the
|
|
|
|
# KUBE_CLIENT_BINARIES array.
|
|
|
|
cp "${client_bins[@]/#/${LOCAL_OUTPUT_BINPATH}/${platform}/}" \
|
|
|
|
"${release_stage}/client/bin/"
|
2014-11-26 21:51:29 +00:00
|
|
|
|
2015-04-02 20:46:39 +00:00
|
|
|
kube::release::clean_cruft
|
2014-09-15 18:57:13 +00:00
|
|
|
|
2015-04-02 20:46:39 +00:00
|
|
|
local package_name="${RELEASE_DIR}/kubernetes-client-${platform_tag}.tar.gz"
|
|
|
|
kube::release::create_tarball "${package_name}" "${release_stage}/.."
|
|
|
|
) &
|
2014-09-15 18:57:13 +00:00
|
|
|
done
|
2015-04-02 20:46:39 +00:00
|
|
|
|
|
|
|
kube::log::status "Waiting on tarballs"
|
2015-04-06 18:09:43 +00:00
|
|
|
kube::util::wait-for-jobs || { kube::log::error "client tarball creation failed"; exit 1; }
|
2014-09-15 18:57:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
# Package up all of the server binaries
|
2014-09-23 22:54:27 +00:00
|
|
|
function kube::release::package_server_tarballs() {
|
2014-09-08 18:00:46 +00:00
|
|
|
local platform
|
2016-04-04 20:33:32 +00:00
|
|
|
for platform in "${KUBE_SERVER_PLATFORMS[@]}"; do
|
2014-09-15 18:57:13 +00:00
|
|
|
local platform_tag=${platform/\//-} # Replace a "/" for a "-"
|
2015-12-23 14:07:35 +00:00
|
|
|
local arch=$(basename ${platform})
|
2015-03-25 22:57:14 +00:00
|
|
|
kube::log::status "Building tarball: server $platform_tag"
|
2014-09-08 18:00:46 +00:00
|
|
|
|
2014-11-19 23:48:37 +00:00
|
|
|
local release_stage="${RELEASE_STAGE}/server/${platform_tag}/kubernetes"
|
2014-09-15 18:57:13 +00:00
|
|
|
rm -rf "${release_stage}"
|
2014-09-23 22:54:27 +00:00
|
|
|
mkdir -p "${release_stage}/server/bin"
|
2015-07-27 18:50:31 +00:00
|
|
|
mkdir -p "${release_stage}/addons"
|
2014-09-08 18:00:46 +00:00
|
|
|
|
2014-09-15 18:57:13 +00:00
|
|
|
# This fancy expression will expand to prepend a path
|
2014-10-22 23:26:59 +00:00
|
|
|
# (${LOCAL_OUTPUT_BINPATH}/${platform}/) to every item in the
|
2014-09-15 18:57:13 +00:00
|
|
|
# KUBE_SERVER_BINARIES array.
|
2014-10-22 23:26:59 +00:00
|
|
|
cp "${KUBE_SERVER_BINARIES[@]/#/${LOCAL_OUTPUT_BINPATH}/${platform}/}" \
|
2014-09-23 22:54:27 +00:00
|
|
|
"${release_stage}/server/bin/"
|
2015-08-24 03:11:29 +00:00
|
|
|
|
2015-12-23 14:07:35 +00:00
|
|
|
kube::release::create_docker_images_for_server "${release_stage}/server/bin" "${arch}"
|
2016-02-09 03:21:44 +00:00
|
|
|
|
2014-11-08 00:49:32 +00:00
|
|
|
# Include the client binaries here too as they are useful debugging tools.
|
2014-11-24 22:10:28 +00:00
|
|
|
local client_bins=("${KUBE_CLIENT_BINARIES[@]}")
|
|
|
|
if [[ "${platform%/*}" == "windows" ]]; then
|
|
|
|
client_bins=("${KUBE_CLIENT_BINARIES_WIN[@]}")
|
|
|
|
fi
|
|
|
|
cp "${client_bins[@]/#/${LOCAL_OUTPUT_BINPATH}/${platform}/}" \
|
2014-11-08 00:49:32 +00:00
|
|
|
"${release_stage}/server/bin/"
|
|
|
|
|
2016-03-02 19:23:32 +00:00
|
|
|
cp "${KUBE_ROOT}/Godeps/LICENSES" "${release_stage}/"
|
|
|
|
|
2016-06-22 01:16:29 +00:00
|
|
|
cp "${RELEASE_DIR}/kubernetes-src.tar.gz" "${release_stage}/"
|
|
|
|
|
2015-02-03 22:45:51 +00:00
|
|
|
kube::release::clean_cruft
|
|
|
|
|
2014-09-15 18:57:13 +00:00
|
|
|
local package_name="${RELEASE_DIR}/kubernetes-server-${platform_tag}.tar.gz"
|
2014-10-30 17:49:44 +00:00
|
|
|
kube::release::create_tarball "${package_name}" "${release_stage}/.."
|
2014-09-08 18:00:46 +00:00
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2015-04-03 01:18:24 +00:00
|
|
|
function kube::release::md5() {
|
|
|
|
if which md5 >/dev/null 2>&1; then
|
|
|
|
md5 -q "$1"
|
|
|
|
else
|
|
|
|
md5sum "$1" | awk '{ print $1 }'
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2015-04-30 22:25:28 +00:00
|
|
|
function kube::release::sha1() {
|
|
|
|
if which shasum >/dev/null 2>&1; then
|
|
|
|
shasum -a1 "$1" | awk '{ print $1 }'
|
|
|
|
else
|
|
|
|
sha1sum "$1" | awk '{ print $1 }'
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2015-03-07 01:41:03 +00:00
|
|
|
# This will take binaries that run on master and creates Docker images
|
|
|
|
# that wrap the binary in them. (One docker image per binary)
|
2015-11-13 01:02:35 +00:00
|
|
|
# Args:
|
|
|
|
# $1 - binary_dir, the directory to save the tared images to.
|
2015-12-23 14:07:35 +00:00
|
|
|
# $2 - arch, architecture for which we are building docker images.
|
2015-03-07 01:41:03 +00:00
|
|
|
function kube::release::create_docker_images_for_server() {
|
|
|
|
# Create a sub-shell so that we don't pollute the outer environment
|
|
|
|
(
|
2015-11-13 01:02:35 +00:00
|
|
|
local binary_dir="$1"
|
2015-12-23 14:07:35 +00:00
|
|
|
local arch="$2"
|
2015-04-03 01:18:24 +00:00
|
|
|
local binary_name
|
2016-02-07 18:35:14 +00:00
|
|
|
local binaries=($(kube::build::get_docker_wrapped_binaries ${arch}))
|
|
|
|
|
|
|
|
for wrappable in "${binaries[@]}"; do
|
2015-11-13 01:02:35 +00:00
|
|
|
|
|
|
|
local oldifs=$IFS
|
|
|
|
IFS=","
|
|
|
|
set $wrappable
|
|
|
|
IFS=$oldifs
|
|
|
|
|
|
|
|
local binary_name="$1"
|
|
|
|
local base_image="$2"
|
|
|
|
|
2015-04-03 01:39:40 +00:00
|
|
|
kube::log::status "Starting Docker build for image: ${binary_name}"
|
|
|
|
|
|
|
|
(
|
2015-04-06 16:41:14 +00:00
|
|
|
local md5_sum
|
2015-11-13 01:02:35 +00:00
|
|
|
md5_sum=$(kube::release::md5 "${binary_dir}/${binary_name}")
|
2015-04-06 16:41:14 +00:00
|
|
|
|
2015-11-13 01:02:35 +00:00
|
|
|
local docker_build_path="${binary_dir}/${binary_name}.dockerbuild"
|
2015-04-06 16:41:14 +00:00
|
|
|
local docker_file_path="${docker_build_path}/Dockerfile"
|
2015-11-13 01:02:35 +00:00
|
|
|
local binary_file_path="${binary_dir}/${binary_name}"
|
2015-04-06 16:41:14 +00:00
|
|
|
|
|
|
|
rm -rf ${docker_build_path}
|
|
|
|
mkdir -p ${docker_build_path}
|
2015-11-13 01:02:35 +00:00
|
|
|
ln ${binary_dir}/${binary_name} ${docker_build_path}/${binary_name}
|
|
|
|
printf " FROM ${base_image} \n ADD ${binary_name} /usr/local/bin/${binary_name}\n" > ${docker_file_path}
|
2015-04-06 16:41:14 +00:00
|
|
|
|
2016-02-07 18:35:14 +00:00
|
|
|
if [[ ${arch} == "amd64" ]]; then
|
|
|
|
# If we are building a amd64 docker image, preserve the original image name
|
|
|
|
local docker_image_tag=gcr.io/google_containers/${binary_name}:${md5_sum}
|
|
|
|
else
|
|
|
|
# If we are building a docker image for another architecture, append the arch in the image tag
|
|
|
|
local docker_image_tag=gcr.io/google_containers/${binary_name}-${arch}:${md5_sum}
|
|
|
|
fi
|
|
|
|
|
2015-12-23 14:07:35 +00:00
|
|
|
"${DOCKER[@]}" build -q -t "${docker_image_tag}" ${docker_build_path} >/dev/null
|
|
|
|
"${DOCKER[@]}" save ${docker_image_tag} > ${binary_dir}/${binary_name}.tar
|
2015-11-13 01:02:35 +00:00
|
|
|
echo $md5_sum > ${binary_dir}/${binary_name}.docker_tag
|
2015-04-06 20:08:15 +00:00
|
|
|
|
|
|
|
rm -rf ${docker_build_path}
|
2015-05-28 21:32:38 +00:00
|
|
|
|
2015-12-23 14:07:35 +00:00
|
|
|
# If we are building an official/alpha/beta release we want to keep docker images
|
|
|
|
# and tag them appropriately.
|
|
|
|
if [[ -n "${KUBE_DOCKER_IMAGE_TAG-}" && -n "${KUBE_DOCKER_REGISTRY-}" ]]; then
|
|
|
|
local release_docker_image_tag="${KUBE_DOCKER_REGISTRY}/${binary_name}-${arch}:${KUBE_DOCKER_IMAGE_TAG}"
|
|
|
|
kube::log::status "Tagging docker image ${docker_image_tag} as ${release_docker_image_tag}"
|
|
|
|
"${DOCKER[@]}" tag -f "${docker_image_tag}" "${release_docker_image_tag}" 2>/dev/null
|
|
|
|
fi
|
|
|
|
|
2015-05-28 21:32:38 +00:00
|
|
|
kube::log::status "Deleting docker image ${docker_image_tag}"
|
2015-05-30 16:18:31 +00:00
|
|
|
"${DOCKER[@]}" rmi ${docker_image_tag} 2>/dev/null || true
|
2015-04-03 01:39:40 +00:00
|
|
|
) &
|
2015-03-07 01:41:03 +00:00
|
|
|
done
|
2015-04-03 01:39:40 +00:00
|
|
|
|
2015-04-06 18:09:43 +00:00
|
|
|
kube::util::wait-for-jobs || { kube::log::error "previous Docker build failed"; return 1; }
|
2015-04-03 01:39:40 +00:00
|
|
|
kube::log::status "Docker builds done"
|
2015-03-07 01:41:03 +00:00
|
|
|
)
|
2015-11-13 01:02:35 +00:00
|
|
|
|
2015-03-07 01:41:03 +00:00
|
|
|
}
|
|
|
|
|
2014-09-23 22:54:27 +00:00
|
|
|
# Package up the salt configuration tree. This is an optional helper to getting
|
|
|
|
# a cluster up and running.
|
|
|
|
function kube::release::package_salt_tarball() {
|
2015-03-25 22:57:14 +00:00
|
|
|
kube::log::status "Building tarball: salt"
|
2014-09-23 22:54:27 +00:00
|
|
|
|
2014-11-19 23:48:37 +00:00
|
|
|
local release_stage="${RELEASE_STAGE}/salt/kubernetes"
|
2014-09-23 22:54:27 +00:00
|
|
|
rm -rf "${release_stage}"
|
|
|
|
mkdir -p "${release_stage}"
|
|
|
|
|
2014-10-03 21:58:49 +00:00
|
|
|
cp -R "${KUBE_ROOT}/cluster/saltbase" "${release_stage}/"
|
2014-09-23 22:54:27 +00:00
|
|
|
|
Deferred creation of SkyDNS, monitoring and logging objects
This implements phase 1 of the proposal in #3579, moving the creation
of the pods, RCs, and services to the master after the apiserver is
available.
This is such a wide commit because our existing initial config story
is special:
* Add kube-addons service and associated salt configuration:
** We configure /etc/kubernetes/addons to be a directory of objects
that are appropriately configured for the current cluster.
** "/etc/init.d/kube-addons start" slurps up everything in that dir.
(Most of the difficult is the business logic in salt around getting
that directory built at all.)
** We cheat and overlay cluster/addons into saltbase/salt/kube-addons
as config files for the kube-addons meta-service.
* Change .yaml.in files to salt templates
* Rename {setup,teardown}-{monitoring,logging} to
{setup,teardown}-{monitoring,logging}-firewall to properly reflect
their real purpose now (the purpose of these functions is now ONLY to
bring up the firewall rules, and possibly to relay the IP to the user).
* Rework GCE {setup,teardown}-{monitoring,logging}-firewall: Both
functions were improperly configuring global rules, yet used
lifecycles tied to the cluster. Use $NODE_INSTANCE_PREFIX with the
rule. The logging rule needed a $NETWORK specifier. The monitoring
rule tried gcloud describe first, but given the instancing, this feels
like a waste of time now.
* Plumb ENABLE_CLUSTER_MONITORING, ENABLE_CLUSTER_LOGGING,
ELASTICSEARCH_LOGGING_REPLICAS and DNS_REPLICAS down to the master,
since these are needed there now.
(Desperately want just a yaml or json file we can share between
providers that has all this crap. Maybe #3525 is an answer?)
Huge caveats: I've gone pretty firm testing on GCE, including
twiddling the env variables and making sure the objects I expect to
come up, come up. I've tested that it doesn't break GKE bringup
somehow. But I haven't had a chance to test the other providers.
2015-01-18 23:16:52 +00:00
|
|
|
# TODO(#3579): This is a temporary hack. It gathers up the yaml,
|
2015-05-04 23:49:28 +00:00
|
|
|
# yaml.in, json files in cluster/addons (minus any demos) and overlays
|
Deferred creation of SkyDNS, monitoring and logging objects
This implements phase 1 of the proposal in #3579, moving the creation
of the pods, RCs, and services to the master after the apiserver is
available.
This is such a wide commit because our existing initial config story
is special:
* Add kube-addons service and associated salt configuration:
** We configure /etc/kubernetes/addons to be a directory of objects
that are appropriately configured for the current cluster.
** "/etc/init.d/kube-addons start" slurps up everything in that dir.
(Most of the difficult is the business logic in salt around getting
that directory built at all.)
** We cheat and overlay cluster/addons into saltbase/salt/kube-addons
as config files for the kube-addons meta-service.
* Change .yaml.in files to salt templates
* Rename {setup,teardown}-{monitoring,logging} to
{setup,teardown}-{monitoring,logging}-firewall to properly reflect
their real purpose now (the purpose of these functions is now ONLY to
bring up the firewall rules, and possibly to relay the IP to the user).
* Rework GCE {setup,teardown}-{monitoring,logging}-firewall: Both
functions were improperly configuring global rules, yet used
lifecycles tied to the cluster. Use $NODE_INSTANCE_PREFIX with the
rule. The logging rule needed a $NETWORK specifier. The monitoring
rule tried gcloud describe first, but given the instancing, this feels
like a waste of time now.
* Plumb ENABLE_CLUSTER_MONITORING, ENABLE_CLUSTER_LOGGING,
ELASTICSEARCH_LOGGING_REPLICAS and DNS_REPLICAS down to the master,
since these are needed there now.
(Desperately want just a yaml or json file we can share between
providers that has all this crap. Maybe #3525 is an answer?)
Huge caveats: I've gone pretty firm testing on GCE, including
twiddling the env variables and making sure the objects I expect to
come up, come up. I've tested that it doesn't break GKE bringup
somehow. But I haven't had a chance to test the other providers.
2015-01-18 23:16:52 +00:00
|
|
|
# them into kube-addons, where we expect them. (This pipeline is a
|
|
|
|
# fancy copy, stripping anything but the files we don't want.)
|
|
|
|
local objects
|
2015-05-04 23:49:28 +00:00
|
|
|
objects=$(cd "${KUBE_ROOT}/cluster/addons" && find . \( -name \*.yaml -or -name \*.yaml.in -or -name \*.json \) | grep -v demo)
|
Deferred creation of SkyDNS, monitoring and logging objects
This implements phase 1 of the proposal in #3579, moving the creation
of the pods, RCs, and services to the master after the apiserver is
available.
This is such a wide commit because our existing initial config story
is special:
* Add kube-addons service and associated salt configuration:
** We configure /etc/kubernetes/addons to be a directory of objects
that are appropriately configured for the current cluster.
** "/etc/init.d/kube-addons start" slurps up everything in that dir.
(Most of the difficult is the business logic in salt around getting
that directory built at all.)
** We cheat and overlay cluster/addons into saltbase/salt/kube-addons
as config files for the kube-addons meta-service.
* Change .yaml.in files to salt templates
* Rename {setup,teardown}-{monitoring,logging} to
{setup,teardown}-{monitoring,logging}-firewall to properly reflect
their real purpose now (the purpose of these functions is now ONLY to
bring up the firewall rules, and possibly to relay the IP to the user).
* Rework GCE {setup,teardown}-{monitoring,logging}-firewall: Both
functions were improperly configuring global rules, yet used
lifecycles tied to the cluster. Use $NODE_INSTANCE_PREFIX with the
rule. The logging rule needed a $NETWORK specifier. The monitoring
rule tried gcloud describe first, but given the instancing, this feels
like a waste of time now.
* Plumb ENABLE_CLUSTER_MONITORING, ENABLE_CLUSTER_LOGGING,
ELASTICSEARCH_LOGGING_REPLICAS and DNS_REPLICAS down to the master,
since these are needed there now.
(Desperately want just a yaml or json file we can share between
providers that has all this crap. Maybe #3525 is an answer?)
Huge caveats: I've gone pretty firm testing on GCE, including
twiddling the env variables and making sure the objects I expect to
come up, come up. I've tested that it doesn't break GKE bringup
somehow. But I haven't had a chance to test the other providers.
2015-01-18 23:16:52 +00:00
|
|
|
tar c -C "${KUBE_ROOT}/cluster/addons" ${objects} | tar x -C "${release_stage}/saltbase/salt/kube-addons"
|
|
|
|
|
2015-02-03 22:45:51 +00:00
|
|
|
kube::release::clean_cruft
|
|
|
|
|
2014-09-23 22:54:27 +00:00
|
|
|
local package_name="${RELEASE_DIR}/kubernetes-salt.tar.gz"
|
2014-10-30 17:49:44 +00:00
|
|
|
kube::release::create_tarball "${package_name}" "${release_stage}/.."
|
2014-09-23 22:54:27 +00:00
|
|
|
}
|
|
|
|
|
2015-12-08 22:32:23 +00:00
|
|
|
# This will pack kube-system manifests files for distros without using salt
|
2016-04-22 18:39:45 +00:00
|
|
|
# such as GCI and Ubuntu Trusty. We directly copy manifests from
|
|
|
|
# cluster/addons and cluster/saltbase/salt. The script of cluster initialization
|
|
|
|
# will remove the salt configuration and evaluate the variables in the manifests.
|
2015-12-08 22:32:23 +00:00
|
|
|
function kube::release::package_kube_manifests_tarball() {
|
|
|
|
kube::log::status "Building tarball: manifests"
|
|
|
|
|
|
|
|
local release_stage="${RELEASE_STAGE}/manifests/kubernetes"
|
|
|
|
rm -rf "${release_stage}"
|
2016-04-22 18:39:45 +00:00
|
|
|
local dst_dir="${release_stage}/gci-trusty"
|
|
|
|
mkdir -p "${dst_dir}"
|
2015-12-08 22:32:23 +00:00
|
|
|
|
|
|
|
local salt_dir="${KUBE_ROOT}/cluster/saltbase/salt"
|
2016-05-27 10:02:20 +00:00
|
|
|
cp "${salt_dir}/cluster-autoscaler/cluster-autoscaler.manifest" "${dst_dir}/"
|
2015-12-08 22:32:23 +00:00
|
|
|
cp "${salt_dir}/fluentd-es/fluentd-es.yaml" "${release_stage}/"
|
|
|
|
cp "${salt_dir}/fluentd-gcp/fluentd-gcp.yaml" "${release_stage}/"
|
|
|
|
cp "${salt_dir}/kube-registry-proxy/kube-registry-proxy.yaml" "${release_stage}/"
|
2015-12-28 17:28:10 +00:00
|
|
|
cp "${salt_dir}/kube-proxy/kube-proxy.manifest" "${release_stage}/"
|
2016-04-22 18:39:45 +00:00
|
|
|
cp "${salt_dir}/etcd/etcd.manifest" "${dst_dir}"
|
|
|
|
cp "${salt_dir}/kube-scheduler/kube-scheduler.manifest" "${dst_dir}"
|
|
|
|
cp "${salt_dir}/kube-apiserver/kube-apiserver.manifest" "${dst_dir}"
|
2016-04-28 21:04:28 +00:00
|
|
|
cp "${salt_dir}/kube-apiserver/abac-authz-policy.jsonl" "${dst_dir}"
|
2016-04-22 18:39:45 +00:00
|
|
|
cp "${salt_dir}/kube-controller-manager/kube-controller-manager.manifest" "${dst_dir}"
|
2016-05-05 17:51:32 +00:00
|
|
|
cp "${salt_dir}/kube-addons/kube-addon-manager.yaml" "${dst_dir}"
|
2016-05-28 23:24:40 +00:00
|
|
|
cp "${salt_dir}/l7-gcp/glbc.manifest" "${dst_dir}"
|
2016-08-17 13:00:29 +00:00
|
|
|
cp "${salt_dir}/rescheduler/rescheduler.manifest" "${dst_dir}/"
|
2016-09-07 10:20:44 +00:00
|
|
|
cp "${salt_dir}/e2e-image-puller/e2e-image-puller.manifest" "${dst_dir}/"
|
2016-05-19 20:24:03 +00:00
|
|
|
cp "${KUBE_ROOT}/cluster/gce/trusty/configure-helper.sh" "${dst_dir}/trusty-configure-helper.sh"
|
|
|
|
cp "${KUBE_ROOT}/cluster/gce/gci/configure-helper.sh" "${dst_dir}/gci-configure-helper.sh"
|
|
|
|
cp "${KUBE_ROOT}/cluster/gce/gci/health-monitor.sh" "${dst_dir}/health-monitor.sh"
|
2016-04-22 18:39:45 +00:00
|
|
|
cp -r "${salt_dir}/kube-admission-controls/limit-range" "${dst_dir}"
|
2016-02-01 19:36:45 +00:00
|
|
|
local objects
|
|
|
|
objects=$(cd "${KUBE_ROOT}/cluster/addons" && find . \( -name \*.yaml -or -name \*.yaml.in -or -name \*.json \) | grep -v demo)
|
2016-04-22 18:39:45 +00:00
|
|
|
tar c -C "${KUBE_ROOT}/cluster/addons" ${objects} | tar x -C "${dst_dir}"
|
2016-06-23 23:46:55 +00:00
|
|
|
|
2016-04-22 18:39:45 +00:00
|
|
|
# This is for coreos only. ContainerVM, GCI, or Trusty does not use it.
|
2015-12-22 23:41:38 +00:00
|
|
|
cp -r "${KUBE_ROOT}/cluster/gce/coreos/kube-manifests"/* "${release_stage}/"
|
2015-12-08 22:32:23 +00:00
|
|
|
|
|
|
|
kube::release::clean_cruft
|
|
|
|
|
|
|
|
local package_name="${RELEASE_DIR}/kubernetes-manifests.tar.gz"
|
|
|
|
kube::release::create_tarball "${package_name}" "${release_stage}/.."
|
|
|
|
}
|
|
|
|
|
2014-12-17 19:41:47 +00:00
|
|
|
# This is the stuff you need to run tests from the binary distribution.
|
|
|
|
function kube::release::package_test_tarball() {
|
2015-03-25 22:57:14 +00:00
|
|
|
kube::log::status "Building tarball: test"
|
2014-12-17 19:41:47 +00:00
|
|
|
|
|
|
|
local release_stage="${RELEASE_STAGE}/test/kubernetes"
|
|
|
|
rm -rf "${release_stage}"
|
|
|
|
mkdir -p "${release_stage}"
|
|
|
|
|
|
|
|
local platform
|
2016-02-07 18:35:14 +00:00
|
|
|
for platform in "${KUBE_TEST_PLATFORMS[@]}"; do
|
2014-12-17 19:41:47 +00:00
|
|
|
local test_bins=("${KUBE_TEST_BINARIES[@]}")
|
|
|
|
if [[ "${platform%/*}" == "windows" ]]; then
|
|
|
|
test_bins=("${KUBE_TEST_BINARIES_WIN[@]}")
|
|
|
|
fi
|
|
|
|
mkdir -p "${release_stage}/platforms/${platform}"
|
|
|
|
cp "${test_bins[@]/#/${LOCAL_OUTPUT_BINPATH}/${platform}/}" \
|
|
|
|
"${release_stage}/platforms/${platform}"
|
|
|
|
done
|
2016-09-13 04:42:22 +00:00
|
|
|
for platform in "${KUBE_NODE_TEST_PLATFORMS[@]}"; do
|
|
|
|
mkdir -p "${release_stage}/platforms/${platform}"
|
|
|
|
cp "${KUBE_NODE_TEST_BINARIES[@]/#/${LOCAL_OUTPUT_BINPATH}/${platform}/}" \
|
|
|
|
"${release_stage}/platforms/${platform}"
|
|
|
|
done
|
2014-12-17 19:41:47 +00:00
|
|
|
|
2015-09-29 15:20:49 +00:00
|
|
|
# Add the test image files
|
|
|
|
mkdir -p "${release_stage}/test/images"
|
|
|
|
cp -fR "${KUBE_ROOT}/test/images" "${release_stage}/test/"
|
2014-12-18 16:19:32 +00:00
|
|
|
tar c ${KUBE_TEST_PORTABLE[@]} | tar x -C ${release_stage}
|
2014-12-17 19:41:47 +00:00
|
|
|
|
2015-02-03 22:45:51 +00:00
|
|
|
kube::release::clean_cruft
|
|
|
|
|
2014-12-17 19:41:47 +00:00
|
|
|
local package_name="${RELEASE_DIR}/kubernetes-test.tar.gz"
|
|
|
|
kube::release::create_tarball "${package_name}" "${release_stage}/.."
|
|
|
|
}
|
|
|
|
|
2014-09-23 22:54:27 +00:00
|
|
|
# This is all the stuff you need to run/install kubernetes. This includes:
|
|
|
|
# - precompiled binaries for client
|
|
|
|
# - Cluster spin up/down scripts and configs for various cloud providers
|
|
|
|
# - tarballs for server binary and salt configs that are ready to be uploaded
|
|
|
|
# to master by whatever means appropriate.
|
|
|
|
function kube::release::package_full_tarball() {
|
2015-03-25 22:57:14 +00:00
|
|
|
kube::log::status "Building tarball: full"
|
2014-09-23 22:54:27 +00:00
|
|
|
|
2014-11-20 16:15:16 +00:00
|
|
|
local release_stage="${RELEASE_STAGE}/full/kubernetes"
|
2014-09-23 22:54:27 +00:00
|
|
|
rm -rf "${release_stage}"
|
|
|
|
mkdir -p "${release_stage}"
|
|
|
|
|
2014-11-04 00:59:17 +00:00
|
|
|
# Copy all of the client binaries in here, but not test or server binaries.
|
|
|
|
# The server binaries are included with the server binary tarball.
|
|
|
|
local platform
|
|
|
|
for platform in "${KUBE_CLIENT_PLATFORMS[@]}"; do
|
2014-11-24 22:10:28 +00:00
|
|
|
local client_bins=("${KUBE_CLIENT_BINARIES[@]}")
|
|
|
|
if [[ "${platform%/*}" == "windows" ]]; then
|
|
|
|
client_bins=("${KUBE_CLIENT_BINARIES_WIN[@]}")
|
|
|
|
fi
|
2014-11-04 00:59:17 +00:00
|
|
|
mkdir -p "${release_stage}/platforms/${platform}"
|
2014-11-24 22:10:28 +00:00
|
|
|
cp "${client_bins[@]/#/${LOCAL_OUTPUT_BINPATH}/${platform}/}" \
|
2014-11-04 00:59:17 +00:00
|
|
|
"${release_stage}/platforms/${platform}"
|
|
|
|
done
|
2014-09-23 22:54:27 +00:00
|
|
|
|
|
|
|
# We want everything in /cluster except saltbase. That is only needed on the
|
|
|
|
# server.
|
2014-10-03 21:58:49 +00:00
|
|
|
cp -R "${KUBE_ROOT}/cluster" "${release_stage}/"
|
2014-09-23 22:54:27 +00:00
|
|
|
rm -rf "${release_stage}/cluster/saltbase"
|
|
|
|
|
|
|
|
mkdir -p "${release_stage}/server"
|
|
|
|
cp "${RELEASE_DIR}/kubernetes-salt.tar.gz" "${release_stage}/server/"
|
|
|
|
cp "${RELEASE_DIR}"/kubernetes-server-*.tar.gz "${release_stage}/server/"
|
2015-12-08 22:32:23 +00:00
|
|
|
cp "${RELEASE_DIR}/kubernetes-manifests.tar.gz" "${release_stage}/server/"
|
2014-09-23 22:54:27 +00:00
|
|
|
|
2014-09-29 20:37:04 +00:00
|
|
|
mkdir -p "${release_stage}/third_party"
|
2014-10-03 21:58:49 +00:00
|
|
|
cp -R "${KUBE_ROOT}/third_party/htpasswd" "${release_stage}/third_party/htpasswd"
|
2014-09-29 20:37:04 +00:00
|
|
|
|
2016-08-17 05:33:06 +00:00
|
|
|
# Include only federation/cluster, federation/manifests and federation/deploy
|
2016-05-10 21:44:45 +00:00
|
|
|
mkdir "${release_stage}/federation"
|
|
|
|
cp -R "${KUBE_ROOT}/federation/cluster" "${release_stage}/federation/"
|
|
|
|
cp -R "${KUBE_ROOT}/federation/manifests" "${release_stage}/federation/"
|
2016-08-25 19:45:40 +00:00
|
|
|
cp -R "${KUBE_ROOT}/federation/deploy" "${release_stage}/federation/"
|
2016-05-10 21:44:45 +00:00
|
|
|
|
2014-10-03 21:58:49 +00:00
|
|
|
cp -R "${KUBE_ROOT}/examples" "${release_stage}/"
|
2015-07-14 22:57:41 +00:00
|
|
|
cp -R "${KUBE_ROOT}/docs" "${release_stage}/"
|
2014-10-03 21:58:49 +00:00
|
|
|
cp "${KUBE_ROOT}/README.md" "${release_stage}/"
|
2016-02-27 02:33:24 +00:00
|
|
|
cp "${KUBE_ROOT}/Godeps/LICENSES" "${release_stage}/"
|
2014-10-03 21:58:49 +00:00
|
|
|
cp "${KUBE_ROOT}/Vagrantfile" "${release_stage}/"
|
2014-09-23 22:54:27 +00:00
|
|
|
|
2015-11-18 02:13:24 +00:00
|
|
|
echo "${KUBE_GIT_VERSION}" > "${release_stage}/version"
|
|
|
|
|
2015-02-03 22:45:51 +00:00
|
|
|
kube::release::clean_cruft
|
2015-02-03 20:57:34 +00:00
|
|
|
|
2014-09-23 22:54:27 +00:00
|
|
|
local package_name="${RELEASE_DIR}/kubernetes.tar.gz"
|
2014-10-30 17:49:44 +00:00
|
|
|
kube::release::create_tarball "${package_name}" "${release_stage}/.."
|
2014-09-23 22:54:27 +00:00
|
|
|
}
|
|
|
|
|
2014-10-30 17:49:44 +00:00
|
|
|
# Build a release tarball. $1 is the output tar name. $2 is the base directory
|
|
|
|
# of the files to be packaged. This assumes that ${2}/kubernetes is what is
|
|
|
|
# being packaged.
|
|
|
|
function kube::release::create_tarball() {
|
2015-07-02 19:44:11 +00:00
|
|
|
kube::build::ensure_tar
|
|
|
|
|
2014-10-30 17:49:44 +00:00
|
|
|
local tarfile=$1
|
|
|
|
local stagingdir=$2
|
|
|
|
|
2015-07-02 19:44:11 +00:00
|
|
|
"${TAR}" czf "${tarfile}" -C "${stagingdir}" kubernetes --owner=0 --group=0
|
2014-10-30 17:49:44 +00:00
|
|
|
}
|
2014-09-23 22:54:27 +00:00
|
|
|
|
2016-04-15 01:30:16 +00:00
|
|
|
###############################################################################
|
|
|
|
# Most of the ::release:: namespace functions have been moved to
|
|
|
|
# github.com/kubernetes/release. Have a look in that repo and specifically in
|
|
|
|
# lib/releaselib.sh for ::release::-related functionality.
|
|
|
|
###############################################################################
|