sigs.k8s.io/cluster-api-provider-azure@v1.14.3/scripts/ci-build-azure-ccm.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-go.sh 27 source "${REPO_ROOT}/hack/ensure-go.sh" 28 # shellcheck source=hack/parse-prow-creds.sh 29 source "${REPO_ROOT}/hack/parse-prow-creds.sh" 30 31 : "${AZURE_STORAGE_ACCOUNT:?Environment variable empty or not defined.}" 32 : "${AZURE_STORAGE_KEY:?Environment variable empty or not defined.}" 33 : "${REGISTRY:?Environment variable empty or not defined.}" 34 35 # cloud controller manager image 36 export CCM_IMAGE_NAME=azure-cloud-controller-manager 37 # cloud node manager image 38 export CNM_IMAGE_NAME=azure-cloud-node-manager 39 # cloud node manager windows image version 40 export WINDOWS_IMAGE_VERSION=1809 41 # container name 42 export AZURE_BLOB_CONTAINER_NAME="${AZURE_BLOB_CONTAINER_NAME:-"kubernetes-ci"}" 43 44 setup() { 45 AZURE_CLOUD_PROVIDER_ROOT="${AZURE_CLOUD_PROVIDER_ROOT:-""}" 46 if [[ -z "${AZURE_CLOUD_PROVIDER_ROOT}" ]]; then 47 AZURE_CLOUD_PROVIDER_ROOT="$(go env GOPATH)/src/sigs.k8s.io/cloud-provider-azure" 48 export AZURE_CLOUD_PROVIDER_ROOT 49 fi 50 51 # the azure-cloud-provider repo expects IMAGE_REGISTRY. 52 export IMAGE_REGISTRY=${REGISTRY} 53 pushd "${AZURE_CLOUD_PROVIDER_ROOT}" && IMAGE_TAG=$(git rev-parse --short=7 HEAD) && 54 IMAGE_TAG_CCM="${IMAGE_TAG_CCM:-${IMAGE_TAG}}" && IMAGE_TAG_CNM="${IMAGE_TAG_CNM:-${IMAGE_TAG}}" && 55 export IMAGE_TAG_CCM && export IMAGE_TAG_CNM && popd 56 echo "Image registry is ${REGISTRY}" 57 echo "Image Tag CCM is ${IMAGE_TAG_CCM}" 58 echo "Image Tag CNM is ${IMAGE_TAG_CNM}" 59 IMAGE_TAG_ACR_CREDENTIAL_PROVIDER="${IMAGE_TAG_ACR_CREDENTIAL_PROVIDER:-${IMAGE_TAG}}" 60 export IMAGE_TAG_ACR_CREDENTIAL_PROVIDER 61 echo "Image Tag ACR credential provider is ${IMAGE_TAG_ACR_CREDENTIAL_PROVIDER}" 62 63 if [[ -n "${WINDOWS_SERVER_VERSION:-}" ]]; then 64 if [[ "${WINDOWS_SERVER_VERSION}" == "windows-2019" ]]; then 65 export WINDOWS_IMAGE_VERSION="1809" 66 elif [[ "${WINDOWS_SERVER_VERSION}" == "windows-2022" ]]; then 67 export WINDOWS_IMAGE_VERSION="ltsc2022" 68 else 69 echo "Windows version not supported: ${WINDOWS_SERVER_VERSION}" 70 fi 71 fi 72 } 73 74 main() { 75 if [[ "$(can_reuse_artifacts)" =~ "false" ]]; then 76 echo "Building Linux Azure amd64 cloud controller manager" 77 make -C "${AZURE_CLOUD_PROVIDER_ROOT}" build-ccm-image-amd64 push-ccm-image-amd64 78 echo "Building Linux amd64 and Windows ${WINDOWS_IMAGE_VERSION} amd64 cloud node managers" 79 make -C "${AZURE_CLOUD_PROVIDER_ROOT}" build-node-image-linux-amd64 push-node-image-linux-amd64 push-node-image-windows-"${WINDOWS_IMAGE_VERSION}"-amd64 manifest-node-manager-image-windows-"${WINDOWS_IMAGE_VERSION}"-amd64 80 81 echo "Building and pushing Linux and Windows amd64 Azure ACR credential provider" 82 make -C "${AZURE_CLOUD_PROVIDER_ROOT}" bin/azure-acr-credential-provider bin/azure-acr-credential-provider.exe 83 84 if [[ "$(az storage container exists --name "${AZURE_BLOB_CONTAINER_NAME}" --query exists --output tsv)" == "false" ]]; then 85 echo "Creating ${AZURE_BLOB_CONTAINER_NAME} storage container" 86 az storage container create --name "${AZURE_BLOB_CONTAINER_NAME}" > /dev/null 87 az storage container set-permission --name "${AZURE_BLOB_CONTAINER_NAME}" --public-access container > /dev/null 88 fi 89 90 az storage blob upload --overwrite --container-name "${AZURE_BLOB_CONTAINER_NAME}" --file "${AZURE_CLOUD_PROVIDER_ROOT}/bin/azure-acr-credential-provider" --name "${IMAGE_TAG_ACR_CREDENTIAL_PROVIDER}/azure-acr-credential-provider" 91 az storage blob upload --overwrite --container-name "${AZURE_BLOB_CONTAINER_NAME}" --file "${AZURE_CLOUD_PROVIDER_ROOT}/bin/azure-acr-credential-provider.exe" --name "${IMAGE_TAG_ACR_CREDENTIAL_PROVIDER}/azure-acr-credential-provider.exe" 92 az storage blob upload --overwrite --container-name "${AZURE_BLOB_CONTAINER_NAME}" --file "${AZURE_CLOUD_PROVIDER_ROOT}/examples/out-of-tree/credential-provider-config.yaml" --name "${IMAGE_TAG_ACR_CREDENTIAL_PROVIDER}/credential-provider-config.yaml" 93 az storage blob upload --overwrite --container-name "${AZURE_BLOB_CONTAINER_NAME}" --file "${AZURE_CLOUD_PROVIDER_ROOT}/examples/out-of-tree/credential-provider-config-win.yaml" --name "${IMAGE_TAG_ACR_CREDENTIAL_PROVIDER}/credential-provider-config-win.yaml" 94 fi 95 } 96 97 # can_reuse_artifacts returns true if there exists CCM artifacts built from a PR that we can reuse 98 can_reuse_artifacts() { 99 declare -a IMAGES=("${CCM_IMAGE_NAME}:${IMAGE_TAG_CCM}" "${CNM_IMAGE_NAME}:${IMAGE_TAG_CNM}") 100 for IMAGE in "${IMAGES[@]}"; do 101 if ! docker pull "${REGISTRY}/${IMAGE}"; then 102 echo "false" && return 103 fi 104 done 105 106 FULL_VERSION=$(docker manifest inspect mcr.microsoft.com/windows/nanoserver:${WINDOWS_IMAGE_VERSION} | jq -r '.manifests[0].platform["os.version"]') 107 if ! docker manifest inspect "${REGISTRY}/${CNM_IMAGE_NAME}:${IMAGE_TAG_CNM}" | grep -q "\"os.version\": \"${FULL_VERSION}\""; then 108 echo "false" && return 109 fi 110 111 for BINARY in azure-acr-credential-provider azure-acr-credential-provider.exe credential-provider-config.yaml credential-provider-config-win.yaml; do 112 if [[ "$(az storage blob exists --container-name "${AZURE_BLOB_CONTAINER_NAME}" --name "${IMAGE_TAG_ACR_CREDENTIAL_PROVIDER}/${BINARY}" --query exists --output tsv)" == "false" ]]; then 113 echo "false" && return 114 fi 115 done 116 117 echo "true" 118 } 119 120 capz::ci-build-azure-ccm::cleanup() { 121 echo "cloud-provider-azure cleanup" 122 if [[ -d "${AZURE_CLOUD_PROVIDER_ROOT:-}" ]]; then 123 make -C "${AZURE_CLOUD_PROVIDER_ROOT}" clean || true 124 fi 125 } 126 127 trap capz::ci-build-azure-ccm::cleanup EXIT 128 129 setup 130 main