#!/usr/bin/env bash # ───────────────────────────────────────────────────────────────────────────── # 前端 dist 生产链(make web-dist 的实现体): # 前端仓库 pnpm build:main → 产物快照到本目录 dist/(Docker build context,不入 git) # # 与 flow-engine 的 prepare-context.sh 同构:产物快照进部署仓库构建,镜像溯源 # 靠 dist/.build-info(前端 git sha/分支/dirty/构建时间)。 # # 用法: # ./sync-dist.sh # 构建 + 拷贝(默认) # SKIP_BUILD=1 ./sync-dist.sh # 只拷现有 dist(前端刚手工构建过时的快捷路径) # FRONTEND_REPO=/path ./sync-dist.sh # 前端仓库不在默认位置时显式指定 # # 前置:node >= 20.19、pnpm >= 9.12(前端仓库 engines 要求);构建吃 8GB 堆 #(NODE_OPTIONS 已在前端仓库 build script 内设置)。 # ───────────────────────────────────────────────────────────────────────────── set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" FRONTEND_REPO="${FRONTEND_REPO:-$REPO_ROOT/../jnpf-web-monorepo-framework-v6.1}" APP_DIST="$FRONTEND_REPO/apps/jnpf-web-apps-main/dist" log() { printf '\033[1;32m[web-dist]\033[0m %s\n' "$*"; } die() { printf '\033[1;31m[web-dist][err]\033[0m %s\n' "$*" >&2; exit 1; } [ -d "$FRONTEND_REPO" ] || die "前端仓库不存在:${FRONTEND_REPO}(用 FRONTEND_REPO=/path 指定)" if [ "${SKIP_BUILD:-0}" = "1" ]; then log "SKIP_BUILD=1:跳过构建,直接拷贝现有 dist" else command -v pnpm >/dev/null || die "未找到 pnpm(前端构建需要 pnpm >= 9.12)" log "pnpm build:main(前端仓库 ${FRONTEND_REPO},约需数分钟、8GB 堆)…" ( cd "$FRONTEND_REPO" && pnpm build:main ) fi # 产物完整性:index.html=入口;_app.config.js=运行时配置注入点(缺=构建链变化,必须人工确认) [ -f "$APP_DIST/index.html" ] || die "构建产物缺 index.html:${APP_DIST}" [ -f "$APP_DIST/_app.config.js" ] || die "构建产物缺 _app.config.js(运行时配置注入点):${APP_DIST}" # 先清后拷:防旧 hash 文件在 context 里无限堆积 DEST="$SCRIPT_DIR/dist" rm -rf "$DEST" cp -R "$APP_DIST" "$DEST" # 溯源信息:本地构建镜像无 RepoDigest,靠它对应回前端仓库 commit FE_SHA="$(git -C "$FRONTEND_REPO" rev-parse --short HEAD 2>/dev/null || echo unknown)" FE_BRANCH="$(git -C "$FRONTEND_REPO" rev-parse --abbrev-ref HEAD 2>/dev/null || echo unknown)" FE_DIRTY="" [ -n "$(git -C "$FRONTEND_REPO" status --porcelain 2>/dev/null)" ] && FE_DIRTY="-dirty" cat > "$DEST/.build-info" <