#!/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}"