Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 

155 righe
4.5 KiB

  1. #!/usr/bin/env bash
  2. set -Eeuo pipefail
  3. # 本地打包脚本:本机完成构建和 docker save,服务器只需要 docker load + compose up。
  4. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  5. ROOT_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)"
  6. DIST_DIR="$SCRIPT_DIR/dist"
  7. IMAGE_NAMESPACE="${IMAGE_NAMESPACE:-emp-test}"
  8. IMAGE_TAG="${IMAGE_TAG:-$(date '+%Y%m%d%H%M%S')}"
  9. PACKAGE_NAME="${PACKAGE_NAME:-emp-test-runtime-${IMAGE_TAG}}"
  10. PACKAGE_DIR="$DIST_DIR/$PACKAGE_NAME"
  11. PACKAGE_ARCHIVE="$DIST_DIR/${PACKAGE_NAME}.tar.gz"
  12. NPM_REGISTRY="${NPM_REGISTRY:-https://registry.npmjs.org}"
  13. SKIP_BUILD="${SKIP_BUILD:-0}"
  14. INCLUDE_MIDDLEWARE_IMAGES="${INCLUDE_MIDDLEWARE_IMAGES:-1}"
  15. JAVA_MODULES=(emp_gateway emp_auth emp_monitor emp_data)
  16. APP_IMAGES=(
  17. "$IMAGE_NAMESPACE/emp-gateway:$IMAGE_TAG"
  18. "$IMAGE_NAMESPACE/emp-gateway:latest"
  19. "$IMAGE_NAMESPACE/emp-auth:$IMAGE_TAG"
  20. "$IMAGE_NAMESPACE/emp-auth:latest"
  21. "$IMAGE_NAMESPACE/emp-monitor:$IMAGE_TAG"
  22. "$IMAGE_NAMESPACE/emp-monitor:latest"
  23. "$IMAGE_NAMESPACE/emp-data:$IMAGE_TAG"
  24. "$IMAGE_NAMESPACE/emp-data:latest"
  25. "$IMAGE_NAMESPACE/emp-pdf:$IMAGE_TAG"
  26. "$IMAGE_NAMESPACE/emp-pdf:latest"
  27. "$IMAGE_NAMESPACE/emp-ws:$IMAGE_TAG"
  28. "$IMAGE_NAMESPACE/emp-ws:latest"
  29. "$IMAGE_NAMESPACE/emp-admin:$IMAGE_TAG"
  30. "$IMAGE_NAMESPACE/emp-admin:latest"
  31. )
  32. MIDDLEWARE_IMAGES=(
  33. "${MYSQL_IMAGE:-mysql:8.0}"
  34. "${REDIS_IMAGE:-redis:7-alpine}"
  35. "${KAFKA_IMAGE:-bitnami/kafka:3.7.0}"
  36. "${TDENGINE_IMAGE:-tdengine/tdengine:3.3.6.0}"
  37. "${NACOS_IMAGE:-nacos/nacos-server:v2.3.2-slim}"
  38. )
  39. log() {
  40. echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"
  41. }
  42. die() {
  43. echo "ERROR: $*" >&2
  44. exit 1
  45. }
  46. need_cmd() {
  47. command -v "$1" >/dev/null 2>&1 || die "缺少命令:$1"
  48. }
  49. build_java_images() {
  50. cd "$ROOT_DIR/emp_server"
  51. log "构建后端 jar"
  52. mvn package -DskipTests -B -pl "$(IFS=,; echo "${JAVA_MODULES[*]}")" -am
  53. for module in "${JAVA_MODULES[@]}"; do
  54. local jar
  55. jar="$(ls "$module"/target/*.jar | grep -v original | grep -v app.jar | head -1)"
  56. cp "$jar" "$module/target/app.jar"
  57. done
  58. log "构建后端镜像"
  59. docker build -f Dockerfile.service --build-arg MODULE=emp_gateway -t "$IMAGE_NAMESPACE/emp-gateway:$IMAGE_TAG" -t "$IMAGE_NAMESPACE/emp-gateway:latest" .
  60. docker build -f Dockerfile.service --build-arg MODULE=emp_auth -t "$IMAGE_NAMESPACE/emp-auth:$IMAGE_TAG" -t "$IMAGE_NAMESPACE/emp-auth:latest" .
  61. docker build -f Dockerfile.service --build-arg MODULE=emp_monitor -t "$IMAGE_NAMESPACE/emp-monitor:$IMAGE_TAG" -t "$IMAGE_NAMESPACE/emp-monitor:latest" .
  62. docker build -f Dockerfile.service --build-arg MODULE=emp_data -t "$IMAGE_NAMESPACE/emp-data:$IMAGE_TAG" -t "$IMAGE_NAMESPACE/emp-data:latest" .
  63. log "构建 PDF 镜像"
  64. docker build -f emp_pdf/Dockerfile -t "$IMAGE_NAMESPACE/emp-pdf:$IMAGE_TAG" -t "$IMAGE_NAMESPACE/emp-pdf:latest" emp_pdf
  65. }
  66. build_ws_image() {
  67. cd "$ROOT_DIR"
  68. log "构建 WS/模拟器镜像"
  69. docker build \
  70. -f deploy/isolated/dockerfiles/emp-ws.Dockerfile \
  71. --build-arg "NPM_REGISTRY=$NPM_REGISTRY" \
  72. -t "$IMAGE_NAMESPACE/emp-ws:$IMAGE_TAG" \
  73. -t "$IMAGE_NAMESPACE/emp-ws:latest" \
  74. .
  75. }
  76. build_admin_image() {
  77. cd "$ROOT_DIR/emp_admin"
  78. log "构建前端 dist"
  79. pnpm install --frozen-lockfile
  80. pnpm run build:shunfeng
  81. cd "$ROOT_DIR"
  82. log "构建前端镜像"
  83. docker build \
  84. -f deploy/isolated/dockerfiles/emp-admin.Dockerfile \
  85. -t "$IMAGE_NAMESPACE/emp-admin:$IMAGE_TAG" \
  86. -t "$IMAGE_NAMESPACE/emp-admin:latest" \
  87. .
  88. }
  89. prepare_package() {
  90. rm -rf "$PACKAGE_DIR"
  91. mkdir -p "$PACKAGE_DIR"
  92. cp "$SCRIPT_DIR/docker-compose.runtime.yml" "$PACKAGE_DIR/docker-compose.yml"
  93. cp "$SCRIPT_DIR/.env.example" "$PACKAGE_DIR/.env.example"
  94. cp "$SCRIPT_DIR/install.sh" "$PACKAGE_DIR/install.sh"
  95. cp "$SCRIPT_DIR/README.md" "$PACKAGE_DIR/README.md"
  96. chmod +x "$PACKAGE_DIR/install.sh"
  97. }
  98. save_images() {
  99. local images=("${APP_IMAGES[@]}")
  100. if [[ "$INCLUDE_MIDDLEWARE_IMAGES" == "1" ]]; then
  101. log "拉取中间件镜像"
  102. for image in "${MIDDLEWARE_IMAGES[@]}"; do
  103. docker pull "$image"
  104. images+=("$image")
  105. done
  106. fi
  107. log "导出镜像包"
  108. docker save -o "$PACKAGE_DIR/images.tar" "${images[@]}"
  109. }
  110. archive_package() {
  111. mkdir -p "$DIST_DIR"
  112. rm -f "$PACKAGE_ARCHIVE"
  113. tar -czf "$PACKAGE_ARCHIVE" -C "$DIST_DIR" "$PACKAGE_NAME"
  114. log "打包完成:$PACKAGE_ARCHIVE"
  115. }
  116. need_cmd docker
  117. need_cmd tar
  118. if [[ "$SKIP_BUILD" != "1" ]]; then
  119. need_cmd mvn
  120. need_cmd pnpm
  121. build_java_images
  122. build_ws_image
  123. build_admin_image
  124. else
  125. log "跳过构建,仅打包当前本机已有镜像"
  126. fi
  127. prepare_package
  128. save_images
  129. archive_package