Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 

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