speccore 8.3.285 → 8.3.295

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.
Files changed (143) hide show
  1. package/.agents/skills/spec-run/SKILL.md +16 -0
  2. package/.agents/skills/spec-task-create/SKILL.md +15 -0
  3. package/.agents/skills/spec-unitize/SKILL.md +16 -0
  4. package/README.en.md +16 -3
  5. package/README.md +23 -8
  6. package/dist/cli.js +59 -12
  7. package/dist/cli.js.map +1 -1
  8. package/dist/commands/about.d.ts.map +1 -1
  9. package/dist/commands/about.js +5 -0
  10. package/dist/commands/about.js.map +1 -1
  11. package/dist/commands/analyze.d.ts.map +1 -1
  12. package/dist/commands/analyze.js +77 -5
  13. package/dist/commands/analyze.js.map +1 -1
  14. package/dist/commands/ask.js +2 -2
  15. package/dist/commands/ask.js.map +1 -1
  16. package/dist/commands/code-index.d.ts.map +1 -1
  17. package/dist/commands/code-index.js +20 -9
  18. package/dist/commands/code-index.js.map +1 -1
  19. package/dist/commands/doc2spec.js +32 -60
  20. package/dist/commands/doc2spec.js.map +1 -1
  21. package/dist/commands/execute.d.ts +1 -0
  22. package/dist/commands/execute.d.ts.map +1 -1
  23. package/dist/commands/execute.js +15 -1
  24. package/dist/commands/execute.js.map +1 -1
  25. package/dist/commands/help.js +14 -5
  26. package/dist/commands/help.js.map +1 -1
  27. package/dist/commands/init.d.ts.map +1 -1
  28. package/dist/commands/init.js +14 -3
  29. package/dist/commands/init.js.map +1 -1
  30. package/dist/commands/iteration/taskify.d.ts.map +1 -1
  31. package/dist/commands/iteration/taskify.js +132 -7
  32. package/dist/commands/iteration/taskify.js.map +1 -1
  33. package/dist/commands/run.d.ts +1 -0
  34. package/dist/commands/run.d.ts.map +1 -1
  35. package/dist/commands/run.js +193 -25
  36. package/dist/commands/run.js.map +1 -1
  37. package/dist/commands/status-panel.d.ts +1 -0
  38. package/dist/commands/status-panel.d.ts.map +1 -1
  39. package/dist/commands/status-panel.js +180 -54
  40. package/dist/commands/status-panel.js.map +1 -1
  41. package/dist/commands/task/new.d.ts +16 -0
  42. package/dist/commands/task/new.d.ts.map +1 -1
  43. package/dist/commands/task/new.js +232 -14
  44. package/dist/commands/task/new.js.map +1 -1
  45. package/dist/commands/verify.d.ts.map +1 -1
  46. package/dist/commands/verify.js +78 -1
  47. package/dist/commands/verify.js.map +1 -1
  48. package/dist/core/analyze-engine.d.ts.map +1 -1
  49. package/dist/core/analyze-engine.js +6 -10
  50. package/dist/core/analyze-engine.js.map +1 -1
  51. package/dist/core/ask-llm.d.ts +7 -0
  52. package/dist/core/ask-llm.d.ts.map +1 -1
  53. package/dist/core/ask-llm.js +45 -0
  54. package/dist/core/ask-llm.js.map +1 -1
  55. package/dist/core/code-graph/incremental-build.d.ts +2 -0
  56. package/dist/core/code-graph/incremental-build.d.ts.map +1 -1
  57. package/dist/core/code-graph/incremental-build.js +6 -5
  58. package/dist/core/code-graph/incremental-build.js.map +1 -1
  59. package/dist/core/code-graph/index.d.ts +2 -0
  60. package/dist/core/code-graph/index.d.ts.map +1 -1
  61. package/dist/core/code-graph/index.js +12 -5
  62. package/dist/core/code-graph/index.js.map +1 -1
  63. package/dist/core/code-scanner.d.ts +19 -4
  64. package/dist/core/code-scanner.d.ts.map +1 -1
  65. package/dist/core/code-scanner.js +193 -77
  66. package/dist/core/code-scanner.js.map +1 -1
  67. package/dist/core/excel-extract.d.ts +16 -2
  68. package/dist/core/excel-extract.d.ts.map +1 -1
  69. package/dist/core/excel-extract.js +54 -12
  70. package/dist/core/excel-extract.js.map +1 -1
  71. package/dist/core/git-integration.d.ts +2 -1
  72. package/dist/core/git-integration.d.ts.map +1 -1
  73. package/dist/core/git-integration.js +38 -14
  74. package/dist/core/git-integration.js.map +1 -1
  75. package/dist/core/global-counters.d.ts +3 -0
  76. package/dist/core/global-counters.d.ts.map +1 -1
  77. package/dist/core/global-counters.js +21 -7
  78. package/dist/core/global-counters.js.map +1 -1
  79. package/dist/core/intent-recognition.d.ts.map +1 -1
  80. package/dist/core/intent-recognition.js +173 -27
  81. package/dist/core/intent-recognition.js.map +1 -1
  82. package/dist/core/plan-store.d.ts +1 -0
  83. package/dist/core/plan-store.d.ts.map +1 -1
  84. package/dist/core/plan-store.js.map +1 -1
  85. package/dist/core/prompt-builder.d.ts.map +1 -1
  86. package/dist/core/prompt-builder.js +168 -140
  87. package/dist/core/prompt-builder.js.map +1 -1
  88. package/dist/core/spec-paths.d.ts.map +1 -1
  89. package/dist/core/spec-paths.js +3 -0
  90. package/dist/core/spec-paths.js.map +1 -1
  91. package/dist/core/spec-skeleton.d.ts.map +1 -1
  92. package/dist/core/spec-skeleton.js +6 -2
  93. package/dist/core/spec-skeleton.js.map +1 -1
  94. package/dist/core/stage-aliases.d.ts +40 -0
  95. package/dist/core/stage-aliases.d.ts.map +1 -0
  96. package/dist/core/stage-aliases.js +110 -0
  97. package/dist/core/stage-aliases.js.map +1 -0
  98. package/dist/core/state.d.ts +11 -0
  99. package/dist/core/state.d.ts.map +1 -1
  100. package/dist/core/state.js +33 -2
  101. package/dist/core/state.js.map +1 -1
  102. package/dist/core/structured-extractor.d.ts.map +1 -1
  103. package/dist/core/structured-extractor.js +7 -0
  104. package/dist/core/structured-extractor.js.map +1 -1
  105. package/dist/core/ui-verify/index.d.ts +2 -2
  106. package/dist/core/ui-verify/index.d.ts.map +1 -1
  107. package/dist/core/ui-verify/index.js +3 -1
  108. package/dist/core/ui-verify/index.js.map +1 -1
  109. package/dist/core/ui-verify/smoke-engine.d.ts.map +1 -1
  110. package/dist/core/ui-verify/smoke-engine.js +36 -0
  111. package/dist/core/ui-verify/smoke-engine.js.map +1 -1
  112. package/dist/core/ui-verify/spec-generator.d.ts +32 -1
  113. package/dist/core/ui-verify/spec-generator.d.ts.map +1 -1
  114. package/dist/core/ui-verify/spec-generator.js +205 -21
  115. package/dist/core/ui-verify/spec-generator.js.map +1 -1
  116. package/dist/core/ui-verify/types.d.ts +2 -0
  117. package/dist/core/ui-verify/types.d.ts.map +1 -1
  118. package/dist/utils/synonyms.d.ts.map +1 -1
  119. package/dist/utils/synonyms.js +15 -0
  120. package/dist/utils/synonyms.js.map +1 -1
  121. package/package.json +3 -2
  122. package/templates/api-design-example.md +338 -0
  123. package/templates/ci/github-actions.yml +44 -0
  124. package/templates/database-example.md +223 -0
  125. package/templates/deploy-docker/README.md +284 -0
  126. package/templates/deploy-docker/deploy-remote.sh +79 -0
  127. package/templates/deploy-docker/docker-compose.yml +113 -0
  128. package/templates/deploy-docker/frontend.Dockerfile +43 -0
  129. package/templates/deploy-docker/nginx.conf +30 -0
  130. package/templates/deploy-examples.yaml +436 -0
  131. package/templates/deploy-java/Dockerfile +50 -0
  132. package/templates/deploy-java/README.md +212 -0
  133. package/templates/deploy-java/deploy.sh +120 -0
  134. package/templates/deploy-java/spring-boot.service +35 -0
  135. package/templates/html/speccore-ask-explain.html +10 -0
  136. package/templates/html/speccore-ask-guide.html +10 -0
  137. package/templates/html/speccore-ask-match.html +10 -0
  138. package/templates/html/speccore-ask-pipeline.html +1 -0
  139. package/templates/html/speccore-ask-result.html +10 -0
  140. package/templates/html/speccore-help.html +241 -0
  141. package/templates/html/speccore-setup-guide.html +289 -0
  142. package/templates/security-example.md +226 -0
  143. package/templates/verify-spec-example.yaml +138 -0
