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