mirror of
https://github.com/hpd840321/starRiverProperty.git
synced 2026-06-09 08:20:31 +08:00
25db029859
- docs/sql: organization_* 与 tenant_* 访客楼层策略脚本 - docs/testing: 访客邀约页初始化验证、pack 脚本与 README(忽略 dist/__pycache__) - maven-ninca-common-component-organization: CpImageStoreServiceImpl、starter、run-verify、releases 脚本与 javap 审计 JSON - docs/superpowers: component-org 生产问题修复计划 - scripts/test-env/prepare-db.sh 更新 Co-authored-by: Cursor <cursoragent@cursor.com>
190 lines
7.6 KiB
Bash
190 lines
7.6 KiB
Bash
#!/usr/bin/env bash
|
||
# 从反应堆根构建 fat JAR,并在 releases/ 下生成发布目录。
|
||
set -euo pipefail
|
||
|
||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
REACTOR_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
||
DEFAULT_JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"
|
||
export JAVA_HOME="${JAVA_HOME:-$DEFAULT_JAVA_HOME}"
|
||
|
||
# 若登录 shell 已将 JAVA_HOME 设为 JDK 11+,:- 默认值不会生效;发布编译仍须 JDK 8
|
||
if ! "${JAVA_HOME}/bin/java" -version 2>&1 | grep -qE 'version "1\.8\.|java version "1\.8\.'; then
|
||
echo "WARN: 当前 JAVA_HOME(${JAVA_HOME})不是 JDK 8;发布构建将改用 ${DEFAULT_JAVA_HOME}" >&2
|
||
export JAVA_HOME="$DEFAULT_JAVA_HOME"
|
||
fi
|
||
|
||
# 默认:顶层部署包中的组件模板目录(application-node.properties / bootstrap.properties)
|
||
DEFAULT_DEPLOY_TEMPLATE="/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/部署包/ninca_common_component_organization_01-ninca_common_component_organization"
|
||
DEPLOY_TEMPLATE="${DEPLOY_TEMPLATE_ROOT:-$DEFAULT_DEPLOY_TEMPLATE}"
|
||
# 与租户访客策略相关的 SQL 权威源(与电梯 prepare-db / release-cw-elevator 共用 docs/sql)
|
||
DEFAULT_DOCS_SQL="$(cd "${SCRIPT_DIR}/../../docs/sql" 2>/dev/null && pwd)" || true
|
||
if [[ -z "${DEFAULT_DOCS_SQL}" || ! -d "${DEFAULT_DOCS_SQL}" ]]; then
|
||
DEFAULT_DOCS_SQL="/media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/源码/docs/sql"
|
||
fi
|
||
DOCS_SQL="${DOCS_SQL_ROOT:-$DEFAULT_DOCS_SQL}"
|
||
|
||
RELEASE_DATE="${RELEASE_DATE:-$(date +%Y%m%d)}"
|
||
|
||
die() { echo "ERROR: $*" >&2; exit 1; }
|
||
|
||
read_version_from_pom() {
|
||
local pom="${REACTOR_ROOT}/pom.xml"
|
||
[[ -f "$pom" ]] || die "找不到反应堆 pom.xml: $pom"
|
||
awk '
|
||
/<artifactId>ninca-common-component-organization-reactor<\/artifactId>/ { inr=1 }
|
||
inr && /<version>/ {
|
||
sub(/.*<version>/, "")
|
||
sub(/<\/version>.*/, "")
|
||
print
|
||
exit
|
||
}
|
||
' "$pom"
|
||
}
|
||
|
||
read_version_mvn() {
|
||
# 备用:mvn help:evaluate(部分环境 -q 会吞掉 stdout,故解析最后一行语义化版本)
|
||
(cd "$REACTOR_ROOT" && mvn -DforceStdout help:evaluate -Dexpression=project.version -f pom.xml 2>/dev/null \
|
||
| grep -E '^[0-9]' | tail -1) || true
|
||
}
|
||
|
||
if [[ ! -x "${JAVA_HOME}/bin/java" ]]; then
|
||
die "JAVA_HOME 无效或缺少 java 可执行文件: ${JAVA_HOME}/bin/java"
|
||
fi
|
||
|
||
if [[ ! -d "${REACTOR_ROOT}/all-lib" ]]; then
|
||
echo "WARN: 未找到 all-lib/(${REACTOR_ROOT}/all-lib)。打包可能失败;请先准备本地扁平依赖库。" >&2
|
||
fi
|
||
|
||
VERSION="$(read_version_from_pom)"
|
||
if [[ -z "${VERSION}" ]]; then
|
||
VERSION="$(read_version_mvn)"
|
||
fi
|
||
[[ -n "${VERSION}" ]] || die "无法从 pom.xml 解析反应堆版本"
|
||
|
||
SEMVER="${VERSION%%-*}"
|
||
JAR_BASENAME="ninca-common-component-organization-${VERSION}.jar"
|
||
SOURCE_JAR="${REACTOR_ROOT}/cwos-component-organization-starter/target/${JAR_BASENAME}"
|
||
BUNDLE_NAME="ninca-common-component-organization-${VERSION}-${RELEASE_DATE}"
|
||
OUT_DIR="${SCRIPT_DIR}/${BUNDLE_NAME}"
|
||
SYMLINK_NAME="ninca-common-component-organization-V${SEMVER}_${RELEASE_DATE}.jar"
|
||
|
||
echo "==> Reactor: ${REACTOR_ROOT}"
|
||
echo "==> Version: ${VERSION}"
|
||
echo "==> Release date: ${RELEASE_DATE}"
|
||
echo "==> Output dir: ${OUT_DIR}"
|
||
|
||
(cd "$REACTOR_ROOT" && mvn clean package -DskipTests)
|
||
|
||
[[ -f "$SOURCE_JAR" ]] || die "未找到构建产物: ${SOURCE_JAR}(请先确认 starter 已成功 repackage)"
|
||
|
||
mkdir -p "$OUT_DIR"
|
||
cp -f "$SOURCE_JAR" "${OUT_DIR}/${JAR_BASENAME}"
|
||
|
||
copy_if_exists() {
|
||
local src="$1" dest="$2"
|
||
if [[ -f "$src" ]]; then
|
||
cp -f "$src" "$dest"
|
||
echo "==> 已复制: $(basename "$src") <- ${src}"
|
||
else
|
||
echo "WARN: 跳过(文件不存在): $src" >&2
|
||
fi
|
||
}
|
||
|
||
copy_if_exists "${DEPLOY_TEMPLATE}/application-node.properties" "${OUT_DIR}/application-node.properties"
|
||
copy_if_exists "${DEPLOY_TEMPLATE}/bootstrap.properties" "${OUT_DIR}/bootstrap.properties"
|
||
# 可选:与 jar 内 logging.config=classpath:recognition-logback.xml 搭配外置覆盖时使用
|
||
copy_if_exists "${REACTOR_ROOT}/cwos-component-organization-starter/src/main/resources/recognition-logback.xml" "${OUT_DIR}/recognition-logback.xml"
|
||
|
||
# 组织组件交付包内附带与策略表相关的 SQL(执行库以脚本注释为准;多为 cw-elevator-application,_init 含 component-organization 主数据 id)
|
||
SQL_DIR="${OUT_DIR}/sql"
|
||
mkdir -p "${SQL_DIR}"
|
||
SQL_NAMES=(
|
||
tenant_visitor_floor_policy.sql
|
||
tenant_visitor_floor_policy_v2.sql
|
||
tenant_visitor_floor_policy_migrate_org_id.sql
|
||
tenant_visitor_floor_policy_init_guangfa_fund.sql
|
||
tenant_visitor_floor_policy_init_property_mgmt_6f.sql
|
||
organization_tenant_visitor_floor_policy.sql
|
||
organization_tenant_visitor_floor_policy_v2.sql
|
||
organization_tenant_visitor_floor_policy_init_guangfa_fund.sql
|
||
organization_tenant_visitor_floor_policy_init_property_mgmt_6f.sql
|
||
organization_tenant_visitor_floor_policy_full_install.sql
|
||
)
|
||
for base in "${SQL_NAMES[@]}"; do
|
||
copy_if_exists "${DOCS_SQL}/${base}" "${SQL_DIR}/${base}"
|
||
done
|
||
if [[ -d "${SQL_DIR}" ]] && [[ -n "$(find "${SQL_DIR}" -maxdepth 1 -name '*.sql' -print -quit)" ]]; then
|
||
cat > "${SQL_DIR}/README.txt" << 'EOSQL'
|
||
本目录 SQL 与源码 docs/sql 下权威文件一致,随组织组件发布包一并交付。
|
||
|
||
说明(概要):
|
||
- tenant_visitor_floor_policy.sql:电梯库,先 DROP 再 CREATE(含 org_id 最终结构);见各 init 文件头。
|
||
- organization_tenant_visitor_floor_policy*.sql:组织库 component-organization;DDL/full_install 会先 DROP 策略表再重建。
|
||
- tenant_visitor_floor_policy_migrate_org_id.sql:迁移/运维说明(注释为主)。
|
||
- *_init_*.sql:种子数据(DML),org_id 需与 cw_is_organization 一致。
|
||
|
||
执行顺序与现网是否已有表有关,实施前请对照 docs/business 下设计文档。
|
||
EOSQL
|
||
echo "==> 已写入: sql/README.txt"
|
||
fi
|
||
|
||
cat > "${OUT_DIR}/start.sh" << EOF
|
||
#!/usr/bin/env bash
|
||
set -euo pipefail
|
||
DIR="\$(cd "\$(dirname "\${BASH_SOURCE[0]}")" && pwd)"
|
||
cd "\${DIR}"
|
||
JAR_NAME="${JAR_BASENAME}"
|
||
# classpath 加载 jar 内公共 application.properties;file 加载本目录 application-node + bootstrap
|
||
exec "\${JAVA_HOME:-/usr/lib/jvm/java-8-openjdk-amd64}/bin/java" -jar "\${DIR}/\${JAR_NAME}" \\
|
||
--spring.config.location="classpath:/,file:\${DIR}/" \\
|
||
--spring.config.name=application,application-node \\
|
||
--logging.path="\${DIR}/logs" \\
|
||
"\$@"
|
||
EOF
|
||
chmod +x "${OUT_DIR}/start.sh"
|
||
|
||
(cd "$OUT_DIR" && ln -sf "${JAR_BASENAME}" "${SYMLINK_NAME}")
|
||
|
||
SHA256="$(sha256sum "${OUT_DIR}/${JAR_BASENAME}" | awk '{ print $1 }')"
|
||
ABS_OUT="$(cd "$OUT_DIR" && pwd)"
|
||
ABS_JAR="${ABS_OUT}/${JAR_BASENAME}"
|
||
|
||
{
|
||
echo "Component: ninca-common-component-organization (starter fat jar)"
|
||
echo "Reactor version (pom.xml): ${VERSION}"
|
||
echo "Release bundle: ${BUNDLE_NAME}"
|
||
echo "Date stamp: ${RELEASE_DATE}"
|
||
echo ""
|
||
echo "Build command:"
|
||
echo " export JAVA_HOME=${JAVA_HOME}"
|
||
echo " cd \"${REACTOR_ROOT}\""
|
||
echo " mvn clean package -DskipTests"
|
||
echo ""
|
||
echo "Fat jar artifact:"
|
||
echo " ${ABS_JAR}"
|
||
echo "SHA256:"
|
||
echo " ${SHA256}"
|
||
echo ""
|
||
echo "Files in this directory:"
|
||
echo " - sql/(租户访客策略相关脚本,来自 docs/sql;含 README.txt)"
|
||
echo " - application-node.properties(节点 Consul/instance-id;若部署包模板存在则已复制)"
|
||
echo " - bootstrap.properties (若部署包模板存在则已复制)"
|
||
echo " - ${JAR_BASENAME}"
|
||
echo " - ${SYMLINK_NAME}"
|
||
echo " - RELEASE.txt"
|
||
echo " - start.sh"
|
||
echo ""
|
||
echo "Symlink (ops naming):"
|
||
echo " ${SYMLINK_NAME} -> ${JAR_BASENAME}"
|
||
echo ""
|
||
echo "Start:"
|
||
echo " bash \"${ABS_OUT}/start.sh\""
|
||
} > "${OUT_DIR}/RELEASE.txt"
|
||
|
||
echo ""
|
||
echo "========================================"
|
||
echo "Release bundle: ${ABS_OUT}"
|
||
echo "SHA256 (${JAR_BASENAME}):"
|
||
echo " ${SHA256}"
|
||
echo "========================================"
|