#!/usr/bin/env bash SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" BASE_DIR="$( cd $SCRIPT_DIR && cd .. & pwd)" CYAN="\033[96m" YELLOW="\033[93m" RESET="\033[0m" BOLD="\033[1m" NORMAL="\033[22m" CHECK="\xE2\x9C\x94" ORG=rancher BRANCH=main CLEAN=false usage() { echo "Usage: $0 []" echo " options:" echo " [-c | --clean] Clean the current extension assets including: ./{charts, assets, extensions, icons}" echo " [-o | --org] Specify the organization of the current repository (defaults to 'rancher')" echo " [-b | --branch] Specify the destination branch of the extension assets within the current repository (defaults to 'main')" exit 1 } while [[ $# -gt 0 ]]; do case "$1" in -h|--help) usage ;; -o|--org) if [[ -z $2 || $2 == -* ]]; then echo "Error: Missing argument for $1 option" usage fi ORG="${2}" shift 2 ;; -c|--clean) CLEAN=true shift ;; -b|--branch) if [[ -z $2 || $2 == -* ]]; then echo "Error: Missing argument for $1 option" usage fi BRANCH="${2}" shift 2 ;; *) echo "Error: Unknown option $1" usage ;; esac done shift $((OPTIND-1)) if [[ $CLEAN == true ]]; then rm -rf ./charts rm -rf ./assets rm -rf ./extensions rm -rf ./icons fi echo -e "${CYAN}${BOLD}Syncing Extensions${RESET}" EXTS=$(jq -r ".extensions | keys[]" manifest.json) TMP=${BASE_DIR}/tmp rm -rf ${TMP} mkdir -p ${TMP} HELM_INDEX=${BASE_DIR}/index.yaml CHART_TMP=${TMP}/_charts REPOSITORY=${ORG}/partner-extensions echo "GitHub Repository: ${REPOSITORY}" echo "GitHub Branch: ${BRANCH}" for NAME in ${EXTS} do echo -e "${CYAN} + Syncing: ${BOLD}${NAME}${RESET}" # Make diretories for assets, charts, and extensions mkdir -p ./assets/${NAME} mkdir -p ./charts/${NAME} mkdir -p ./extensions/${NAME} # Get repository name, branch, and versions REPO=$(jq -r ".extensions.${NAME}.repo" manifest.json) EXT_BRANCH=$(jq -r ".extensions.${NAME}.branch" manifest.json) VERSIONS=$(jq -r ".extensions.${NAME}.versions[]" manifest.json) VFORMAT=$(echo $VERSIONS | tr '\n' ' ') echo -e " Repository: ${REPO}" echo -e " Branch: ${EXT_BRANCH}" echo -e " Versions : ${VFORMAT}" echo "" echo -e " .. Cloning repository" rm -rf ./tmp/${NAME} pushd tmp > /dev/null git clone https://github.com/${REPO}.git ${NAME} cd ${NAME} git checkout ${EXT_BRANCH} pwd popd > /dev/null for VERSION in ${VERSIONS} do echo -e "${CYAN} Syncing: ${BOLD}${NAME}@${VERSION}${RESET}" if [ -d "./charts/${NAME}/${VERSION}" ]; then echo " Version already synced" else echo " + Copying version ${VERSION}" # cp ./tmp/${NAME}/extensions/${NAME}/${NAME}-${VERSION}.tgz ./assets/${NAME} cp -R ./tmp/${NAME}/extensions/${NAME}/${VERSION} ./extensions/${NAME}/${VERSION} cp -R ./tmp/${NAME}/charts/${NAME}/${VERSION} ./charts/${NAME}/${VERSION} # Need to patch the charts echo " + Patching Helm chart" CR_FILE=./charts/${NAME}/${VERSION}/templates/cr.yaml ENDPOINT=https://raw.githubusercontent.com/${REPOSITORY}/${BRANCH}/extensions/${NAME}/${VERSION} sed -i.bak -e 's@endpoint:.*@endpoint: '"$ENDPOINT"'@' ${CR_FILE} rm -f ${CR_FILE}.bak echo " + Fetching and patching icon" # Check the chart file for an icon CHART_FILE=./charts/${NAME}/${VERSION}/Chart.yaml ICON=$(sed -nr 's/icon: (.*)/\1/p' ${CHART_FILE}) if [ -n "${ICON}" ]; then # Downloading icon ICON_FILE=$(basename $ICON) echo " + Fetching icon: ${ICON}" ICON_REL=icons/${NAME}/${VERSION}-${ICON_FILE} mkdir -p ${BASE_DIR}/icons/${NAME} rm -f ${BASE_DIR}/${ICON_REL} wget --quiet -O ${BASE_DIR}/${ICON_REL} ${ICON} NEW_ICON=https://raw.githubusercontent.com/${REPOSITORY}/${BRANCH}/${ICON_REL} sed -i.bak -e 's@icon:.*@icon: '"$NEW_ICON"'@' ${CHART_FILE} rm -rf ${CHART_FILE}.bak PKG_FILE=${BASE_DIR}/extensions/${NAME}/${VERSION}/plugin/package.json sed -i.bak -e 's@\"icon\": \".*\"@\"icon\": \"'"$NEW_ICON"'\"@' ${PKG_FILE} rm -rf ${PKG_FILE}.bak fi echo " + Packaging Helm chart" helm package ./charts/${NAME}/${VERSION} -d ./assets/${NAME} echo " + Updating Helm index" # -------------------------------------------------------------------------------- # Update the helm index just for this chart # -------------------------------------------------------------------------------- if [ -f "${HELM_INDEX}" ]; then UPDATE="--merge ${HELM_INDEX}" fi # Base URL referencing assets directly from GitHub BASE_URL="assets/${NAME}" rm -rf ${CHART_TMP} mkdir -p ${CHART_TMP} cp ${BASE_DIR}/assets/${NAME}/${NAME}-${VERSION}.tgz ${CHART_TMP} helm repo index ${CHART_TMP} --url ${BASE_URL} ${UPDATE} cp ${CHART_TMP}/index.yaml ${HELM_INDEX} fi done echo "" done # Clean up rm -rf ${CHART_TMP} rm -rf ${TMP}