sync 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  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. echo "listing folders in ./tmp"
  102. echo ""
  103. ls -la ./tmp
  104. echo ""
  105. echo "listing folders in ./tmp/${NAME}"
  106. echo ""
  107. ls -la ./tmp/${NAME}
  108. echo ""
  109. echo "listing folders in ./tmp/${NAME}/extensions"
  110. echo ""
  111. ls -la ./tmp/${NAME}/extensions
  112. echo ""
  113. echo "listing folders in ./tmp/${NAME}/extensions/${NAME}"
  114. echo ""
  115. ls -la ./tmp/${NAME}/extensions/${NAME}
  116. echo ""
  117. echo "listing folders in ./tmp/${NAME}/extensions/${NAME}/${VERSION}"
  118. echo ""
  119. ls -la ./tmp/${NAME}/extensions/${NAME}/${VERSION}
  120. echo ""
  121. # cp ./tmp/${NAME}/extensions/${NAME}/${NAME}-${VERSION}.tgz ./assets/${NAME}
  122. cp -R ./tmp/${NAME}/extensions/${NAME}/${VERSION} ./extensions/${NAME}/${VERSION}
  123. cp -R ./tmp/${NAME}/charts/${NAME}/${VERSION} ./charts/${NAME}/${VERSION}
  124. # Need to patch the charts
  125. echo " + Patching Helm chart"
  126. CR_FILE=./charts/${NAME}/${VERSION}/templates/cr.yaml
  127. ENDPOINT=https://raw.githubusercontent.com/${REPOSITORY}/${BRANCH}/extensions/${NAME}/${VERSION}
  128. sed -i.bak -e 's@endpoint:.*@endpoint: '"$ENDPOINT"'@' ${CR_FILE}
  129. rm -f ${CR_FILE}.bak
  130. echo " + Fetching and patching icon"
  131. # Check the chart file for an icon
  132. CHART_FILE=./charts/${NAME}/${VERSION}/Chart.yaml
  133. ICON=$(sed -nr 's/icon: (.*)/\1/p' ${CHART_FILE})
  134. if [ -n "${ICON}" ]; then
  135. # Downloading icon
  136. ICON_FILE=$(basename $ICON)
  137. echo " + Fetching icon: ${ICON}"
  138. ICON_REL=icons/${NAME}/${VERSION}-${ICON_FILE}
  139. mkdir -p ${BASE_DIR}/icons/${NAME}
  140. rm -f ${BASE_DIR}/${ICON_REL}
  141. wget --quiet -O ${BASE_DIR}/${ICON_REL} ${ICON}
  142. NEW_ICON=https://raw.githubusercontent.com/${REPOSITORY}/${BRANCH}/${ICON_REL}
  143. sed -i.bak -e 's@icon:.*@icon: '"$NEW_ICON"'@' ${CHART_FILE}
  144. rm -rf ${CHART_FILE}.bak
  145. PKG_FILE=${BASE_DIR}/extensions/${NAME}/${VERSION}/plugin/package.json
  146. sed -i.bak -e 's@\"icon\": \".*\"@\"icon\": \"'"$NEW_ICON"'\"@' ${PKG_FILE}
  147. rm -rf ${PKG_FILE}.bak
  148. fi
  149. echo " + Packaging Helm chart"
  150. helm package ./charts/${NAME}/${VERSION} -d ./assets/${NAME}
  151. echo " + Updating Helm index"
  152. # --------------------------------------------------------------------------------
  153. # Update the helm index just for this chart
  154. # --------------------------------------------------------------------------------
  155. if [ -f "${HELM_INDEX}" ]; then
  156. UPDATE="--merge ${HELM_INDEX}"
  157. fi
  158. # Base URL referencing assets directly from GitHub
  159. BASE_URL="assets/${NAME}"
  160. rm -rf ${CHART_TMP}
  161. mkdir -p ${CHART_TMP}
  162. cp ${BASE_DIR}/assets/${NAME}/${NAME}-${VERSION}.tgz ${CHART_TMP}
  163. helm repo index ${CHART_TMP} --url ${BASE_URL} ${UPDATE}
  164. cp ${CHART_TMP}/index.yaml ${HELM_INDEX}
  165. fi
  166. done
  167. echo ""
  168. done
  169. # Clean up
  170. rm -rf ${CHART_TMP}
  171. rm -rf ${TMP}