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.
- package/.agents/skills/spec-run/SKILL.md +16 -0
- package/.agents/skills/spec-task-create/SKILL.md +15 -0
- package/.agents/skills/spec-unitize/SKILL.md +16 -0
- package/README.en.md +16 -3
- package/README.md +23 -8
- package/dist/cli.js +59 -12
- package/dist/cli.js.map +1 -1
- package/dist/commands/about.d.ts.map +1 -1
- package/dist/commands/about.js +5 -0
- package/dist/commands/about.js.map +1 -1
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +77 -5
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/ask.js +2 -2
- package/dist/commands/ask.js.map +1 -1
- package/dist/commands/code-index.d.ts.map +1 -1
- package/dist/commands/code-index.js +20 -9
- package/dist/commands/code-index.js.map +1 -1
- package/dist/commands/doc2spec.js +32 -60
- package/dist/commands/doc2spec.js.map +1 -1
- package/dist/commands/execute.d.ts +1 -0
- package/dist/commands/execute.d.ts.map +1 -1
- package/dist/commands/execute.js +15 -1
- package/dist/commands/execute.js.map +1 -1
- package/dist/commands/help.js +14 -5
- package/dist/commands/help.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +14 -3
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/iteration/taskify.d.ts.map +1 -1
- package/dist/commands/iteration/taskify.js +132 -7
- package/dist/commands/iteration/taskify.js.map +1 -1
- package/dist/commands/run.d.ts +1 -0
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +193 -25
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/status-panel.d.ts +1 -0
- package/dist/commands/status-panel.d.ts.map +1 -1
- package/dist/commands/status-panel.js +180 -54
- package/dist/commands/status-panel.js.map +1 -1
- package/dist/commands/task/new.d.ts +16 -0
- package/dist/commands/task/new.d.ts.map +1 -1
- package/dist/commands/task/new.js +232 -14
- package/dist/commands/task/new.js.map +1 -1
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +78 -1
- package/dist/commands/verify.js.map +1 -1
- package/dist/core/analyze-engine.d.ts.map +1 -1
- package/dist/core/analyze-engine.js +6 -10
- package/dist/core/analyze-engine.js.map +1 -1
- package/dist/core/ask-llm.d.ts +7 -0
- package/dist/core/ask-llm.d.ts.map +1 -1
- package/dist/core/ask-llm.js +45 -0
- package/dist/core/ask-llm.js.map +1 -1
- package/dist/core/code-graph/incremental-build.d.ts +2 -0
- package/dist/core/code-graph/incremental-build.d.ts.map +1 -1
- package/dist/core/code-graph/incremental-build.js +6 -5
- package/dist/core/code-graph/incremental-build.js.map +1 -1
- package/dist/core/code-graph/index.d.ts +2 -0
- package/dist/core/code-graph/index.d.ts.map +1 -1
- package/dist/core/code-graph/index.js +12 -5
- package/dist/core/code-graph/index.js.map +1 -1
- package/dist/core/code-scanner.d.ts +19 -4
- package/dist/core/code-scanner.d.ts.map +1 -1
- package/dist/core/code-scanner.js +193 -77
- package/dist/core/code-scanner.js.map +1 -1
- package/dist/core/excel-extract.d.ts +16 -2
- package/dist/core/excel-extract.d.ts.map +1 -1
- package/dist/core/excel-extract.js +54 -12
- package/dist/core/excel-extract.js.map +1 -1
- package/dist/core/git-integration.d.ts +2 -1
- package/dist/core/git-integration.d.ts.map +1 -1
- package/dist/core/git-integration.js +38 -14
- package/dist/core/git-integration.js.map +1 -1
- package/dist/core/global-counters.d.ts +3 -0
- package/dist/core/global-counters.d.ts.map +1 -1
- package/dist/core/global-counters.js +21 -7
- package/dist/core/global-counters.js.map +1 -1
- package/dist/core/intent-recognition.d.ts.map +1 -1
- package/dist/core/intent-recognition.js +173 -27
- package/dist/core/intent-recognition.js.map +1 -1
- package/dist/core/plan-store.d.ts +1 -0
- package/dist/core/plan-store.d.ts.map +1 -1
- package/dist/core/plan-store.js.map +1 -1
- package/dist/core/prompt-builder.d.ts.map +1 -1
- package/dist/core/prompt-builder.js +168 -140
- package/dist/core/prompt-builder.js.map +1 -1
- package/dist/core/spec-paths.d.ts.map +1 -1
- package/dist/core/spec-paths.js +3 -0
- package/dist/core/spec-paths.js.map +1 -1
- package/dist/core/spec-skeleton.d.ts.map +1 -1
- package/dist/core/spec-skeleton.js +6 -2
- package/dist/core/spec-skeleton.js.map +1 -1
- package/dist/core/stage-aliases.d.ts +40 -0
- package/dist/core/stage-aliases.d.ts.map +1 -0
- package/dist/core/stage-aliases.js +110 -0
- package/dist/core/stage-aliases.js.map +1 -0
- package/dist/core/state.d.ts +11 -0
- package/dist/core/state.d.ts.map +1 -1
- package/dist/core/state.js +33 -2
- package/dist/core/state.js.map +1 -1
- package/dist/core/structured-extractor.d.ts.map +1 -1
- package/dist/core/structured-extractor.js +7 -0
- package/dist/core/structured-extractor.js.map +1 -1
- package/dist/core/ui-verify/index.d.ts +2 -2
- package/dist/core/ui-verify/index.d.ts.map +1 -1
- package/dist/core/ui-verify/index.js +3 -1
- package/dist/core/ui-verify/index.js.map +1 -1
- package/dist/core/ui-verify/smoke-engine.d.ts.map +1 -1
- package/dist/core/ui-verify/smoke-engine.js +36 -0
- package/dist/core/ui-verify/smoke-engine.js.map +1 -1
- package/dist/core/ui-verify/spec-generator.d.ts +32 -1
- package/dist/core/ui-verify/spec-generator.d.ts.map +1 -1
- package/dist/core/ui-verify/spec-generator.js +205 -21
- package/dist/core/ui-verify/spec-generator.js.map +1 -1
- package/dist/core/ui-verify/types.d.ts +2 -0
- package/dist/core/ui-verify/types.d.ts.map +1 -1
- package/dist/utils/synonyms.d.ts.map +1 -1
- package/dist/utils/synonyms.js +15 -0
- package/dist/utils/synonyms.js.map +1 -1
- package/package.json +3 -2
- package/templates/api-design-example.md +338 -0
- package/templates/ci/github-actions.yml +44 -0
- package/templates/database-example.md +223 -0
- package/templates/deploy-docker/README.md +284 -0
- package/templates/deploy-docker/deploy-remote.sh +79 -0
- package/templates/deploy-docker/docker-compose.yml +113 -0
- package/templates/deploy-docker/frontend.Dockerfile +43 -0
- package/templates/deploy-docker/nginx.conf +30 -0
- package/templates/deploy-examples.yaml +436 -0
- package/templates/deploy-java/Dockerfile +50 -0
- package/templates/deploy-java/README.md +212 -0
- package/templates/deploy-java/deploy.sh +120 -0
- package/templates/deploy-java/spring-boot.service +35 -0
- package/templates/html/speccore-ask-explain.html +10 -0
- package/templates/html/speccore-ask-guide.html +10 -0
- package/templates/html/speccore-ask-match.html +10 -0
- package/templates/html/speccore-ask-pipeline.html +1 -0
- package/templates/html/speccore-ask-result.html +10 -0
- package/templates/html/speccore-help.html +241 -0
- package/templates/html/speccore-setup-guide.html +289 -0
- package/templates/security-example.md +226 -0
- 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`
|