speccore 8.3.67 → 8.3.69
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.
package/README.md
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-env-configs.d.ts","sourceRoot":"","sources":["../../src/commands/update-env-configs.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"update-env-configs.d.ts","sourceRoot":"","sources":["../../src/commands/update-env-configs.ts"],"names":[],"mappings":"AAmbA,wBAAwB;AACxB,wBAAsB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAuDnF;AAyLD,wBAAwB;AACxB,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAmB5E"}
|
|
@@ -108,7 +108,7 @@ platforms:
|
|
|
108
108
|
deploy:
|
|
109
109
|
type: pm2
|
|
110
110
|
output_dir: .
|
|
111
|
-
pm2_config: ecosystem.config.js
|
|
111
|
+
pm2_config: .speccore/environments/scripts/ecosystem.config.js
|
|
112
112
|
# 如需远程部署,取消注释:
|
|
113
113
|
# host: deploy@server.example.com
|
|
114
114
|
# remote_dir: /opt/services/notification
|
|
@@ -119,14 +119,14 @@ platforms:
|
|
|
119
119
|
deploy:
|
|
120
120
|
type: k8s
|
|
121
121
|
target: ${t.name}
|
|
122
|
-
script: k8s
|
|
122
|
+
script: .speccore/environments/scripts/k8s-deployment.yaml
|
|
123
123
|
|
|
124
124
|
# 后端示例:Python 处理 → 脚本部署
|
|
125
125
|
data-processor:
|
|
126
126
|
build_cmd: pip install -r requirements.txt -t dist/
|
|
127
127
|
deploy:
|
|
128
128
|
type: script
|
|
129
|
-
script:
|
|
129
|
+
script: .speccore/environments/scripts/deploy.sh
|
|
130
130
|
|
|
131
131
|
# 后端示例:用户服务 → Helm
|
|
132
132
|
user-service:
|
|
@@ -135,7 +135,7 @@ platforms:
|
|
|
135
135
|
type: helm
|
|
136
136
|
target: ${t.name}
|
|
137
137
|
script: ./helm/user-service
|
|
138
|
-
output_dir: values-${t.name}.yaml
|
|
138
|
+
output_dir: .speccore/environments/scripts/values-${t.name}.yaml
|
|
139
139
|
|
|
140
140
|
# 后端示例:定时任务 → SFTP 到服务器
|
|
141
141
|
scheduler:
|
|
@@ -226,6 +226,202 @@ pipeline:
|
|
|
226
226
|
max_retries: 3
|
|
227
227
|
`;
|
|
228
228
|
}
|
|
229
|
+
// ── 部署脚本模板 ──
|
|
230
|
+
const SCRIPT_TEMPLATES = [
|
|
231
|
+
{
|
|
232
|
+
name: 'deploy.sh',
|
|
233
|
+
content: `#!/bin/bash
|
|
234
|
+
# =============================================================================
|
|
235
|
+
# SpecCore 通用部署脚本模板
|
|
236
|
+
# =============================================================================
|
|
237
|
+
# 用途:自定义部署逻辑(script 类型部署时调用)
|
|
238
|
+
# 位置:.speccore/environments/scripts/deploy.sh
|
|
239
|
+
# 执行:speccore deploy --env <env> --platform <platform>
|
|
240
|
+
#
|
|
241
|
+
# 环境变量(由 deploy engine 自动注入):
|
|
242
|
+
# $PLATFORM 当前端名(如 notification-service)
|
|
243
|
+
# $ENV 当前环境(如 staging, production)
|
|
244
|
+
# $CWD 端代码路径(code_path 或项目根目录)
|
|
245
|
+
# =============================================================================
|
|
246
|
+
|
|
247
|
+
set -e
|
|
248
|
+
|
|
249
|
+
echo "🚀 开始部署: $PLATFORM → $ENV"
|
|
250
|
+
echo "📂 工作目录: $CWD"
|
|
251
|
+
|
|
252
|
+
# TODO: 在此添加自定义部署逻辑
|
|
253
|
+
# 示例:
|
|
254
|
+
# cd "$CWD"
|
|
255
|
+
# tar -czf dist.tar.gz dist/
|
|
256
|
+
# scp dist.tar.gz deploy@server:/opt/services/$PLATFORM/
|
|
257
|
+
# ssh deploy@server "cd /opt/services/$PLATFORM && tar -xzf dist.tar.gz && sudo systemctl restart $PLATFORM"
|
|
258
|
+
|
|
259
|
+
echo "✅ 部署完成: $PLATFORM → $ENV"
|
|
260
|
+
`,
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
name: 'ecosystem.config.js',
|
|
264
|
+
content: `// =============================================================================
|
|
265
|
+
// PM2 生态配置模板
|
|
266
|
+
// =============================================================================
|
|
267
|
+
// 用途:PM2 进程管理配置(pm2 类型部署时调用)
|
|
268
|
+
// 位置:.speccore/environments/scripts/ecosystem.config.js
|
|
269
|
+
// 执行:speccore deploy --env <env> --platform <platform>
|
|
270
|
+
//
|
|
271
|
+
// 请根据实际项目修改 app 名称、脚本路径、环境变量等。
|
|
272
|
+
// =============================================================================
|
|
273
|
+
|
|
274
|
+
module.exports = {
|
|
275
|
+
apps: [
|
|
276
|
+
{
|
|
277
|
+
name: 'notification-service',
|
|
278
|
+
script: './dist/index.js',
|
|
279
|
+
instances: 'max',
|
|
280
|
+
exec_mode: 'cluster',
|
|
281
|
+
env: {
|
|
282
|
+
NODE_ENV: 'development',
|
|
283
|
+
PORT: 3000,
|
|
284
|
+
},
|
|
285
|
+
env_dev: {
|
|
286
|
+
NODE_ENV: 'development',
|
|
287
|
+
PORT: 3000,
|
|
288
|
+
},
|
|
289
|
+
env_test: {
|
|
290
|
+
NODE_ENV: 'test',
|
|
291
|
+
PORT: 3000,
|
|
292
|
+
},
|
|
293
|
+
env_staging: {
|
|
294
|
+
NODE_ENV: 'staging',
|
|
295
|
+
PORT: 3000,
|
|
296
|
+
},
|
|
297
|
+
env_production: {
|
|
298
|
+
NODE_ENV: 'production',
|
|
299
|
+
PORT: 3000,
|
|
300
|
+
},
|
|
301
|
+
log_file: './logs/combined.log',
|
|
302
|
+
out_file: './logs/out.log',
|
|
303
|
+
error_file: './logs/error.log',
|
|
304
|
+
log_date_format: 'YYYY-MM-DD HH:mm:ss Z',
|
|
305
|
+
merge_logs: true,
|
|
306
|
+
max_memory_restart: '500M',
|
|
307
|
+
restart_delay: 3000,
|
|
308
|
+
},
|
|
309
|
+
],
|
|
310
|
+
};
|
|
311
|
+
`,
|
|
312
|
+
},
|
|
313
|
+
{
|
|
314
|
+
name: 'k8s-deployment.yaml',
|
|
315
|
+
content: `# =============================================================================
|
|
316
|
+
# K8s Deployment + Service 模板
|
|
317
|
+
# =============================================================================
|
|
318
|
+
# 用途:Kubernetes 部署配置(k8s 类型部署时调用)
|
|
319
|
+
# 位置:.speccore/environments/scripts/k8s-deployment.yaml
|
|
320
|
+
# 执行:speccore deploy --env <env> --platform <platform>
|
|
321
|
+
#
|
|
322
|
+
# 请根据实际项目修改镜像名、端口、资源限制等。
|
|
323
|
+
# =============================================================================
|
|
324
|
+
|
|
325
|
+
apiVersion: apps/v1
|
|
326
|
+
kind: Deployment
|
|
327
|
+
metadata:
|
|
328
|
+
name: gateway
|
|
329
|
+
labels:
|
|
330
|
+
app: gateway
|
|
331
|
+
spec:
|
|
332
|
+
replicas: 2
|
|
333
|
+
selector:
|
|
334
|
+
matchLabels:
|
|
335
|
+
app: gateway
|
|
336
|
+
template:
|
|
337
|
+
metadata:
|
|
338
|
+
labels:
|
|
339
|
+
app: gateway
|
|
340
|
+
spec:
|
|
341
|
+
containers:
|
|
342
|
+
- name: gateway
|
|
343
|
+
image: registry.example.com/gateway:latest
|
|
344
|
+
ports:
|
|
345
|
+
- containerPort: 8080
|
|
346
|
+
resources:
|
|
347
|
+
requests:
|
|
348
|
+
memory: '128Mi'
|
|
349
|
+
cpu: '100m'
|
|
350
|
+
limits:
|
|
351
|
+
memory: '512Mi'
|
|
352
|
+
cpu: '500m'
|
|
353
|
+
livenessProbe:
|
|
354
|
+
httpGet:
|
|
355
|
+
path: /health
|
|
356
|
+
port: 8080
|
|
357
|
+
initialDelaySeconds: 10
|
|
358
|
+
periodSeconds: 30
|
|
359
|
+
readinessProbe:
|
|
360
|
+
httpGet:
|
|
361
|
+
path: /ready
|
|
362
|
+
port: 8080
|
|
363
|
+
initialDelaySeconds: 5
|
|
364
|
+
periodSeconds: 10
|
|
365
|
+
---
|
|
366
|
+
apiVersion: v1
|
|
367
|
+
kind: Service
|
|
368
|
+
metadata:
|
|
369
|
+
name: gateway
|
|
370
|
+
spec:
|
|
371
|
+
selector:
|
|
372
|
+
app: gateway
|
|
373
|
+
ports:
|
|
374
|
+
- protocol: TCP
|
|
375
|
+
port: 80
|
|
376
|
+
targetPort: 8080
|
|
377
|
+
type: ClusterIP
|
|
378
|
+
`,
|
|
379
|
+
},
|
|
380
|
+
];
|
|
381
|
+
function generateHelmValuesContent(envName) {
|
|
382
|
+
return `# =============================================================================
|
|
383
|
+
# Helm Values 模板 — ${envName} 环境
|
|
384
|
+
# =============================================================================
|
|
385
|
+
# 用途:Helm chart 的 values 覆盖文件(helm 类型部署时调用)
|
|
386
|
+
# 位置:.speccore/environments/scripts/values-${envName}.yaml
|
|
387
|
+
# 执行:speccore deploy --env ${envName} --platform <platform>
|
|
388
|
+
#
|
|
389
|
+
# 请根据实际项目修改镜像、副本数、资源限制等。
|
|
390
|
+
# =============================================================================
|
|
391
|
+
|
|
392
|
+
replicaCount: 2
|
|
393
|
+
|
|
394
|
+
image:
|
|
395
|
+
repository: registry.example.com/user-service
|
|
396
|
+
pullPolicy: IfNotPresent
|
|
397
|
+
tag: '${envName}'
|
|
398
|
+
|
|
399
|
+
service:
|
|
400
|
+
type: ClusterIP
|
|
401
|
+
port: 80
|
|
402
|
+
|
|
403
|
+
ingress:
|
|
404
|
+
enabled: false
|
|
405
|
+
|
|
406
|
+
resources:
|
|
407
|
+
limits:
|
|
408
|
+
cpu: 500m
|
|
409
|
+
memory: 512Mi
|
|
410
|
+
requests:
|
|
411
|
+
cpu: 100m
|
|
412
|
+
memory: 128Mi
|
|
413
|
+
|
|
414
|
+
autoscaling:
|
|
415
|
+
enabled: false
|
|
416
|
+
minReplicas: 1
|
|
417
|
+
maxReplicas: 5
|
|
418
|
+
targetCPUUtilizationPercentage: 80
|
|
419
|
+
|
|
420
|
+
nodeSelector: {}
|
|
421
|
+
tolerations: []
|
|
422
|
+
affinity: {}
|
|
423
|
+
`;
|
|
424
|
+
}
|
|
229
425
|
/** update 时初始化环境配置目录 */
|
|
230
426
|
async function initEnvironmentConfigs(projectRoot) {
|
|
231
427
|
const envDir = (0, path_1.join)(projectRoot, '.speccore', 'environments');
|
|
@@ -233,20 +429,45 @@ async function initEnvironmentConfigs(projectRoot) {
|
|
|
233
429
|
const files = await (0, fs_extra_1.readdir)(envDir);
|
|
234
430
|
const hasYaml = files.some((f) => f.endsWith('.yaml') || f.endsWith('.yml'));
|
|
235
431
|
const created = [];
|
|
432
|
+
// v8.3.69+: 脚本模板和 Helm values 在新建/升级时都创建(已有项目升级时补全缺失的脚本)
|
|
433
|
+
const scriptsDir = (0, path_1.join)(envDir, 'scripts');
|
|
434
|
+
await (0, fs_extra_1.ensureDir)(scriptsDir);
|
|
435
|
+
// 创建通用脚本模板(缺失才创建)
|
|
436
|
+
for (const st of SCRIPT_TEMPLATES) {
|
|
437
|
+
const scriptPath = (0, path_1.join)(scriptsDir, st.name);
|
|
438
|
+
if (!(await (0, fs_extra_1.pathExists)(scriptPath))) {
|
|
439
|
+
await (0, fs_extra_1.writeFile)(scriptPath, st.content, 'utf-8');
|
|
440
|
+
created.push(`.speccore/environments/scripts/${st.name}`);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
236
443
|
if (!hasYaml) {
|
|
237
444
|
logger_1.logger.info(' 📦 初始化默认环境配置...');
|
|
238
445
|
for (const t of ENV_TEMPLATES) {
|
|
239
446
|
const filePath = (0, path_1.join)(envDir, `${t.name}.yaml`);
|
|
240
447
|
await (0, fs_extra_1.writeFile)(filePath, generateEnvContent(t), 'utf-8');
|
|
241
448
|
created.push(`.speccore/environments/${t.name}.yaml`);
|
|
449
|
+
// 为每个环境创建 Helm values 模板
|
|
450
|
+
const valuesPath = (0, path_1.join)(scriptsDir, `values-${t.name}.yaml`);
|
|
451
|
+
if (!(await (0, fs_extra_1.pathExists)(valuesPath))) {
|
|
452
|
+
await (0, fs_extra_1.writeFile)(valuesPath, generateHelmValuesContent(t.name), 'utf-8');
|
|
453
|
+
created.push(`.speccore/environments/scripts/values-${t.name}.yaml`);
|
|
454
|
+
}
|
|
242
455
|
}
|
|
243
456
|
}
|
|
244
457
|
else {
|
|
245
|
-
// 已有环境配置,仅更新示例文件
|
|
458
|
+
// 已有环境配置,仅更新示例文件 + 补全缺失的 Helm values
|
|
246
459
|
const examplePath = (0, path_1.join)(envDir, 'staging.yaml.example');
|
|
247
460
|
const exampleContent = generateEnvContent(ENV_TEMPLATES[2]) + '\n# 本文件为示例,可复制为 staging.yaml 后修改使用\n';
|
|
248
461
|
await (0, fs_extra_1.writeFile)(examplePath, exampleContent, 'utf-8');
|
|
249
462
|
created.push('.speccore/environments/staging.yaml.example');
|
|
463
|
+
// v8.3.69+: 已有环境配置时,补全可能缺失的 Helm values 模板
|
|
464
|
+
for (const t of ENV_TEMPLATES) {
|
|
465
|
+
const valuesPath = (0, path_1.join)(scriptsDir, `values-${t.name}.yaml`);
|
|
466
|
+
if (!(await (0, fs_extra_1.pathExists)(valuesPath))) {
|
|
467
|
+
await (0, fs_extra_1.writeFile)(valuesPath, generateHelmValuesContent(t.name), 'utf-8');
|
|
468
|
+
created.push(`.speccore/environments/scripts/values-${t.name}.yaml`);
|
|
469
|
+
}
|
|
470
|
+
}
|
|
250
471
|
}
|
|
251
472
|
return created;
|
|
252
473
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-env-configs.js","sourceRoot":"","sources":["../../src/commands/update-env-configs.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"update-env-configs.js","sourceRoot":"","sources":["../../src/commands/update-env-configs.ts"],"names":[],"mappings":"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"}
|