sync 5.1 KB

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