|
|
|
@@ -1,10 +1,14 @@ |
|
|
|
#!/usr/bin/env bash |
|
|
|
set -Eeuo pipefail |
|
|
|
|
|
|
|
# 本地打包脚本:本机完成构建和 docker save,服务器只需要 docker load + compose up。 |
|
|
|
# Build all images locally, export them, and create a server runtime package. |
|
|
|
# Supports both layouts: |
|
|
|
# 1. monorepo: emp/deploy/isolated/build-package.sh |
|
|
|
# 2. split deploy: emp_test_deploy/isolated/build-package.sh with EMP_ROOT=/path/to/emp |
|
|
|
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" |
|
|
|
ROOT_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)" |
|
|
|
DIST_DIR="$SCRIPT_DIR/dist" |
|
|
|
BUILD_CONTEXT_DIR="$SCRIPT_DIR/.build-context" |
|
|
|
|
|
|
|
IMAGE_NAMESPACE="${IMAGE_NAMESPACE:-emp-test}" |
|
|
|
IMAGE_TAG="${IMAGE_TAG:-$(date '+%Y%m%d%H%M%S')}" |
|
|
|
@@ -51,35 +55,71 @@ die() { |
|
|
|
} |
|
|
|
|
|
|
|
need_cmd() { |
|
|
|
command -v "$1" >/dev/null 2>&1 || die "缺少命令:$1" |
|
|
|
command -v "$1" >/dev/null 2>&1 || die "Missing command: $1" |
|
|
|
} |
|
|
|
|
|
|
|
has_emp_root() { |
|
|
|
[[ -d "$1/emp_server" && -d "$1/emp_admin" && -d "$1/emp_ws" ]] |
|
|
|
} |
|
|
|
|
|
|
|
resolve_root_dir() { |
|
|
|
if [[ -n "${EMP_ROOT:-}" ]]; then |
|
|
|
local root |
|
|
|
root="$(cd "$EMP_ROOT" && pwd)" |
|
|
|
has_emp_root "$root" || die "EMP_ROOT is invalid: $EMP_ROOT" |
|
|
|
printf '%s\n' "$root" |
|
|
|
return |
|
|
|
fi |
|
|
|
|
|
|
|
local candidates=( |
|
|
|
"$SCRIPT_DIR/../.." |
|
|
|
"$SCRIPT_DIR/../../emp" |
|
|
|
"$SCRIPT_DIR/.." |
|
|
|
"$PWD" |
|
|
|
) |
|
|
|
local candidate root |
|
|
|
for candidate in "${candidates[@]}"; do |
|
|
|
if [[ -d "$candidate" ]]; then |
|
|
|
root="$(cd "$candidate" && pwd)" |
|
|
|
if has_emp_root "$root"; then |
|
|
|
printf '%s\n' "$root" |
|
|
|
return |
|
|
|
fi |
|
|
|
fi |
|
|
|
done |
|
|
|
|
|
|
|
die "Cannot find EMP root. Set EMP_ROOT=/path/to/emp where emp_server, emp_admin and emp_ws exist." |
|
|
|
} |
|
|
|
|
|
|
|
ROOT_DIR="$(resolve_root_dir)" |
|
|
|
|
|
|
|
build_java_images() { |
|
|
|
cd "$ROOT_DIR/emp_server" |
|
|
|
log "构建后端 jar" |
|
|
|
log "Build backend jars" |
|
|
|
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)" |
|
|
|
[[ -n "$jar" ]] || die "Jar not found for $module" |
|
|
|
cp "$jar" "$module/target/app.jar" |
|
|
|
done |
|
|
|
|
|
|
|
log "构建后端镜像" |
|
|
|
log "Build backend images" |
|
|
|
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 镜像" |
|
|
|
log "Build PDF image" |
|
|
|
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/模拟器镜像" |
|
|
|
log "Build WS/simulator image" |
|
|
|
docker build \ |
|
|
|
-f deploy/isolated/dockerfiles/emp-ws.Dockerfile \ |
|
|
|
-f "$SCRIPT_DIR/dockerfiles/emp-ws.Dockerfile" \ |
|
|
|
--build-arg "NPM_REGISTRY=$NPM_REGISTRY" \ |
|
|
|
-t "$IMAGE_NAMESPACE/emp-ws:$IMAGE_TAG" \ |
|
|
|
-t "$IMAGE_NAMESPACE/emp-ws:latest" \ |
|
|
|
@@ -88,17 +128,22 @@ build_ws_image() { |
|
|
|
|
|
|
|
build_admin_image() { |
|
|
|
cd "$ROOT_DIR/emp_admin" |
|
|
|
log "构建前端 dist" |
|
|
|
log "Build frontend dist" |
|
|
|
pnpm install --frozen-lockfile |
|
|
|
pnpm run build:shunfeng |
|
|
|
|
|
|
|
cd "$ROOT_DIR" |
|
|
|
log "构建前端镜像" |
|
|
|
log "Prepare frontend image context" |
|
|
|
rm -rf "$BUILD_CONTEXT_DIR/emp-admin" |
|
|
|
mkdir -p "$BUILD_CONTEXT_DIR/emp-admin" |
|
|
|
cp -R "$ROOT_DIR/emp_admin/dist" "$BUILD_CONTEXT_DIR/emp-admin/dist" |
|
|
|
cp "$SCRIPT_DIR/nginx/admin.conf" "$BUILD_CONTEXT_DIR/emp-admin/admin.conf" |
|
|
|
|
|
|
|
log "Build frontend image" |
|
|
|
docker build \ |
|
|
|
-f deploy/isolated/dockerfiles/emp-admin.Dockerfile \ |
|
|
|
-f "$SCRIPT_DIR/dockerfiles/emp-admin.Dockerfile" \ |
|
|
|
-t "$IMAGE_NAMESPACE/emp-admin:$IMAGE_TAG" \ |
|
|
|
-t "$IMAGE_NAMESPACE/emp-admin:latest" \ |
|
|
|
. |
|
|
|
"$BUILD_CONTEXT_DIR/emp-admin" |
|
|
|
} |
|
|
|
|
|
|
|
prepare_package() { |
|
|
|
@@ -117,14 +162,14 @@ save_images() { |
|
|
|
local images=("${APP_IMAGES[@]}") |
|
|
|
|
|
|
|
if [[ "$INCLUDE_MIDDLEWARE_IMAGES" == "1" ]]; then |
|
|
|
log "拉取中间件镜像" |
|
|
|
log "Pull middleware images" |
|
|
|
for image in "${MIDDLEWARE_IMAGES[@]}"; do |
|
|
|
docker pull "$image" |
|
|
|
images+=("$image") |
|
|
|
done |
|
|
|
fi |
|
|
|
|
|
|
|
log "导出镜像包" |
|
|
|
log "Save images" |
|
|
|
docker save -o "$PACKAGE_DIR/images.tar" "${images[@]}" |
|
|
|
} |
|
|
|
|
|
|
|
@@ -132,12 +177,15 @@ archive_package() { |
|
|
|
mkdir -p "$DIST_DIR" |
|
|
|
rm -f "$PACKAGE_ARCHIVE" |
|
|
|
tar -czf "$PACKAGE_ARCHIVE" -C "$DIST_DIR" "$PACKAGE_NAME" |
|
|
|
log "打包完成:$PACKAGE_ARCHIVE" |
|
|
|
log "Package created: $PACKAGE_ARCHIVE" |
|
|
|
} |
|
|
|
|
|
|
|
need_cmd docker |
|
|
|
need_cmd tar |
|
|
|
|
|
|
|
log "EMP root: $ROOT_DIR" |
|
|
|
log "Deploy root: $SCRIPT_DIR" |
|
|
|
|
|
|
|
if [[ "$SKIP_BUILD" != "1" ]]; then |
|
|
|
need_cmd mvn |
|
|
|
need_cmd pnpm |
|
|
|
@@ -145,7 +193,7 @@ if [[ "$SKIP_BUILD" != "1" ]]; then |
|
|
|
build_ws_image |
|
|
|
build_admin_image |
|
|
|
else |
|
|
|
log "跳过构建,仅打包当前本机已有镜像" |
|
|
|
log "Skip build, package existing local images only" |
|
|
|
fi |
|
|
|
|
|
|
|
prepare_package |
|
|
|
|