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)