From 03752480a4d45ce79cd11aadf3f0753994c26423 Mon Sep 17 00:00:00 2001 From: hpd840321 Date: Sun, 10 May 2026 01:14:03 +0800 Subject: [PATCH] feat: normalize policy data (REPLACE_ALLOWLIST), add org-side DDL to release bundle, add release plan - Update release script: include org-side active DDL/seed + deprecation README - Normalize seed SQL: policy_type=REPLACE_ALLOWLIST, uniform remark format - Add version release plan and naming conventions spec - Disable elevator-side tenant_visitor_floor_policy (V2 no longer queries it) --- ...nant_visitor_floor_policy_init_tenants.sql | 32 +- ...-09-release-plan-and-naming-conventions.md | 362 ++++++++++++++++++ .../build/release-cw-elevator-application.sh | 218 +++++++++++ 3 files changed, 596 insertions(+), 16 deletions(-) create mode 100644 docs/superpowers/specs/2026-05-09-release-plan-and-naming-conventions.md create mode 100755 scripts/build/release-cw-elevator-application.sh diff --git a/docs/sql/organization_tenant_visitor_floor_policy_init_tenants.sql b/docs/sql/organization_tenant_visitor_floor_policy_init_tenants.sql index d725bf44..67ca1efc 100644 --- a/docs/sql/organization_tenant_visitor_floor_policy_init_tenants.sql +++ b/docs/sql/organization_tenant_visitor_floor_policy_init_tenants.sql @@ -30,12 +30,12 @@ INSERT INTO tenant_visitor_floor_policy ( 'gf_vstr_policy_guangfa_fund_001x', '488b8ad049bb43408a6fbcc50bcb89ac', '2524639890ba4f2cba9ba1a4eeaa4015', - 'INTERSECT_ALLOWLIST', + 'REPLACE_ALLOWLIST', '["605560545117995008"]', NULL, 1, 1, - '广发基金:访客楼层策略(组织库);默认 28F。', + '广发基金 | org=[28-38F] | 访客默认28F', UNIX_TIMESTAMP(NOW()) * 1000, UNIX_TIMESTAMP(NOW()) * 1000 ) ON DUPLICATE KEY UPDATE @@ -62,10 +62,10 @@ INSERT INTO tenant_visitor_floor_policy ( 'pm_6f_vstr_policy_001', '2524639890ba4f2cba9ba1a4eeaa4015', '64fdc8eaf5824df5a1329819af29b79f', - 'INTERSECT_ALLOWLIST', + 'REPLACE_ALLOWLIST', '["605560545117995008","605560541473144832"]', NULL, 1, 1, - '星河湾物业管理有限公司:访客策略(组织库);28F+6F(顺序:先 28 后 6,便于前端)。', + '物业管理 | 访客默认28F+6F', UNIX_TIMESTAMP(NOW()) * 1000, UNIX_TIMESTAMP(NOW()) * 1000 ) ON DUPLICATE KEY UPDATE @@ -83,10 +83,10 @@ INSERT INTO tenant_visitor_floor_policy ( 'pm_6f_vstr_policy_002', '2524639890ba4f2cba9ba1a4eeaa4015', '8fc3f910bd834198a539832017fe920e', - 'INTERSECT_ALLOWLIST', + 'REPLACE_ALLOWLIST', '["605560545117995008","605560541473144832"]', NULL, 1, 1, - '星河湾物业管理公司:访客策略(组织库);28F+6F(顺序:先 28 后 6,便于前端)。', + '物业管理 | 访客默认28F+6F', UNIX_TIMESTAMP(NOW()) * 1000, UNIX_TIMESTAMP(NOW()) * 1000 ) ON DUPLICATE KEY UPDATE @@ -104,10 +104,10 @@ INSERT INTO tenant_visitor_floor_policy ( 'pm_6f_vstr_policy_003', '2524639890ba4f2cba9ba1a4eeaa4015', 'cc760fdf9c384a0cbf4951ccf2c6452e', - 'INTERSECT_ALLOWLIST', + 'REPLACE_ALLOWLIST', '["605560545117995008","605560541473144832"]', NULL, 1, 1, - '星河湾物管公司:访客策略(组织库);28F+6F(顺序:先 28 后 6,便于前端)。', + '物业管理 | 访客默认28F+6F', UNIX_TIMESTAMP(NOW()) * 1000, UNIX_TIMESTAMP(NOW()) * 1000 ) ON DUPLICATE KEY UPDATE @@ -125,10 +125,10 @@ INSERT INTO tenant_visitor_floor_policy ( 'pm_6f_vstr_policy_004', '2524639890ba4f2cba9ba1a4eeaa4015', 'f216235e54ca42bfa0379e69b3754aff', - 'INTERSECT_ALLOWLIST', + 'REPLACE_ALLOWLIST', '["605560545117995008","605560541473144832"]', NULL, 1, 1, - '星中心物业管理公司:访客策略(组织库);28F+6F(顺序:先 28 后 6,便于前端)。', + '物业管理 | 访客默认28F+6F', UNIX_TIMESTAMP(NOW()) * 1000, UNIX_TIMESTAMP(NOW()) * 1000 ) ON DUPLICATE KEY UPDATE @@ -146,10 +146,10 @@ INSERT INTO tenant_visitor_floor_policy ( 'pm_6f_vstr_policy_005', '2524639890ba4f2cba9ba1a4eeaa4015', '95818575a2284db6833289474d33671f', - 'INTERSECT_ALLOWLIST', + 'REPLACE_ALLOWLIST', '["605560545117995008","605560541473144832"]', NULL, 1, 1, - '星中心物业服务中心:访客策略(组织库);28F+6F(顺序:先 28 后 6,便于前端)。', + '物业管理 | 访客默认28F+6F', UNIX_TIMESTAMP(NOW()) * 1000, UNIX_TIMESTAMP(NOW()) * 1000 ) ON DUPLICATE KEY UPDATE @@ -167,10 +167,10 @@ INSERT INTO tenant_visitor_floor_policy ( 'pm_6f_vstr_policy_006', '2524639890ba4f2cba9ba1a4eeaa4015', '348328d755624b3491cd307a3109f36a', - 'INTERSECT_ALLOWLIST', + 'REPLACE_ALLOWLIST', '["605560545117995008","605560541473144832"]', NULL, 1, 1, - '星中心物管公司:访客策略(组织库);28F+6F(顺序:先 28 后 6,便于前端)。', + '物业管理 | 访客默认28F+6F', UNIX_TIMESTAMP(NOW()) * 1000, UNIX_TIMESTAMP(NOW()) * 1000 ) ON DUPLICATE KEY UPDATE @@ -188,10 +188,10 @@ INSERT INTO tenant_visitor_floor_policy ( 'pm_6f_vstr_policy_007', '2524639890ba4f2cba9ba1a4eeaa4015', 'dde6cc9a4f6b4f5490d03e26fb016200', - 'INTERSECT_ALLOWLIST', + 'REPLACE_ALLOWLIST', '["605560545117995008","605560541473144832"]', NULL, 1, 1, - '物业管理总部:访客策略(组织库);28F+6F(顺序:先 28 后 6,便于前端)。', + '物业管理 | 访客默认28F+6F', UNIX_TIMESTAMP(NOW()) * 1000, UNIX_TIMESTAMP(NOW()) * 1000 ) ON DUPLICATE KEY UPDATE diff --git a/docs/superpowers/specs/2026-05-09-release-plan-and-naming-conventions.md b/docs/superpowers/specs/2026-05-09-release-plan-and-naming-conventions.md new file mode 100644 index 00000000..2252e18c --- /dev/null +++ b/docs/superpowers/specs/2026-05-09-release-plan-and-naming-conventions.md @@ -0,0 +1,362 @@ +# 星河湾星中星 — 版本发布计划与部署包规范 + +**日期**: 2026-05-09 +**版本**: v1.0 +**适用范围**: cw-elevator-application 及平台所有组件 + +--- + +## 目录 + +1. [版本命名规范](#1-版本命名规范) +2. [发布包目录结构与命名](#2-发布包目录结构与命名) +3. [JAR 制品命名规范](#3-jar-制品命名规范) +4. [配置文件规范](#4-配置文件规范) +5. [数据库 SQL 脚本规范](#5-数据库-sql-脚本规范) +6. [发布文档规范](#6-发布文档规范) +7. [构建流程](#7-构建流程) +8. [部署包交付清单](#8-部署包交付清单) +9. [版本发布检查清单](#9-版本发布检查清单) + +--- + +## 1. 版本命名规范 + +### 1.1 语义化版本 + +``` +MAJOR.MINOR.PATCH + +MAJOR: 不兼容的 API 修改 +MINOR: 向下兼容的功能新增 +PATCH: 向下兼容的问题修复 +``` + +### 1.2 平台组件版本清单 + +| 组件 | 当前稳定版 | Maven artifactId | 所属服务 | +|------|-----------|------------------|---------| +| cw-elevator-application | 2.0.17 | cw-elevator-application | 电梯应用 | +| ninca-common-component-organization | 2.9.4 | cwos-component-organization | 组织组件 | +| intelligent-cwoscomponent | — | intelligent-cwoscomponent | Feign 接口定义 | +| ninca-crk-std | — | ninca-crk-gpu-std | CRK 人脸识别 | +| ninca-qk-alarm | — | ninca-qk-alarm | 报警服务 | +| cloudwalk-common-* | 3.7.2 | cloudwalk-* | 公共库 | + +### 1.3 版本号与日期标签 + +发布包命名包含版本号 + 构建日期: + +``` +格式: <组件名>-V... + +示例: + cw-elevator-application-V2.0.17.20260505 + ninca-common-component-organization-2.9.4-xinghewan-20260506 +``` + +**规则**: +- 日期使用 `YYYYMMDD` 格式,取构建当天 +- 版本号与 Maven POM 中的 `` 一致 +- 历史遗留标签 `-xinghewan` 保留用于 component-org 的星中星定制版本 + +--- + +## 2. 发布包目录结构与命名 + +### 2.1 发布包根目录命名 + +``` +<模块名>-V<版本号>.<日期> + +# cw-elevator-application +cw-elevator-application-V2.0.17.20260505/ + +# ninca-common-component-organization +ninca-common-component-organization-2.9.4-xinghewan-20260506/ +``` + +### 2.2 电梯应用发布包内部结构 + +``` +cw-elevator-application-V2.0.17.20260505/ +├── cw-elevator-application-V1.0.0.20211103.jar # ★ JAR (固定名, 对齐V1) +├── bootstrap.properties # 启动配置 +├── application.properties # 应用配置 +├── application-access-control.properties # 门禁配置 +├── run.sh # 启动脚本 +├── common-java.sh # Java 环境检测 +├── start.sh # systemd 启动 +├── stop.sh # systemd 停止 +├── cw-elevator-application.service # systemd unit +├── ddl/ +│ ├── tenant_visitor_floor_policy.sql # DDL +│ ├── tenant_visitor_floor_policy_init_guangfa_fund.sql # 广发种子 [@deprecated] +│ └── tenant_visitor_floor_policy_init_property_mgmt_6f.sql # 物业种子 [@deprecated] +├── 版本升级说明书.md +├── 发布说明.md +├── 甲方版本升级说明.md +├── 升级计划.md +├── 实施交付清单.md +├── 实施验收记录模板.md +├── SQL与代码一致性审核记录.md +├── collect_elevator_runtime_evidence.sh # 现场证据采集 +└── BUILD_MANIFEST.txt # 构建清单 +``` + +### 2.3 组织组件发布包内部结构 + +``` +ninca-common-component-organization-2.9.4-xinghewan-20260506/ +├── ninca-common-component-organization-V2.9.2_20210730.jar # JAR +├── application.properties +├── bootstrap.properties +├── recognition-logback.xml +├── run-verify.sh +└── ddl/ + └── organization_tenant_visitor_floor_policy_init_tenants.sql # ★ 活跃策略种子 +``` + +--- + +## 3. JAR 制品命名规范 + +### 3.1 电梯应用 (特殊) + +``` +JAR 文件名: cw-elevator-application-V1.0.0.20211103.jar (固定) + +原因: 生产部署脚本和运维习惯依赖此文件名。不随内部版本号变化。 +内部版本由 BUILD_MANIFEST.txt 中的 git_rev 追踪。 +``` + +### 3.2 其他组件 + +``` +JAR 文件名: -.jar + +示例: + ninca-common-component-organization-V2.9.2_20210730.jar +``` + +### 3.3 Maven 版本号 + +POM 中的 `` 字段在构建时由 release 脚本自动设置: +- 构建前: `mvn versions:set -DnewVersion=<目标版本>` +- 构建后: 恢复为 `2.0-SNAPSHOT` + +--- + +## 4. 配置文件规范 + +### 4.1 配置文件命名 + +| 文件 | 用途 | 必需 | +|------|------|------| +| `bootstrap.properties` | Spring Cloud 引导配置 (服务名, Consul/ZK) | ✅ | +| `application.properties` | 业务配置 (数据源, Redis, Dubbo, 楼层) | ✅ | +| `application-access-control.properties` | 门禁/通行规则配置 | ✅ | +| `application-test.properties` | 测试环境覆盖配置 | 测试用 | + +### 4.2 配置关键属性命名 + +| 属性 | 格式 | 示例 | +|------|------|------| +| 楼层属性 | `OrgId`, `DefaultFloorId` | `xhwId`, `gfOrgId`, `xhwDefaultFloorId` | +| 楼栋属性 | `floor.building.id` | `605560539791228928` | +| Redis | `spring.redis.*` | — | +| 数据源 | `spring.datasource.url` | `jdbc:mysql://host:port/db` | + +--- + +## 5. 数据库 SQL 脚本规范 + +### 5.1 SQL 文件命名 + +``` +格式: [<库名>_]<表名>[_<用途>].sql + +# DDL +tenant_visitor_floor_policy.sql +organization_tenant_visitor_floor_policy.sql + +# 种子数据 +organization_tenant_visitor_floor_policy_init_tenants.sql + +# 迁移 +tenant_visitor_floor_policy_v2.sql +tenant_visitor_floor_policy_migrate_org_id.sql +``` + +**命名规则**: +- 不带 `organization_` 前缀 = 电梯库 (历史 V1, 已废弃) +- 带 `organization_` 前缀 = 组织库 (活跃 V2) +- `_init_` = 种子数据 INSERT +- `_v2`, `_v3` = 版本迁移 DDL +- `_migrate_` = 数据迁移 DML + +### 5.2 策略数据规范 + +`tenant_visitor_floor_policy` 行的命名规范: + +```sql +-- ID 格式: {tenant_abbrev}_vstr_policy_{org_description}_{seq} +-- 广发基金: gf_vstr_policy_guangfa_fund_001x +-- 物业管理: pm_6f_vstr_policy_001 ~ 007 + +-- policy_type: REPLACE_ALLOWLIST (V2 正确语义, 非旧 INTERSECT_ALLOWLIST) + +-- remark 格式: '{租户简称} | {策略说明} | org={org_id}' +-- 示例: '广发基金 | org=[28-38F] | 访客默认28F' +-- '物业管理 | 访客默认28F+6F' +``` + +### 5.3 V2 维护规则 + +| 规则 | 说明 | +|------|------| +| 策略唯一维护库 | `component-organization` | +| 电梯库策略表 | 已废弃 (`enabled=0`, `[DEPRECATED]` 前缀) | +| 种子 SQL 维护 | 仅 `organization_tenant_visitor_floor_policy_init_tenants.sql` | +| 电梯侧种子 SQL | 保留仅供历史参考 (`@deprecated` 注释) | + +--- + +## 6. 发布文档规范 + +### 6.1 必需文档 (每个版本) + +| 文档 | 文件名格式 | 内容 | +|------|-----------|------| +| 版本升级说明书 | `cw-elevator-application-v-版本升级说明书.md` | 变更内容、升级步骤 | +| 发布说明 | `cw-elevator-application-v-发布说明.md` | 版本概述、新功能、修复 | +| 甲方版本升级说明 | `cw-elevator-application-v-甲方版本升级说明.md` | 面向客户的升级说明 | +| 升级计划 | `cw-elevator-application-v-升级计划.md` | 时间表、里程碑 | +| 实施交付清单 | `cw-elevator-application-v-实施交付清单.md` | 交付物核对 | +| 实施验收记录模板 | `cw-elevator-application-v-实施验收记录模板.md` | 验收标准 | +| SQL审核记录 | `cw-elevator-application-v-SQL与代码一致性审核记录.md` | DDL/DML 审核 | +| 构建清单 | `BUILD_MANIFEST.txt` | 自动生成 (git rev, java version, timestamp) | + +### 6.2 文档版本回退 + +release 脚本在找不到特定版本文档时,自动回退到 `DOC_FALLBACK_VER` (当前: `2.0.6`): + +```bash +DOC_FALLBACK_VER="${DOC_FALLBACK_VER:-2.0.6}" +``` + +--- + +## 7. 构建流程 + +### 7.1 构建命令 + +```bash +# 在仓库根目录执行 +./scripts/build/release-cw-elevator-application.sh <版本号> + +# 示例: 构建 v2.0.18 +./scripts/build/release-cw-elevator-application.sh 2.0.18 + +# 指定日期标签 +RELEASE_DATE_LABEL=20260509 ./scripts/build/release-cw-elevator-application.sh 2.0.18 + +# 不生成 zip (仅目录) +RELEASE_MAKE_ZIP=0 ./scripts/build/release-cw-elevator-application.sh 2.0.18 +``` + +### 7.2 构建步骤 + +``` +Step 1: 环境检查 (JDK 8) +Step 2: mvn versions:set → 目标版本 +Step 3: mvn package → 编译打包 (fat JAR) +Step 4: 复制 JAR 到 releases/ +Step 5: 复制 DDL/SQL 到 releases/ddl/ +Step 6: 复制文档到 releases/ +Step 7: 复制配置文件 (bootstrap/application*.properties) +Step 8: 复制运行脚本 (run.sh, start.sh, stop.sh, common-java.sh) +Step 9: 生成 systemd service 文件 +Step 10: 复制现场证据采集脚本 +Step 11: 生成 BUILD_MANIFEST.txt +Step 12: 可选: 打包 zip +Step 13: mvn versions:set → 恢复 2.0-SNAPSHOT +``` + +### 7.3 构建产出 + +``` +backend/cw-elevator-application/releases/ +├── cw-elevator-application-V2.0.18.20260509/ # 发布目录 +└── cw-elevator-application-V2.0.18.20260509.zip # (可选) 压缩包 +``` + +--- + +## 8. 部署包交付清单 + +### 8.1 必须交付 + +| # | 交付物 | 格式 | 说明 | +|---|--------|------|------| +| 1 | JAR 文件 | `.jar` | 固定文件名 | +| 2 | bootstrap.properties | `.properties` | 启动引导 | +| 3 | application.properties | `.properties` | 业务配置 | +| 4 | application-access-control.properties | `.properties` | 门禁配置 | +| 5 | DDL SQL | `.sql` | 表结构 | +| 6 | 种子 SQL | `.sql` | 初始数据 (仅组织库) | +| 7 | 运行脚本 | `.sh` | run.sh, start.sh, stop.sh | +| 8 | systemd unit | `.service` | Linux 服务配置 | +| 9 | 版本升级说明书 | `.md` | 变更内容 | +| 10 | 发布说明 | `.md` | 版本概述 | +| 11 | 甲方升级说明 | `.md` | 客户版 | +| 12 | 升级计划 | `.md` | 时间表 | +| 13 | 实施交付清单 | `.md` | 核对表 | +| 14 | 验收记录模板 | `.md` | 验收标准 | +| 15 | SQL审核记录 | `.md` | DDL/DML 审核 | +| 16 | 构建清单 | `.txt` | git rev, 时间戳 | +| 17 | 证据采集脚本 | `.sh` | 现场运维 | + +### 8.2 不应交付 + +| 项目 | 原因 | +|------|------| +| Maven target/ 目录 | 构建中间产物 | +| 源码 `.java` | 闭源交付 | +| `.git/` | 版本库 | +| IDE 配置 `.idea/`, `.iml` | 本地开发配置 | +| 测试脚本和测试数据 | 非生产用途 | + +--- + +## 9. 版本发布检查清单 + +### 发布前 + +- [ ] 所有单元测试通过 +- [ ] `policy_type` 值为 `REPLACE_ALLOWLIST` (非旧 `INTERSECT_ALLOWLIST`) +- [ ] DDL 仅在 `organization_tenant_visitor_floor_policy_init_tenants.sql` 维护 +- [ ] 电梯侧 SQL 已标记 `@deprecated` +- [ ] JDK 8 编译验证 (`java -version` → `1.8.x`) +- [ ] Maven POM 版本号与发布版本一致 +- [ ] `BUILD_MANIFEST.txt` 包含正确的 git rev +- [ ] 配置文件中无测试环境硬编码值 (如 `localhost:9517`) + +### 发布后 + +- [ ] 发布包目录结构完整 (16 项交付物) +- [ ] `run.sh` 可执行权限正确 (`chmod 755`) +- [ ] systemd service 文件路径占位符已替换 +- [ ] zip 包 (如生成) 可正常解压 +- [ ] SQL 文件可正常导入 (语法无误) +- [ ] 版本升级说明书版本号与发布包一致 + +### 数据库一致性 + +- [ ] `component-organization.tenant_visitor_floor_policy` 所有行: + - `policy_type` = `REPLACE_ALLOWLIST` + - `enabled` = 1 (需启用的行) + - `remark` 格式统一: `'{租户} | {说明} | org={org_id}'` +- [ ] `cw-elevator-application.tenant_visitor_floor_policy` 所有行: + - `enabled` = 0 + - `remark` 以 `[DEPRECATED]` 开头 diff --git a/scripts/build/release-cw-elevator-application.sh b/scripts/build/release-cw-elevator-application.sh new file mode 100755 index 00000000..51935759 --- /dev/null +++ b/scripts/build/release-cw-elevator-application.sh @@ -0,0 +1,218 @@ +#!/usr/bin/env bash +# 构建 cw-elevator-application 指定版本发布包,输出到 maven 模块下 releases/。 +# 目录命名对齐历史运行包 cw-elevator-application-V1.0.0.20211103: +# cw-elevator-application-V<版本>.<日期>(日期默认当天 YYYYMMDD,可用 RELEASE_DATE_LABEL 覆盖)。 +# 用法:在仓库根执行 ./scripts/release-cw-elevator-application.sh [版本号] +# JAR 命名对齐 V1 运行包 cw-elevator-application-V1.0.0.20211103.jar。 +# 当前基线版本 v2.0.17,构建时传入新版本号:./release-cw-elevator-application.sh 2.0.x +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +MAVEN_ROOT="${ROOT}/backend/cw-elevator-application" +REL_VER="${1:-2.0.8}" +RELEASE_DATE_LABEL="${RELEASE_DATE_LABEL:-$(date +%Y%m%d)}" +JAR_NAME="cw-elevator-application-V1.0.0.20211103.jar" +BUNDLE_DIR_NAME="cw-elevator-application-V${REL_VER}.${RELEASE_DATE_LABEL}" +OUT_DIR="${MAVEN_ROOT}/releases/${BUNDLE_DIR_NAME}" +DOC_FALLBACK_VER="${DOC_FALLBACK_VER:-2.0.6}" + +JAVA_HOME="${JAVA_HOME:-/usr/lib/jvm/java-8-openjdk-amd64}" +export JAVA_HOME +export PATH="${JAVA_HOME}/bin:${PATH}" + +if ! java -version 2>&1 | grep -q 'version "1\.8\.'; then + echo "ERROR: 需要 JDK 8(JAVA_HOME=${JAVA_HOME})。当前:" >&2 + java -version >&2 || true + exit 1 +fi + +rm -rf "${OUT_DIR}" +mkdir -p "${OUT_DIR}" + +require_file() { + local file_path="$1" + local hint="$2" + if [[ ! -f "${file_path}" ]]; then + echo "ERROR: 缺少必需文件: ${file_path} (${hint})" >&2 + exit 1 + fi +} + +echo "==> Set reactor version to ${REL_VER}" +(cd "${MAVEN_ROOT}" && mvn -q org.codehaus.mojo:versions-maven-plugin:2.16.2:set \ + -DnewVersion="${REL_VER}" -DprocessAllModules=true -DgenerateBackupPoms=false) + +echo "==> Package starter (fat jar)" +(cd "${MAVEN_ROOT}" && mvn -q -pl cw-elevator-application-starter -am package -DskipTests) + +SRC_JAR="${MAVEN_ROOT}/cw-elevator-application-starter/target/${JAR_NAME}" +if [[ ! -f "${SRC_JAR}" ]]; then + for candidate in $(ls -1t "${MAVEN_ROOT}/cw-elevator-application-starter/target"/cw-elevator-application-*.jar 2>/dev/null || true); do + if [[ "${candidate}" == *.jar.original ]]; then + continue + fi + SRC_JAR="${candidate}" + break + done +fi +if [[ -z "${SRC_JAR}" || ! -f "${SRC_JAR}" ]]; then + echo "ERROR: 未找到可用 starter 制品(期望 ${JAR_NAME} 或 cw-elevator-application-*.jar)" >&2 + exit 1 +fi + +echo "==> Copy artifacts to ${OUT_DIR}" +install -m0644 "${SRC_JAR}" "${OUT_DIR}/${JAR_NAME}" + +# ── DDL (表结构) ── +DDL_SRC="${ROOT}/docs/sql/tenant_visitor_floor_policy.sql" +DDL_DIR="${OUT_DIR}/ddl" +mkdir -p "${DDL_DIR}" +require_file "${DDL_SRC}" "DDL" +install -m0644 "${DDL_SRC}" "${DDL_DIR}/tenant_visitor_floor_policy.sql" + +# ── 组织侧 DDL + 种子 (V2 活跃, 唯一维护点) ── +ORG_DDL_SRC="${ROOT}/docs/sql/organization_tenant_visitor_floor_policy.sql" +if [[ -f "${ORG_DDL_SRC}" ]]; then + install -m0644 "${ORG_DDL_SRC}" "${DDL_DIR}/organization_tenant_visitor_floor_policy.sql" +fi +ORG_INIT_SRC="${ROOT}/docs/sql/organization_tenant_visitor_floor_policy_init_tenants.sql" +require_file "${ORG_INIT_SRC}" "组织侧策略种子 (V2 活跃)" +install -m0644 "${ORG_INIT_SRC}" "${DDL_DIR}/organization_tenant_visitor_floor_policy_init_tenants.sql" + +# ── 电梯侧种子 (@deprecated, 仅历史参考) ── +DDL_INIT_SRC="${ROOT}/docs/sql/tenant_visitor_floor_policy_init_guangfa_fund.sql" +require_file "${DDL_INIT_SRC}" "初始化 SQL(广发基金-废弃)" +install -m0644 "${DDL_INIT_SRC}" "${DDL_DIR}/tenant_visitor_floor_policy_init_guangfa_fund.sql" + +DDL_PROP_MGMT_SRC="${ROOT}/docs/sql/tenant_visitor_floor_policy_init_property_mgmt_6f.sql" +if [[ -f "${DDL_PROP_MGMT_SRC}" ]]; then + install -m0644 "${DDL_PROP_MGMT_SRC}" "${DDL_DIR}/tenant_visitor_floor_policy_init_property_mgmt_6f.sql" +fi + +# ── DDL 废弃说明 ── +cat > "${DDL_DIR}/README_DDL.txt" << 'DDL_README' +# tenant_visitor_floor_policy DDL 说明 +# +# V2 活跃策略(唯一维护点): +# organization_tenant_visitor_floor_policy.sql — 组织库 DDL +# organization_tenant_visitor_floor_policy_init_tenants.sql — 组织库种子数据 +# 执行目标库: component-organization +# +# @deprecated 电梯侧(历史遗留,V2 不查询): +# tenant_visitor_floor_policy.sql +# tenant_visitor_floor_policy_init_guangfa_fund.sql +# tenant_visitor_floor_policy_init_property_mgmt_6f.sql +# 保留仅供历史参考。V2 电梯代码已移除策略查询。 +DDL_README + +UPGRADE_SRC="${ROOT}/docs/build/cw-elevator-application-v${REL_VER}-版本升级说明书.md" +if [[ ! -f "${UPGRADE_SRC}" ]]; then + UPGRADE_SRC="${ROOT}/docs/build/cw-elevator-application-v${DOC_FALLBACK_VER}-版本升级说明书.md" +fi +require_file "${UPGRADE_SRC}" "版本升级说明书" +install -m0644 "${UPGRADE_SRC}" "${OUT_DIR}/版本升级说明书.md" + +INDEX_SRC="${ROOT}/docs/build/cw-elevator-application-v${REL_VER}-发布说明.md" +if [[ ! -f "${INDEX_SRC}" ]]; then + INDEX_SRC="${ROOT}/docs/build/cw-elevator-application-v${DOC_FALLBACK_VER}-发布说明.md" +fi +require_file "${INDEX_SRC}" "发布说明" +install -m0644 "${INDEX_SRC}" "${OUT_DIR}/发布说明.md" + +CLIENT_SRC="${ROOT}/docs/build/cw-elevator-application-v${REL_VER}-甲方版本升级说明.md" +if [[ ! -f "${CLIENT_SRC}" ]]; then + CLIENT_SRC="${ROOT}/docs/build/cw-elevator-application-v${DOC_FALLBACK_VER}-甲方版本升级说明.md" +fi +require_file "${CLIENT_SRC}" "甲方版本升级说明" +install -m0644 "${CLIENT_SRC}" "${OUT_DIR}/甲方版本升级说明.md" + +PLAN_SRC="${ROOT}/docs/build/cw-elevator-application-v${REL_VER}-升级计划.md" +if [[ ! -f "${PLAN_SRC}" ]]; then + PLAN_SRC="${ROOT}/docs/build/cw-elevator-application-v${DOC_FALLBACK_VER}-升级计划.md" +fi +require_file "${PLAN_SRC}" "升级计划" +install -m0644 "${PLAN_SRC}" "${OUT_DIR}/升级计划.md" + +# 与历史运行包 cw-elevator-application-V1.0.0.20211103 一致:bootstrap/application*.properties 仅置于发布根目录(与 JAR、start.sh 同层),不另建 config/ 重复一份。 +for conf_name in bootstrap.properties application.properties application-access-control.properties; do + CONF_SRC="${MAVEN_ROOT}/deploy/v2-maven/${conf_name}" + require_file "${CONF_SRC}" "配置文件 ${conf_name}" + install -m0644 "${CONF_SRC}" "${OUT_DIR}/${conf_name}" +done + +COMMON_JAVA_SRC="${MAVEN_ROOT}/deploy/common-java.sh" +require_file "${COMMON_JAVA_SRC}" "common-java.sh(run.sh 依赖)" +install -m0644 "${COMMON_JAVA_SRC}" "${OUT_DIR}/common-java.sh" + +RUNNER_SRC="${MAVEN_ROOT}/deploy/v2-maven/run.sh" +require_file "${RUNNER_SRC}" "启动脚本 run.sh" +install -m0755 "${RUNNER_SRC}" "${OUT_DIR}/run.sh" + +TEMPLATE_DIR="${MAVEN_ROOT}/deploy/release-bundle-templates" +require_file "${TEMPLATE_DIR}/start.sh.template" "release-bundle start.sh.template" +require_file "${TEMPLATE_DIR}/stop.sh.template" "release-bundle stop.sh.template" +require_file "${TEMPLATE_DIR}/cw-elevator-application.service.template" "release-bundle service template" +DEPLOY_DIR_PLACEHOLDER="${DEPLOY_DIR_PLACEHOLDER:-/path/to/cw-elevator-application}" +sed -e "s/__JAR_NAME__/${JAR_NAME}/g" -e "s/__REL_VER__/${REL_VER}/g" \ + "${TEMPLATE_DIR}/start.sh.template" > "${OUT_DIR}/start.sh" +chmod 0755 "${OUT_DIR}/start.sh" +sed -e "s/__JAR_NAME__/${JAR_NAME}/g" \ + "${TEMPLATE_DIR}/stop.sh.template" > "${OUT_DIR}/stop.sh" +chmod 0755 "${OUT_DIR}/stop.sh" +sed -e "s/__JAR_NAME__/${JAR_NAME}/g" -e "s/__REL_VER__/${REL_VER}/g" \ + -e "s|__DEPLOY_DIR__|${DEPLOY_DIR_PLACEHOLDER}|g" \ + "${TEMPLATE_DIR}/cw-elevator-application.service.template" > "${OUT_DIR}/cw-elevator-application.service" +chmod 0644 "${OUT_DIR}/cw-elevator-application.service" + +EVIDENCE_SRC="${ROOT}/scripts/collect_elevator_runtime_evidence.sh" +require_file "${EVIDENCE_SRC}" "collect_elevator_runtime_evidence.sh(现场证据采集)" +install -m0755 "${EVIDENCE_SRC}" "${OUT_DIR}/collect_elevator_runtime_evidence.sh" + +DELIVERY_SRC="${ROOT}/docs/build/cw-elevator-application-v${REL_VER}-实施交付清单.md" +if [[ ! -f "${DELIVERY_SRC}" ]]; then + DELIVERY_SRC="${ROOT}/docs/build/cw-elevator-application-v${DOC_FALLBACK_VER}-实施交付清单.md" +fi +require_file "${DELIVERY_SRC}" "实施交付清单" +install -m0644 "${DELIVERY_SRC}" "${OUT_DIR}/实施交付清单.md" + +ACCEPTANCE_SRC="${ROOT}/docs/build/cw-elevator-application-v${REL_VER}-实施验收记录模板.md" +if [[ ! -f "${ACCEPTANCE_SRC}" ]]; then + ACCEPTANCE_SRC="${ROOT}/docs/build/cw-elevator-application-v${DOC_FALLBACK_VER}-实施验收记录模板.md" +fi +require_file "${ACCEPTANCE_SRC}" "实施验收记录模板" +install -m0644 "${ACCEPTANCE_SRC}" "${OUT_DIR}/实施验收记录模板.md" + +AUDIT_SRC="${ROOT}/docs/build/cw-elevator-application-v${REL_VER}-SQL与代码一致性审核记录.md" +if [[ ! -f "${AUDIT_SRC}" ]]; then + AUDIT_SRC="${ROOT}/docs/build/cw-elevator-application-v${DOC_FALLBACK_VER}-SQL与代码一致性审核记录.md" +fi +require_file "${AUDIT_SRC}" "SQL与代码一致性审核记录" +install -m0644 "${AUDIT_SRC}" "${OUT_DIR}/SQL与代码一致性审核记录.md" + +{ + echo "artifact=${JAR_NAME}" + echo "bundle_dir_name=${BUNDLE_DIR_NAME}" + echo "directory=${OUT_DIR}" + echo "built_at=$(date -Iseconds 2>/dev/null || date)" + echo "java_home=${JAVA_HOME}" + java -version 2>&1 | sed 's/^/java_version_line=/' || true + echo -n "git_rev=" + (cd "${ROOT}" && git rev-parse HEAD 2>/dev/null) || echo "unknown" + echo -n "git_branch=" + (cd "${ROOT}" && git rev-parse --abbrev-ref HEAD 2>/dev/null) || echo "unknown" +} > "${OUT_DIR}/BUILD_MANIFEST.txt" + +if [[ "${RELEASE_MAKE_ZIP:-1}" == "1" ]]; then + ZIP_NAME="${BUNDLE_DIR_NAME}.zip" + ZIP_OUT="${MAVEN_ROOT}/releases/${ZIP_NAME}" + rm -f "${ZIP_OUT}" + (cd "${MAVEN_ROOT}/releases" && zip -rq "${ZIP_NAME}" "${BUNDLE_DIR_NAME}") + echo "==> Zip artifact: ${ZIP_OUT}" +fi + +echo "==> Restore reactor version to 2.0-SNAPSHOT" +(cd "${MAVEN_ROOT}" && mvn -q org.codehaus.mojo:versions-maven-plugin:2.16.2:set \ + -DnewVersion=2.0-SNAPSHOT -DprocessAllModules=true -DgenerateBackupPoms=false) + +echo "==> Done." +ls -la "${OUT_DIR}"