@@ -0,0 +1,436 @@
1
+ # ═══════════════════════════════════════════════════════════
2
+ # SpecCore 部署配置示例(v8.3.91+)
3
+ # ═══════════════════════════════════════════════════════════
4
+ #
5
+ # 使用方式:
6
+ # 1. 复制你需要的配置块到 PROJECT.yaml 的 platform.deploy 段
7
+ # 2. 或复制到 .speccore/environments/{env}.yaml 的 platform 段
8
+ #
9
+ # 部署命令:
10
+ # speccore deploy --env staging --platform <端名>
11
+ # speccore deploy --env staging --all
12
+ # speccore deploy --env production --platform h5 --dry-run # 预览模式
13
+ #
14
+ # ═══════════════════════════════════════════════════════════
15
+
16
+ # ─────────────────────────────────────────
17
+ # 1. SSH 部署(推荐:有独立服务器的场景)
18
+ # ─────────────────────────────────────────
19
+ #
20
+ # 适用场景:前端构建后上传到 Nginx/Apache 静态目录,或后端上传到服务器重启
21
+ #
22
+ # 认证方式:
23
+ # 方式 A — 密钥认证(推荐,更安全):
24
+ # 1) 本地生成密钥:ssh-keygen -t rsa -b 4096
25
+ # 2) 上传公钥到服务器:ssh-copy-id -i ~/.ssh/id_rsa.pub user@host
26
+ # 3) 配置 key 字段指向私钥路径
27
+ #
28
+ # 方式 B — 密码认证(v8.3.91+):
29
+ # 1) 安装 sshpass:
30
+ # macOS: brew install sshpass
31
+ # Ubuntu/Debian: apt-get install sshpass
32
+ # 2) 配置 password 字段
33
+ #
34
+ ssh_key_example:
35
+ type: ssh
36
+ build_cmd: npm run build:staging
37
+ output_dir: dist
38
+ host: deployer@192.168.1.100:22
39
+ key: ~/.ssh/id_rsa
40
+ remote_dir: /var/www/html/h5
41
+ script: sudo nginx -s reload
42
+ pre_deploy:
43
+ - echo "开始部署到 staging..."
44
+ post_deploy:
45
+ - echo "部署完成"
46
+
47
+ # SSH 密码认证示例
48
+ ssh_password_example:
49
+ type: ssh
50
+ build_cmd: npm run build:staging
51
+ output_dir: dist
52
+ host: deployer@192.168.1.100:22
53
+ password: your-password-here # SSH 密码(v8.3.91+,需安装 sshpass)
54
+ remote_dir: /var/www/html/h5
55
+ script: sudo nginx -s reload
56
+
57
+ # ─────────────────────────────────────────
58
+ # 2. SFTP 部署(无 SSH 权限,只有 SFTP)
59
+ # ─────────────────────────────────────────
60
+ #
61
+ # 适用场景:共享主机、虚拟主机,只有 SFTP 权限无 SSH 登录权限
62
+ #
63
+ sftp_example:
64
+ type: sftp
65
+ build_cmd: npm run build
66
+ output_dir: dist
67
+ host: deployer@192.168.1.100 # SFTP 地址(格式 user@host)
68
+ key: ~/.ssh/id_rsa # SSH 私钥路径
69
+ remote_dir: /var/www/html/h5 # 远程目录(SFTP 必须有写权限)
70
+
71
+ # ─────────────────────────────────────────
72
+ # 3. 静态资源部署(local / S3 / rsync)
73
+ # ─────────────────────────────────────────
74
+ #
75
+ # 适用场景:CDN、对象存储、共享文件系统、本地目录
76
+ #
77
+ # target 格式:
78
+ # - 本地路径:/var/www/html/h5
79
+ # - S3 桶:s3://my-bucket/h5/
80
+ # - rsync 远程:rsync://user@host:/var/www/html/h5
81
+ # - rsync 远程(简写):user@host:/var/www/html/h5
82
+ #
83
+ static_local_example:
84
+ type: static
85
+ build_cmd: npm run build
86
+ output_dir: dist
87
+ target: /var/www/html/h5 # 本地或挂载的共享目录
88
+
89
+ static_s3_example:
90
+ type: static
91
+ build_cmd: npm run build
92
+ output_dir: dist
93
+ target: s3://my-cdn-bucket/h5-staging/ # AWS S3(需安装 AWS CLI)
94
+
95
+ static_rsync_example:
96
+ type: static
97
+ build_cmd: npm run build
98
+ output_dir: dist
99
+ target: deployer@cdn-server:/var/www/html/h5 # rsync 远程同步
100
+
101
+ # ─────────────────────────────────────────
102
+ # 4. 自定义脚本部署(最灵活)
103
+ # ─────────────────────────────────────────
104
+ #
105
+ # 适用场景:Jenkins 触发、FTP 上传、复杂部署流程
106
+ #
107
+ # script 字段可以是:
108
+ # - 脚本文件路径(相对于 code_path):./scripts/deploy-staging.sh
109
+ # - 直接命令:curl -X POST http://jenkins/job/build/build
110
+ #
111
+ script_jenkins_example:
112
+ type: script
113
+ build_cmd: npm run build
114
+ script: ./scripts/trigger-jenkins.sh # 脚本文件(存在则执行 bash)
115
+ # 或直接写命令:
116
+ # script: "curl -X POST -u user:token http://jenkins.example.com/job/my-job/build"
117
+
118
+ script_ftp_example:
119
+ type: script
120
+ build_cmd: npm run build
121
+ output_dir: dist
122
+ script: ./scripts/deploy-ftp.sh # 脚本内容示例见下文
123
+
124
+ # ─────────────────────────────────────────
125
+ # 5. Docker 部署
126
+ # ─────────────────────────────────────────
127
+ #
128
+ # 适用场景:容器化部署,支持本地构建 + 镜像仓库推送 + 远程服务器部署
129
+ #
130
+ # 远程部署说明(v8.3.96+):
131
+ # - 配置 host 后,speccore 会自动 SSH 到远程服务器执行 docker pull && run
132
+ # - 远程部署必须配置 registry(否则远程服务器无法获取镜像)
133
+ # - 可通过 script 字段自定义远程命令(默认:stop → rm → pull → run)
134
+ # - 支持密钥认证(key)和密码认证(password + sshpass)
135
+ #
136
+ # 完整模板见 templates/deploy-docker/(含前端 Dockerfile、Nginx 配置、Compose 编排)
137
+
138
+ # 基础 Docker:仅本地构建并推送到仓库(适合 CI/CD 场景)
139
+ docker_push_only:
140
+ type: docker
141
+ dockerfile: ./Dockerfile
142
+ registry: registry.example.com
143
+ image: my-project/h5
144
+ tag: staging
145
+
146
+ # 前端 Docker + 远程部署(Nginx 托管)
147
+ docker_frontend_remote:
148
+ type: docker
149
+ build_cmd: npm run build:staging # 前置构建(可选)
150
+ dockerfile: ./Dockerfile # 多阶段构建:Node → Nginx
151
+ registry: registry.example.com
152
+ image: my-project/admin-web
153
+ tag: staging
154
+ host: deployer@staging-server.example.com # 远程服务器(v8.3.96+)
155
+ key: ~/.ssh/id_rsa
156
+ # script 自定义远程命令(可选,以下为默认值示例)
157
+ # script: "docker pull registry.example.com/my-project/admin-web:staging && docker stop admin-web 2>/dev/null; docker rm admin-web 2>/dev/null; docker run -d --name admin-web --restart always -p 80:80 registry.example.com/my-project/admin-web:staging"
158
+
159
+ # 后端 Java Docker + 远程部署
160
+ docker_backend_remote:
161
+ type: docker
162
+ dockerfile: ./Dockerfile # 多阶段构建:Maven → JRE
163
+ registry: registry.example.com
164
+ image: my-project/order-service
165
+ tag: staging
166
+ host: deployer@staging-server.example.com
167
+ key: ~/.ssh/id_rsa
168
+
169
+ # Docker Compose 统一部署(使用 script 类型调用 compose)
170
+ docker_compose_example:
171
+ type: script
172
+ script: ./scripts/deploy-compose.sh
173
+ # deploy-compose.sh 内容示例:
174
+ # cd /opt/deploy && docker-compose pull && docker-compose up -d
175
+
176
+ # ─────────────────────────────────────────
177
+ # 6. PM2 部署(Node.js 后端)
178
+ # ─────────────────────────────────────────
179
+ #
180
+ # 适用场景:Node.js 服务,本地或远程 PM2 进程管理
181
+ #
182
+ pm2_local_example:
183
+ type: pm2
184
+ build_cmd: npm run build
185
+ output_dir: .
186
+ pm2_config: ecosystem.config.js # PM2 配置文件(默认 ecosystem.config.js)
187
+
188
+ pm2_remote_example:
189
+ type: pm2
190
+ build_cmd: npm run build
191
+ pm2_config: ecosystem.config.js
192
+ host: deployer@192.168.1.100 # 远程服务器(可选,配置则 SSH 远程重启)
193
+ key: ~/.ssh/id_rsa
194
+ remote_dir: /opt/services/api
195
+
196
+ # ─────────────────────────────────────────
197
+ # 7. Kubernetes 部署
198
+ # ─────────────────────────────────────────
199
+ #
200
+ # 适用场景:K8s 集群
201
+ #
202
+ k8s_example:
203
+ type: k8s
204
+ target: staging # namespace(默认 default)
205
+ script: k8s/deployment.yaml # K8s manifest 文件路径(默认 k8s-deployment.yaml)
206
+
207
+ # ─────────────────────────────────────────
208
+ # 8. Helm 部署
209
+ # ─────────────────────────────────────────
210
+ #
211
+ # 适用场景:使用 Helm 管理 K8s 应用
212
+ #
213
+ helm_example:
214
+ type: helm
215
+ target: staging # namespace(默认环境名)
216
+ script: ./helm/h5 # Chart 路径(默认 ./helm/<端名>)
217
+ output_dir: values-staging.yaml # values 文件路径(默认 values-<env>.yaml)
218
+
219
+ # ─────────────────────────────────────────
220
+ # 9. Vercel 部署
221
+ # ─────────────────────────────────────────
222
+ #
223
+ # 适用场景:前端项目快速部署到 Vercel
224
+ #
225
+ vercel_example:
226
+ type: vercel
227
+ # 无需额外配置,执行 npx vercel --prod(production)或 npx vercel(preview)
228
+ # 需提前安装 Vercel CLI 并登录:npm i -g vercel && vercel login
229
+
230
+ # ─────────────────────────────────────────
231
+ # 10. Serverless 部署(函数计算)
232
+ # ─────────────────────────────────────────
233
+ #
234
+ # 适用场景:函数计算、无服务器架构
235
+ #
236
+ serverless_aliyun_example:
237
+ type: serverless
238
+ provider: aliyun-fc # 阿里云函数计算
239
+ target: my-func-name # 函数名(默认使用端名)
240
+
241
+ serverless_aws_example:
242
+ type: serverless
243
+ provider: aws-lambda # AWS Lambda
244
+ target: my-lambda-func
245
+
246
+ serverless_tencent_example:
247
+ type: serverless
248
+ provider: tencent-scf # 腾讯云云函数
249
+ target: my-scf-func
250
+
251
+ # ─────────────────────────────────────────
252
+ # 11. Java 后端部署(Spring Boot + systemd)
253
+ # ─────────────────────────────────────────
254
+ #
255
+ # 适用场景:Java 后端服务,通过 systemd 管理 jar 进程
256
+ #
257
+ # 服务器端准备(只需一次):
258
+ # 1) 将 templates/deploy-java/spring-boot.service 复制到服务器:
259
+ # /etc/systemd/system/order-service.service
260
+ # (文件名必须与 platform.name 一致)
261
+ # 2) 创建部署目录:mkdir -p /opt/services/order-service
262
+ # 3) 创建日志目录:mkdir -p /var/log/order-service
263
+ # 4) 重载 systemd:sudo systemctl daemon-reload
264
+ # 5) 启用开机自启:sudo systemctl enable order-service
265
+ #
266
+ # 数据库 / Redis 配置:
267
+ # 通过 Spring Boot profiles 切换,如 application-staging.yml
268
+ # 部署时激活 profile:script 中传入 --spring.profiles.active=staging
269
+ #
270
+ java_systemd_example:
271
+ type: ssh
272
+ build_cmd: mvn clean package -DskipTests -P staging
273
+ output_dir: target
274
+ host: deployer@staging-server.example.com:22
275
+ key: ~/.ssh/id_rsa
276
+ remote_dir: /opt/services/order-service
277
+ # 部署后执行:停止服务 → 替换 jar → 启动服务
278
+ script: sudo systemctl restart order-service
279
+ pre_deploy:
280
+ - echo "开始部署 Java 后端..."
281
+ post_deploy:
282
+ - echo "部署完成,检查状态..."
283
+ - ssh deployer@staging-server.example.com "sudo systemctl status order-service --no-pager"
284
+
285
+ # ─────────────────────────────────────────
286
+ # 12. Java 后端部署(Spring Boot + Docker)
287
+ # ─────────────────────────────────────────
288
+ #
289
+ # 适用场景:Java 服务容器化部署
290
+ #
291
+ # Dockerfile 示例见 templates/deploy-java/Dockerfile
292
+ #
293
+ java_docker_example:
294
+ type: docker
295
+ dockerfile: ./Dockerfile
296
+ registry: registry.example.com
297
+ image: my-project/order-service
298
+ tag: staging
299
+
300
+ # ═══════════════════════════════════════════════════════════
301
+ # 完整 PROJECT.yaml 示例(含部署配置)
302
+ # ═══════════════════════════════════════════════════════════
303
+
304
+ platforms:
305
+ - name: sr-web-operation
306
+ type: frontend
307
+ description: 运营管理前端
308
+ code_path: ./sr-web-operation
309
+ default_branch: main
310
+ requirement_unit: 运营管理
311
+ deploy:
312
+ staging:
313
+ type: ssh
314
+ build_cmd: npm run build:staging
315
+ output_dir: dist
316
+ host: deployer@staging-server.example.com
317
+ key: ~/.ssh/id_rsa
318
+ remote_dir: /var/www/html/sr-web-operation
319
+ script: sudo nginx -s reload
320
+ production:
321
+ type: ssh
322
+ build_cmd: npm run build:prod
323
+ output_dir: dist
324
+ host: deployer@prod-server.example.com
325
+ key: ~/.ssh/id_rsa_production
326
+ remote_dir: /var/www/html/sr-web-operation
327
+ script: sudo nginx -s reload
328
+
329
+ - name: api-service
330
+ type: backend
331
+ description: API 服务
332
+ code_path: ./api-service
333
+ default_branch: main
334
+ deploy:
335
+ staging:
336
+ type: pm2
337
+ build_cmd: npm run build
338
+ pm2_config: ecosystem.config.js
339
+ host: deployer@staging-server.example.com
340
+ key: ~/.ssh/id_rsa
341
+ remote_dir: /opt/services/api-service
342
+
343
+ # ═══════════════════════════════════════════════════════════
344
+ # 环境配置文件示例(.speccore/environments/staging.yaml)
345
+ # ═══════════════════════════════════════════════════════════
346
+ #
347
+ # 环境配置会与 PROJECT.yaml 的 deploy 段合并,优先级:环境配置 > PROJECT.yaml
348
+ #
349
+
350
+ branch: develop # pipeline 命令的目标分支
351
+ build_cmd: npm run build:staging # 覆盖 PROJECT.yaml 的构建命令
352
+
353
+ deploy:
354
+ type: ssh
355
+ host: deployer@staging-server.example.com:22
356
+ key: ~/.ssh/id_rsa
357
+ remote_dir: /var/www/html/sr-web-operation
358
+
359
+ # ═══════════════════════════════════════════════════════════
360
+ # 常用脚本示例
361
+ # ═══════════════════════════════════════════════════════════
362
+
363
+ # --- scripts/trigger-jenkins.sh ---
364
+ # #!/bin/bash
365
+ # curl -X POST \
366
+ # -u "$JENKINS_USER:$JENKINS_TOKEN" \
367
+ # "http://jenkins.example.com/job/my-project-$1/build"
368
+
369
+ # --- scripts/deploy-ftp.sh ---
370
+ # #!/bin/bash
371
+ # # 使用 lftp 进行 FTP 上传(支持密码)
372
+ # lftp -u "$FTP_USER,$FTP_PASS" "$FTP_HOST" <<EOF
373
+ # set ssl:verify-certificate no
374
+ # mirror -R dist /public_html/h5
375
+ # bye
376
+ # EOF
377
+
378
+ # --- scripts/deploy-password-ssh.sh ---
379
+ # #!/bin/bash
380
+ # # 使用 sshpass 进行密码认证的 SSH 部署(需安装 sshpass)
381
+ # # macOS: brew install sshpass
382
+ # # Ubuntu: apt-get install sshpass
383
+ # sshpass -p "$SSH_PASSWORD" scp -r dist/* "$SSH_USER@$SSH_HOST:$REMOTE_DIR/"
384
+ # sshpass -p "$SSH_PASSWORD" ssh "$SSH_USER@$SSH_HOST" "sudo nginx -s reload"
385
+
386
+ # --- scripts/deploy-java.sh(服务器端执行) ---
387
+ # #!/bin/bash
388
+ # # Java 后端部署脚本(放在服务器上,由 SSH 调用或手动执行)
389
+ # APP_NAME="${1:-order-service}"
390
+ # DEPLOY_DIR="/opt/services/$APP_NAME"
391
+ # BACKUP_DIR="/opt/services/$APP_NAME/backups"
392
+ # JAR_FILE="$DEPLOY_DIR/$APP_NAME.jar"
393
+ # NEW_JAR="$DEPLOY_DIR/$APP_NAME-new.jar"
394
+ #
395
+ # # 1. 备份旧版本
396
+ # mkdir -p "$BACKUP_DIR"
397
+ # if [ -f "$JAR_FILE" ]; then
398
+ # cp "$JAR_FILE" "$BACKUP_DIR/$APP_NAME-$(date +%Y%m%d-%H%M%S).jar"
399
+ # # 只保留最近 5 个备份
400
+ # ls -t "$BACKUP_DIR"/*.jar | tail -n +6 | xargs -r rm -f
401
+ # fi
402
+ #
403
+ # # 2. 替换 jar
404
+ # if [ -f "$NEW_JAR" ]; then
405
+ # mv "$NEW_JAR" "$JAR_FILE"
406
+ # else
407
+ # echo "错误:未找到新 jar 文件 $NEW_JAR"
408
+ # exit 1
409
+ # fi
410
+ #
411
+ # # 3. 重启服务
412
+ # sudo systemctl restart "$APP_NAME"
413
+ # sleep 2
414
+ # sudo systemctl status "$APP_NAME" --no-pager
415
+
416
+ # --- systemd service 文件示例(/etc/systemd/system/order-service.service) ---
417
+ # [Unit]
418
+ # Description=Order Service
419
+ # After=network.target
420
+ #
421
+ # [Service]
422
+ # Type=simple
423
+ # User=deployer
424
+ # Group=deployer
425
+ # WorkingDirectory=/opt/services/order-service
426
+ # Environment="SPRING_PROFILES_ACTIVE=staging"
427
+ # Environment="JAVA_OPTS=-Xms512m -Xmx1024m -Dfile.encoding=UTF-8"
428
+ # ExecStart=/usr/bin/java $JAVA_OPTS -jar order-service.jar
429
+ # ExecStop=/bin/kill -SIGTERM $MAINPID
430
+ # Restart=on-failure
431
+ # RestartSec=10
432
+ # StandardOutput=append:/var/log/order-service/app.log
433
+ # StandardError=append:/var/log/order-service/error.log
434
+ #
435
+ # [Install]
436
+ # WantedBy=multi-user.target
@@ -0,0 +1,50 @@
1
+ # ═══════════════════════════════════════════════════════════
2
+ # Spring Boot Docker 构建示例
3
+ # ═══════════════════════════════════════════════════════════
4
+ #
5
+ # 用法:
6
+ # 1. 将本文件复制到 Java 工程根目录(与 pom.xml 同级)
7
+ # 2. 在 PROJECT.yaml 中配置 docker 类型部署:
8
+ # deploy:
9
+ # staging:
10
+ # type: docker
11
+ # dockerfile: ./Dockerfile
12
+ # registry: registry.example.com
13
+ # image: my-project/order-service
14
+ # tag: staging
15
+ # 3. 执行: speccore deploy --env staging --platform order-service
16
+ #
17
+ # 多阶段构建:先编译,再复制 jar 到精简镜像
18
+ # ═══════════════════════════════════════════════════════════
19
+
20
+ # ── 阶段 1:构建 ──
21
+ FROM maven:3.9-eclipse-temurin-17-alpine AS builder
22
+ WORKDIR /build
23
+ COPY pom.xml .
24
+ COPY src ./src
25
+ RUN mvn clean package -DskipTests -P docker
26
+
27
+ # ── 阶段 2:运行 ──
28
+ FROM eclipse-temurin:17-jre-alpine
29
+ WORKDIR /app
30
+
31
+ # 创建非 root 用户(安全最佳实践)
32
+ RUN addgroup -S appgroup && adduser -S appuser -G appgroup
33
+
34
+ # 复制构建产物
35
+ COPY --from=builder /build/target/*.jar app.jar
36
+
37
+ # 环境变量(可在运行时通过 -e 覆盖)
38
+ ENV SPRING_PROFILES_ACTIVE=staging
39
+ ENV JAVA_OPTS="-Xms512m -Xmx1024m -Dfile.encoding=UTF-8 -Djava.security.egd=file:/dev/./urandom"
40
+
41
+ # 暴露端口(根据实际应用修改)
42
+ EXPOSE 8080
43
+
44
+ # 健康检查
45
+ HEALTHCHECK --interval=30s --timeout=3s --start-period=60s --retries=3 \
46
+ CMD wget --no-verbose --tries=1 --spider http://localhost:8080/actuator/health || exit 1
47
+
48
+ USER appuser
49
+
50
+ ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]
@@ -0,0 +1,212 @@
1
+ # Java 后端部署指南
2
+
3
+ > 本目录提供 Java(Spring Boot)后端服务的部署模板和示例脚本。
4
+
5
+ ---
6
+
7
+ ## 目录结构
8
+
9
+ ```
10
+ deploy-java/
11
+ ├── spring-boot.service # systemd service 文件模板
12
+ ├── deploy.sh # 服务器端部署脚本(备份 → 替换 → 重启 → 健康检查)
13
+ ├── Dockerfile # 多阶段构建 Dockerfile 示例
14
+ └── README.md # 本文件
15
+ ```
16
+
17
+ ---
18
+
19
+ ## 部署方式一:systemd + SSH(推荐测试环境)
20
+
21
+ ### 1. 服务器端准备(只需一次)
22
+
23
+ ```bash
24
+ # 创建部署目录
25
+ sudo mkdir -p /opt/services/order-service
26
+ sudo mkdir -p /var/log/order-service
27
+
28
+ # 复制 service 文件(将 spring-boot.service 中的占位符替换后复制)
29
+ # 注意:文件名必须与 PROJECT.yaml 中的 platform.name 一致
30
+ sudo cp spring-boot.service /etc/systemd/system/order-service.service
31
+
32
+ # 重载 systemd
33
+ sudo systemctl daemon-reload
34
+ sudo systemctl enable order-service
35
+ ```
36
+
37
+ ### 2. 替换 service 文件中的占位符
38
+
39
+ | 占位符 | 示例值 | 说明 |
40
+ |--------|--------|------|
41
+ | `{{APP_NAME}}` | `order-service` | 应用名,与 platform.name 一致 |
42
+ | `{{DEPLOY_USER}}` | `deployer` | 运行服务的系统用户 |
43
+ | `{{DEPLOY_DIR}}` | `/opt/services/order-service` | jar 文件所在目录 |
44
+ | `{{PROFILE}}` | `staging` | Spring Boot profile |
45
+ | `{{JVM_XMS}}` | `512m` | JVM 初始堆内存 |
46
+ | `{{JVM_XMX}}` | `1024m` | JVM 最大堆内存 |
47
+
48
+ ### 3. PROJECT.yaml 配置
49
+
50
+ ```yaml
51
+ platforms:
52
+ - name: order-service
53
+ type: backend
54
+ code_path: ./order-service
55
+ default_branch: main
56
+ deploy:
57
+ staging:
58
+ type: ssh
59
+ build_cmd: mvn clean package -DskipTests -P staging
60
+ output_dir: target
61
+ host: deployer@staging-server.example.com:22
62
+ key: ~/.ssh/id_rsa
63
+ remote_dir: /opt/services/order-service
64
+ script: sudo systemctl restart order-service
65
+ ```
66
+
67
+ ### 4. 数据库 / Redis 配置切换
68
+
69
+ **方式 A:Spring Boot Profiles(推荐)**
70
+
71
+ ```yaml
72
+ # src/main/resources/application-staging.yml
73
+ spring:
74
+ datasource:
75
+ url: jdbc:mysql://staging-db:3306/order_db
76
+ username: ${DB_USER}
77
+ password: ${DB_PASS}
78
+ data:
79
+ redis:
80
+ host: staging-redis
81
+ port: 6379
82
+ password: ${REDIS_PASS}
83
+ ```
84
+
85
+ **方式 B:环境变量注入(配合 systemd)**
86
+
87
+ 在 `spring-boot.service` 的 `[Service]` 段增加:
88
+ ```ini
89
+ Environment="DB_USER=order_user"
90
+ Environment="DB_PASS=secret"
91
+ Environment="REDIS_PASS=redis_secret"
92
+ ```
93
+
94
+ 在 `application.yml` 中引用:
95
+ ```yaml
96
+ spring:
97
+ datasource:
98
+ username: ${DB_USER}
99
+ password: ${DB_PASS}
100
+ ```
101
+
102
+ ### 5. 部署流程
103
+
104
+ ```bash
105
+ speccore deploy --env staging --platform order-service
106
+ ```
107
+
108
+ 执行流程:
109
+ 1. 本地执行 `mvn clean package -DskipTests -P staging`
110
+ 2. SCP 上传 `target/*.jar` 到服务器 `/opt/services/order-service/`
111
+ 3. SSH 执行 `sudo systemctl restart order-service`
112
+ 4. systemd 自动完成:停止旧进程 → 启动新 jar → 写入日志
113
+
114
+ ---
115
+
116
+ ## 部署方式二:Docker(推荐生产环境)
117
+
118
+ ### 1. 准备 Dockerfile
119
+
120
+ 将 `Dockerfile` 复制到 Java 工程根目录(与 `pom.xml` 同级)。
121
+
122
+ ### 2. PROJECT.yaml 配置
123
+
124
+ ```yaml
125
+ platforms:
126
+ - name: order-service
127
+ type: backend
128
+ code_path: ./order-service
129
+ default_branch: main
130
+ deploy:
131
+ production:
132
+ type: docker
133
+ dockerfile: ./Dockerfile
134
+ registry: registry.example.com
135
+ image: my-project/order-service
136
+ tag: production
137
+ ```
138
+
139
+ ### 3. 部署流程
140
+
141
+ ```bash
142
+ speccore deploy --env production --platform order-service
143
+ ```
144
+
145
+ 执行流程:
146
+ 1. 本地 `docker build`
147
+ 2. 推送到镜像仓库 `registry.example.com/my-project/order-service:production`
148
+ 3. 服务器端拉取镜像并运行(需配合额外的部署脚本或 CI/CD)
149
+
150
+ > 提示:如果服务器需要 SSH 登录后执行 `docker pull && docker run`,可将 deploy 类型改为 `script`,编写自定义脚本。
151
+
152
+ ---
153
+
154
+ ## 部署方式三:自定义脚本(最灵活)
155
+
156
+ 如果 systemd 和 Docker 都不满足需求,使用 `script` 类型:
157
+
158
+ ```yaml
159
+ deploy:
160
+ staging:
161
+ type: script
162
+ build_cmd: mvn clean package -DskipTests
163
+ script: ./scripts/deploy-custom.sh
164
+ ```
165
+
166
+ ---
167
+
168
+ ## 数据库 / Redis 连接检查清单
169
+
170
+ | 检查项 | 说明 |
171
+ |--------|------|
172
+ | 网络连通性 | 服务器能否 ping 通数据库和 Redis 主机 |
173
+ | 防火墙 / 安全组 | 数据库端口(3306/5432)和 Redis 端口(6379)是否开放 |
174
+ | 用户名密码 | 确认 staging / production 环境的凭据正确 |
175
+ | 数据库存在性 | 目标数据库是否已创建 |
176
+ | 连接池配置 | HikariCP 的最大连接数是否超过数据库限制 |
177
+ | 时区 | JVM 时区、数据库时区、应用时区是否一致 |
178
+
179
+ ---
180
+
181
+ ## 常见问题
182
+
183
+ **Q: 部署后服务起不来,怎么排查?**
184
+
185
+ ```bash
186
+ # 查看服务状态
187
+ sudo systemctl status order-service --no-pager
188
+
189
+ # 查看日志
190
+ sudo journalctl -u order-service -f
191
+
192
+ # 查看应用日志
193
+ tail -f /var/log/order-service/app.log
194
+ ```
195
+
196
+ **Q: 如何回滚到上一个版本?**
197
+
198
+ ```bash
199
+ cd /opt/services/order-service
200
+ # 找到最新备份
201
+ LATEST=$(ls -t backups/*.jar | head -1)
202
+ cp "$LATEST" order-service.jar
203
+ sudo systemctl restart order-service
204
+ ```
205
+
206
+ **Q: 多个环境(staging / production)如何管理配置?**
207
+
208
+ 使用 Spring Boot profiles:
209
+ - `application-staging.yml` — 测试环境
210
+ - `application-production.yml` — 生产环境
211
+ - 打包时激活 profile:`-P staging`
212
+ - 运行时激活 profile:`--spring.profiles.active=staging`