#!/usr/bin/env bash # Copyright 2017 The Kubernetes Authors. # # 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 -o errexit set -o nounset set -o pipefail TASK=$1 WHAT=$2 # Connecting to a Remote Docker requires certificates for authentication, which can be found # at this path. By default, they can be found in the ${HOME} folder. We're expecting to find # here ".docker-${os_version}" folders which contains the necessary certificates. DOCKER_CERT_BASE_PATH="${DOCKER_CERT_BASE_PATH:-${HOME}}" KUBE_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd -P)" source "${KUBE_ROOT}/hack/lib/logging.sh" source "${KUBE_ROOT}/hack/lib/util.sh" # Mapping of go ARCH to actual architectures shipped part of multiarch/qemu-user-static project declare -A QEMUARCHS=( ["amd64"]="x86_64" ["arm"]="arm" ["arm64"]="aarch64" ["ppc64le"]="ppc64le" ["s390x"]="s390x" ) # Returns list of all supported architectures from BASEIMAGE file listOsArchs() { image=$1 cut -d "=" -f 1 "${image}"/BASEIMAGE } splitOsArch() { image=$1 os_arch=$2 if [[ $os_arch =~ .*/.*/.* ]]; then # for Windows, we have to support both LTS and SAC channels, so we're building multiple Windows images. # the format for this case is: OS/ARCH/OS_VERSION. os_name=$(echo "$os_arch" | cut -d "/" -f 1) arch=$(echo "$os_arch" | cut -d "/" -f 2) os_version=$(echo "$os_arch" | cut -d "/" -f 3) suffix="$os_name-$arch-$os_version" # currently, GCE does not have Hyper-V support, which means that the same node cannot be used to build # multiple versions of Windows images. Which is why we have $REMOTE_DOCKER_URL_$os_version URLs configured. # TODO(claudiub): once Hyper-V support has been added to GCE, revert this to just $REMOTE_DOCKER_URL. remote_docker_url_name="REMOTE_DOCKER_URL_$os_version" REMOTE_DOCKER_URL=$(eval echo "\${${remote_docker_url_name}:-}") elif [[ $os_arch =~ .*/.* ]]; then os_name=$(echo "$os_arch" | cut -d "/" -f 1) arch=$(echo "$os_arch" | cut -d "/" -f 2) suffix="$os_name-$arch" else echo "The BASEIMAGE file for the ${image} image is not properly formatted. Expected entries to start with 'os/arch', found '${os_arch}' instead." exit 1 fi } # Returns baseimage need to used in Dockerfile for any given architecture getBaseImage() { os_arch=$1 grep "${os_arch}=" BASEIMAGE | cut -d= -f2 } # This function will build test image for all the architectures # mentioned in BASEIMAGE file. In the absence of BASEIMAGE file, # it will build for all the supported arch list - amd64, arm, # arm64, ppc64le, s390x build() { image=$1 if [[ -f ${image}/BASEIMAGE ]]; then os_archs=$(listOsArchs "$image") else # prepend linux/ to the QEMUARCHS items. os_archs=$(printf 'linux/%s\n' "${!QEMUARCHS[*]}") fi kube::util::ensure-gnu-sed for os_arch in ${os_archs}; do splitOsArch "${image}" "${os_arch}" if [[ "${os_name}" == "windows" && -z "${REMOTE_DOCKER_URL}" ]]; then # If we have a Windows os_arch entry but no Remote Docker Daemon for it, # we should skip it, so we don't have to build any binaries for it. echo "Cannot build the image '${image}' for ${os_arch}. REMOTE_DOCKER_URL_$os_version should be set, containing the URL to a Windows docker daemon." continue fi echo "Building image for ${image} OS/ARCH: ${os_arch}..." # Create a temporary directory for every architecture and copy the image content # and build the image from temporary directory mkdir -p "${KUBE_ROOT}"/_tmp temp_dir=$(mktemp -d "${KUBE_ROOT}"/_tmp/test-images-build.XXXXXX) kube::util::trap_add "rm -rf ${temp_dir}" EXIT cp -r "${image}"/* "${temp_dir}" if [[ -f ${image}/Makefile ]]; then # make bin will take care of all the prerequisites needed # for building the docker image make -C "${image}" bin OS="${os_name}" ARCH="${arch}" TARGET="${temp_dir}" fi pushd "${temp_dir}" # image tag TAG=$(