From 6cfc820ce82eadc0de58ebea0ccab6e1488ce674 Mon Sep 17 00:00:00 2001 From: chenxing Date: Tue, 11 Aug 2026 15:59:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9ci=E9=85=8D=E7=BD=AE=E6=B5=81?= =?UTF-8?q?=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 19 +++++++++--- src/main/resources/bootstrap.yml | 48 +++++++++++++++++++++--------- src/main/resources/bschconfig.jks | Bin 2267 -> 0 bytes 3 files changed, 49 insertions(+), 18 deletions(-) delete mode 100644 src/main/resources/bschconfig.jks diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 90b1eef..d244d4f 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -105,11 +105,13 @@ jobs: RB=userbase-service:rb-$(date +%s) docker tag userbase-service:latest "$RB" 2>/dev/null || true docker stop userbase-service 2>/dev/null; docker rm -f userbase-service 2>/dev/null - # 注意(SCA 2.2.4 坑): 命名空间必须用标准属性名 SPRING_CLOUD_NACOS_CONFIG_NAMESPACE, - # 用 NACOS_NAMESPACE 这个 env 名不会被 bootstrap 的 ${NACOS_NAMESPACE:dev} 解析到(会落 public); - # 凭据必须放顶层 SPRING_CLOUD_NACOS_USERNAME/PASSWORD, 放在 spring.cloud.nacos.config.* 下不生效(403)。 + # bootstrap.yml 默认 nacos.config.enabled=false(本地不连);CI 必须注入 NACOS_CONFIG_ENABLED=true 才会拉配置 + # SPRING_PROFILES_ACTIVE=prod 激活生产 profile(留给将来拆 application-prod.yml 用) + # namespace/凭据仍用顶层 SPRING_CLOUD_NACOS_* env(bootstrap 的 ${...} 占位符才能解析到) docker run -d --name userbase-service --restart unless-stopped --network infra-infra-net -p 8060:8060 \ --add-host sso.yunhaixingtong.com:192.168.10.160 \ + -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 \ @@ -125,7 +127,16 @@ jobs: if [ "$OK" = "0" ]; then echo "!! UNHEALTHY -> rollback to userbase-service:latest" docker stop userbase-service 2>/dev/null; docker rm -f userbase-service 2>/dev/null - docker run -d --name userbase-service --restart unless-stopped --network infra-infra-net -p 8060:8060 userbase-service:latest + # 回滚也必须注入同样的 env,否则 bootstrap 默认 enabled=false 会连不上 nacos 拉不到线上配置 + docker run -d --name userbase-service --restart unless-stopped --network infra-infra-net -p 8060:8060 \ + --add-host sso.yunhaixingtong.com:192.168.10.160 \ + -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 \ + userbase-service:latest echo "rolled back"; exit 7 fi echo "DEPLOY OK: $IMG" diff --git a/src/main/resources/bootstrap.yml b/src/main/resources/bootstrap.yml index 257ebb5..d5721ed 100644 --- a/src/main/resources/bootstrap.yml +++ b/src/main/resources/bootstrap.yml @@ -1,27 +1,47 @@ spring: application: name: userbase + # 本地默认 local(不连 nacos);CI 注入 SPRING_PROFILES_ACTIVE=prod + profiles: + active: ${SPRING_PROFILES_ACTIVE:local} cloud: nacos: config: - # Nacos 配置中心地址;生产也可通过环境变量 NACOS_ADDR 覆盖(例如内网别名 nacos:8848) + # ⭐ 本地默认关闭 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} - # public 命名空间:Nacos 中 public 的 namespace id 固定为空字符串 - namespace: ${NACOS_NAMESPACE:ce902c5c-b568-4465-b058-a98e1e2992e7} - # 应用自身配置所在分组 - group: USERBASE - # 配置文件格式;最终主配置 dataId = ${spring.application.name}.${file-extension},即 userbase.yaml + # 默认指向 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 / application-infra.yaml 同组 + group: DEFAULT_GROUP + # 配置文件格式;最终主配置 dataId = ${spring.application.name}.${file-extension} = userbase.yaml file-extension: yaml encode: UTF-8 - # nacos 不可达时不强制退出,回退到本地 application.yml / application-prod.yml 兜底 + # nacos 不可达时不强制退出,回退到本地 application.yml 兜底 fail-fast: false - # 只读账号(仅 public 命名空间读权限),用于拉取配置;非管理员账号,可安全提交 - username: yh-reader - password: 123456 - # 共享公共配置:public 空间下的 common.yaml(所有服务公共项,如公共数据源 / Redis 等) - # 优先级低于本应用配置(userbase.yaml),即应用配置可覆盖公共配置中的同名字段 + # 只读账号(仅读取配置权限);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: - - data-id: common.yaml + # ① 1 号(最低优先级):public 命名空间(namespace="" 固定写空字符串)的 application-default.yaml + - data-id: application-default.yaml group: DEFAULT_GROUP - namespace: "" + 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 \ No newline at end of file diff --git a/src/main/resources/bschconfig.jks b/src/main/resources/bschconfig.jks deleted file mode 100644 index c05e280a079845647158f445e1d30a743c09081b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2267 zcmc(g`8U*k8^`B6Gh`bIVMruPmiP`P*|KGQhRBvB+gQfZlr?0Ov4u<$*=0>4V~;Eu z#lZ}U?nE~#WXryciMZ9dpXc-+JU?7NykF-!*SXI7^EvNpe`$XS0)ape3;10Kw?Hfo zdmZoT?d9tcc1V54A`}B45GDvngztfz%xtpE0348k9s>X-2%HF?gDJ^n)D%Q)5O@Qy zg+0Er?9=y`h*2Vtp_3XUtVFG++vT!0Str&$CR>)`JeUK;(Kc193 z%QCR`bNt%E!Xu@eY|RL-B-Cg7zJYdTzesxw={Zg|nmtDN9Nye5=4-n*$wovUo>;RZ zCY3$P@}Bj6ZfBoh86w8YQFe*lY#J>!ID-&nvkHGJdM3sCG<9`16^Wf_l;Ju-AqMmE z^^1*KD=;NmrA?k!ALzNSX z+Z!H-E8FBvu%R{$8236~b(c7mE_w;|IdfN+6$xArxbfKjDveIETdeHdWZ1O%s=J%2 zSx-AQUScN<>=i!y?q_{Tb~}K#dk{Zav@(plAt^H4YNE}1iahdyeYwjuI1;{c3pJoY z&P=z3$x&ZyD^{*B@qR!rLU`l9Dzru}pAFEe4%lt-sjd#;nQBh;<-m+2XWsT3itXte zSZ`!hlC&U}lJ9|e%FNbdh06P_oV7Z8VF*U*`+@T1kNi7#^{bXI=?;|(%H~msy6Z@G z-sQv#hRp09NmbhK73Pn=S1?HvapTWZuj^>xc<7Xdz8QxKePAa8&e{o;}xP+$9vIUq$lfE?zGDU94?Lb2X4#=JAD>Z6{a#Stip zSQy&bjx495#4|!Wq0^t$KIXQ+kySlwmjh`wS|fSyHVZ}H$kj}j6tLP!ykecAt+v{E z8=lGmIo_u5>UcEfM?`&m{M+sozHR-EnN9sUE4znvg{%39){LUYb%EHaUF?XUW{a98 zKVJUWb)iqjj(@q8%^es&>ih{r=+=CK%Ul+X<7!Dy3R5`yP=O`ePscIgDVHAXX6<}s znmeeY`+8AH)NirQKUT0Pu4X8C)FJXEc}DnL^t_?@jX}f0_M(eSW$qiHV5UW5D`cOB z6*S>1`Cd3ngy(m?(MCfCeCA`gS2i?!-pT6H%}W+)nwyPfUBdmPw>XOklf%)$x`dj+ zyAzU%)3+Ez<`XM`FF}O5R`m2k=#=Ebmp-@B>Y-lMJiEA=tk~Uy=6%!R*x-Uq-?5$c zGj3*n_Z*g0d({K;SB^z)>@A4=@SIT^4NQ(57$O~*Stc^PmVg$Px2})QvrIS*B<{s! zubmY&e)y!8bnKpCx#`Eb`Qa^YQK1_awGYOX#ofReyWMBI7R4}7)?hNDY)miLn(c(8 z1jlUhOSPAoHo7bley97TSf6u`cn>&m`;9Qpxfd5_xie`b8}8_!=xLJGgdj7?z{zW# z0hz`|l6S&k6=t8;`U1(fXEc|d={mP)Zua6z3DG%SI;jr?@tH?!>$xVs;7H^q=pOrH z%+c$?`Ki+CTp_h>&XrqgmKRBCgnBJ0&BQLYHNJDUZ%#|oG$R3y*7Z~FCIGY^v< z&KvKFItFt6(kwhImN-|u7tYoDzv##xi0g3BVHX<@v(a_DS6DFWU%>u9AOs?Rb-;MI zbr0iORPT3Qi&}aFgm?siC;1U5RZs;5g6BXq2-^RWhvNLd^8d9K5fJ;+pu_6{BLZB9 zX9Zw`5&-}bwL!;3o+gQxS54I^nvU;1Jz5H+q~G*0n?9qF(2y~?HBQkqDjBMX3>IHm z8LQ~0{qW(d5Zf4LINC z^4c8}j@1$MVnW-H02S6W2IHZhY|B`slfw$((;ro}n{+Cv*AFJ{uK&$HC_iIZAv*80 zARsld!eGQHOo(NNy!tumcra=v?C+woOO}^-wtj1)A%`OkFMy>*0rIpqEkp_O_(?mh zuCq`W00D|mfg+&r;oAyx!ujC5VD4=r2l0gZ>WUXPdt>9fX%GqXKTSORWrrpL5RrpE zoKMDu{^H?w4dYO%9$jH{p5J9c+`cLvi=p~<6X>;=f*g6+VrQfCNLIM|i-~(%BT)Bv zlnZBn98szupFssM2gv1+^C}7!yHu!=$7WV`=x3`E1N0PB98t!7i_*`2*#iAzWT5B4 z{0GIx&gU`sJ5Oz+E@B($a*y;#~6W%2&;lZOg0Gr12b`ImrbFfwM?=Yx7!R>8U7ZY5G2$);$ch Qte8qLJ=qTBUZpMk1NndI=Kufz