From 34981c30a78e8bbd7791131059a9210f9928b62c Mon Sep 17 00:00:00 2001
From: 刘光辉 <347230014@qq.com>
Date: 星期四, 17 九月 2026 09:24:09 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master' into master

---
 docker/delivery/assemble-offline-package.sh |  239 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 239 insertions(+), 0 deletions(-)

diff --git a/docker/delivery/assemble-offline-package.sh b/docker/delivery/assemble-offline-package.sh
new file mode 100644
index 0000000..b5cf240
--- /dev/null
+++ b/docker/delivery/assemble-offline-package.sh
@@ -0,0 +1,239 @@
+#!/usr/bin/env bash
+# 鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+# 鏋勫缓鏈轰笓鐢細缁勮鏁存爤绂荤嚎浜や粯鍖咃紙Backlog B / M3锛屾柟妗堣 tasks/backlog-b-offline-package-plan.md锛�
+#
+# 浜х墿 dist/jnpf-offline-<鏃ユ湡>-<gitsha>/锛�
+#   images/cx-images.tar.gz             9 鍞竴闀滃儚锛坙inux/amd64锛屽崟 tar 鍏变韩灞傚幓閲嶏級
+#   images/cx-migration-tools.tar.gz   杩佺Щ杈呭姪闀滃儚 mysql:8.0 + pgloader锛堝壊鎺ュ悗鍙垹锛�
+#   images/manifest.txt                  闀滃儚 digest/ID/鏋舵瀯/澶у皬 + git commit
+#   docker-compose.yml / .env.example / Makefile(鐜板満鐗�) / INSTALL.md
+#   锛坉ocker/rocketmq/ 宸查殢 RocketMQ 浜� 2026-08-10 绉婚櫎锛岃琛ヤ竵 #10锛涜ˉ涓� #8 璧�
+#     娉ㄥ唽/閰嶇疆涓績鏁翠綋鎽橀櫎锛屽叾鎸傝浇閰嶇疆鐩綍宸蹭笉鍐嶆墦鍖咃紝config/shared/ 闅忛暅鍍忕儳鍏ュ嵆鍚叏閮ㄩ厤缃級
+#   migration/                           MySQL鈫扨G 杩佺Щ宸ュ叿鍖咃紙鐧藉悕鍗曞鍒讹紝缁濅笉鍚� dump/锛�
+#   docs/                                release-checklist / compose-guide / cutover-checklist
+#   SHA256SUMS                           鍏ㄥ寘瀹屾暣鎬ф竻鍗曪紙鐜板満 make verify 鏍¢獙锛�
+#
+# 鐢ㄦ硶锛歮ake images-offline锛堟帹鑽愶紝鑷姩鏍¢獙 jar 涓� flow-engine context锛�
+# 鐜鍙橀噺锛�
+#   ALLOW_DIRTY=1            宸ヤ綔鍖鸿剰鏃朵粛鎵撳寘锛堥獙璇佹湡鐢紱姝e紡浜や粯蹇呴』骞插噣鎻愪氦锛�
+#   SKIP_MIGRATION_TOOLS=1   璺宠繃 mysql/pgloader 杈呭姪闀滃儚锛堝寘鏇村皬锛岀幇鍦鸿縼绉婚』鑷锛�
+#
+# 瀹夊叏鏈哄埗锛氭湰鑴氭湰浼氭妸鏈湴涓氬姟闀滃儚 tag 涓存椂瑕嗙洊涓� amd64锛岀粨鏉燂紙鍚け璐ワ級鏃� trap 鑷姩
+# 閲嶅缓鍘熺敓闀滃儚鎭㈠鈥斺�斿惁鍒欎笅娆� make up 浼氫互 11 涓� Rosetta JVM 杩愯锛圠024 浜嬫晠闈級銆�
+# 鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+set -euo pipefail
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
+cd "$REPO_ROOT"
+
+log()  { printf '\033[1;34m[offline]\033[0m %s\n' "$*"; }
+warn() { printf '\033[1;33m[offline][warn]\033[0m %s\n' "$*"; }
+die()  { printf '\033[1;31m[offline][err]\033[0m %s\n' "$*" >&2; exit 1; }
+
+# 浜や粯鏋勫缓鐨勫彈鎺ф簮锛堝潎涓� SWR amd64 鍗曟灦鏋勶紱涓� flow-engine 鏃㈡湁鍩哄骇鍚屾簮锛�
+SWR_JRE="swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/bellsoft/liberica-openjre-rocky:21"
+SWR_REDIS="swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/redis:8.4.0-alpine"
+# OnlyOffice DS锛�2026-08-19 鐢� Hub 闀垮悕鍒囧埌 SWR 鐭悕锛屽悓 cx-redis 鏈哄埗锛�
+SWR_ONLYOFFICE="swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/onlyoffice/documentserver:9.4.0.1"
+# 鍓嶇 nginx 鍩哄簳锛�2026-07-17 imagetools inspect 瀹炴祴锛氬崟 manifest amd64锛孡032 楠岃瘉杩囷級
+SWR_NGINX="swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nginx:1.27-alpine"
+MYSQL_IMAGE="mysql:8.0"
+PGLOADER_IMAGE="dimitri/pgloader:latest"
+
+# amd64 鏋勫缓鐜锛欴OCKER_DEFAULT_PLATFORM 瑕嗙洊鏈寚瀹� platform 鐨勪笟鍔℃湇鍔°��
+# COMPOSE_PROFILES=localdb 鏄墦鍖呮湡蹇呴』鐨勶細cx-postgres 鍦ㄨ profile 鍐咃紙榛樿涓嶅惎鍔級锛屼笉甯﹀畠
+# build 浼氳烦杩� PG 闀滃儚銆乣config --images` 涔熸暟涓嶅埌瀹冿紝浜や粯鍖呯洿鎺ョ己搴撻暅鍍忋�備氦浠樼幇鍦虹殑
+# .env 鍚屾牱瑕佽杩欎釜閿紙PG 灏辨槸閭h竟鐨勫敮涓�搴擄級锛岃 .env.example 搂1銆�
+compose_amd64() {
+  env DOCKER_DEFAULT_PLATFORM=linux/amd64 COMPOSE_PROFILES=localdb \
+      docker compose "$@"
+}
+
+# 鈹�鈹� 0. 鍓嶇疆鏍¢獙 鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+command -v docker >/dev/null || die "鏈壘鍒� docker"
+
+DIRTY=""
+if [ -n "$(git status --porcelain)" ]; then
+  if [ "${ALLOW_DIRTY:-0}" = "1" ]; then
+    DIRTY="-dirty"; warn "宸ヤ綔鍖烘湁鏈彁浜ゆ敼鍔紙ALLOW_DIRTY=1 鏀捐锛夆�斺�旀寮忎氦浠樺繀椤诲湪骞插噣鎻愪氦涓婃墦鍖�"
+  else
+    die "宸ヤ綔鍖烘湁鏈彁浜ゆ敼鍔ㄢ�斺�斾氦浠樹骇鐗╁繀椤诲彲杩芥函鍒板敮涓� commit銆傚厛鎻愪氦锛屾垨楠岃瘉鏈熺敤 ALLOW_DIRTY=1"
+  fi
+fi
+
+# 5 涓粯璁ゅ悗绔湇鍔$殑 jar 閫愪竴鏍¢獙锛堝钩鍙拌仛鍚� + 鐙珛 DMS锛�
+BIZ_JARS=(
+  jnpf-gateway/target
+  jnpf-platform/jnpf-platform-server/target
+  jnpf-biz-common/jnpf-biz-common-server/target
+  jnpf-lims/jnpf-lims-server/target
+  jnpf-dms/jnpf-dms-server/target
+)
+for d in "${BIZ_JARS[@]}"; do
+  ls "$d"/*.jar >/dev/null 2>&1 || die "缂轰笟鍔� jar锛�${d}/*.jar 鈥斺�� 鍏� make jars"
+done
+ls docker/flow-engine/context/*.jar >/dev/null 2>&1 || die "缂� flow-engine context jar 鈥斺�� 鍏� make prepare"
+[ -f docker/frontend/dist/index.html ] || die "缂哄墠绔骇鐗� docker/frontend/dist/ 鈥斺�� 鍏� make web-dist锛堟柊椴滃害鐪� dist/.build-info锛�"
+
+# migration sql 缁勮鏍¢獙锛堢己鍒欏皾璇曡嚜鍔ㄧ粍瑁咃紝瀹樻柟鑴氭湰鐩綍涓嶅湪鍒欐槑纭姤閿欙級
+if [ ! -f docker/postgres/migration/sql/jnpf_dbnull_init.sql ]; then
+  log "migration/sql/ 鏈粍瑁咃紝灏濊瘯鑷姩缁勮 鈥�"
+  ./docker/postgres/migration/assemble-package.sh || die "sql/ 缁勮澶辫触锛堝畼鏂硅剼鏈洰褰曠己澶辨椂浼� DB_REPO=... 閲嶈瘯锛�"
+fi
+
+GIT_SHA="$(git rev-parse --short HEAD)"
+PKG_NAME="cx-offline-$(date +%Y%m%d)-${GIT_SHA}${DIRTY}"
+PKG="dist/$PKG_NAME"
+rm -rf "$PKG"
+mkdir -p "$PKG/images"
+
+# 鈹�鈹� 鎭㈠鏈哄埗锛氭棤璁烘垚璐ワ紝閫�鍑烘椂鎶婃湰鍦伴暅鍍忔仮澶嶄负鍘熺敓鏋舵瀯 鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+NEED_RESTORE_BUILD=0
+NEED_RESTORE_MYSQL=0
+restore() {
+  local rc=$?
+  trap - EXIT
+  if [ "$NEED_RESTORE_BUILD" = 1 ]; then
+    log "鎭㈠鏈湴鍘熺敓涓氬姟闀滃儚锛坅rm64 灞傜紦瀛樺懡涓紝閫氬父绉掔骇锛夆��"
+    if env COMPOSE_PROFILES=localdb docker compose build >/dev/null; then
+      log "鏈湴闀滃儚宸叉仮澶嶏細cx/gateway=$(docker image inspect --format '{{.Architecture}}' "cx/gateway:${CX_VERSION:-1.0.0}" 2>/dev/null || echo '?')"
+    else
+      warn "鏈湴闀滃儚鎭㈠澶辫触锛佹墜鍔ㄦ墽琛� make images 鈥斺�� 鍚﹀垯 make up 灏嗕互 amd64 闀滃儚杩愯锛圠024 椋庨櫓锛�"
+    fi
+  fi
+  if [ "$NEED_RESTORE_MYSQL" = 1 ]; then
+    docker pull --platform linux/arm64 "$MYSQL_IMAGE" >/dev/null 2>&1 \
+      || warn "mysql:8.0 arm64 鎭㈠澶辫触锛堜粎褰卞搷鏈湴 mysql 瀹㈡埛绔鍣ㄨ蛋妯℃嫙灞傦紝鍙◢鍚庢墜鍔� pull锛�"
+  fi
+  exit "$rc"
+}
+trap restore EXIT
+# 鏈崟鑾风殑 INT/TERM 涓嶄細瑙﹀彂 EXIT trap锛坆ash 璇箟锛夛紝鏄惧紡杞垚 exit 淇濊瘉鎭㈠蹇呯劧鎵ц
+trap 'exit 130' INT
+trap 'exit 143' TERM
+
+# 鈹�鈹� 1. amd64 鏋勫缓锛堜笟鍔″熀搴ф敞鍏� SWR锛沺ostgres/flow-engine 宸� platform 鍥哄畾=缂撳瓨鍛戒腑锛� 鈹�鈹�
+log "===== amd64 鏋勫缓锛�5 鍚庣涓氬姟闀滃儚 + 鑷缓闀滃儚锛涘熀搴� ${SWR_JRE##*/}锛�====="
+NEED_RESTORE_BUILD=1
+compose_amd64 build --build-arg BASE_IMAGE="$SWR_JRE" --build-arg NGINX_BASE_IMAGE="$SWR_NGINX"
+
+# 鈹�鈹� 2. amd64 鍩虹璁炬柦鎷夊彇 + retag 鎴� compose 鐢ㄧ殑鐭悕 鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+# 涓嶈兘鍐嶇敤 `compose pull --ignore-buildable`锛歝ompose 閲岃繖涓や釜鏈嶅姟鍐欑殑鏄煭鍚�
+# 锛坈x-redis锛涜ˉ涓� #8 鎽橀櫎娉ㄥ唽/閰嶇疆涓績銆佽ˉ涓� #10 鎽橀櫎 RocketMQ 鍓嶈繕鏈夋洿澶氬熀纭�璁炬柦鐭悕锛夛紝
+# 瑁� pull 浼氬幓 docker.io 鎵句笉瀛樺湪鐨勪粨搴撱�傝繖閲屾樉寮忔媺 SWR amd64 闀垮悕鍐� retag锛�
+# 绛変环浜� amd64 鐗堢殑 `make pull-infra`銆�
+log "===== amd64 鍩虹璁炬柦闀滃儚鎷夊彇锛圫WR锛�+ retag 鐭悕 ====="
+docker pull --platform linux/amd64 "$SWR_REDIS"
+docker tag "$SWR_REDIS" cx-redis:8.4.0-alpine
+# OnlyOffice DS ~2GB锛屾槸杩欎竴姝ヨ�楁椂鐨勫ぇ澶达紙棣栨鎷夊彇锛涘悗缁蛋鏈湴缂撳瓨锛�
+docker pull --platform linux/amd64 "$SWR_ONLYOFFICE"
+docker tag "$SWR_ONLYOFFICE" cx-onlyoffice:9.4.0.1
+
+# 鈹�鈹� 3. 闀滃儚娓呭崟 + 閫愪竴鏋舵瀯鏍¢獙 鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+# 涓嬮檺 8 鐨勬潵鍘嗭紙2026-08-20 瀹炴祴 `docker compose config --images | sort -u`锛岄粯璁� profile锛夛細
+#   路 cx-onlyoffice 鍦ㄩ粯璁� profile锛屽繀椤荤敱涓婇潰鐨� SWR pull+retag 渚涜揣銆�
+#   路 骞冲彴鑱氬悎鍚庯紝榛樿娓呭崟涓� cx/gateway銆乧x/platform銆乧x/lims銆乧x/biz-common銆乧x/dms銆�
+#     cx/flow-engine銆乧x/web銆乧x-onlyoffice銆侱MS 鐙珛鏈嶅姟浣挎竻鍗曚粠 7 涓鍔犲埌 8 涓��
+# 缁存姢鎻愮ず锛氳繖涓暟瀛�**姣忔澧炲垹 compose 鏈嶅姟閮借璺熺潃鏀�**锛屽畠鐨勪环鍊兼槸鎸′綇"婕忎簡鏌愪釜闀滃儚"锛�
+# 鎵�浠ュ畞鍙簿纭�佷笉瑕佺暀瀵屼綑銆�
+IMAGES=()
+while IFS= read -r img; do IMAGES+=("$img"); done < <(compose_amd64 config --images | sort -u)
+[ "${#IMAGES[@]}" -ge 8 ] || die "compose 瑙f瀽鍑虹殑闀滃儚鏁板紓甯革細${#IMAGES[@]}锛堟湡鏈� 鈮�8锛�"
+
+log "===== 鏋舵瀯鏍¢獙锛坱odo 瑕佹眰锛氭墦鍖呭墠閫愪竴 docker inspect锛�====="
+for img in "${IMAGES[@]}"; do
+  arch="$(docker image inspect --format '{{.Architecture}}' "$img" 2>/dev/null)" \
+    || die "闀滃儚涓嶅瓨鍦細${img}"
+  [ "$arch" = "amd64" ] || die "鏋舵瀯涓嶇锛�${img} 鏄� ${arch}锛堟湡鏈� amd64锛�"
+  printf '   %-78s amd64 鉁揬n' "$img"
+done
+
+# 鈹�鈹� 4. 瀵煎嚭杩愯闀滃儚锛堝崟 tar 鍚堝苟 save锛氬叡浜熀搴у眰鍙瓨涓�浠斤級 鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+log "===== docker save ${#IMAGES[@]} 涓暅鍍� 鈫� images/cx-images.tar.gz锛堟暟 GB锛岃�愬績锛�====="
+docker save "${IMAGES[@]}" | gzip > "$PKG/images/cx-images.tar.gz"
+
+# 鈹�鈹� 5. 杩佺Щ杈呭姪闀滃儚锛坢igrate-data.sh 鐨勯殣钘� Docker Hub 杩愯鏃朵緷璧栵紝鏀剁紪绂荤嚎鍖栵級 鈹�
+TOOL_IMAGES=()
+if [ "${SKIP_MIGRATION_TOOLS:-0}" != "1" ]; then
+  log "===== 杩佺Щ杈呭姪闀滃儚锛坅md64锛�====="
+  NEED_RESTORE_MYSQL=1
+  docker pull --platform linux/amd64 "$MYSQL_IMAGE"
+  docker pull --platform linux/amd64 "$PGLOADER_IMAGE"
+  for img in "$MYSQL_IMAGE" "$PGLOADER_IMAGE"; do
+    arch="$(docker image inspect --format '{{.Architecture}}' "$img")"
+    [ "$arch" = "amd64" ] || die "鏋舵瀯涓嶇锛�${img} 鏄� ${arch}"
+  done
+  TOOL_IMAGES=("$MYSQL_IMAGE" "$PGLOADER_IMAGE")
+  docker save "${TOOL_IMAGES[@]}" | gzip > "$PKG/images/cx-migration-tools.tar.gz"
+else
+  warn "SKIP_MIGRATION_TOOLS=1锛氫笉鎵撹縼绉昏緟鍔╅暅鍍忥紝鐜板満鍋滄満绐楀彛闇�鑷 mysql:8.0 涓� pgloader"
+fi
+
+# 鈹�鈹� 6. manifest 鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+{
+  echo "JNPF 鏁存爤绂荤嚎浜や粯鍖� 闀滃儚娓呭崟"
+  echo "鍖呭悕        : $PKG_NAME"
+  echo "git commit  : $(git rev-parse HEAD)${DIRTY}"
+  echo "鎵撳寘鏃堕棿    : $(date '+%F %T %z')"
+  echo "鐩爣骞冲彴    : linux/amd64"
+  echo
+  printf '%-78s %-7s %-8s %s\n' "IMAGE" "ARCH" "SIZE" "IMAGE_ID | REPO_DIGEST"
+  for img in "${IMAGES[@]}" ${TOOL_IMAGES[@]+"${TOOL_IMAGES[@]}"}; do
+    docker image inspect --format \
+      "$(printf '%-78s' "$img") {{.Architecture}}   {{.Size}}B  {{.Id}} | {{if .RepoDigests}}{{index .RepoDigests 0}}{{else}}(鏈湴鏋勫缓锛屾棤 RepoDigest){{end}}" \
+      "$img"
+  done
+} > "$PKG/images/manifest.txt"
+
+# 鈹�鈹� 7. 杩愯鏃舵枃浠讹紙鐩稿璺緞涓庝粨搴撲竴鑷达紝compose 鍘熸牱鍙敤锛� 鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+log "===== 鎷疯礉杩愯鏃舵枃浠朵笌鏂囨。 ====="
+cp docker-compose.yml .env.example "$PKG/"
+# 閮ㄧ讲鑷妇鏍¢獙锛圔acklog C1锛夛細鍖呭唴璺緞涓庝粨搴撲竴鑷达紝鍖� Makefile 鐨� up 寮哄埗鍓嶇疆
+cp docker/preflight.sh "$PKG/docker/"
+# 鍓嶇 nginx.conf锛歝ompose 浠ョ浉瀵硅矾寰勬寕杞斤紙鐜板満鍏嶆瀯寤烘敼鍙嶄唬/寮� TLS锛夛紝鍖呭唴缂哄畠 up 鐩存帴澶辫触
+mkdir -p "$PKG/docker/frontend"
+cp docker/frontend/nginx.conf "$PKG/docker/frontend/"
+
+# DLQ/spool 閲嶆斁棰勬鑴氭湰锛歡uide 搂19銆孌LQ 閲嶆斁闂幆銆嶉�愭潯寮曠敤锛孖NSTALL.md 搂1 鐨� python3 鍓嶇疆
+# 鍗充负瀹冣�斺�旀鍓嶉仐婕忔湭鎵撳寘锛岀幇鍦烘寜鎵嬪唽鎿嶄綔浼氬洜鏂囦欢缂哄け鑰屽け璐ワ紙Codex review锛�
+mkdir -p "$PKG/tasks"
+cp tasks/audit-event-validate.sh "$PKG/tasks/"
+
+# migration 宸ュ叿鍖咃細鐧藉悕鍗曞鍒讹紙缁濅笉 cp -R 鏁寸洰褰曗�斺�攄ump/ 鍚幇鍦轰笟鍔℃暟鎹紝codex review锛�
+mkdir -p "$PKG/migration/sql"
+for f in install.sh migrate-data.sh backup.sh create-app-roles.sh create_app_roles.sql \
+         schema-drift-check.sh \
+         README-杩佺Щ鎿嶄綔鎵嬪唽.md; do
+  cp "docker/postgres/migration/$f" "$PKG/migration/"
+done
+cp docker/postgres/migration/sql/* "$PKG/migration/sql/"
+
+mkdir -p "$PKG/docs"
+cp docs/release-checklist.md docs/docker-compose-guide.md docs/archive/server-pg-cutover-checklist.md "$PKG/docs/"
+cp "$SCRIPT_DIR/INSTALL.md" "$PKG/INSTALL.md"
+cp "$SCRIPT_DIR/site.Makefile" "$PKG/Makefile"
+
+# 鈹�鈹� 8. 瀹屾暣鎬ф竻鍗� 鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+log "===== 鐢熸垚 SHA256SUMS ====="
+SHACMD="sha256sum"; command -v sha256sum >/dev/null || SHACMD="shasum -a 256"
+( cd "$PKG" && find . -type f ! -name SHA256SUMS -print0 | sort -z | xargs -0 $SHACMD > SHA256SUMS )
+
+# 鈹�鈹� 8b. 缁勫寘鍚庡叧閿氦浠樼墿瀛樺湪鎬ф柇瑷�锛圕odex review锛夆攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+[ -f "$PKG/tasks/audit-event-validate.sh" ] \
+  || die "缁勫寘寮傚父锛欴LQ/spool 閲嶆斁棰勬鑴氭湰鏈繘鍏ヤ氦浠樺寘锛坱asks/audit-event-validate.sh 缂哄け锛実uide 搂19/INSTALL.md 搂1 寮曠敤浼氬け鏁堬級"
+# 绮剧‘閿氬畾 SHA256SUMS 琛屽熬锛坄<hash>鈵犫悹./璺緞`锛宻ha256sum/shasum 鏂囨湰妯″紡缁熶竴鏍煎紡锛夛紝涓嶇敤瀛愪覆鍖归厤
+# 锛坓rep -qF 浼氳鏇撮暱璺緞鐨勫伓鐒跺瓙涓茶鍒や负"宸茶鐩�"锛屽 .../not-tasks/audit-event-validate.sh 鎴�
+# tasks/audit-event-validate.sh.bak 鍧囧惈璇ュ瓙涓蹭絾骞堕潪鍚屼竴浜や粯鏂囦欢锛�
+grep -qE '  \./tasks/audit-event-validate\.sh$' "$PKG/SHA256SUMS" \
+  || die "缁勫寘寮傚父锛歋HA256SUMS 鏈鐩� tasks/audit-event-validate.sh"
+
+# 鈹�鈹� 9. 姹囨�� 鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+log "===== 鎵撳寘瀹屾垚 ====="
+du -sh "$PKG" | awk '{print "  鎬诲ぇ灏�: "$1}'
+du -sh "$PKG"/images/*.tar.gz | sed 's/^/  /'
+echo
+log "浜や粯鍖呯洰褰曪細$PKG"
+log "鍗曟枃浠朵紶杈擄紙闀滃儚宸� gzip锛屽灞備笉鍐嶅帇缂╋級锛�"
+log "  tar cf dist/${PKG_NAME}.tar -C dist ${PKG_NAME}"
+log "鐜板満姝ラ瑙佸寘鍐� INSTALL.md锛坢ake verify 鈫� load 鈫� 閰� .env 鈫� up 鈫� wait 鈫� smoke锛�"

--
Gitblit v1.8.0