-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathMakefile
More file actions
351 lines (311 loc) · 15.6 KB
/
Copy pathMakefile
File metadata and controls
351 lines (311 loc) · 15.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
# ==============================================================================
# Makefile - OwlApi 项目管理脚本
# ==============================================================================
# 支持环境: macOS, Linux, WSL2
# 核心功能: 开发环境启停, 生产环境部署, 代码生成, 项目清理
# ==============================================================================
.PHONY: help \
check-dev-env dev-init dev-up dev-down dev-build dev-rebuild dev-restart dev-restart-backend dev-logs dev-logs-backend dev-clean dev-db-psql \
prod-init prod-up prod-up-build prod-down prod-rebuild prod-restart prod-logs prod-clean check-prod-env \
prod-static-up prod-static-up-build prod-static-down prod-static-logs \
gen-proto gen-sdk gen-swagger clean set-version \
format check-changed check-all setup-hooks \
init-test-db smoke-test \
publish-ce-github
# ------------------------------------------------------------------------------
# 1. 基础配置
# ------------------------------------------------------------------------------
UNAME_S := $(shell uname -s)
DEV_COMPOSE := docker compose -f docker-compose.dev.yml
PROD_COMPOSE := docker compose -f deploy/docker-compose.yml
STATIC_COMPOSE := docker compose -f deploy/docker-compose.static.yml
# EE=1 时附加 compose profile,把所有 profiles: ["ee"] 的服务(sdkbuilder 等)也拉起来。
# 用法: make dev-up EE=1 / make prod-up EE=1
EE_FLAGS := $(if $(filter 1,$(EE)),--profile ee,)
# 跨平台 sed -i (macOS 需要空字符串参数)
ifeq ($(UNAME_S),Darwin)
SED_I := sed -i ''
else
SED_I := sed -i
endif
# ------------------------------------------------------------------------------
# 2. 帮助信息 (Help)
# ------------------------------------------------------------------------------
help:
@echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
@echo " 🦉 OwlApi - SQL to API 智能网关平台"
@echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
@echo " 💻 系统检测: $(UNAME_S)"
@echo ""
@echo " 🛠️ [开发环境] (Development Environment)"
@echo " make dev-init 初始化开发环境配置 (复制 .env.example)"
@echo " make dev-up [EE=1] 启动全栈热更新环境 (前台运行); EE=1 时同步启动 sdkbuilder"
@echo " make dev-down [EE=1] 停止开发容器; EE=1 时一并停 EE 服务"
@echo " make dev-build [EE=1] 构建开发镜像; EE=1 时一并构建 EE 镜像"
@echo " make dev-rebuild [EE=1] 重建并启动开发环境 (后台运行)"
@echo " make dev-restart 重启开发环境所有服务"
@echo " make dev-restart-backend 仅重启后端服务 (backend)"
@echo " make dev-logs 查看开发环境所有服务日志"
@echo " make dev-logs-backend 查看开发环境后端日志"
@echo " make dev-clean 停止容器并删除数据卷 (重置数据库)"
@echo " make dev-db-psql 进入开发环境数据库终端"
@echo ""
@echo " 🚀 [生产环境] (Production Environment)"
@echo " make prod-init 初始化生产环境配置"
@echo " make prod-up [EE=1] 启动生产集群 (后台运行, 拉取远端镜像); EE=1 时同步启动 sdkbuilder"
@echo " make prod-up-build [EE=1] 本地构建并启动生产集群; EE=1 时一并构建 EE 镜像"
@echo " make prod-rebuild [EE=1] 无缓存重新构建并启动生产环境"
@echo " make prod-down [EE=1] 停止生产集群; EE=1 时一并停 EE 服务"
@echo " make prod-restart 重启生产环境所有服务"
@echo " make prod-logs 查看生产环境日志"
@echo " make prod-clean 停止容器并删除数据卷 (❗危险:清空生产数据)"
@echo ""
@echo " 🌐 [静态站点] (Static Sites: Docs + Website)"
@echo " make prod-static-up 启动文档站 + 官网 (拉取远端镜像)"
@echo " make prod-static-up-build 本地构建并启动文档站 + 官网"
@echo " make prod-static-down 停止文档站 + 官网"
@echo " make prod-static-logs 查看文档站 + 官网日志"
@echo ""
@echo " 🧩 [通用命令] (Common Commands)"
@echo " make gen-proto 生成 gRPC 代码"
@echo " make gen-swagger 生成 Swagger 文档"
@echo " make gen-sdk 从 OpenAPI 生成前端 TypeScript SDK (含 gen-swagger)"
@echo " make format 运行代码格式化 (后端 gofmt + 前端 eslint --fix)"
@echo " make check-changed 仅检查已暂存改动 (增量, 用于 pre-commit)"
@echo " make check-all 全量规范检查 (gofmt+vet + lint+tsc + swagger/sdk + 冒烟测试*)"
@echo " make setup-hooks 配置 Git hooksPath 到 scripts/git-hooks"
@echo " make clean 清理所有环境与缓存 (dev + prod + static)"
@echo " make help 显示此帮助信息"
@echo ""
@echo " 📦 [发布同步] (Release & Sync)"
@echo " make set-version v=0.2.1 统一修改项目版本号 (package.json, 镜像标签, Go 版本)"
@echo " make 从 ee 生成 Community Edition (CE) 分支"
@echo " make 将 origin/ce 同步并推送到 GitHub 公开仓库"
@echo " make init-test-db 向 default 租户写入四种测试数据源 (需服务已启动)"
@echo " make smoke-test [c=0] 对运行中的 dev 全栈做端到端冒烟测试; c=0 保留测试数据"
@echo ""
@echo " ⚠️ Windows 用户注意: 请使用 WSL2 或 Git Bash 运行 make 命令"
@echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
# ------------------------------------------------------------------------------
# 3. [开发环境] Development Targets
# ------------------------------------------------------------------------------
# 前置检查: 确保 .env 存在
check-dev-env:
@if [ ! -f "backend/.env" ]; then \
echo "❌ [OwlApi] 错误: 未检测到开发环境配置文件 backend/.env"; \
echo "💡 [OwlApi] 请先执行 'make dev-init' 生成配置文件。"; \
exit 1; \
fi
# 初始化开发环境配置
dev-init:
@echo "🔧 [OwlApi] 正在初始化开发环境配置..."
@cp backend/.env.example backend/.env
@$(SED_I) 's|OWLAPI_CORS_ORIGIN=https://admin.owlapi.cn|OWLAPI_CORS_ORIGIN=http://localhost:8001|' backend/.env
@$(SED_I) 's|PUBLIC_API_URL=https://api.owlapi.cn|PUBLIC_API_URL=http://localhost:3000|' backend/.env
@echo "✅ [OwlApi] 开发环境配置文件已生成: backend/.env"
dev-build: check-dev-env
@echo "🐳 [DEV] 正在构建开发镜像..."
$(DEV_COMPOSE) $(EE_FLAGS) build
dev-up: check-dev-env
@echo "🐳 [DEV] 正在启动热更新环境 (前台日志模式)..."
@echo " - Admin: http://localhost:8001"
@echo " - API: http://localhost:3000"
@echo " - Docs: http://localhost:8003"
@echo " - Postgres: localhost:5433"
@[ "$(EE)" = "1" ] && echo " - SDK Builder (EE): http://localhost:7100" || true
@echo " (按 Ctrl+C 停止服务)"
$(DEV_COMPOSE) $(EE_FLAGS) up
dev-down:
@echo "🛑 [DEV] 正在停止开发环境..."
$(DEV_COMPOSE) $(EE_FLAGS) down --remove-orphans
dev-rebuild: check-dev-env
@echo "🔧 [DEV] 重建并启动开发环境..."
$(DEV_COMPOSE) $(EE_FLAGS) up -d --build
dev-restart:
$(DEV_COMPOSE) restart
dev-restart-backend:
$(DEV_COMPOSE) restart backend
dev-logs:
$(DEV_COMPOSE) logs -f
dev-logs-backend:
$(DEV_COMPOSE) logs -f backend
dev-clean:
@echo "🧹 [DEV] 正在尝试深度清理开发环境..."
@echo "⚠️ 警告:此操作将删除所有开发容器相关的数据卷和数据!"
@read -p "您确定要继续吗?[y/N] " ans && [ $${ans:-N} = y ] || (echo "❌ 操作已取消"; exit 1)
$(DEV_COMPOSE) --profile ee down -v --remove-orphans
@echo "✅ 开发环境深度清理完成"
dev-db-psql:
$(DEV_COMPOSE) exec postgres psql -U postgres -d owlapi
# ------------------------------------------------------------------------------
# 4. [生产环境] Production Targets
# ------------------------------------------------------------------------------
# 前置检查: 确保 .env 存在
check-prod-env:
@if [ ! -f "deploy/.env" ]; then \
echo "❌ 未找到 deploy/.env, 请先执行: make prod-init"; \
exit 1; \
fi
# 初始化生产环境配置
prod-init:
@echo "🚀 [OwlApi] 正在初始化生产环境配置..."
@cp backend/.env.example deploy/.env
@echo "✅ [OwlApi] 生产环境配置文件已生成: deploy/.env"
@echo "⚠️ 请务必在运行 'make prod-up' 前修改以下敏感信息:"
@echo " - POSTGRES_PASSWORD 数据库密码"
@echo " - OWLAPI_JWT_SECRET JWT 签名密钥 (建议: openssl rand -hex 32)"
@echo " - OWLAPI_GATEWAY_TOKEN 网关认证令牌 (建议: openssl rand -hex 16)"
@echo " - PUBLIC_API_URL 后端 API 公网地址"
prod-up: check-prod-env
@echo "🚀 [PROD] 正在启动生产集群..."
@[ "$(EE)" = "1" ] && echo " - SDK Builder (EE): 已启用" || true
$(PROD_COMPOSE) $(EE_FLAGS) pull
$(PROD_COMPOSE) $(EE_FLAGS) up -d
@echo "✅ 生产集群已启动 (后台运行)"
prod-up-build: check-prod-env
@echo "🚀 [PROD] 本地构建并启动生产集群..."
@[ "$(EE)" = "1" ] && echo " - SDK Builder (EE): 已启用" || true
$(PROD_COMPOSE) $(EE_FLAGS) up -d --build
@echo "✅ 生产集群已启动 (后台运行)"
prod-rebuild: check-prod-env
@echo "🔧 [PROD] 无缓存重新构建生产环境..."
$(PROD_COMPOSE) $(EE_FLAGS) build --no-cache
$(PROD_COMPOSE) $(EE_FLAGS) up -d
prod-down: check-prod-env
@echo "🛑 [PROD] 正在停止生产集群..."
$(PROD_COMPOSE) $(EE_FLAGS) down
prod-restart: check-prod-env
$(PROD_COMPOSE) restart
prod-logs: check-prod-env
$(PROD_COMPOSE) logs -f
prod-clean: check-prod-env
@echo "🛑 [危险] 正在尝试深度清理生产环境..."
@echo "⚠️ 警告:此操作将删除所有生产容器相关的数据卷和数据!"
@read -p "您确定要继续吗?[y/N] " ans && [ $${ans:-N} = y ] || (echo "❌ 操作已取消"; exit 1)
$(PROD_COMPOSE) down -v
@echo "✅ 生产环境深度清理完成"
# ------------------------------------------------------------------------------
# 5. [静态站点] Static Sites Targets (Docs + Website)
# ------------------------------------------------------------------------------
prod-static-up:
@echo "🌐 [STATIC] 正在启动文档站 + 官网..."
$(STATIC_COMPOSE) pull
$(STATIC_COMPOSE) up -d
@echo "✅ 文档站 + 官网已启动"
prod-static-up-build:
@echo "🌐 [STATIC] 本地构建并启动文档站 + 官网..."
$(STATIC_COMPOSE) up -d --build
@echo "✅ 文档站 + 官网已启动"
prod-static-down:
@echo "🛑 [STATIC] 正在停止文档站 + 官网..."
$(STATIC_COMPOSE) down
prod-static-logs:
$(STATIC_COMPOSE) logs -f
# ------------------------------------------------------------------------------
# 6. [通用命令] Common Targets
# ------------------------------------------------------------------------------
gen-swagger:
@echo "🔄 生成 Swagger 文档..."
cd backend && $$(go env GOPATH)/bin/swag init -g cmd/server/main.go -o docs
@echo "✅ Swagger 文档已生成 → backend/docs/"
gen-proto:
@echo "🔄 生成 gRPC 代码..."
cd backend && protoc --go_out=internal/pb --go-grpc_out=internal/pb \
--go_opt=paths=source_relative --go-grpc_opt=paths=source_relative \
-I proto proto/gateway.proto
@echo "✅ gRPC 代码已生成"
gen-sdk: gen-swagger
@echo "⚙️ 正在生成前端 SDK..."
@python3 backend/scripts/generate_sdk.py
@echo "✅ SDK 生成完成!"
clean:
@echo "🧹 清理所有环境..."
$(DEV_COMPOSE) down -v 2>/dev/null || true
$(PROD_COMPOSE) down -v 2>/dev/null || true
$(STATIC_COMPOSE) down 2>/dev/null || true
rm -rf backend/server backend/init backend/tmp/
@echo "✅ 清理完成"
# ------------------------------------------------------------------------------
# 7. [代码质量] Format & Check Targets
# ------------------------------------------------------------------------------
# 格式化代码 (gofmt + eslint --fix)
format:
@echo "🎨 [Backend] 正在格式化 Go 代码..."
@if command -v gofmt >/dev/null 2>&1; then cd backend && gofmt -w .; else echo " ⚠️ gofmt 未安装,跳过后端格式化"; fi
@echo "🎨 [Frontend] 正在格式化 TypeScript 代码 (Admin)..."
@if [ -f "frontend/admin/node_modules/.bin/eslint" ]; then cd frontend/admin && pnpm run lint:fix; else echo " ⚠️ node_modules 未安装,跳过前端格式化"; fi
@echo "✅ 代码格式化完成"
# 增量检查 (仅对 staged 文件, 供 pre-commit 调用)
check-changed:
@echo "🔎 运行增量检查 (staged files)..."
@STAGED="$$(git diff --cached --name-only --diff-filter=ACMR)"; \
if [ -z "$$STAGED" ]; then \
echo "ℹ️ 未检测到已暂存改动,跳过增量检查。"; \
exit 0; \
fi; \
if printf '%s\n' "$$STAGED" | grep -q '^backend/.*\.go$$'; then \
echo " - backend gofmt"; \
UNFORMATTED=$$(cd backend && gofmt -l .); \
if [ -n "$$UNFORMATTED" ]; then \
echo "❌ Go 代码格式不符,请先运行 make format:"; \
echo "$$UNFORMATTED"; \
exit 1; \
fi; \
echo " - backend go vet"; \
cd backend && go vet ./...; \
cd - >/dev/null; \
fi; \
if printf '%s\n' "$$STAGED" | grep -Eq '^frontend/admin/.*\.(ts|tsx)$$'; then \
echo " - frontend/admin eslint + tsc"; \
cd frontend/admin && pnpm run lint && pnpm exec tsc --noEmit -p tsconfig.check.json; \
cd - >/dev/null; \
fi; \
echo "✅ 增量检查通过"
# 全量检查 (CI / 手动执行)
check-all:
@echo "🔎 运行全量检查..."
@echo " - backend gofmt"
@UNFORMATTED=$$(cd backend && gofmt -l .); \
if [ -n "$$UNFORMATTED" ]; then \
echo "❌ Go 代码格式不符,请先运行 make format:"; \
echo "$$UNFORMATTED"; \
exit 1; \
fi
@echo " - backend go vet"
cd backend && go vet ./...
@echo " - frontend/admin eslint + tsc"
cd frontend/admin && pnpm run lint && pnpm exec tsc --noEmit -p tsconfig.check.json
@echo " - swagger/sdk drift"
@SWAG="$$(go env GOPATH)/bin/swag"; \
if ! [ -x "$$SWAG" ]; then \
echo " ⚠️ swag 未安装,跳过检查 (go install github.com/swaggo/swag/cmd/swag@latest)"; \
elif [ ! -f "frontend/admin/node_modules/.bin/orval" ]; then \
echo " ⚠️ orval 未安装,跳过检查 (cd frontend/admin && pnpm install)"; \
else \
python3 backend/scripts/generate_sdk.py >/dev/null 2>&1; \
if ! git diff --quiet -- backend/docs/ frontend/admin/src/lib/sdk/; then \
echo "❌ Swagger/SDK 已过期,请执行 make gen-sdk 后提交以下文件:"; \
git diff --stat -- backend/docs/ frontend/admin/src/lib/sdk/; \
git checkout -- backend/docs/ frontend/admin/src/lib/sdk/; \
exit 1; \
fi; \
echo " ✓ Swagger/SDK 已同步"; \
fi
@echo " - 冒烟测试 (需 dev 全栈运行)"
@if curl -sf --max-time 3 http://localhost:3000/health >/dev/null 2>&1; then \
python3 scripts/smoke_test.py >/dev/null 2>&1 && echo " ✓ 冒烟测试通过" || { \
echo "❌ 冒烟测试失败,详情请运行 make smoke-test"; \
exit 1; \
}; \
else \
echo " ⚠️ 后端未就绪 (localhost:3000),跳过冒烟测试 (先 make dev-rebuild)"; \
fi
@echo "✅ 全量检查通过"
# 配置 Git hooks 路径
setup-hooks:
@git config core.hooksPath scripts/git-hooks
@chmod +x scripts/git-hooks/pre-commit
@echo "✅ 已配置 hooksPath: scripts/git-hooks"
# ------------------------------------------------------------------------------
# 8. [发布同步] Release & Sync Targets
# ------------------------------------------------------------------------------