github.com/rancher/elemental/tests@v0.0.0-20240517125144-ae048c615b3f/scripts/build-airgap (about)

     1  #!/bin/bash
     2  
     3  # Build Airgap
     4  
     5  set -x
     6  
     7  # Retry helm command in case of sporadic issue
     8  function RunHelmCmdWithRetry() {
     9    # Wait for a maximum of 1 minute
    10    for ((i=0; i<60; i++)); do
    11      # If helm command is OK then we simply return (exit the function)
    12      helm $* && return
    13  
    14      # Wait a little
    15      sleep 5
    16    done
    17  
    18    # If we are here then an error happened!
    19    exit 1
    20  }
    21  
    22  # Retry skopeo command in case of sporadic issue
    23  function RunSkopeoCmdWithRetry() {
    24    CMD=$*
    25  
    26    # Wait for a maximum of 1 minute
    27    for ((i=0; i<60; i++)); do
    28      # If skopeo command is OK then we simply return (exit the function)
    29      ERRMSG=$(skopeo ${CMD} 2>&1 > /dev/null) && return
    30  
    31      # If resource access is denied retry with local access
    32      case ${ERRMSG} in
    33        *requested\ access\ to\ the\ resource\ is\ denied*)
    34          CMD=${CMD/docker:\/\//docker-daemon:}
    35          ;;
    36        *Storing\ signatures\ for\ docker\ tar\ files\ is\ not\ supported*)
    37          CMD=${CMD/copy/copy --remove-signatures}
    38          ;;
    39      esac
    40  
    41      # Wait a little
    42      sleep 5
    43    done
    44  
    45    # If we are here then an error happened!
    46    exit 1
    47  }
    48  
    49  # Variable(s)
    50  K3S_UPSTREAM_VERSION=$1
    51  CERT_MANAGER_VERSION=$2
    52  RANCHER_CHANNEL=$3
    53  K3S_DOWNSTREAM_VERSION=$4
    54  ELEMENTAL_REPO=$5
    55  DEPLOY_AIRGAP_SCRIPT=$(realpath ../scripts/deploy-airgap)
    56  OPT_RANCHER="${HOME}/airgap_rancher"
    57  REPO_SERVER="rancher-manager.test:5000"
    58  
    59  # Set Elemental version
    60  case ${ELEMENTAL_REPO} in
    61    */dev/*)
    62      ELEMENTAL_VERSION=dev
    63      ;;
    64    */staging/*)
    65      ELEMENTAL_VERSION=staging
    66      ;;
    67    *)
    68      ELEMENTAL_VERSION=stable
    69      ;;
    70  esac
    71  
    72  # Format K8s version
    73  TMP_VER=${K3S_UPSTREAM_VERSION/+*}
    74  K8S_UPSTREAM_VERSION=${TMP_VER/v}
    75  TMP_VER=${K3S_DOWNSTREAM_VERSION/+*}
    76  K8S_DOWNSTREAM_VERSION=${TMP_VER/v}
    77  
    78  # Create directories
    79  mkdir -p ${OPT_RANCHER}/{k3s_${K8S_UPSTREAM_VERSION},k3s_${K8S_DOWNSTREAM_VERSION},helm} ${OPT_RANCHER}/images/registry
    80  
    81  # Install packages
    82  sudo zypper --no-refresh -n in skopeo yq
    83  
    84  # Add rancher manager in /etc/hosts
    85  sudo sh -c "echo '192.168.122.102 ${REPO_SERVER%:*}' >> /etc/hosts"
    86  
    87  # Download k3s and rancher
    88  for k8s_ver in ${K3S_UPSTREAM_VERSION}:${K8S_UPSTREAM_VERSION} ${K3S_DOWNSTREAM_VERSION}:${K8S_DOWNSTREAM_VERSION}; do
    89    K3S_URL=https://github.com/k3s-io/k3s/releases/download/${k8s_ver%:*}
    90    for i in k3s-airgap-images-amd64.tar.zst k3s; do
    91      curl -sL ${K3S_URL}/${i} -o ${OPT_RANCHER}/k3s_${k8s_ver#*:}/${i}
    92  
    93      # Get the install script
    94      curl -sfL https://get.k3s.io -o ${OPT_RANCHER}/k3s_${k8s_ver#*:}/install.sh
    95  
    96      # Get the airgap deploy script
    97      cp ${DEPLOY_AIRGAP_SCRIPT} ${OPT_RANCHER}/k3s_${k8s_ver#*:}
    98    done
    99  done
   100  
   101  # Get Helm Charts
   102  cd ${OPT_RANCHER}/helm/
   103  
   104  # Add repos
   105  RunHelmCmdWithRetry repo add jetstack https://charts.jetstack.io > /dev/null 2>&1
   106  RunHelmCmdWithRetry repo add rancher-${RANCHER_CHANNEL} https://releases.rancher.com/server-charts/${RANCHER_CHANNEL} > /dev/null 2>&1
   107  RunHelmCmdWithRetry repo update > /dev/null 2>&1
   108  
   109  # Get CertManager charts
   110  [[ "${CERT_MANAGER_VERSION}" != "latest" ]] && VER_OPT="--version ${CERT_MANAGER_VERSION}"
   111  RunHelmCmdWithRetry pull jetstack/cert-manager ${VER_OPT} > /dev/null 2>&1
   112  
   113  # Get CertManager version
   114  CERT_MANAGER_VERSION=$(ls cert-manager-*.tgz 2>/dev/null)
   115  CERT_MANAGER_VERSION=${CERT_MANAGER_VERSION#cert-manager-*}
   116  CERT_MANAGER_VERSION=${CERT_MANAGER_VERSION%.*}
   117  
   118  # Get Rancher charts
   119  [[ "${RANCHER_CHANNEL}" == "latest" ]] && DEVEL="--devel"
   120  RunHelmCmdWithRetry pull rancher-${RANCHER_CHANNEL}/rancher ${DEVEL} > /dev/null 2>&1
   121  for i in elemental-operator-chart elemental-operator-crds-chart ; do
   122    RunHelmCmdWithRetry pull ${ELEMENTAL_REPO}/${i} > /dev/null 2>&1
   123  done
   124  
   125  # Get Rancher Manager version
   126  RANCHER_MANAGER_VERSION=$(ls rancher-*.tgz 2>/dev/null)
   127  RANCHER_MANAGER_VERSION=${RANCHER_MANAGER_VERSION#rancher-*}
   128  RANCHER_MANAGER_VERSION=${RANCHER_MANAGER_VERSION%.*}
   129  
   130  # Get the Elemental repositories
   131  ELEMENTAL_AIRGAP_REPO=https://raw.githubusercontent.com/rancher/elemental-operator/main/scripts
   132  ELEMENTAL_AIRGAP_SCRIPT=elemental-airgap.sh
   133  curl -sOL ${ELEMENTAL_AIRGAP_REPO}/${ELEMENTAL_AIRGAP_SCRIPT}
   134  bash ${ELEMENTAL_AIRGAP_SCRIPT} -d -r ${REPO_SERVER} -sa ${ELEMENTAL_VERSION} || exit 1
   135  rm -f ${ELEMENTAL_AIRGAP_SCRIPT}
   136  
   137  # Get container images
   138  cd ${OPT_RANCHER}/images/
   139  
   140  # Rancher image list
   141  RANCHER_REPO=https://github.com/rancher/rancher/releases/download/v${RANCHER_MANAGER_VERSION}
   142  RANCHER_IMAGES_FILE=rancher-images.txt
   143  curl -sOL ${RANCHER_REPO}/${RANCHER_IMAGES_FILE}
   144  
   145  # CertManager image list
   146  CERT_IMAGES_FILE=cert-manager-images.txt
   147  RunHelmCmdWithRetry template ${OPT_RANCHER}/helm/cert-manager-${CERT_MANAGER_VERSION}.tgz \
   148    | awk '$1 ~ /image:/ {print $2}' \
   149    | sed s/\"//g > ${CERT_IMAGES_FILE}
   150  
   151  # Elemental image list
   152  ELEMENTAL_IMAGES_FILE=elemental-images.txt
   153  mv -f ${OPT_RANCHER}/helm/elemental-images.txt ${ELEMENTAL_IMAGES_FILE}
   154  
   155  # Get images
   156  loop=0
   157  for i in $(< ${CERT_IMAGES_FILE}) $(< ${ELEMENTAL_IMAGES_FILE}) $(< ${RANCHER_IMAGES_FILE}); do
   158    mkdir -p ${i%/*}
   159    RunSkopeoCmdWithRetry copy docker://${i} docker-archive:${i/:/_}.tar:${i} &
   160  
   161    # Wait for skopeo jobs to finish if we already have too much jobs in parallel
   162    # This is to avoid the "too many requests to registry" error!
   163    if (( ++loop > 50 )); then
   164      echo "Wait for sync..."
   165      wait
   166  
   167      # Reset loop counter
   168      loop=0
   169    fi
   170  done
   171  
   172  # Wait for *ALL* skopeo jobs to finish
   173  wait
   174  
   175  # Skopeo - Registry
   176  RunSkopeoCmdWithRetry copy --additional-tag registry:latest docker://registry:latest docker-archive:registry/registry.tar
   177  
   178  # Compress all the things
   179  cd ${OPT_RANCHER}
   180  tar -I pzstd -vcf ${OPT_RANCHER%/*}/airgap_rancher.zst $(ls 2>/dev/null)