sigs.k8s.io/cluster-api-provider-azure@v1.17.0/scripts/ci-build-kubernetes.sh (about) 1 #!/bin/bash 2 3 # Copyright 2021 The Kubernetes Authors. 4 # 5 # Licensed under the Apache License, Version 2.0 (the "License"); 6 # you may not use this file except in compliance with the License. 7 # You may obtain a copy of the License at 8 # 9 # http://www.apache.org/licenses/LICENSE-2.0 10 # 11 # Unless required by applicable law or agreed to in writing, software 12 # distributed under the License is distributed on an "AS IS" BASIS, 13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 # See the License for the specific language governing permissions and 15 # limitations under the License. 16 17 ############################################################################### 18 19 set -o errexit 20 set -o nounset 21 set -o pipefail 22 23 REPO_ROOT=$(dirname "${BASH_SOURCE[0]}")/.. 24 cd "${REPO_ROOT}" || exit 1 25 26 # shellcheck source=hack/ensure-azcli.sh 27 source "${REPO_ROOT}/hack/ensure-azcli.sh" 28 # shellcheck source=hack/ensure-go.sh 29 source "${REPO_ROOT}/hack/ensure-go.sh" 30 # shellcheck source=hack/util.sh 31 source "${REPO_ROOT}/hack/util.sh" 32 33 : "${AZURE_STORAGE_ACCOUNT:?Environment variable empty or not defined.}" 34 : "${REGISTRY:?Environment variable empty or not defined.}" 35 36 declare -a BINARIES=("kubeadm" "kubectl" "kubelet" "e2e.test") 37 declare -a WINDOWS_BINARIES=("kubeadm" "kubectl" "kubelet" "kube-proxy") 38 declare -a IMAGES=("kube-apiserver" "kube-controller-manager" "kube-proxy" "kube-scheduler") 39 40 GREP_BINARY="grep" 41 if [[ "${OSTYPE}" == "darwin"* ]]; then 42 GREP_BINARY="ggrep" 43 fi 44 45 setup() { 46 KUBE_ROOT="$(go env GOPATH)/src/k8s.io/kubernetes" 47 export KUBE_ROOT 48 49 # shellcheck disable=SC1091 50 # extract KUBE_GIT_VERSION from k/k 51 # ref: https://github.com/kubernetes/test-infra/blob/de07aa4b89f1161778856dc0fed310bd816aad72/experiment/kind-conformance-image-e2e.sh#L112-L115 52 source "${KUBE_ROOT}/hack/lib/version.sh" 53 pushd "${KUBE_ROOT}" && kube::version::get_version_vars && popd 54 : "${KUBE_GIT_VERSION:?Environment variable empty or not defined.}" 55 export KUBE_GIT_VERSION 56 echo "using KUBE_GIT_VERSION=${KUBE_GIT_VERSION}" 57 58 # allow both TEST_WINDOWS and WINDOWS for backwards compatibility. 59 export TEST_WINDOWS="${TEST_WINDOWS:-${WINDOWS:-}}" 60 61 # get the latest ci version for a particular release so that kubeadm is 62 # able to pull existing images before being replaced by custom images 63 major="$(echo "${KUBE_GIT_VERSION}" | ${GREP_BINARY} -Po "(?<=v)[0-9]+")" 64 minor="$(echo "${KUBE_GIT_VERSION}" | ${GREP_BINARY} -Po "(?<=v${major}.)[0-9]+")" 65 CI_VERSION="$(capz::util::get_latest_ci_version "${major}.${minor}")" 66 export CI_VERSION 67 echo "using CI_VERSION=${CI_VERSION}" 68 export KUBERNETES_VERSION="${CI_VERSION}" 69 echo "using KUBERNETES_VERSION=${KUBERNETES_VERSION}" 70 71 # Docker tags cannot contain '+' 72 # ref: https://github.com/kubernetes/kubernetes/blob/5491484aa91fd09a01a68042e7674bc24d42687a/build/lib/release.sh#L345-L346 73 export KUBE_IMAGE_TAG="${KUBE_GIT_VERSION/+/_}" 74 echo "using K8s KUBE_IMAGE_TAG=${KUBE_IMAGE_TAG}" 75 76 export AZURE_BLOB_CONTAINER_NAME="${AZURE_BLOB_CONTAINER_NAME:-"kubernetes-ci"}" 77 } 78 79 main() { 80 if [[ "$(az storage container exists --name "${AZURE_BLOB_CONTAINER_NAME}" --query exists --output tsv --auth-mode login)" == "false" ]]; then 81 echo "Creating ${AZURE_BLOB_CONTAINER_NAME} storage container" 82 az storage container create --name "${AZURE_BLOB_CONTAINER_NAME}" --auth-mode login > /dev/null 83 az storage container set-permission --name "${AZURE_BLOB_CONTAINER_NAME}" --auth-mode login --public-access container > /dev/null 84 fi 85 86 if [[ "${KUBE_BUILD_CONFORMANCE:-}" =~ [yY] ]]; then 87 IMAGES+=("conformance") 88 # consume by the conformance test suite 89 export CONFORMANCE_IMAGE="${REGISTRY}/conformance:${KUBE_IMAGE_TAG}" 90 fi 91 92 if [[ "$(can_reuse_artifacts)" == "false" ]]; then 93 echo "Building Kubernetes" 94 95 # TODO(chewong): support multi-arch and Windows build 96 make -C "${KUBE_ROOT}" quick-release 97 98 if [[ "${KUBE_BUILD_CONFORMANCE:-}" =~ [yY] ]]; then 99 # rename conformance image since it is the only image that has an amd64 suffix 100 mv "${KUBE_ROOT}"/_output/release-images/amd64/conformance-amd64.tar "${KUBE_ROOT}"/_output/release-images/amd64/conformance.tar 101 fi 102 103 for IMAGE_NAME in "${IMAGES[@]}"; do 104 # extract docker image URL form `docker load` output 105 OLD_IMAGE_URL="$(docker load --input "${KUBE_ROOT}/_output/release-images/amd64/${IMAGE_NAME}.tar" | ${GREP_BINARY} -oP '(?<=Loaded image: )[^ ]*' | head -n 1)" 106 NEW_IMAGE_URL="${REGISTRY}/${IMAGE_NAME}:${KUBE_IMAGE_TAG}" 107 # retag and push images to ACR 108 docker tag "${OLD_IMAGE_URL}" "${NEW_IMAGE_URL}" && docker push "${NEW_IMAGE_URL}" 109 done 110 111 echo "Uploading binaries to Azure storage container ${AZURE_BLOB_CONTAINER_NAME}" 112 113 for BINARY in "${BINARIES[@]}"; do 114 BIN_PATH="${KUBE_GIT_VERSION}/bin/linux/amd64/${BINARY}" 115 echo "uploading ${BIN_PATH}" 116 az storage blob upload --auth-mode login --overwrite --container-name "${AZURE_BLOB_CONTAINER_NAME}" --file "${KUBE_ROOT}/_output/dockerized/bin/linux/amd64/${BINARY}" --name "${BIN_PATH}" 117 done 118 119 if [[ "${TEST_WINDOWS:-}" == "true" ]]; then 120 echo "Building Kubernetes Windows binaries" 121 122 for BINARY in "${WINDOWS_BINARIES[@]}"; do 123 "${KUBE_ROOT}"/build/run.sh make WHAT=cmd/"${BINARY}" KUBE_BUILD_PLATFORMS=windows/amd64 KUBE_VERBOSE=0 124 done 125 126 for BINARY in "${WINDOWS_BINARIES[@]}"; do 127 BIN_PATH="${KUBE_GIT_VERSION}/bin/windows/amd64/${BINARY}.exe" 128 echo "uploading ${BIN_PATH}" 129 az storage blob upload --auth-mode login --overwrite --container-name "${AZURE_BLOB_CONTAINER_NAME}" --file "${KUBE_ROOT}/_output/dockerized/bin/windows/amd64/${BINARY}.exe" --name "${BIN_PATH}" 130 done 131 fi 132 fi 133 } 134 135 # can_reuse_artifacts returns true if there exists Kubernetes artifacts built from a PR that we can reuse 136 can_reuse_artifacts() { 137 for IMAGE_NAME in "${IMAGES[@]}"; do 138 if ! docker pull "${REGISTRY}/${IMAGE_NAME}:${KUBE_IMAGE_TAG}"; then 139 echo "false" && return 140 fi 141 done 142 143 for BINARY in "${BINARIES[@]}"; do 144 if [[ "$(az storage blob exists --auth-mode login --container-name "${AZURE_BLOB_CONTAINER_NAME}" --name "${KUBE_GIT_VERSION}/bin/linux/amd64/${BINARY}" --query exists --output tsv)" == "false" ]]; then 145 echo "false" && return 146 fi 147 done 148 149 if [[ "${TEST_WINDOWS:-}" == "true" ]]; then 150 for BINARY in "${WINDOWS_BINARIES[@]}"; do 151 if [[ "$(az storage blob exists --auth-mode login --container-name "${AZURE_BLOB_CONTAINER_NAME}" --name "${KUBE_GIT_VERSION}/bin/windows/amd64/${BINARY}.exe" --query exists --output tsv)" == "false" ]]; then 152 echo "false" && return 153 fi 154 done 155 fi 156 157 echo "true" 158 } 159 160 capz::ci-build-kubernetes::cleanup() { 161 if [[ -d "${KUBE_ROOT:-}" ]]; then 162 make -C "${KUBE_ROOT}" clean || true 163 fi 164 } 165 166 trap capz::ci-build-kubernetes::cleanup EXIT 167 168 setup 169 main