@gadmin2n/schematics 0.0.92 → 0.0.94
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -13,31 +13,6 @@ Check CLI version
|
|
|
13
13
|
$ gadmin2 -v
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
-
## Template Sync
|
|
17
|
-
|
|
18
|
-
本项目是 gadmin2 的实例项目。日常在本项目迭代新功能,完成后需要同步回模板。
|
|
19
|
-
|
|
20
|
-
### 查看与模板的差异
|
|
21
|
-
```bash
|
|
22
|
-
# 完整 diff(含文件内容差异)
|
|
23
|
-
$ gadmin2 template diff
|
|
24
|
-
|
|
25
|
-
# 只看文件列表
|
|
26
|
-
$ gadmin2 template diff --no-content
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
### 从模板拉取更新
|
|
30
|
-
```bash
|
|
31
|
-
# 预览变更(不执行)
|
|
32
|
-
$ gadmin2 template update --dry-run
|
|
33
|
-
|
|
34
|
-
# 执行更新(冲突文件会生成 conflict markers)
|
|
35
|
-
$ gadmin2 template update
|
|
36
|
-
|
|
37
|
-
# 跳过确认
|
|
38
|
-
$ gadmin2 template update -y
|
|
39
|
-
```
|
|
40
|
-
|
|
41
16
|
## Usage
|
|
42
17
|
|
|
43
18
|
### Define data model
|
|
@@ -70,6 +45,174 @@ $ yarn start:dev
|
|
|
70
45
|
```
|
|
71
46
|
About nestjs server [read more](https://ptc.coding.intlgame.com/p/gadmin2/d/schematics/git/tree/master/src/lib/application/files/server/nest/README.md)
|
|
72
47
|
|
|
48
|
+
## 构建与部署
|
|
49
|
+
|
|
50
|
+
### 模块划分
|
|
51
|
+
|
|
52
|
+
monorepo 包含 3 个独立部署的模块:
|
|
53
|
+
|
|
54
|
+
| 模块 | 路径 | 镜像 |
|
|
55
|
+
|------|------|------|
|
|
56
|
+
| Web | `web/` | `gadmin2-web` |
|
|
57
|
+
| Server | `server/` | `gadmin2-server` |
|
|
58
|
+
| Temporal Worker | `temporal/worker/` | `gadmin2-worker` |
|
|
59
|
+
|
|
60
|
+
### Dockerfile 布局
|
|
61
|
+
|
|
62
|
+
所有 Dockerfile 都放在项目根(`-f Dockerfile.*`),构建上下文也是项目根。
|
|
63
|
+
|
|
64
|
+
| 文件 | 作用 |
|
|
65
|
+
|------|------|
|
|
66
|
+
| `Dockerfile.codegen` | 装 gadmin2 CLI + server devDeps,跑 `gadmin2 g prisma`,产出**带生成代码的中间镜像** |
|
|
67
|
+
| `Dockerfile.web` | `FROM ${CODEGEN_IMAGE}` 取 web 源码 → vite build → nginx |
|
|
68
|
+
| `Dockerfile.server` | `FROM ${CODEGEN_IMAGE}` 取 server 源码 → gadmin2 build → NestJS runner |
|
|
69
|
+
| `temporal/worker/Dockerfile` | 独立 worker,不依赖 codegen |
|
|
70
|
+
|
|
71
|
+
**为什么独立 codegen 镜像(方案 C):**
|
|
72
|
+
- `gadmin2 g prisma` 物理上依赖 server 的 devDeps(`@gadmin2n/prisma-react-generator` / `prisma-nest-generator`)
|
|
73
|
+
- 抽出单独镜像后,web/server 各自的镜像不再需要重装 server devDeps,构建更轻
|
|
74
|
+
- 同一 docker daemon 内 `FROM ${CODEGEN_IMAGE}` 直接命中本地缓存,**不需要 push/pull registry**
|
|
75
|
+
|
|
76
|
+
### 本地构建(docker-compose 集成验证)
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
# 首次 / config/ 有变更后:先 rebuild codegen 中间镜像
|
|
80
|
+
docker compose --profile codegen build codegen
|
|
81
|
+
|
|
82
|
+
# 起全套服务(PG + Temporal + Server + Worker + Web)
|
|
83
|
+
docker compose up -d --build
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
详细使用与端口分配见 `docker-compose.md`。
|
|
87
|
+
|
|
88
|
+
> 注:开发态 web/server 推荐直接 `yarn dev` / `yarn start:dev`(见 Usage 章节),`docker compose` 是用于完整集成验证。
|
|
89
|
+
|
|
90
|
+
### CI/CD 流水线
|
|
91
|
+
|
|
92
|
+
由 Coding CI(Jenkins)驱动,分支 `test` / `master` 自动触发。流水线定义在项目根 `Jenkinsfile`。
|
|
93
|
+
|
|
94
|
+
**路径触发规则(变更哪些目录构建哪些镜像):**
|
|
95
|
+
|
|
96
|
+
| 变更路径 | web | server | worker |
|
|
97
|
+
|------|:---:|:---:|:---:|
|
|
98
|
+
| `web/**` | ✅ | | |
|
|
99
|
+
| `config/ui/**` | ✅ | | |
|
|
100
|
+
| `config/prisma/**` | ✅ | ✅ | |
|
|
101
|
+
| `server/**` | | ✅ | |
|
|
102
|
+
| `temporal/worker/**` | | | ✅ |
|
|
103
|
+
|
|
104
|
+
纯文档变更(`docs/`、`*.md`、`.gitignore`、`Jenkinsfile` 自身、`.claude/`、`sync-to-template.*`)跳过所有构建。
|
|
105
|
+
|
|
106
|
+
**流水线阶段:**
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
检出 Git
|
|
110
|
+
↓
|
|
111
|
+
检测变更模块(计算 BUILD_WEB / BUILD_SERVER / BUILD_WORKER)
|
|
112
|
+
↓
|
|
113
|
+
代码生成(仅当 BUILD_WEB || BUILD_SERVER)
|
|
114
|
+
docker build -f Dockerfile.codegen -t gadmin2-codegen:build-${N} .
|
|
115
|
+
产出本地中间镜像,不 push
|
|
116
|
+
↓
|
|
117
|
+
并行构建推送镜像
|
|
118
|
+
├─ web docker build --build-arg CODEGEN_IMAGE=... -f Dockerfile.web . → push
|
|
119
|
+
├─ server docker build --build-arg CODEGEN_IMAGE=... -f Dockerfile.server . → push
|
|
120
|
+
└─ worker docker build -f temporal/worker/Dockerfile temporal/worker → push
|
|
121
|
+
↓
|
|
122
|
+
触发 Spinnaker 部署 webhook(每个模块独立的 application)
|
|
123
|
+
↓
|
|
124
|
+
post.always: 清理本地 codegen 中间镜像
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### 部署
|
|
128
|
+
|
|
129
|
+
镜像推送到 Coding 制品库后,Jenkins 通过 webhook 触发 [Spinnaker](https://api-spinnaker.devops.intlgame.com),由 Spinnaker 完成 K8s 滚动更新。Spinnaker application 命名约定:`oit-gadmin2-{web|server|worker}-{test|prod}`。
|
|
130
|
+
|
|
131
|
+
### 数据库初始化全链路
|
|
132
|
+
|
|
133
|
+
数据库的「库 → schema → 表 → 基础数据」分布在多个环节自动完成。本地 compose 与生产/临时环境走的是不同路径,以下是从容器启动到接入流量的完整时序。
|
|
134
|
+
|
|
135
|
+
#### 1. 本地 compose(`./compose-ctl.sh up`)
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
./compose-ctl.sh up
|
|
139
|
+
└── docker compose up
|
|
140
|
+
├── postgres 服务首次启动(pgdata 卷为空时)
|
|
141
|
+
│ └── 自动执行 /docker-entrypoint-initdb.d/init.sql ← 数据库在这里创建
|
|
142
|
+
│ • CREATE DATABASE gadmin_demo
|
|
143
|
+
│ • CREATE DATABASE temporal
|
|
144
|
+
│ • CREATE DATABASE temporal_visibility
|
|
145
|
+
│
|
|
146
|
+
├── server-init(一次性容器,depends_on postgres healthy)
|
|
147
|
+
│ • yarn push:db (prisma 把 schema 推到 gadmin_demo)
|
|
148
|
+
│ • yarn seed (播种 RBAC 等基础数据,跑完即退出 Exited 0)
|
|
149
|
+
│
|
|
150
|
+
└── server / web / temporal-* (正常服务)
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
要点:
|
|
154
|
+
- `init.sql` 只在 **pgdata 卷为空** 时执行一次。`./compose-ctl.sh --reset` 会清卷重新触发;卷还在但库被手动 drop 不会重跑。
|
|
155
|
+
- `server-init` 显示 `Exited 0` 是正常状态,不是失败。
|
|
156
|
+
- 业务 server 镜像走 `--production` 安装,**不带** ts-node / prisma CLI / `seed/` 源码,因此 seed 不能在 server 容器里跑,必须独立 server-init。
|
|
157
|
+
|
|
158
|
+
#### 2. 生产 / 临时环境(K8s + `server/start-prod.sh`)
|
|
159
|
+
|
|
160
|
+
server 镜像的入口是 `start-prod.sh`,比本地 compose 多了「按需 push:db」「per-branch schema 隔离」逻辑:
|
|
161
|
+
|
|
162
|
+
```
|
|
163
|
+
container start
|
|
164
|
+
└── start-prod.sh
|
|
165
|
+
├── 加载 .env(不覆盖已有 env 变量)
|
|
166
|
+
├── 校验 DATABASE_URL 非空
|
|
167
|
+
│
|
|
168
|
+
├── node ensure-database.js ← 兜底建库(IF NOT EXISTS 风格,幂等)
|
|
169
|
+
│ ※ 本地 compose 此步是 no-op(init.sql 已建好);
|
|
170
|
+
│ 主战场:托管 PG / 库被误删 / 无 docker-entrypoint-initdb.d 的环境
|
|
171
|
+
│
|
|
172
|
+
├── 根据 DEPLOY_NAME 分支:
|
|
173
|
+
│ │
|
|
174
|
+
│ ├─ A. 临时环境(feature*/bugfix*/hotfix*):每次启动都重建分支 schema
|
|
175
|
+
│ │ • 改写 DATABASE_URL:schema=<DEPLOY_NAME>(- 与 / 替换为 _)
|
|
176
|
+
│ │ • yarn push:db
|
|
177
|
+
│ │ • node migrate-between-pg-schemas.js (从 public schema 拷数据到分支 schema)
|
|
178
|
+
│ │ • yarn seed (幂等,每次启动都跑)
|
|
179
|
+
│ │
|
|
180
|
+
│ └─ B. 非临时环境(默认 / production):按需初始化
|
|
181
|
+
│ • DATABASE_URL 兜底 schema=public
|
|
182
|
+
│ • 探测 t_role:不存在或 count=0 → yarn push:db + yarn seed;否则跳过
|
|
183
|
+
│ • 连接失败等异常 → 保守走初始化路径
|
|
184
|
+
│
|
|
185
|
+
└── exec node dist/src/main ← 启动 NestJS
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
要点:
|
|
189
|
+
- `ensure-database.js` 与本地 compose 的 `init.sql` 是**互补关系**:compose 路径走 init.sql,K8s / 外部托管 PG 走 ensure-database.js。重复执行无副作用。
|
|
190
|
+
- 临时环境「每次启动都 seed」依赖所有 seed 实现都是 upsert / skipDuplicates 风格,重复跑不插重。
|
|
191
|
+
- 非临时环境用 `t_role` 行数判断是否需要初始化(首次部署或被清库),避免每次重启都跑 push:db + seed。
|
|
192
|
+
- 如果部署环境已通过 DBA / 运维流程保证库存在,可设 `SKIP_ENSURE_DATABASE=1` 跳过 ensure-database.js(预留开关,当前实现未消费该变量,按需扩展)。
|
|
193
|
+
|
|
194
|
+
#### 3. 谁在何时建什么 — 总览
|
|
195
|
+
|
|
196
|
+
| 对象 | 本地 compose | 生产 / 临时环境 |
|
|
197
|
+
|---|---|---|
|
|
198
|
+
| 数据库(`gadmin_demo`) | `dev/postgres/init.sql`(pgdata 卷为空时) | `ensure-database.js`(每次启动幂等) |
|
|
199
|
+
| Schema + 表结构 | `server-init` 里 `yarn push:db` | `start-prod.sh` 按分支策略 `yarn push:db` |
|
|
200
|
+
| 基础数据(seed) | `server-init` 里 `yarn seed` | `start-prod.sh` 按分支策略 `yarn seed` |
|
|
201
|
+
| 临时环境 schema 隔离 | — | `start-prod.sh` 改写 DATABASE_URL + `migrate-between-pg-schemas.js` |
|
|
202
|
+
|
|
203
|
+
## Template Sync
|
|
204
|
+
|
|
205
|
+
本项目是 gadmin2 的实例项目。日常在本项目迭代新功能,完成后需要同步回模板。
|
|
206
|
+
|
|
207
|
+
### 将本项目变更推送回模板
|
|
208
|
+
```bash
|
|
209
|
+
# 预览
|
|
210
|
+
$ ./sync-to-template.sh --dry-run
|
|
211
|
+
|
|
212
|
+
# 执行同步
|
|
213
|
+
$ ./sync-to-template.sh
|
|
214
|
+
```
|
|
215
|
+
|
|
73
216
|
## 登录流程
|
|
74
217
|
|
|
75
218
|
```
|
|
@@ -18,10 +18,10 @@ TAIHU_BASE=https://tai.it.tencent.com/api/auth-center/oauth2
|
|
|
18
18
|
|
|
19
19
|
#https://tai.it.woa.com/odc/app/list?currentPage=0&pageSize=10
|
|
20
20
|
TAIHU_ODC_CLIENT_ID=oit-erp-app
|
|
21
|
-
TAIHU_ODC_APP_TOKEN=token
|
|
21
|
+
#TAIHU_ODC_APP_TOKEN=token
|
|
22
22
|
|
|
23
23
|
#https://tai.it.woa.com/apps?currentPage=0&pageSize=10
|
|
24
|
-
TAIHU_APP_TOKEN=token
|
|
24
|
+
#TAIHU_APP_TOKEN=token
|
|
25
25
|
|
|
26
26
|
EXTERNAL_PAGE_SECRET=secret
|
|
27
27
|
|