刘光辉
12 小时以前 34981c30a78e8bbd7791131059a9210f9928b62c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/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