#!/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" <<EOF
|
frontend_repo=${FRONTEND_REPO}
|
frontend_git=${FE_BRANCH}@${FE_SHA}${FE_DIRTY}
|
built_at=$(date '+%Y-%m-%d %H:%M:%S %z')
|
EOF
|
|
log "dist 就绪:${DEST}($(du -sh "$DEST" | cut -f1),前端 ${FE_BRANCH}@${FE_SHA}${FE_DIRTY})"
|
[ -n "$FE_DIRTY" ] && printf '\033[1;33m[web-dist][warn]\033[0m %s\n' \
|
"前端仓库有未提交改动——正式交付前请先在前端仓库提交,保证镜像可溯源"
|
exit 0
|