清除Nacos:删bootstrap.yml与pom依赖,加actuator;配置改平台档案模式
This commit is contained in:
+5
-68
@@ -1,9 +1,11 @@
|
||||
name: ci-bschclass-service
|
||||
|
||||
# 后端标准化 CI:maven 构建 jar -> docker build -> 推 Nexus docker-hosted
|
||||
# 触发:push 到 master(本仓库默认分支,代码在根目录)/ 手动 Run workflow
|
||||
# 触发:push 到 master(本仓库默认分支)/ 手动 Run workflow
|
||||
# ⚠️ 本 workflow 不再负责部署:镜像推完后由 projman 平台接管(DeployTab 选 tag 手动触发部署,
|
||||
# 平台负责 compose 渲染 / 配置挂载 / 健康检查 / Caddy 路由)。
|
||||
# 依赖仓库 Actions Secrets:NEXUS_USER / NEXUS_PASSWORD(ci-docker 账号,仅 docker-hosted 推送权)
|
||||
# 中间件密码(redis/mysql/rabbitmq)由 Nacos application-infra.yaml 注入,无需 Secret,也不注入容器 env
|
||||
# 中间件连接由 projman 平台按「infra 勾选」注入容器 env,无需 Secret
|
||||
on:
|
||||
push:
|
||||
branches: [master]
|
||||
@@ -13,10 +15,6 @@ on:
|
||||
description: 'image tag (default = short sha)'
|
||||
required: false
|
||||
default: 'auto'
|
||||
deploy:
|
||||
description: 'deploy to 160 after build (auto / skip)'
|
||||
required: false
|
||||
default: 'auto'
|
||||
|
||||
jobs:
|
||||
build-and-push:
|
||||
@@ -83,65 +81,4 @@ jobs:
|
||||
run: docker push nexus:8083/docker-hosted/bschclass-service:${{ steps.meta.outputs.tag }}
|
||||
|
||||
- name: Report build
|
||||
run: echo "pushed nexus:8083/docker-hosted/bschclass-service:${{ steps.meta.outputs.tag }}"
|
||||
|
||||
# —— 部署阶段(仅在 push 或手动 dispatch deploy=auto 时执行)——
|
||||
# 运行在 160 的 act_runner 上,复用宿主 docker daemon(docker.sock 由 act_runner 自动挂载),
|
||||
# 因此 docker pull / run 直接作用于 160 宿主。
|
||||
- name: Deploy (pull + rollout with rollback)
|
||||
if: github.event_name == 'push' || inputs.deploy == 'auto'
|
||||
run: |
|
||||
set +e
|
||||
IMG=nexus:8083/docker-hosted/bschclass-service:${{ steps.meta.outputs.tag }}
|
||||
echo "deploying $IMG"
|
||||
echo "${{ secrets.NEXUS_PASSWORD }}" | docker login nexus:8083 -u ${{ secrets.NEXUS_USER }} --password-stdin
|
||||
docker pull "$IMG"
|
||||
# 回滚锚:保留当前 bschclass-service:latest(已知良好镜像),再额外打一个时间点标签
|
||||
RB=bschclass-service:rb-$(date +%s)
|
||||
docker tag bschclass-service:latest "$RB" 2>/dev/null || true
|
||||
docker stop bschclass-service 2>/dev/null; docker rm -f bschclass-service 2>/dev/null
|
||||
# bootstrap.yml 默认 nacos.config.enabled=false(本地不连);CI 必须注入 NACOS_CONFIG_ENABLED=true 才会拉配置
|
||||
# SPRING_PROFILES_ACTIVE=prod 激活生产 profile
|
||||
# namespace/凭据用顶层 SPRING_CLOUD_NACOS_* env(bootstrap 的 ${...} 占位符才能解析到)
|
||||
# ⚠️ 后端有 context-path=/bschclass(application-prod.yml),caddy 用 handle(不剥离 /bschclass 前缀),
|
||||
# 故 CAS 客户端拼出的 service URL 正确包含 /bschclass,登录回跳地址不会丢前缀。
|
||||
docker run -d --name bschclass-service --restart unless-stopped --network infra-infra-net -p 8087:8087 \
|
||||
--add-host sso.yunhaixingtong.com:192.168.10.160 \
|
||||
--memory=1.5g --memory-swap=1.5g \
|
||||
-v /data/logs/bschclass:/app/logs \
|
||||
-e JAVA_OPTS="-Xms512m -Xmx1024m -XX:MaxMetaspaceSize=256m" \
|
||||
-e SPRING_PROFILES_ACTIVE=prod \
|
||||
-e NACOS_CONFIG_ENABLED=true \
|
||||
-e NACOS_ADDR=nacos:8848 \
|
||||
-e SPRING_CLOUD_NACOS_CONFIG_NAMESPACE=6196f0de-a28d-4894-8f10-e2982b57c6bc \
|
||||
-e SPRING_CLOUD_NACOS_USERNAME=yh-reader \
|
||||
-e SPRING_CLOUD_NACOS_PASSWORD=123456 \
|
||||
"$IMG"
|
||||
# 健康检查:context-path=/bschclass 后,context root 为 /bschclass/(无欢迎页返回 404);
|
||||
# 000 表示应用未起来(端口不通),非 000 即视为已启动。探 /bschclass/ 而非 / 更准确。
|
||||
OK=0
|
||||
for i in $(seq 1 30); do
|
||||
sleep 5
|
||||
CODE=$(curl -s -o /dev/null -w '%{http_code}' http://localhost:8087/bschclass/ 2>/dev/null || true)
|
||||
if [ "$CODE" != "000" ]; then OK=1; break; fi
|
||||
done
|
||||
if [ "$OK" = "0" ]; then
|
||||
echo "!! UNHEALTHY -> rollback to bschclass-service:latest"
|
||||
docker stop bschclass-service 2>/dev/null; docker rm -f bschclass-service 2>/dev/null
|
||||
docker run -d --name bschclass-service --restart unless-stopped --network infra-infra-net -p 8087:8087 \
|
||||
--add-host sso.yunhaixingtong.com:192.168.10.160 \
|
||||
--memory=1.5g --memory-swap=1.5g \
|
||||
-v /data/logs/bschclass:/app/logs \
|
||||
-e JAVA_OPTS="-Xms512m -Xmx1024m -XX:MaxMetaspaceSize=256m" \
|
||||
-e SPRING_PROFILES_ACTIVE=prod \
|
||||
-e NACOS_CONFIG_ENABLED=true \
|
||||
-e NACOS_ADDR=nacos:8848 \
|
||||
-e SPRING_CLOUD_NACOS_CONFIG_NAMESPACE=6196f0de-a28d-4894-8f10-e2982b57c6bc \
|
||||
-e SPRING_CLOUD_NACOS_USERNAME=yh-reader \
|
||||
-e SPRING_CLOUD_NACOS_PASSWORD=123456 \
|
||||
bschclass-service:latest
|
||||
echo "rolled back"; exit 7
|
||||
fi
|
||||
echo "DEPLOY OK: $IMG"
|
||||
docker tag "$IMG" bschclass-service:latest
|
||||
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Image}}' | grep bschclass || true
|
||||
run: echo "pushed nexus:8083/docker-hosted/bschclass-service:${{ steps.meta.outputs.tag }} —— 部署请到 projman 平台 DeployTab 手动触发"
|
||||
|
||||
+2
-2
@@ -10,8 +10,8 @@ RUN apt-get update \
|
||||
|
||||
WORKDIR /app
|
||||
COPY target/BschClass-0.1.jar /app/BschClass-0.1.jar
|
||||
# 镜像内 application-prod.yml 仅作「nacos 不可达时的兜底默认」;
|
||||
# 正常启动由 run-app.sh 从 nacos 拉取线上配置(主 dataId=bschclassmanage.yaml,group=SCHCLASSMANAGE,prod 命名空间)后覆盖。
|
||||
# 镜像内 application-prod.yml 仅作独立运行时的兜底默认;
|
||||
# projman 部署时平台配置档案会以 bind mount 覆盖同路径文件,环境变量再压过文件。
|
||||
COPY docker/application-prod.yml /app/config/application-prod.yml
|
||||
COPY docker/run-app.sh /app/run-app.sh
|
||||
RUN chmod +x /app/run-app.sh && mkdir -p /data/upload
|
||||
|
||||
+33
-45
@@ -1,7 +1,14 @@
|
||||
# BschClass 生产配置(线上以 nacos 的 bschclassmanage.yaml 为准,本文件是 nacos 不可达时的兜底)
|
||||
server:
|
||||
port: 8087
|
||||
# 无 context-path:经 caddy 暴露为 http://base.yunhaixingtong.com/bschclass,caddy 已剥离 /bschclass 前缀
|
||||
# ==============================================================
|
||||
# BschClass 生产配置(projman 应用配置档案;同一份内容烤进镜像作独立运行兜底)
|
||||
# --------------------------------------------------------------
|
||||
# 加载顺序(低 -> 高):
|
||||
# jar 内 application.yml(本地开发自己的,写本地 redis/DB)
|
||||
# < 本文件(projman 挂载 /app/config/application-prod.yml,SPRING_PROFILES_ACTIVE=prod)
|
||||
# < 平台注入环境变量(SERVER_PORT / SPRING_DATASOURCE_* / SPRING_REDIS_* / SPRING_RABBITMQ_* / SSO / FILE_WEB_PATH)
|
||||
# ⚠️ 覆盖是 key 级合并非整文件替换;env 压过本文件。
|
||||
# 本文件只放:appKey/appSecret、业务开关、JPA/Hikari 口径、日志级别。
|
||||
# 不要放:端口/contextPath(SERVER_* env 注入)、平台供给的 DB/中间件连接(勾选 infra 后 env 注入)。
|
||||
# ==============================================================
|
||||
|
||||
spring:
|
||||
mvc:
|
||||
@@ -14,36 +21,17 @@ spring:
|
||||
time-zone: GMT+8
|
||||
date-format: yyyy-MM-dd HH:mm:ss
|
||||
|
||||
redis:
|
||||
host: redis
|
||||
port: 6379
|
||||
database: 0
|
||||
# 密码由 nacos application-infra.yaml 注入(spring.redis.password),不在此写死、不依赖容器 env
|
||||
timeout: 2000ms
|
||||
data:
|
||||
redis:
|
||||
repositories:
|
||||
enabled: false
|
||||
|
||||
# datasource:
|
||||
# url: jdbc:mysql://mysql8:3306/dbschoolclass?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
|
||||
# username: root
|
||||
# # 生产由 nacos application-infra.yaml 注入(含密码);此处仅作 nacos 不可达时的兜底参考
|
||||
# password: ${DB_PASSWORD}
|
||||
# driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
# min-idle: 30
|
||||
# max-active: 30
|
||||
# hikari:
|
||||
# minimum-idle: 20
|
||||
# maximum-pool-size: 500
|
||||
# connection-timeout: 600000
|
||||
# idle-timeout: 120000
|
||||
# leakDetectionThreshold: 300000
|
||||
# auto-commit: true
|
||||
# max-lifetime: 1800000
|
||||
# validation-timeout: 3000
|
||||
# connection-test-query: SELECT 1 FROM DUAL
|
||||
# connection-init-sql: SET NAMES utf8mb4
|
||||
datasource:
|
||||
hikari:
|
||||
# 连接治理(平台口径):泄漏 60s 打堆栈现形;拿不到连接快速失败而非干等 600s
|
||||
minimum-idle: 10
|
||||
maximum-pool-size: 30
|
||||
connection-timeout: 10000
|
||||
leak-detection-threshold: 60000
|
||||
max-lifetime: 1800000
|
||||
validation-timeout: 3000
|
||||
connection-test-query: SELECT 1
|
||||
connection-init-sql: SET NAMES utf8mb4
|
||||
|
||||
jpa:
|
||||
database: MySQL
|
||||
@@ -58,11 +46,8 @@ spring:
|
||||
open-in-view: true
|
||||
|
||||
rabbitmq:
|
||||
host: rabbitmq
|
||||
port: 5672
|
||||
username: admin
|
||||
# 密码由 nacos application-infra.yaml 注入(spring.rabbitmq.password),不在此写死、不依赖容器 env
|
||||
listener:
|
||||
# 业务开关:消费端不随应用自动启动(保留原 Nacos 生产行为,与连接注入无关)
|
||||
direct:
|
||||
auto-startup: false
|
||||
simple:
|
||||
@@ -71,22 +56,25 @@ spring:
|
||||
# 单点登录 / 应用间签名鉴权(基础平台 yh-auth / yh-app-auth)
|
||||
yh:
|
||||
sso:
|
||||
server-url-prefix: http://sso.yunhaixingtong.com/cas/
|
||||
client-host-url: http://base.yunhaixingtong.com/bschclass
|
||||
# server-url-prefix / client-host-url 由平台按平台设置注入(改地址 Apply 即生效),此处不写
|
||||
allow-headers: all
|
||||
allow-origins: all
|
||||
url-pattern: /api/*
|
||||
mobi-api-pattern: /mobiapi/*
|
||||
app-auth:
|
||||
enabled: true
|
||||
app-key: 100002
|
||||
app-secret: 2314a3b158b24a838b2b9b69fd3db118
|
||||
open:
|
||||
enabled: true
|
||||
# base-host 由平台注入;此处仅保留相对路径约定
|
||||
user-center-url: http://base.yunhaixingtong.com/userbase
|
||||
group-center-url: http://base.yunhaixingtong.com/userbase
|
||||
|
||||
# 上传文件落容器卷(docker 内 /data/upload)
|
||||
# 上传文件落容器卷 /data/upload(平台挂载宿主持久目录,勿改)
|
||||
FILE_PATH: /data/upload
|
||||
FILE_WEB_PATH: http://base.yunhaixingtong.com/bschclass/upload/
|
||||
UPLOAD_WEB_PATH_HTTP: http://base.yunhaixingtong.com/bschclass/upload/file/
|
||||
# FILE_WEB_PATH / UPLOAD_WEB_PATH_HTTP 由平台注入 {portal}/bschclass/upload/...,此处不写
|
||||
|
||||
logging:
|
||||
level:
|
||||
root: INFO
|
||||
file:
|
||||
path: /app/logs
|
||||
|
||||
+6
-5
@@ -1,10 +1,11 @@
|
||||
#!/bin/sh
|
||||
# BschClass 启动入口:配置统一由 Nacos 配置中心在 bootstrap 阶段下发(见 bootstrap.yml)
|
||||
# 不再需要手动 curl 拉取;若 nacos 不可达,bootstrap 中 fail-fast=false 会自动回退到
|
||||
# 镜像内烤好的 application-prod.yml 兜底默认。
|
||||
# BschClass 启动入口。
|
||||
# 配置来源(低 -> 高):镜像内兜底 /app/config/application-prod.yml
|
||||
# < projman 平台挂载的同名文件(覆盖镜像内兜底)
|
||||
# < 平台注入的环境变量(SERVER_PORT / 数据库连接 / 中间件 / SSO 等)
|
||||
set -e
|
||||
|
||||
echo "[run-app] starting BschClass (profile=prod, nacos=${NACOS_ADDR:-nacos.yunhaixingtong.com:8848}) ..."
|
||||
echo "[run-app] starting BschClass (profile=${SPRING_PROFILES_ACTIVE:-prod}) ..."
|
||||
|
||||
exec java ${JAVA_OPTS:--Xms512m -Xmx1024m} -Dfile.encoding=UTF-8 -jar /app/BschClass-0.1.jar \
|
||||
--spring.profiles.active=prod
|
||||
--spring.profiles.active=${SPRING_PROFILES_ACTIVE:-prod}
|
||||
|
||||
@@ -30,14 +30,6 @@
|
||||
<type>pom</type>
|
||||
<scope>import</scope>
|
||||
</dependency>
|
||||
<!-- Spring Cloud Alibaba(Nacos 配置中心,对齐 Boot 2.7) -->
|
||||
<dependency>
|
||||
<groupId>com.alibaba.cloud</groupId>
|
||||
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
|
||||
<version>2021.0.5.0</version>
|
||||
<type>pom</type>
|
||||
<scope>import</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</dependencyManagement>
|
||||
|
||||
@@ -53,16 +45,10 @@
|
||||
<artifactId>spring-boot-starter-jdbc</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- Nacos 配置中心(替代 Spring Cloud Config)。Spring Cloud Alibaba 2021.0.5 适配 Boot 2.7 -->
|
||||
<!-- 健康检查:projman 平台探活/compose healthcheck 默认探 {contextPath}/actuator/health -->
|
||||
<dependency>
|
||||
<groupId>com.alibaba.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
|
||||
</dependency>
|
||||
<!-- Boot 2.4+ 默认不再处理 bootstrap.yml,需显式引入以继续从 Nacos 拉取配置 -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-bootstrap</artifactId>
|
||||
<version>3.1.8</version>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-actuator</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
|
||||
BIN
Binary file not shown.
@@ -1,14 +0,0 @@
|
||||
server:
|
||||
address: 0.0.0.0
|
||||
port: 8086
|
||||
|
||||
spring:
|
||||
web:
|
||||
cors:
|
||||
enabled: false
|
||||
|
||||
yh:
|
||||
sso:
|
||||
client-host-url: http://192.168.10.166:8086
|
||||
|
||||
FILE_WEB_PATH: http://localhost:8086/upload/
|
||||
@@ -1,13 +0,0 @@
|
||||
server:
|
||||
address: 0.0.0.0
|
||||
port: 8087
|
||||
servlet:
|
||||
# 对齐 UserBase:后端加 context-path,配合 Caddy 用 handle(不剥离 /bschclass 前缀),
|
||||
# 使 CAS 客户端拼出的 service URL 正确包含 /bschclass(否则登录回跳会丢前缀)。
|
||||
context-path: /bschclass
|
||||
|
||||
yh:
|
||||
sso:
|
||||
client-host-url: http://192.168.10.166:8087
|
||||
|
||||
FILE_WEB_PATH: http://localhost:8087/upload/
|
||||
@@ -1,4 +1,9 @@
|
||||
spring:
|
||||
application:
|
||||
name: bschclassmanage
|
||||
# 本地默认 local(纯走本文件);线上由平台注入 SPRING_PROFILES_ACTIVE=prod(容器 env)
|
||||
profiles:
|
||||
active: ${SPRING_PROFILES_ACTIVE:local}
|
||||
mvc:
|
||||
date-format: yyyy-MM-dd HH:mm:ss
|
||||
servlet:
|
||||
|
||||
@@ -1,47 +0,0 @@
|
||||
spring:
|
||||
application:
|
||||
name: bschclassmanage
|
||||
# 本地默认 local(不连 nacos);CI 注入 SPRING_PROFILES_ACTIVE=prod
|
||||
profiles:
|
||||
active: ${SPRING_PROFILES_ACTIVE:local}
|
||||
cloud:
|
||||
nacos:
|
||||
config:
|
||||
# ⭐ 本地默认关闭 nacos(profile=local 时完全不连,无 403 噪音,纯走 application.yml)
|
||||
# CI 注入 NACOS_CONFIG_ENABLED=true 才启用,拉 prod namespace 配置覆盖 application.yml
|
||||
enabled: ${NACOS_CONFIG_ENABLED:false}
|
||||
# Nacos 配置中心地址;CI 注入 NACOS_ADDR=nacos:8848(容器内网别名)
|
||||
server-addr: ${NACOS_ADDR:nacos.yunhaixingtong.com:8848}
|
||||
# 默认指向 prod namespace UUID,避免本地误开时连到空的 dev 命名空间
|
||||
# CI 用 SPRING_CLOUD_NACOS_CONFIG_NAMESPACE 覆盖(注意:NACOS_NAMESPACE 这个 env 名不生效,必须用 SPRING_CLOUD_NACOS_CONFIG_NAMESPACE)
|
||||
namespace: ${SPRING_CLOUD_NACOS_CONFIG_NAMESPACE:6196f0de-a28d-4894-8f10-e2982b57c6bc}
|
||||
# 主配置 group:userbase.yaml 在 USERBASE group(与下方 shared-configs 的 DEFAULT_GROUP 不同组,各自指定)
|
||||
group: SCHCLASSMANAGE
|
||||
# 配置文件格式;最终主配置 dataId = ${spring.application.name}.${file-extension} = userbase.yaml
|
||||
file-extension: yaml
|
||||
encode: UTF-8
|
||||
# nacos 不可达时不强制退出,回退到本地 application.yml 兜底
|
||||
fail-fast: false
|
||||
# 只读账号(仅读取配置权限);CI 注入 SPRING_CLOUD_NACOS_USERNAME/PASSWORD
|
||||
# 注意:凭据必须用顶层 SPRING_CLOUD_NACOS_* env,放在 spring.cloud.nacos.config.* 下不生效(403)
|
||||
username: ${SPRING_CLOUD_NACOS_USERNAME:yh-reader}
|
||||
password: ${SPRING_CLOUD_NACOS_PASSWORD:123456}
|
||||
|
||||
# ============================================================
|
||||
# ⭐⭐⭐ 共享配置加载顺序(决定优先级!:排在数组越靠后 = 优先级越高 = 覆盖前面的同 key)
|
||||
# 低 1) public 命名空间 application-default.yaml(跨环境公共:日期格式/上传大小等,所有应用都能继承)
|
||||
# 中 2) prod 命名空间 application-infra.yaml(仅生产:mysql/redis/rabbitmq 中间件连接)
|
||||
# 高 3) prod 命名空间 userbase.yaml(应用级主配置:上传路径/context-path/CAS等,覆盖前两个)
|
||||
# 最高 4) 启动命令 -D 参数 / 环境变量(覆盖一切)
|
||||
# ============================================================
|
||||
shared-configs:
|
||||
# ① 1 号(最低优先级):public 命名空间(namespace="" 固定写空字符串)的 application-default.yaml
|
||||
- data-id: application-default.yaml
|
||||
group: DEFAULT_GROUP
|
||||
namespace: "" # ⭐ 固定 = "",强制指向 Nacos "public" 命名空间,不读上面的全局 prod namespace
|
||||
refresh: false
|
||||
|
||||
# ② 2 号(中等优先级):prod 命名空间(不写 namespace = 继承顶部全局 prod namespace id)的 application-infra.yaml
|
||||
- data-id: application-infra.yaml
|
||||
group: DEFAULT_GROUP
|
||||
refresh: false
|
||||
@@ -16,8 +16,8 @@
|
||||
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<file>/app/logs/app.log</file>
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<fileNamePattern>/app/logs/app.%d{yyyy-MM-dd}.log</fileNamePattern>
|
||||
<maxHistory>30</maxHistory>
|
||||
<fileNamePattern>/app/logs/app.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
|
||||
<maxHistory>60</maxHistory>
|
||||
<totalSizeCap>5GB</totalSizeCap>
|
||||
</rollingPolicy>
|
||||
<encoder>
|
||||
|
||||
Reference in New Issue
Block a user