docker_push.sh 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #!/bin/bash
  2. set -o errexit
  3. set -o pipefail
  4. if [ "$DEBUG" == "true" ]; then
  5. set -ex ;export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'
  6. fi
  7. pushd $(dirname $(dirname "$BASH_SOURCE")) > /dev/null
  8. CUR_DIR=$(pwd)
  9. SRC_DIR=$CUR_DIR
  10. popd > /dev/null
  11. DOCKER_DIR="$SRC_DIR"
  12. get_current_arch() {
  13. local current_arch
  14. case $(uname -m) in
  15. x86_64)
  16. current_arch=amd64
  17. ;;
  18. aarch64)
  19. current_arch=arm64
  20. ;;
  21. riscv64)
  22. current_arch=riscv64
  23. ;;
  24. esac
  25. echo $current_arch
  26. }
  27. ALLARCH=("amd64" "arm64" "riscv64")
  28. CURRENT_ARCH=$(get_current_arch)
  29. ARCH=${ARCH:-$CURRENT_ARCH}
  30. REGISTRY=${REGISTRY:-registry.cn-beijing.aliyuncs.com/yunionio}
  31. TAG=${TAG:-latest}
  32. build_src() {
  33. docker run --network host --rm \
  34. -v $SRC_DIR:/app \
  35. -e OEM_VERSION=$OEM_VERSION \
  36. -e VUE_APP_OEM_VERSION=$VUE_APP_OEM_VERSION \
  37. registry.cn-beijing.aliyuncs.com/swordqiu/node:20-alpine-git \
  38. /bin/sh -c "set -ex;
  39. git config --global --add safe.directory /app;
  40. cd /app;
  41. yarn cache clean
  42. rm -fr node_modules
  43. yarn install;
  44. yarn run build;
  45. chown -R $(id -u):$(id -g) dist node_modules;
  46. "
  47. }
  48. buildx_and_push() {
  49. local tag=$1
  50. local file=$2
  51. local path=$3
  52. local arch=$4
  53. docker buildx build -t "$tag" --platform "linux/$arch" -f "$2" "$3" --push
  54. docker pull --platform "linux/$arch" "$tag"
  55. }
  56. make_manifest_image() {
  57. local img_name=$1
  58. local arch=$2
  59. CMD="docker buildx imagetools create -t ${img_name} "
  60. for ac in "${ALLARCH[@]}"; do
  61. if [[ "${arch}" == "all" || "${arch}" == *"$ac"* ]]; then
  62. CMD="${CMD} ${img_name}-${ac}"
  63. fi
  64. done
  65. echo "$CMD"
  66. $CMD
  67. }
  68. # 如果 ENV="local",跳过 build_src
  69. if [[ "$ENV" != "local" ]]; then
  70. build_src
  71. fi
  72. if [[ "$DRY_RUN" == "true" ]]; then
  73. echo "[$(readlink -f ${BASH_SOURCE}):${LINENO} ${FUNCNAME[0]}] return for DRY_RUN"
  74. exit 0
  75. fi
  76. img_name="$REGISTRY/web:$TAG"
  77. set -x
  78. multiarch=""
  79. for ac in "${ALLARCH[@]}"; do
  80. if [[ "$ARCH" == "$ac" ]]; then
  81. # single arch
  82. buildx_and_push "$img_name" "$DOCKER_DIR/Dockerfile" "$SRC_DIR" "$ARCH"
  83. elif [[ "$ARCH" == "all" || "$ARCH" == *"$ac"* ]]; then
  84. multiarch="true"
  85. buildx_and_push "$img_name-$ac" "$DOCKER_DIR/Dockerfile" "$SRC_DIR" "$ac"
  86. fi
  87. done
  88. if [[ "$multiarch" == "true" ]]; then
  89. make_manifest_image $img_name $ARCH
  90. fi
  91. echo "更新命令:"
  92. echo "kubectl patch oc -n onecloud default --type='json' -p='[{op: replace, path: /spec/web/imageName, value: web},{"op": "replace", "path": "/spec/web/repository", "value": "${REGISTRY}"},{"op": "add", "path": "/spec/web/tag", "value": "${TAG}"}]'"
  93. # 输出当前web-console版本信息
  94. if [ "$ENV" == "local" ]; then
  95. WEB_CONSOLE_VERSION=$(grep -o 'web-console-fe:v[^[:space:]]*' Dockerfile | head -1 | sed 's/web-console-fe://')
  96. echo "当前web-console版本为: ${WEB_CONSOLE_VERSION}"
  97. echo "请注意检查web-console环境兼容性!"
  98. echo "请注意检查OEM_VERSION是否设置"
  99. fi