刘光辉
3 小时以前 06f314545ac3514d7ce28939920866ae8188d31c
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/usr/bin/env bash
# ─────────────────────────────────────────────────────────────────────────────
# 前端 dist 生产链(make web-dist 的实现体):
#   前端仓库 pnpm build:main → 产物快照到本目录 dist/(Docker build context,不入 git)
#   + registry.yaml 里的 OnlyOffice 插件 → dist/onlyoffice-plugins/<release>/<code>/
#
# 与 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 指定)"
 
# OnlyOffice 插件(2026-09-23):生产不走 pnpm dev:onlyoffice 开发网关,插件就是静态文件,
# 随 cx-web 发布到 /onlyoffice-plugins/<release>/<code>/(后端 OnlyOfficePluginResolver 按
# {public-base-url}/{release}/{code}/config.json 拼地址)。清单读前端 registry.yaml,
# 新增插件无需改本脚本。release 固定 0.1.0(generate-backend-config 只认 0.1.0 / 0.1.0-dev)。
PLUGIN_ROOT="$FRONTEND_REPO/packages/onlyoffice-plugins"
PLUGIN_RELEASE="${ONLYOFFICE_PLUGIN_RELEASE:-0.1.0}"
# 输出 "package directory" 对,按 registry.yaml 的书写顺序
plugin_list() {
  awk '/^[[:space:]]+package:/{p=$2} /^[[:space:]]+directory:/{print p, $2}' "$PLUGIN_ROOT/registry.yaml"
}
[ -f "$PLUGIN_ROOT/registry.yaml" ] || die "缺插件注册表:${PLUGIN_ROOT}/registry.yaml"
 
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 )
  while read -r pkg dir; do
    log "OnlyOffice 插件 ${dir}:pnpm --filter ${pkg} build"
    ( cd "$FRONTEND_REPO" && pnpm --filter "$pkg" build >/dev/null ) || die "插件构建失败:${pkg}"
  done < <(plugin_list)
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"
 
N_PLUGINS=0
while read -r pkg dir; do
  src="$PLUGIN_ROOT/$dir/dist"
  [ -f "$src/config.json" ] && [ -f "$src/index.html" ] || die "插件产物不全:${src}(缺 config.json / index.html)"
  mkdir -p "$DEST/onlyoffice-plugins/$PLUGIN_RELEASE"
  cp -R "$src" "$DEST/onlyoffice-plugins/$PLUGIN_RELEASE/$dir"
  N_PLUGINS=$((N_PLUGINS + 1))
done < <(plugin_list)
[ "$N_PLUGINS" -gt 0 ] || die "registry.yaml 未解析出任何插件"
log "OnlyOffice 插件 ${N_PLUGINS} 个 → dist/onlyoffice-plugins/${PLUGIN_RELEASE}/"
 
# 溯源信息:本地构建镜像无 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