|
- #!/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
|