sync 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. #!/usr/bin/env bash
  2. set -euo pipefail
  3. SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
  4. BASE_DIR="$( cd $SCRIPT_DIR && cd .. & pwd)"
  5. CYAN="\033[96m"
  6. YELLOW="\033[93m"
  7. RESET="\033[0m"
  8. BOLD="\033[1m"
  9. NORMAL="\033[22m"
  10. CHECK="\xE2\x9C\x94"
  11. ORG=rancher
  12. BRANCH=main
  13. CLEAN=false
  14. usage() {
  15. echo "Usage: $0 [<options>]"
  16. echo " options:"
  17. echo " [-c | --clean] Clean the current extension assets including: ./{charts, assets, extensions, icons}"
  18. echo " [-o | --org] <name> Specify the organization of the current repository (defaults to 'rancher')"
  19. echo " [-b | --branch] <name> Specify the destination branch of the extension assets within the current repository (defaults to 'main')"
  20. exit 1
  21. }
  22. while [[ $# -gt 0 ]]; do
  23. case "$1" in
  24. -h|--help)
  25. usage
  26. ;;
  27. -o|--org)
  28. if [[ -z $2 || $2 == -* ]]; then
  29. echo "Error: Missing argument for $1 option"
  30. usage
  31. fi
  32. ORG="${2}"
  33. shift 2
  34. ;;
  35. -c|--clean)
  36. CLEAN=true
  37. shift
  38. ;;
  39. -b|--branch)
  40. if [[ -z $2 || $2 == -* ]]; then
  41. echo "Error: Missing argument for $1 option"
  42. usage
  43. fi
  44. BRANCH="${2}"
  45. shift 2
  46. ;;
  47. *)
  48. echo "Error: Unknown option $1"
  49. usage
  50. ;;
  51. esac
  52. done
  53. shift $((OPTIND-1))
  54. if [[ $CLEAN == true ]]; then
  55. rm -rf ./charts
  56. rm -rf ./assets
  57. rm -rf ./extensions
  58. rm -rf ./icons
  59. fi
  60. echo -e "${CYAN}${BOLD}Syncing Extensions${RESET}"
  61. EXTS=$(jq -r ".extensions | keys[]" manifest.json)
  62. TMP=${BASE_DIR}/tmp
  63. rm -rf ${TMP}
  64. mkdir -p ${TMP}
  65. HELM_INDEX=${BASE_DIR}/index.yaml
  66. CHART_TMP=${TMP}/_charts
  67. REPOSITORY=${ORG}/partner-extensions
  68. echo "GitHub Repository: ${REPOSITORY}"
  69. echo "GitHub Branch: ${BRANCH}"
  70. for NAME in ${EXTS}
  71. do
  72. echo -e "${CYAN} + Syncing: ${BOLD}${NAME}${RESET}"
  73. # Make diretories for assets, charts, and extensions
  74. mkdir -p ./assets/${NAME}
  75. mkdir -p ./charts/${NAME}
  76. mkdir -p ./extensions/${NAME}
  77. # Get repository name, branch, and versions
  78. REPO=$(jq -r ".extensions.\"${NAME}\".repo" manifest.json)
  79. EXT_BRANCH=$(jq -r ".extensions.\"${NAME}\".branch" manifest.json)
  80. VERSIONS=$(jq -r ".extensions.\"${NAME}\".versions[]" manifest.json)
  81. VFORMAT=$(echo $VERSIONS | tr '\n' ' ')
  82. echo -e " Repository: ${REPO}"
  83. echo -e " Branch: ${EXT_BRANCH}"
  84. echo -e " Versions : ${VFORMAT}"
  85. echo ""
  86. echo -e " .. Cloning repository"
  87. rm -rf ./tmp/${NAME}
  88. pushd tmp > /dev/null
  89. git clone https://github.com/${REPO}.git ${NAME}
  90. cd ${NAME}
  91. git checkout ${EXT_BRANCH}
  92. pwd
  93. popd > /dev/null
  94. for VERSION in ${VERSIONS}
  95. do
  96. echo -e "${CYAN} Syncing: ${BOLD}${NAME}@${VERSION}${RESET}"
  97. if [ -d "./charts/${NAME}/${VERSION}" ]; then
  98. echo " Version already synced"
  99. else
  100. echo " + Copying version ${VERSION}"
  101. # cp ./tmp/${NAME}/extensions/${NAME}/${NAME}-${VERSION}.tgz ./assets/${NAME}
  102. cp -R ./tmp/${NAME}/extensions/${NAME}/${VERSION} ./extensions/${NAME}/${VERSION}
  103. cp -R ./tmp/${NAME}/charts/${NAME}/${VERSION} ./charts/${NAME}/${VERSION}
  104. # Need to patch the charts
  105. echo " + Patching Helm chart"
  106. CR_FILE=./charts/${NAME}/${VERSION}/templates/cr.yaml
  107. ENDPOINT=https://raw.githubusercontent.com/${REPOSITORY}/${BRANCH}/extensions/${NAME}/${VERSION}
  108. sed -i.bak -e 's@endpoint:.*@endpoint: '"$ENDPOINT"'@' ${CR_FILE}
  109. rm -f ${CR_FILE}.bak
  110. echo " + Fetching and patching icon"
  111. # Check the chart file for an icon
  112. CHART_FILE=./charts/${NAME}/${VERSION}/Chart.yaml
  113. ICON=$(yq eval '.icon' ${CHART_FILE})
  114. if [ -n "${ICON}" ]; then
  115. # Downloading icon
  116. ICON_FILE=$(basename $ICON)
  117. echo " + Fetching icon: ${ICON}"
  118. ICON_REL=icons/${NAME}/${VERSION}-${ICON_FILE}
  119. mkdir -p ${BASE_DIR}/icons/${NAME}
  120. rm -f ${BASE_DIR}/${ICON_REL}
  121. wget --quiet -O ${BASE_DIR}/${ICON_REL} ${ICON}
  122. NEW_ICON=https://raw.githubusercontent.com/${REPOSITORY}/${BRANCH}/${ICON_REL}
  123. # Check if '>-' exists in the icon property to remove the second line
  124. if grep -q 'icon: >-' "${CHART_FILE}"; then
  125. SECOND_LINE=$(sed -n '/^icon: >-/{n;p;q}' "${CHART_FILE}")
  126. sed -i.bak '/^icon: >-/{n;d;}' "${CHART_FILE}"
  127. sed -i -e 's@icon:.*@icon: '"${NEW_ICON}"'@' ${CHART_FILE}
  128. else
  129. sed -i.bak -e 's@icon:.*@icon: '"${NEW_ICON}"'@' ${CHART_FILE}
  130. fi
  131. rm -rf ${CHART_FILE}.bak
  132. PKG_FILE=${BASE_DIR}/extensions/${NAME}/${VERSION}/plugin/package.json
  133. sed -i.bak -e 's@\"icon\": \".*\"@\"icon\": \"'"$NEW_ICON"'\"@' ${PKG_FILE}
  134. rm -rf ${PKG_FILE}.bak
  135. fi
  136. echo " + Packaging Helm chart"
  137. helm package ./charts/${NAME}/${VERSION} -d ./assets/${NAME}
  138. echo " + Updating Helm index"
  139. # --------------------------------------------------------------------------------
  140. # Update the helm index just for this chart
  141. # --------------------------------------------------------------------------------
  142. if [ -f "${HELM_INDEX}" ]; then
  143. UPDATE="--merge ${HELM_INDEX}"
  144. fi
  145. # Base URL referencing assets directly from GitHub
  146. BASE_URL="assets/${NAME}"
  147. rm -rf ${CHART_TMP}
  148. mkdir -p ${CHART_TMP}
  149. cp ${BASE_DIR}/assets/${NAME}/${NAME}-${VERSION}.tgz ${CHART_TMP}
  150. helm repo index ${CHART_TMP} --url ${BASE_URL} ${UPDATE}
  151. cp ${CHART_TMP}/index.yaml ${HELM_INDEX}
  152. fi
  153. done
  154. echo ""
  155. done
  156. # Clean up
  157. rm -rf ${CHART_TMP}
  158. rm -rf ${TMP}