From 7c45f56804385112bcdb456471dfe0b32306c1da Mon Sep 17 00:00:00 2001 From: lzh Date: Tue, 28 Apr 2026 16:45:11 +0800 Subject: [PATCH] =?UTF-8?q?chore(ci):=20=E7=BB=9F=E4=B8=80=E9=A2=84?= =?UTF-8?q?=E5=8F=91=E7=8E=AF=E5=A2=83=E5=91=BD=E5=90=8D=20staging=20?= =?UTF-8?q?=E2=86=92=20release?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - env/staging.env.example → env/release.env.example(git mv 保留历史) - Jenkinsfile:STAGING_DEPLOY_HOST/PATH → RELEASE_*,日志和注释同步 - docker-compose.core.yml、5 个 application.yaml 注释里的 staging → release - TDengine database:aiot_platform_staging → aiot_platform_release - XXL-Job appname 后缀:-staging → -release 仅命名调整,不动任何运行行为。 --- Jenkinsfile | 20 +++++++++---------- docker-compose.core.yml | 4 ++-- ...taging.env.example => release.env.example} | 18 ++++++++--------- .../src/main/resources/application.yaml | 2 +- .../src/main/resources/application.yaml | 2 +- .../src/main/resources/application.yaml | 2 +- .../src/main/resources/application.yaml | 2 +- .../src/main/resources/application.yaml | 2 +- 8 files changed, 26 insertions(+), 26 deletions(-) rename env/{staging.env.example => release.env.example} (84%) diff --git a/Jenkinsfile b/Jenkinsfile index 6de47f49..872c8c10 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -29,14 +29,14 @@ pipeline { // 服务配置 CORE_SERVICES = 'viewsh-gateway,viewsh-module-system-server,viewsh-module-infra-server,viewsh-module-iot-server,viewsh-module-iot-gateway,viewsh-module-ops-server' - // 部署配置(默认 Prod,release/next 分支会在 Initialize 阶段覆盖为 Staging) + // 部署配置(默认 Prod,release/next 分支会在 Initialize 阶段覆盖为 Release) DEPLOY_HOST = '172.17.16.14' DEPLOY_PATH = '/opt/aiot-platform-cloud' SSH_KEY = '/var/jenkins_home/.ssh/id_rsa' - // Staging 服务器配置 - STAGING_DEPLOY_HOST = '172.17.16.7' - STAGING_DEPLOY_PATH = '/opt/aiot-platform-cloud' + // Release 服务器配置 + RELEASE_DEPLOY_HOST = '172.17.16.7' + RELEASE_DEPLOY_PATH = '/opt/aiot-platform-cloud' // 磁盘守护阈值(%):低于 MIN 直接 fail;低于 WARN 仅告警 DISK_FREE_MIN_PCT = '5' @@ -78,9 +78,9 @@ pipeline { // 根据分支选择部署目标 if (env.BRANCH_NAME == 'release/next') { - env.DEPLOY_HOST = env.STAGING_DEPLOY_HOST - env.DEPLOY_PATH = env.STAGING_DEPLOY_PATH - echo "📦 Deploy target: STAGING (${env.DEPLOY_HOST})" + env.DEPLOY_HOST = env.RELEASE_DEPLOY_HOST + env.DEPLOY_PATH = env.RELEASE_DEPLOY_PATH + echo "📦 Deploy target: RELEASE (${env.DEPLOY_HOST})" } else { echo "📦 Deploy target: PRODUCTION (${env.DEPLOY_HOST})" } @@ -427,7 +427,7 @@ pipeline { def stageStartTime = System.currentTimeMillis() echo "🧹 Cleaning up old images (keep=${env.IMAGE_KEEP_COUNT})" - // Prod/Staging 本地:清旧镜像 + dangling + builder cache + // Prod/Release 本地:清旧镜像 + dangling + builder cache cleanupDeployHost(env.DEPLOY_HOST, env.IMAGE_KEEP_COUNT) // Registry:按保留策略删 manifest + 触发 GC 释放磁盘 @@ -1177,13 +1177,13 @@ def checkRemoteEnvFileOrFail(String host, String deployPath) { error("""❌ ${host}:${deployPath}/.env 不存在! 请先在部署机上手工放置环境变量文件(敏感凭据不进 git): - prod 模板:env/prod.env.example - - staging 模板:env/staging.env.example + - release 模板:env/release.env.example 拷贝模板到 ${deployPath}/.env 并填好密码、CTSDB 凭据等占位符后再触发部署。""") } echo " ✅ ${host}:${deployPath}/.env 存在" } -// Prod/Staging 本地清理:调用仓库内的 cleanup.sh +// Prod/Release 本地清理:调用仓库内的 cleanup.sh def cleanupDeployHost(String host, String keep) { def sshOpts = "-o StrictHostKeyChecking=no -o ConnectTimeout=10 -i ${env.SSH_KEY}" try { diff --git a/docker-compose.core.yml b/docker-compose.core.yml index c4fa61fe..155e8f95 100644 --- a/docker-compose.core.yml +++ b/docker-compose.core.yml @@ -46,7 +46,7 @@ x-common-env: &common-env ROCKETMQ_SECRET_KEY: ${ROCKETMQ_SECRET_KEY:-sk82108944bc0997f7} # ===== XXL-Job ===== - # 注意:XXL_JOB_EXECUTOR_APPNAME 用来区分 prod/staging 在同一 admin 下的执行器组 + # 注意:XXL_JOB_EXECUTOR_APPNAME 用来区分 prod/release 在同一 admin 下的执行器组 # (后端 application.yaml 需要支持 ${XXL_JOB_EXECUTOR_APPNAME:${spring.application.name}}) XXL_JOB_ADMIN_ADDRESSES: ${XXL_JOB_ADMIN_ADDRESSES:-http://172.17.16.7:19090/xxl-job-admin} XXL_JOB_EXECUTOR_IP: ${XXL_JOB_EXECUTOR_IP:-172.17.16.14} @@ -146,7 +146,7 @@ services: JAVA_OPTS: "-Xms1024m -Xmx2048m -XX:+UseContainerSupport -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/app/logs" # ===== 时序库(iot-server 独有)===== - # prod 用 TDengine(172.17.16.7:6041),staging 用腾讯云 CTSDB(InfluxDB 兼容) + # prod 用 TDengine(172.17.16.7:6041),release 用腾讯云 CTSDB(InfluxDB 兼容) # 通过 TSDB_TYPE 切换:tdengine | ctsdb TSDB_TYPE: ${TSDB_TYPE:-tdengine} TDENGINE_HOST: ${TDENGINE_HOST:-172.17.16.7} diff --git a/env/staging.env.example b/env/release.env.example similarity index 84% rename from env/staging.env.example rename to env/release.env.example index 7d3e050e..697b8945 100644 --- a/env/staging.env.example +++ b/env/release.env.example @@ -1,5 +1,5 @@ # ============================================ -# 预发布环境(STAGING)环境变量模板 +# 预发布环境(RELEASE)环境变量模板 # ============================================ # 部署机使用方式: # 1) 拷贝到 172.17.16.7 的 /opt/aiot-platform-cloud/.env @@ -28,7 +28,7 @@ REDIS_HOST=172.17.16.13 REDIS_PORT=6379 REDIS_PASSWORD= -# ===== RocketMQ(用 staging 服务器本地部署的 1Panel-rocketmq-ZQQi 实例,内网地址)===== +# ===== RocketMQ(用 release 服务器本地部署的 1Panel-rocketmq-ZQQi 实例,内网地址)===== # 1Panel 上 namesrv 容器对外端口(请按实际 1Panel 暴露端口校正,默认 9876) ROCKETMQ_NAMESRV_ADDR=172.17.16.7:9876 # 自部署 RocketMQ 通常无 ACL,留空即可;如启用了 ACL 再填 @@ -36,16 +36,16 @@ ROCKETMQ_ACCESS_KEY= ROCKETMQ_SECRET_KEY= # ===== 时序库 ===== -# TODO: staging 计划用腾讯云 CTSDB(InfluxDB 兼容),但当前后端 application-prod.yaml 仍写死 +# TODO: release 计划用腾讯云 CTSDB(InfluxDB 兼容),但当前后端 application-prod.yaml 仍写死 # TDengine 的 jdbc:TAOS-RS 协议;切到 CTSDB 需要后端代码层改造(双引擎抽象在 -# framework/tsdb/ 已有但 yaml 未启用切换)。短期方案:staging 共享 prod 的 TDengine +# framework/tsdb/ 已有但 yaml 未启用切换)。短期方案:release 共享 prod 的 TDengine # 实例(172.17.16.7:6041),通过独立 database 名隔离。 TSDB_TYPE=tdengine TDENGINE_HOST=172.17.16.7 TDENGINE_PORT=6041 TDENGINE_USERNAME=root TDENGINE_PASSWORD= -TDENGINE_DATABASE=aiot_platform_staging +TDENGINE_DATABASE=aiot_platform_release # CTSDB 切换 follow-up(暂留空) CTSDB_URL= CTSDB_USERNAME= @@ -53,13 +53,13 @@ CTSDB_PASSWORD= CTSDB_DATABASE= # ===== XXL-Job ===== -# 共用 prod 的 admin(http://172.17.16.7:19090),但用 -staging 后缀区分执行器组 -# 否则 admin 调度任务会同时打到 prod 和 staging(同 appname 串台) +# 共用 prod 的 admin(http://172.17.16.7:19090),但用 -release 后缀区分执行器组 +# 否则 admin 调度任务会同时打到 prod 和 release(同 appname 串台) XXL_JOB_ADMIN_ADDRESSES=http://172.17.16.7:19090/xxl-job-admin XXL_JOB_EXECUTOR_IP=172.17.16.7 -XXL_JOB_EXECUTOR_APPNAME_SUFFIX=-staging +XXL_JOB_EXECUTOR_APPNAME_SUFFIX=-release -# ===== 微信(建议 staging 用沙箱号;先沿用 prod)===== +# ===== 微信(建议 release 用沙箱号;先沿用 prod)===== WX_MP_APP_ID=wx5b23ba7a5589ecbb WX_MP_SECRET= WX_MINIAPP_APPID=wxc4598c446f8a9cb3 diff --git a/viewsh-module-infra/viewsh-module-infra-server/src/main/resources/application.yaml b/viewsh-module-infra/viewsh-module-infra-server/src/main/resources/application.yaml index 9beec4d7..f7b97155 100644 --- a/viewsh-module-infra/viewsh-module-infra-server/src/main/resources/application.yaml +++ b/viewsh-module-infra/viewsh-module-infra-server/src/main/resources/application.yaml @@ -122,7 +122,7 @@ spring: xxl: job: executor: - appname: ${spring.application.name}${XXL_JOB_EXECUTOR_APPNAME_SUFFIX:} # 执行器 AppName(SUFFIX 在 staging 设为 -staging,prod 留空) + appname: ${spring.application.name}${XXL_JOB_EXECUTOR_APPNAME_SUFFIX:} # 执行器 AppName(SUFFIX 在 release 设为 -release,prod 留空) logpath: ${user.home}/logs/xxl-job/${spring.application.name} # 执行器运行日志文件存储磁盘路径 accessToken: default_token # 执行器通讯TOKEN diff --git a/viewsh-module-iot/viewsh-module-iot-server/src/main/resources/application.yaml b/viewsh-module-iot/viewsh-module-iot-server/src/main/resources/application.yaml index a914c49a..60e5d5b2 100644 --- a/viewsh-module-iot/viewsh-module-iot-server/src/main/resources/application.yaml +++ b/viewsh-module-iot/viewsh-module-iot-server/src/main/resources/application.yaml @@ -122,7 +122,7 @@ spring: xxl: job: executor: - appname: ${spring.application.name}${XXL_JOB_EXECUTOR_APPNAME_SUFFIX:} # 执行器 AppName(SUFFIX 在 staging 设为 -staging,prod 留空) + appname: ${spring.application.name}${XXL_JOB_EXECUTOR_APPNAME_SUFFIX:} # 执行器 AppName(SUFFIX 在 release 设为 -release,prod 留空) logpath: ${user.home}/logs/xxl-job/${spring.application.name} # 执行器运行日志文件存储磁盘路径 accessToken: default_token # 执行器通讯TOKEN diff --git a/viewsh-module-ops/viewsh-module-ops-server/src/main/resources/application.yaml b/viewsh-module-ops/viewsh-module-ops-server/src/main/resources/application.yaml index 5a2cb65b..1abe987b 100644 --- a/viewsh-module-ops/viewsh-module-ops-server/src/main/resources/application.yaml +++ b/viewsh-module-ops/viewsh-module-ops-server/src/main/resources/application.yaml @@ -115,7 +115,7 @@ spring: xxl: job: executor: - appname: ${spring.application.name}${XXL_JOB_EXECUTOR_APPNAME_SUFFIX:} # 执行器 AppName(SUFFIX 在 staging 设为 -staging,prod 留空) + appname: ${spring.application.name}${XXL_JOB_EXECUTOR_APPNAME_SUFFIX:} # 执行器 AppName(SUFFIX 在 release 设为 -release,prod 留空) logpath: ${user.home}/logs/xxl-job/${spring.application.name} # 执行器运行日志文件存储磁盘路径 accessToken: default_token # 执行器通讯TOKEN diff --git a/viewsh-module-system/viewsh-module-system-server/src/main/resources/application.yaml b/viewsh-module-system/viewsh-module-system-server/src/main/resources/application.yaml index 3f995190..abc1dc28 100644 --- a/viewsh-module-system/viewsh-module-system-server/src/main/resources/application.yaml +++ b/viewsh-module-system/viewsh-module-system-server/src/main/resources/application.yaml @@ -122,7 +122,7 @@ spring: xxl: job: executor: - appname: ${spring.application.name}${XXL_JOB_EXECUTOR_APPNAME_SUFFIX:} # 执行器 AppName(SUFFIX 在 staging 设为 -staging,prod 留空) + appname: ${spring.application.name}${XXL_JOB_EXECUTOR_APPNAME_SUFFIX:} # 执行器 AppName(SUFFIX 在 release 设为 -release,prod 留空) logpath: ${user.home}/logs/xxl-job/${spring.application.name} # 执行器运行日志文件存储磁盘路径 accessToken: default_token # 执行器通讯TOKEN diff --git a/viewsh-server/src/main/resources/application.yaml b/viewsh-server/src/main/resources/application.yaml index a13c764a..0d41c60f 100644 --- a/viewsh-server/src/main/resources/application.yaml +++ b/viewsh-server/src/main/resources/application.yaml @@ -104,7 +104,7 @@ easy-trans: xxl: job: executor: - appname: ${spring.application.name}${XXL_JOB_EXECUTOR_APPNAME_SUFFIX:} # 执行器 AppName(SUFFIX 在 staging 设为 -staging,prod 留空) + appname: ${spring.application.name}${XXL_JOB_EXECUTOR_APPNAME_SUFFIX:} # 执行器 AppName(SUFFIX 在 release 设为 -release,prod 留空) logpath: ${user.home}/logs/xxl-job/${spring.application.name} # 执行器运行日志文件存储磁盘路径 accessToken: default_token # 执行器通讯TOKEN