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