您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 

211 行
6.1 KiB

  1. #!/usr/bin/env bash
  2. set -Eeuo pipefail
  3. # Build all images locally, export them, and create a server runtime package.
  4. # Supports both layouts:
  5. # 1. monorepo: emp/deploy/isolated/build-package.sh
  6. # 2. split deploy: emp_test_deploy/isolated/build-package.sh with EMP_ROOT=/path/to/emp
  7. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  8. DIST_DIR="$SCRIPT_DIR/dist"
  9. BUILD_CONTEXT_DIR="$SCRIPT_DIR/.build-context"
  10. IMAGE_NAMESPACE="${IMAGE_NAMESPACE:-emp-test}"
  11. IMAGE_TAG="${IMAGE_TAG:-$(date '+%Y%m%d%H%M%S')}"
  12. PACKAGE_NAME="${PACKAGE_NAME:-emp-test-runtime-${IMAGE_TAG}}"
  13. PACKAGE_DIR="$DIST_DIR/$PACKAGE_NAME"
  14. PACKAGE_ARCHIVE="$DIST_DIR/${PACKAGE_NAME}.tar.gz"
  15. NPM_REGISTRY="${NPM_REGISTRY:-https://registry.npmjs.org}"
  16. SKIP_BUILD="${SKIP_BUILD:-0}"
  17. INCLUDE_MIDDLEWARE_IMAGES="${INCLUDE_MIDDLEWARE_IMAGES:-1}"
  18. JAVA_MODULES=(emp_gateway emp_auth emp_monitor emp_data)
  19. APP_IMAGES=(
  20. "$IMAGE_NAMESPACE/emp-gateway:$IMAGE_TAG"
  21. "$IMAGE_NAMESPACE/emp-gateway:latest"
  22. "$IMAGE_NAMESPACE/emp-auth:$IMAGE_TAG"
  23. "$IMAGE_NAMESPACE/emp-auth:latest"
  24. "$IMAGE_NAMESPACE/emp-monitor:$IMAGE_TAG"
  25. "$IMAGE_NAMESPACE/emp-monitor:latest"
  26. "$IMAGE_NAMESPACE/emp-data:$IMAGE_TAG"
  27. "$IMAGE_NAMESPACE/emp-data:latest"
  28. "$IMAGE_NAMESPACE/emp-pdf:$IMAGE_TAG"
  29. "$IMAGE_NAMESPACE/emp-pdf:latest"
  30. "$IMAGE_NAMESPACE/emp-ws:$IMAGE_TAG"
  31. "$IMAGE_NAMESPACE/emp-ws:latest"
  32. "$IMAGE_NAMESPACE/emp-admin:$IMAGE_TAG"
  33. "$IMAGE_NAMESPACE/emp-admin:latest"
  34. )
  35. MIDDLEWARE_IMAGES=(
  36. "${MYSQL_IMAGE:-mysql:8.0}"
  37. "${REDIS_IMAGE:-redis:7-alpine}"
  38. "${KAFKA_IMAGE:-bitnami/kafka:3.7.0}"
  39. "${TDENGINE_IMAGE:-tdengine/tdengine:3.3.6.0}"
  40. "${NACOS_IMAGE:-nacos/nacos-server:v2.3.2-slim}"
  41. )
  42. log() {
  43. echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"
  44. }
  45. die() {
  46. echo "ERROR: $*" >&2
  47. exit 1
  48. }
  49. need_cmd() {
  50. command -v "$1" >/dev/null 2>&1 || die "Missing command: $1"
  51. }
  52. has_emp_root() {
  53. [[ -d "$1/emp_server" && -d "$1/emp_admin" && -d "$1/emp_ws" ]]
  54. }
  55. resolve_root_dir() {
  56. if [[ -n "${EMP_ROOT:-}" ]]; then
  57. local root
  58. root="$(cd "$EMP_ROOT" && pwd)"
  59. has_emp_root "$root" || die "EMP_ROOT is invalid: $EMP_ROOT"
  60. printf '%s\n' "$root"
  61. return
  62. fi
  63. local candidates=(
  64. "$SCRIPT_DIR/../.."
  65. "$SCRIPT_DIR/../../emp"
  66. "$SCRIPT_DIR/.."
  67. "$PWD"
  68. )
  69. local candidate root
  70. for candidate in "${candidates[@]}"; do
  71. if [[ -d "$candidate" ]]; then
  72. root="$(cd "$candidate" && pwd)"
  73. if has_emp_root "$root"; then
  74. printf '%s\n' "$root"
  75. return
  76. fi
  77. fi
  78. done
  79. die "Cannot find EMP root. Set EMP_ROOT=/path/to/emp where emp_server, emp_admin and emp_ws exist."
  80. }
  81. ROOT_DIR="$(resolve_root_dir)"
  82. build_java_images() {
  83. cd "$ROOT_DIR/emp_server"
  84. log "Build backend jars"
  85. mvn package -DskipTests -B -pl "$(IFS=,; echo "${JAVA_MODULES[*]}")" -am
  86. for module in "${JAVA_MODULES[@]}"; do
  87. local jar
  88. jar="$(ls "$module"/target/*.jar | grep -v original | grep -v app.jar | head -1)"
  89. [[ -n "$jar" ]] || die "Jar not found for $module"
  90. cp "$jar" "$module/target/app.jar"
  91. done
  92. log "Build backend images"
  93. docker build -f Dockerfile.service --build-arg MODULE=emp_gateway -t "$IMAGE_NAMESPACE/emp-gateway:$IMAGE_TAG" -t "$IMAGE_NAMESPACE/emp-gateway:latest" .
  94. docker build -f Dockerfile.service --build-arg MODULE=emp_auth -t "$IMAGE_NAMESPACE/emp-auth:$IMAGE_TAG" -t "$IMAGE_NAMESPACE/emp-auth:latest" .
  95. docker build -f Dockerfile.service --build-arg MODULE=emp_monitor -t "$IMAGE_NAMESPACE/emp-monitor:$IMAGE_TAG" -t "$IMAGE_NAMESPACE/emp-monitor:latest" .
  96. docker build -f Dockerfile.service --build-arg MODULE=emp_data -t "$IMAGE_NAMESPACE/emp-data:$IMAGE_TAG" -t "$IMAGE_NAMESPACE/emp-data:latest" .
  97. log "Build PDF image"
  98. docker build -f emp_pdf/Dockerfile -t "$IMAGE_NAMESPACE/emp-pdf:$IMAGE_TAG" -t "$IMAGE_NAMESPACE/emp-pdf:latest" emp_pdf
  99. }
  100. build_ws_image() {
  101. cd "$ROOT_DIR"
  102. log "Build WS/simulator image"
  103. docker build \
  104. -f "$SCRIPT_DIR/dockerfiles/emp-ws.Dockerfile" \
  105. --build-arg "NPM_REGISTRY=$NPM_REGISTRY" \
  106. -t "$IMAGE_NAMESPACE/emp-ws:$IMAGE_TAG" \
  107. -t "$IMAGE_NAMESPACE/emp-ws:latest" \
  108. .
  109. }
  110. build_admin_image() {
  111. cd "$ROOT_DIR/emp_admin"
  112. log "Build frontend dist"
  113. pnpm install --frozen-lockfile
  114. pnpm run build:shunfeng
  115. log "Prepare frontend image context"
  116. rm -rf "$BUILD_CONTEXT_DIR/emp-admin"
  117. mkdir -p "$BUILD_CONTEXT_DIR/emp-admin"
  118. cp -R "$ROOT_DIR/emp_admin/dist" "$BUILD_CONTEXT_DIR/emp-admin/dist"
  119. cp "$SCRIPT_DIR/nginx/admin.conf" "$BUILD_CONTEXT_DIR/emp-admin/admin.conf"
  120. log "Build frontend image"
  121. docker build \
  122. -f "$SCRIPT_DIR/dockerfiles/emp-admin.Dockerfile" \
  123. -t "$IMAGE_NAMESPACE/emp-admin:$IMAGE_TAG" \
  124. -t "$IMAGE_NAMESPACE/emp-admin:latest" \
  125. "$BUILD_CONTEXT_DIR/emp-admin"
  126. }
  127. prepare_package() {
  128. rm -rf "$PACKAGE_DIR"
  129. mkdir -p "$PACKAGE_DIR"
  130. local compose_src="$SCRIPT_DIR/docker-compose.runtime.yml"
  131. local env_src="$SCRIPT_DIR/.env.example"
  132. if [[ -f "$SCRIPT_DIR/test/docker-compose.yml" ]]; then
  133. compose_src="$SCRIPT_DIR/test/docker-compose.yml"
  134. fi
  135. if [[ -f "$SCRIPT_DIR/test/env.txt" ]]; then
  136. env_src="$SCRIPT_DIR/test/env.txt"
  137. fi
  138. cp "$compose_src" "$PACKAGE_DIR/docker-compose.yml"
  139. cp "$env_src" "$PACKAGE_DIR/.env.example"
  140. cp "$SCRIPT_DIR/install.sh" "$PACKAGE_DIR/install.sh"
  141. cp "$SCRIPT_DIR/README.md" "$PACKAGE_DIR/README.md"
  142. chmod +x "$PACKAGE_DIR/install.sh"
  143. }
  144. save_images() {
  145. local images=("${APP_IMAGES[@]}")
  146. if [[ "$INCLUDE_MIDDLEWARE_IMAGES" == "1" ]]; then
  147. log "Pull middleware images"
  148. for image in "${MIDDLEWARE_IMAGES[@]}"; do
  149. docker pull "$image"
  150. images+=("$image")
  151. done
  152. fi
  153. log "Save images"
  154. docker save -o "$PACKAGE_DIR/images.tar" "${images[@]}"
  155. }
  156. archive_package() {
  157. mkdir -p "$DIST_DIR"
  158. rm -f "$PACKAGE_ARCHIVE"
  159. tar -czf "$PACKAGE_ARCHIVE" -C "$DIST_DIR" "$PACKAGE_NAME"
  160. log "Package created: $PACKAGE_ARCHIVE"
  161. }
  162. need_cmd docker
  163. need_cmd tar
  164. log "EMP root: $ROOT_DIR"
  165. log "Deploy root: $SCRIPT_DIR"
  166. if [[ "$SKIP_BUILD" != "1" ]]; then
  167. need_cmd mvn
  168. need_cmd pnpm
  169. build_java_images
  170. build_ws_image
  171. build_admin_image
  172. else
  173. log "Skip build, package existing local images only"
  174. fi
  175. prepare_package
  176. save_images
  177. archive_package