#!/usr/bin/env bash set -Eeuo pipefail # 本地打包脚本:本机完成构建和 docker save,服务器只需要 docker load + compose up。 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ROOT_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)" DIST_DIR="$SCRIPT_DIR/dist" IMAGE_NAMESPACE="${IMAGE_NAMESPACE:-emp-test}" IMAGE_TAG="${IMAGE_TAG:-$(date '+%Y%m%d%H%M%S')}" PACKAGE_NAME="${PACKAGE_NAME:-emp-test-runtime-${IMAGE_TAG}}" PACKAGE_DIR="$DIST_DIR/$PACKAGE_NAME" PACKAGE_ARCHIVE="$DIST_DIR/${PACKAGE_NAME}.tar.gz" NPM_REGISTRY="${NPM_REGISTRY:-https://registry.npmjs.org}" SKIP_BUILD="${SKIP_BUILD:-0}" INCLUDE_MIDDLEWARE_IMAGES="${INCLUDE_MIDDLEWARE_IMAGES:-1}" JAVA_MODULES=(emp_gateway emp_auth emp_monitor emp_data) APP_IMAGES=( "$IMAGE_NAMESPACE/emp-gateway:$IMAGE_TAG" "$IMAGE_NAMESPACE/emp-gateway:latest" "$IMAGE_NAMESPACE/emp-auth:$IMAGE_TAG" "$IMAGE_NAMESPACE/emp-auth:latest" "$IMAGE_NAMESPACE/emp-monitor:$IMAGE_TAG" "$IMAGE_NAMESPACE/emp-monitor:latest" "$IMAGE_NAMESPACE/emp-data:$IMAGE_TAG" "$IMAGE_NAMESPACE/emp-data:latest" "$IMAGE_NAMESPACE/emp-pdf:$IMAGE_TAG" "$IMAGE_NAMESPACE/emp-pdf:latest" "$IMAGE_NAMESPACE/emp-ws:$IMAGE_TAG" "$IMAGE_NAMESPACE/emp-ws:latest" "$IMAGE_NAMESPACE/emp-admin:$IMAGE_TAG" "$IMAGE_NAMESPACE/emp-admin:latest" ) MIDDLEWARE_IMAGES=( "${MYSQL_IMAGE:-mysql:8.0}" "${REDIS_IMAGE:-redis:7-alpine}" "${KAFKA_IMAGE:-bitnami/kafka:3.7.0}" "${TDENGINE_IMAGE:-tdengine/tdengine:3.3.6.0}" "${NACOS_IMAGE:-nacos/nacos-server:v2.3.2-slim}" ) log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" } die() { echo "ERROR: $*" >&2 exit 1 } need_cmd() { command -v "$1" >/dev/null 2>&1 || die "缺少命令:$1" } build_java_images() { cd "$ROOT_DIR/emp_server" log "构建后端 jar" mvn package -DskipTests -B -pl "$(IFS=,; echo "${JAVA_MODULES[*]}")" -am for module in "${JAVA_MODULES[@]}"; do local jar jar="$(ls "$module"/target/*.jar | grep -v original | grep -v app.jar | head -1)" cp "$jar" "$module/target/app.jar" done log "构建后端镜像" docker build -f Dockerfile.service --build-arg MODULE=emp_gateway -t "$IMAGE_NAMESPACE/emp-gateway:$IMAGE_TAG" -t "$IMAGE_NAMESPACE/emp-gateway:latest" . docker build -f Dockerfile.service --build-arg MODULE=emp_auth -t "$IMAGE_NAMESPACE/emp-auth:$IMAGE_TAG" -t "$IMAGE_NAMESPACE/emp-auth:latest" . docker build -f Dockerfile.service --build-arg MODULE=emp_monitor -t "$IMAGE_NAMESPACE/emp-monitor:$IMAGE_TAG" -t "$IMAGE_NAMESPACE/emp-monitor:latest" . docker build -f Dockerfile.service --build-arg MODULE=emp_data -t "$IMAGE_NAMESPACE/emp-data:$IMAGE_TAG" -t "$IMAGE_NAMESPACE/emp-data:latest" . log "构建 PDF 镜像" docker build -f emp_pdf/Dockerfile -t "$IMAGE_NAMESPACE/emp-pdf:$IMAGE_TAG" -t "$IMAGE_NAMESPACE/emp-pdf:latest" emp_pdf } build_ws_image() { cd "$ROOT_DIR" log "构建 WS/模拟器镜像" docker build \ -f deploy/isolated/dockerfiles/emp-ws.Dockerfile \ --build-arg "NPM_REGISTRY=$NPM_REGISTRY" \ -t "$IMAGE_NAMESPACE/emp-ws:$IMAGE_TAG" \ -t "$IMAGE_NAMESPACE/emp-ws:latest" \ . } build_admin_image() { cd "$ROOT_DIR/emp_admin" log "构建前端 dist" pnpm install --frozen-lockfile pnpm run build:shunfeng cd "$ROOT_DIR" log "构建前端镜像" docker build \ -f deploy/isolated/dockerfiles/emp-admin.Dockerfile \ -t "$IMAGE_NAMESPACE/emp-admin:$IMAGE_TAG" \ -t "$IMAGE_NAMESPACE/emp-admin:latest" \ . } prepare_package() { rm -rf "$PACKAGE_DIR" mkdir -p "$PACKAGE_DIR" cp "$SCRIPT_DIR/docker-compose.runtime.yml" "$PACKAGE_DIR/docker-compose.yml" cp "$SCRIPT_DIR/.env.example" "$PACKAGE_DIR/.env.example" cp "$SCRIPT_DIR/install.sh" "$PACKAGE_DIR/install.sh" cp "$SCRIPT_DIR/README.md" "$PACKAGE_DIR/README.md" chmod +x "$PACKAGE_DIR/install.sh" } save_images() { local images=("${APP_IMAGES[@]}") if [[ "$INCLUDE_MIDDLEWARE_IMAGES" == "1" ]]; then log "拉取中间件镜像" for image in "${MIDDLEWARE_IMAGES[@]}"; do docker pull "$image" images+=("$image") done fi log "导出镜像包" docker save -o "$PACKAGE_DIR/images.tar" "${images[@]}" } archive_package() { mkdir -p "$DIST_DIR" rm -f "$PACKAGE_ARCHIVE" tar -czf "$PACKAGE_ARCHIVE" -C "$DIST_DIR" "$PACKAGE_NAME" log "打包完成:$PACKAGE_ARCHIVE" } need_cmd docker need_cmd tar if [[ "$SKIP_BUILD" != "1" ]]; then need_cmd mvn need_cmd pnpm build_java_images build_ws_image build_admin_image else log "跳过构建,仅打包当前本机已有镜像" fi prepare_package save_images archive_package