clouddreamai-cicd-setup 1.0.1 → 1.0.3
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 +421 -92
- package/dist/cli.js +5 -2
- package/dist/cli.js.map +1 -1
- package/dist/core/gitlab-client.d.ts.map +1 -1
- package/dist/core/gitlab-client.js +0 -4
- package/dist/core/gitlab-client.js.map +1 -1
- package/dist/core/types.d.ts +26 -7
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/variables.d.ts.map +1 -1
- package/dist/core/variables.js +54 -47
- package/dist/core/variables.js.map +1 -1
- package/dist/utils/prompts.d.ts +8 -8
- package/dist/utils/prompts.d.ts.map +1 -1
- package/dist/utils/prompts.js +192 -147
- package/dist/utils/prompts.js.map +1 -1
- package/dist/utils/template.d.ts +13 -5
- package/dist/utils/template.d.ts.map +1 -1
- package/dist/utils/template.js +77 -12
- package/dist/utils/template.js.map +1 -1
- package/package.json +1 -1
- package/templates/docker-compose/nestjs.yml +17 -0
- package/templates/docker-compose/vue.yml +15 -0
- package/templates/gitlab-ci/nestjs-gitlab.yml +170 -0
- package/templates/gitlab-ci/nestjs.yml +15 -24
- package/templates/gitlab-ci/vue-gitlab.yml +168 -0
- package/templates/gitlab-ci/vue.yml +15 -24
- package/templates/scripts/deploy.sh +121 -15
package/README.md
CHANGED
|
@@ -10,173 +10,502 @@
|
|
|
10
10
|
- 📦 **多项目支持** - 支持 NestJS、Vue、React 等多种项目类型
|
|
11
11
|
- 🐳 **Docker 化** - 基于 Docker 的完整部署流程
|
|
12
12
|
- 🌍 **多环境** - 支持开发/生产环境分离或单服务器多环境
|
|
13
|
+
- 📝 **GitLab Registry** - 默认使用 GitLab Container Registry,无需额外配置
|
|
13
14
|
|
|
14
|
-
##
|
|
15
|
+
## 安装使用
|
|
15
16
|
|
|
16
|
-
###
|
|
17
|
+
### 安装
|
|
17
18
|
|
|
18
19
|
```bash
|
|
19
20
|
npm install -g clouddreamai-cicd-setup
|
|
20
21
|
```
|
|
21
22
|
|
|
22
|
-
###
|
|
23
|
+
### 使用
|
|
24
|
+
|
|
25
|
+
在你的项目根目录运行:
|
|
23
26
|
|
|
24
27
|
```bash
|
|
25
|
-
|
|
26
|
-
npm install
|
|
27
|
-
npm run build
|
|
28
|
-
npm link
|
|
28
|
+
cicd-setup init
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
-
##
|
|
31
|
+
## 使用前准备
|
|
32
32
|
|
|
33
|
-
###
|
|
33
|
+
### 1. GitLab Personal Access Token
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
1. 登录 GitLab
|
|
36
|
+
2. 进入 **User Settings** → **Access Tokens**
|
|
37
|
+
3. 创建新 Token,需要以下权限:
|
|
38
|
+
- ✅ `api` - 访问 API
|
|
39
|
+
- ✅ `write_repository` - 写入仓库
|
|
40
|
+
4. 复制生成的 Token(只显示一次,请妥善保存)
|
|
41
|
+
|
|
42
|
+
### 2. SSH 密钥
|
|
36
43
|
|
|
37
44
|
```bash
|
|
38
|
-
|
|
45
|
+
# 生成 SSH 密钥(如果还没有)
|
|
46
|
+
ssh-keygen -t rsa -b 4096 -C "gitlab-ci@your-domain.com" -f ~/.ssh/gitlab-ci-deploy
|
|
47
|
+
|
|
48
|
+
# 将公钥添加到服务器
|
|
49
|
+
ssh-copy-id -i ~/.ssh/gitlab-ci-deploy.pub root@服务器IP
|
|
39
50
|
```
|
|
40
51
|
|
|
41
|
-
|
|
52
|
+
### 3. 环境变量文件(必需)
|
|
42
53
|
|
|
43
|
-
|
|
44
|
-
- GitLab 实例 URL 和 Access Token
|
|
45
|
-
- 项目类型(NestJS/Vue/React)
|
|
46
|
-
- Docker Hub 凭据
|
|
47
|
-
- 服务器信息和 SSH 密钥
|
|
48
|
-
- 环境变量文件
|
|
54
|
+
**NestJS 项目必须提供环境变量文件:**
|
|
49
55
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
56
|
+
```bash
|
|
57
|
+
# 创建开发环境配置
|
|
58
|
+
cp .env.example .env.dev
|
|
53
59
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
- `ci/generate-env.sh` - 环境变量生成脚本
|
|
60
|
+
# 创建生产环境配置
|
|
61
|
+
cp .env.example .env.prod
|
|
62
|
+
```
|
|
58
63
|
|
|
59
|
-
|
|
60
|
-
- 自动创建/更新所需的环境变量
|
|
61
|
-
- 支持加密(Masked)和保护(Protected)
|
|
64
|
+
编辑这两个文件,填写对应环境的配置(数据库、Redis、密钥等)。
|
|
62
65
|
|
|
63
|
-
|
|
66
|
+
## 配置流程
|
|
67
|
+
|
|
68
|
+
运行 `cicd-setup init` 后,工具会交互式引导你完成以下配置:
|
|
69
|
+
|
|
70
|
+
### 1. GitLab 配置
|
|
64
71
|
|
|
65
|
-
```bash
|
|
66
|
-
cicd-setup init --dry-run
|
|
67
72
|
```
|
|
73
|
+
📦 GitLab 配置
|
|
68
74
|
|
|
69
|
-
|
|
75
|
+
? GitLab 实例 URL: https://gitlab.clouddreamai.com
|
|
76
|
+
? GitLab Personal Access Token: glpat-xxxxxxxxxxxx
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
工具会立即测试连接,验证 Token 是否有效。
|
|
80
|
+
|
|
81
|
+
### 2. 镜像仓库配置
|
|
70
82
|
|
|
71
|
-
```bash
|
|
72
|
-
cicd-setup init --output /path/to/project
|
|
73
83
|
```
|
|
84
|
+
📦 镜像仓库配置
|
|
74
85
|
|
|
75
|
-
|
|
86
|
+
? 选择镜像仓库类型:
|
|
87
|
+
❯ GitLab Container Registry(推荐,无需额外配置)
|
|
88
|
+
自建 Docker Registry
|
|
89
|
+
不使用 Registry(服务器本地构建)
|
|
90
|
+
```
|
|
76
91
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
92
|
+
**推荐选择 GitLab Container Registry**:
|
|
93
|
+
- ✅ 无需额外配置
|
|
94
|
+
- ✅ 与 GitLab 深度集成
|
|
95
|
+
- ✅ 自动使用 CI 预定义变量
|
|
96
|
+
- ✅ 支持私有镜像
|
|
97
|
+
|
|
98
|
+
如果选择自建 Registry,需要提供:
|
|
99
|
+
- Registry URL(如 `registry.example.com:5000`)
|
|
100
|
+
- 用户名
|
|
101
|
+
- 密码
|
|
102
|
+
|
|
103
|
+
如果选择"不使用 Registry",镜像将在服务器本地构建。
|
|
104
|
+
|
|
105
|
+
### 3. 项目配置
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
🔧 项目配置
|
|
109
|
+
|
|
110
|
+
? 项目名称 (用于容器名称): my-project
|
|
111
|
+
? 项目类型: NestJS 后端
|
|
112
|
+
? 镜像名称 (可选,留空将使用 GitLab 项目路径): [留空]
|
|
113
|
+
? 部署目录 (服务器上的绝对路径): /www/wwwroot/my-project
|
|
114
|
+
? 开发环境端口: 3000
|
|
115
|
+
? 生产环境端口: 3001
|
|
116
|
+
? 开发环境 URL (可选): https://my-project-test.example.com
|
|
117
|
+
? 生产环境 URL (可选): https://my-project.example.com
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
**配置说明:**
|
|
121
|
+
- **项目名称**:用于 Docker 容器名称,只能包含小写字母、数字和连字符
|
|
122
|
+
- **项目类型**:影响默认的 lint 命令和构建流程
|
|
123
|
+
- **镜像名称**:使用 GitLab Registry 时可以留空,会自动使用项目路径
|
|
124
|
+
- **部署目录**:必须是服务器上的绝对路径,工具会在此目录部署项目
|
|
125
|
+
- **端口**:应用监听的端口,确保不与其他服务冲突
|
|
126
|
+
- **URL**:可选,用于 GitLab 环境链接展示
|
|
127
|
+
|
|
128
|
+
### 4. 服务器配置
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
🖥️ 服务器配置
|
|
132
|
+
|
|
133
|
+
? 是否使用单服务器多环境模式? Yes
|
|
134
|
+
? 测试/开发服务器地址 (IP 或域名): 192.168.1.100
|
|
135
|
+
? 生产服务器地址: [自动填充相同地址]
|
|
136
|
+
```
|
|
83
137
|
|
|
84
|
-
|
|
138
|
+
**配置说明:**
|
|
139
|
+
- **单服务器多环境模式**:开发和生产环境部署在同一台服务器,通过不同端口区分
|
|
140
|
+
- **双服务器模式**:开发和生产环境部署在不同服务器,更安全但成本更高
|
|
85
141
|
|
|
86
|
-
|
|
142
|
+
### 5. SSH 私钥配置
|
|
143
|
+
|
|
144
|
+
```
|
|
145
|
+
🔑 SSH 私钥配置
|
|
146
|
+
|
|
147
|
+
? 如何提供 SSH 私钥?
|
|
148
|
+
❯ 从文件读取
|
|
149
|
+
手动粘贴
|
|
150
|
+
|
|
151
|
+
? SSH 私钥文件路径: ~/.ssh/gitlab-ci-deploy
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
**配置说明:**
|
|
155
|
+
- **从文件读取**:推荐方式,直接指定私钥文件路径
|
|
156
|
+
- **手动粘贴**:会打开编辑器,粘贴私钥内容后保存
|
|
157
|
+
|
|
158
|
+
**注意**:
|
|
159
|
+
- 私钥必须是 PEM 格式
|
|
160
|
+
- 不需要 base64 编码
|
|
161
|
+
- 私钥内容会安全地存储在 GitLab CI/CD 变量中(Masked)
|
|
162
|
+
|
|
163
|
+
### 6. 环境变量文件(必需)
|
|
164
|
+
|
|
165
|
+
```
|
|
166
|
+
📄 环境变量文件配置(必需)
|
|
167
|
+
|
|
168
|
+
⚠️ NestJS 项目需要 .env 文件来配置数据库、密钥等信息
|
|
169
|
+
请确保已创建 .env.dev 和 .env.prod 文件
|
|
170
|
+
|
|
171
|
+
? 开发环境 .env 文件路径 (必需): .env.dev
|
|
172
|
+
✓ 成功读取 .env.dev (25 行)
|
|
173
|
+
|
|
174
|
+
? 生产环境 .env 文件路径 (必需): .env.prod
|
|
175
|
+
✓ 成功读取 .env.prod (25 行)
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
**配置说明:**
|
|
179
|
+
- 环境变量文件是**必需的**,不能跳过
|
|
180
|
+
- 如果文件不存在,工具会提示你先创建
|
|
181
|
+
- 工具会读取文件内容并上传到 GitLab CI/CD 变量(File 类型)
|
|
182
|
+
- 部署时会自动注入到容器中
|
|
183
|
+
|
|
184
|
+
## 配置完成
|
|
185
|
+
|
|
186
|
+
工具会自动完成以下操作:
|
|
187
|
+
|
|
188
|
+
### 1. 生成配置文件
|
|
189
|
+
|
|
190
|
+
```
|
|
191
|
+
your-project/
|
|
192
|
+
├── .gitlab-ci.yml # GitLab CI/CD 配置
|
|
193
|
+
├── docker-compose.yml # Docker Compose 配置(如果不存在)
|
|
194
|
+
└── ci/
|
|
195
|
+
├── deploy.sh # 部署脚本
|
|
196
|
+
└── generate-env.sh # 环境变量生成脚本
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
**文件说明:**
|
|
200
|
+
- **`.gitlab-ci.yml`**:定义 CI/CD Pipeline 流程,包括 lint、build、deploy 阶段
|
|
201
|
+
- **`docker-compose.yml`**:定义 Docker 容器配置,用于本地和服务器部署
|
|
202
|
+
- **`ci/deploy.sh`**:部署脚本,在服务器上执行,负责拉取镜像、启动容器等
|
|
203
|
+
- **`ci/generate-env.sh`**:环境变量生成脚本,从 GitLab 变量中提取 .env 文件
|
|
204
|
+
|
|
205
|
+
### 2. 上传 CI/CD 变量到 GitLab
|
|
206
|
+
|
|
207
|
+
工具会自动选择一个 GitLab 项目,并上传以下变量:
|
|
87
208
|
|
|
88
209
|
| 变量名 | 类型 | 说明 | Protected | Masked |
|
|
89
210
|
|--------|------|------|-----------|--------|
|
|
90
211
|
| `GITLAB_ACCESS_TOKEN` | env_var | GitLab Personal Access Token | ✓ | ✓ |
|
|
91
|
-
| `
|
|
92
|
-
| `DOCKER_HUB_PASSWORD` | env_var | Docker Hub 密码 | ✓ | ✓ |
|
|
93
|
-
| `SSH_PRIVATE_KEY` | env_var | 服务器 SSH 私钥 | ✓ | ✓ |
|
|
212
|
+
| `SSH_PRIVATE_KEY` | env_var | 服务器 SSH 私钥(PEM 格式原始内容) | ✓ | ✓ |
|
|
94
213
|
| `TEST_SERVER_HOST` | env_var | 测试服务器地址 | ✗ | ✗ |
|
|
95
214
|
| `PROD_SERVER_HOST` | env_var | 生产服务器地址 | ✓ | ✗ |
|
|
96
|
-
| `DEV_ENV_FILE` | file | 开发环境 .env
|
|
97
|
-
| `PROD_ENV_FILE` | file | 生产环境 .env
|
|
215
|
+
| `DEV_ENV_FILE` | file | 开发环境 .env 文件内容 | ✓ | ✗ |
|
|
216
|
+
| `PROD_ENV_FILE` | file | 生产环境 .env 文件内容 | ✓ | ✗ |
|
|
217
|
+
|
|
218
|
+
**变量说明:**
|
|
219
|
+
- **Protected**:只在受保护的分支(main、develop)可用
|
|
220
|
+
- **Masked**:在日志中自动遮蔽,防止泄露
|
|
221
|
+
- **File 类型**:变量内容会写入临时文件,可直接作为 .env 使用
|
|
222
|
+
|
|
223
|
+
**使用 GitLab Container Registry 时会自动使用以下 CI 预定义变量:**
|
|
224
|
+
- `$CI_REGISTRY` - Registry URL
|
|
225
|
+
- `$CI_REGISTRY_USER` - Registry 用户名
|
|
226
|
+
- `$CI_REGISTRY_PASSWORD` - Registry 密码
|
|
227
|
+
- `$CI_REGISTRY_IMAGE` - 完整的镜像路径
|
|
98
228
|
|
|
99
|
-
|
|
229
|
+
### 3. 提交到 Git
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
# 检查生成的文件
|
|
233
|
+
git status
|
|
234
|
+
|
|
235
|
+
# 添加文件
|
|
236
|
+
git add .gitlab-ci.yml docker-compose.yml ci/
|
|
237
|
+
|
|
238
|
+
# 提交
|
|
239
|
+
git commit -m "feat: 添加 GitLab CI/CD 配置"
|
|
240
|
+
|
|
241
|
+
# 推送到 develop 分支,自动触发部署
|
|
242
|
+
git push origin develop
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
## CI/CD 工作流程
|
|
100
246
|
|
|
101
247
|
### 分支策略
|
|
102
248
|
|
|
103
|
-
|
|
104
|
-
|
|
249
|
+
```
|
|
250
|
+
main (生产环境)
|
|
251
|
+
↑
|
|
252
|
+
develop (开发环境)
|
|
253
|
+
↑
|
|
254
|
+
feature/* (功能分支)
|
|
255
|
+
```
|
|
105
256
|
|
|
106
|
-
###
|
|
257
|
+
### 自动触发规则
|
|
258
|
+
|
|
259
|
+
- **develop 分支推送** → 自动部署到开发环境
|
|
260
|
+
- **main 分支推送** → 需要在 GitLab 手动触发部署到生产环境
|
|
261
|
+
- **其他分支** → 仅运行 lint 检查
|
|
107
262
|
|
|
108
|
-
|
|
109
|
-
- NestJS: `npm run lint:check`
|
|
110
|
-
- Vue/React: `npm run type-check`
|
|
263
|
+
### Pipeline 阶段
|
|
111
264
|
|
|
112
|
-
|
|
113
|
-
- 构建镜像并推送到 Docker Hub
|
|
114
|
-
- 支持 BuildKit 缓存加速
|
|
265
|
+
#### 1. lint - 代码质量检查(所有分支)
|
|
115
266
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
267
|
+
```yaml
|
|
268
|
+
NestJS: npm run lint:check
|
|
269
|
+
Vue/React: npm run type-check
|
|
270
|
+
```
|
|
120
271
|
|
|
121
|
-
|
|
272
|
+
在 `node:20-alpine` 容器中执行,使用 npm 缓存加速。
|
|
122
273
|
|
|
123
|
-
|
|
274
|
+
#### 2. build - 构建 Docker 镜像(main/develop)
|
|
124
275
|
|
|
276
|
+
```yaml
|
|
277
|
+
- 拉取最新镜像作为缓存
|
|
278
|
+
- 使用 BuildKit 构建新镜像
|
|
279
|
+
- 推送到 GitLab Container Registry
|
|
280
|
+
- 打上 commit SHA 和 latest 标签
|
|
125
281
|
```
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
282
|
+
|
|
283
|
+
使用 Docker 缓存层加速构建,大幅减少构建时间。
|
|
284
|
+
|
|
285
|
+
#### 3. deploy - 部署到服务器(main/develop)
|
|
286
|
+
|
|
287
|
+
```yaml
|
|
288
|
+
开发环境(develop 分支):
|
|
289
|
+
- 使用 rsync 同步代码到服务器
|
|
290
|
+
- 传递 GitLab Registry 凭据
|
|
291
|
+
- 执行 ci/deploy.sh 脚本
|
|
292
|
+
- 自动部署,无需确认
|
|
293
|
+
|
|
294
|
+
生产环境(main 分支):
|
|
295
|
+
- 同样的流程
|
|
296
|
+
- 需要手动触发(when: manual)
|
|
297
|
+
- 增加安全性,避免误部署
|
|
131
298
|
```
|
|
132
299
|
|
|
133
|
-
|
|
300
|
+
**部署流程详解:**
|
|
134
301
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
302
|
+
1. **同步代码**:使用 rsync 增量同步,只传输变更的文件
|
|
303
|
+
2. **登录 Registry**:使用 GitLab 预定义变量自动登录
|
|
304
|
+
3. **生成 .env**:从 CI/CD 变量中提取环境变量文件
|
|
305
|
+
4. **停止旧容器**:docker-compose down
|
|
306
|
+
5. **拉取新镜像**:docker-compose pull
|
|
307
|
+
6. **启动新容器**:docker-compose up -d
|
|
308
|
+
7. **健康检查**:检查容器是否成功启动
|
|
138
309
|
|
|
139
310
|
## 常见问题
|
|
140
311
|
|
|
141
312
|
### 1. SSH 连接失败
|
|
142
313
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
-
|
|
314
|
+
**错误**:`Permission denied (publickey)`
|
|
315
|
+
|
|
316
|
+
**原因**:
|
|
317
|
+
- 公钥未添加到服务器
|
|
318
|
+
- 私钥格式不正确
|
|
319
|
+
- 服务器禁止 root 登录
|
|
147
320
|
|
|
148
|
-
|
|
321
|
+
**解决**:
|
|
322
|
+
```bash
|
|
323
|
+
# 1. 确认公钥已添加到服务器
|
|
324
|
+
ssh -i ~/.ssh/gitlab-ci-deploy root@服务器IP
|
|
149
325
|
|
|
150
|
-
|
|
151
|
-
-
|
|
152
|
-
|
|
153
|
-
- 网络连接
|
|
326
|
+
# 2. 确认私钥格式正确(PEM 格式)
|
|
327
|
+
head -n 1 ~/.ssh/gitlab-ci-deploy
|
|
328
|
+
# 应该显示: -----BEGIN RSA PRIVATE KEY-----
|
|
154
329
|
|
|
155
|
-
|
|
330
|
+
# 3. 如果服务器禁止 root 登录,修改 /etc/ssh/sshd_config
|
|
331
|
+
# PermitRootLogin yes
|
|
332
|
+
```
|
|
156
333
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
334
|
+
### 2. 环境变量文件未找到
|
|
335
|
+
|
|
336
|
+
**错误**:`❌ 错误: 文件 .env.dev 不存在`
|
|
337
|
+
|
|
338
|
+
**解决**:
|
|
339
|
+
```bash
|
|
340
|
+
# 从示例文件创建
|
|
341
|
+
cp .env.example .env.dev
|
|
342
|
+
cp .env.example .env.prod
|
|
343
|
+
|
|
344
|
+
# 编辑文件填写配置
|
|
345
|
+
vim .env.dev
|
|
346
|
+
vim .env.prod
|
|
347
|
+
|
|
348
|
+
# 确认文件存在
|
|
349
|
+
ls -la .env.dev .env.prod
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
### 3. GitLab Token 权限不足
|
|
353
|
+
|
|
354
|
+
**错误**:`GitLab 连接失败: Token 无效或已过期`
|
|
355
|
+
|
|
356
|
+
**原因**:
|
|
357
|
+
- Token 权限不足
|
|
358
|
+
- Token 已过期
|
|
359
|
+
- GitLab URL 不正确
|
|
360
|
+
|
|
361
|
+
**解决**:
|
|
362
|
+
1. 检查 Token 是否有 `api` 和 `write_repository` 权限
|
|
363
|
+
2. 重新创建 Token 并设置合理的过期时间
|
|
364
|
+
3. 确认 GitLab URL 格式正确(如 `https://gitlab.example.com`)
|
|
365
|
+
|
|
366
|
+
### 4. 部署后服务无法访问
|
|
367
|
+
|
|
368
|
+
**原因**:
|
|
369
|
+
- 服务器端口未开放
|
|
370
|
+
- 防火墙限制
|
|
371
|
+
- 容器未成功启动
|
|
372
|
+
- 应用内部错误
|
|
373
|
+
|
|
374
|
+
**解决**:
|
|
375
|
+
|
|
376
|
+
**方法一:使用宝塔面板配置 Nginx 反向代理(推荐)**
|
|
377
|
+
1. 登录宝塔面板
|
|
378
|
+
2. 网站 → 添加站点
|
|
379
|
+
3. 配置反向代理到 `http://localhost:端口号`
|
|
380
|
+
4. 可选:申请 SSL 证书
|
|
381
|
+
|
|
382
|
+
**方法二:手动开放端口**
|
|
383
|
+
```bash
|
|
384
|
+
# CentOS/RHEL
|
|
385
|
+
firewall-cmd --add-port=3000/tcp --permanent
|
|
386
|
+
firewall-cmd --reload
|
|
387
|
+
|
|
388
|
+
# Ubuntu/Debian
|
|
389
|
+
ufw allow 3000/tcp
|
|
390
|
+
|
|
391
|
+
# 检查端口是否开放
|
|
392
|
+
netstat -tlnp | grep 3000
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
**方法三:检查容器日志**
|
|
396
|
+
```bash
|
|
397
|
+
# SSH 到服务器
|
|
398
|
+
ssh root@服务器IP
|
|
399
|
+
|
|
400
|
+
# 进入部署目录
|
|
401
|
+
cd /www/wwwroot/your-project
|
|
402
|
+
|
|
403
|
+
# 查看容器状态
|
|
404
|
+
docker-compose ps
|
|
405
|
+
|
|
406
|
+
# 查看容器日志
|
|
407
|
+
docker-compose logs -f
|
|
408
|
+
|
|
409
|
+
# 如果容器未启动,查看详细错误
|
|
410
|
+
docker-compose up
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
### 5. 构建失败
|
|
414
|
+
|
|
415
|
+
**错误**:`ERROR: failed to solve: ...`
|
|
416
|
+
|
|
417
|
+
**原因**:
|
|
418
|
+
- Dockerfile 配置错误
|
|
419
|
+
- 依赖安装失败
|
|
420
|
+
- 网络问题
|
|
421
|
+
|
|
422
|
+
**解决**:
|
|
423
|
+
1. 检查 Dockerfile 语法
|
|
424
|
+
2. 确认 package.json 中的依赖正确
|
|
425
|
+
3. 查看 GitLab Pipeline 日志详细信息
|
|
426
|
+
4. 本地测试构建:`docker build -t test .`
|
|
427
|
+
|
|
428
|
+
### 6. 如何回滚部署?
|
|
429
|
+
|
|
430
|
+
**方法一:使用 GitLab 回滚功能**
|
|
431
|
+
1. 进入 GitLab 项目 → CI/CD → Pipelines
|
|
432
|
+
2. 找到之前成功的 Pipeline
|
|
433
|
+
3. 点击 "Retry" 按钮重新部署
|
|
434
|
+
|
|
435
|
+
**方法二:手动回滚**
|
|
436
|
+
```bash
|
|
437
|
+
# 进入 GitLab Pipeline → rollback job
|
|
438
|
+
# 手动触发回滚任务
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
**方法三:服务器上手动操作**
|
|
442
|
+
```bash
|
|
443
|
+
ssh root@服务器IP
|
|
444
|
+
cd /www/wwwroot/your-project
|
|
445
|
+
docker-compose down
|
|
446
|
+
# 修改 docker-compose.yml 中的镜像标签为之前的版本
|
|
447
|
+
docker-compose up -d
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
## 高级配置
|
|
451
|
+
|
|
452
|
+
### 自定义 Dockerfile
|
|
453
|
+
|
|
454
|
+
如果项目需要自定义 Dockerfile,在项目根目录创建,工具生成的 `docker-compose.yml` 会自动使用。
|
|
455
|
+
|
|
456
|
+
**Dockerfile 示例(NestJS):**
|
|
457
|
+
```dockerfile
|
|
458
|
+
FROM node:20-alpine AS builder
|
|
459
|
+
WORKDIR /app
|
|
460
|
+
COPY package*.json ./
|
|
461
|
+
RUN npm ci
|
|
462
|
+
COPY . .
|
|
463
|
+
RUN npm run build
|
|
464
|
+
|
|
465
|
+
FROM node:20-alpine
|
|
466
|
+
WORKDIR /app
|
|
467
|
+
COPY --from=builder /app/dist ./dist
|
|
468
|
+
COPY --from=builder /app/node_modules ./node_modules
|
|
469
|
+
COPY package*.json ./
|
|
470
|
+
EXPOSE 3000
|
|
471
|
+
CMD ["node", "dist/main"]
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
### 自定义部署脚本
|
|
475
|
+
|
|
476
|
+
生成的 `ci/deploy.sh` 可以根据需要自定义,例如:
|
|
477
|
+
- 添加数据库迁移:`npm run migration:run`
|
|
478
|
+
- 添加健康检查:`curl -f http://localhost:3000/health`
|
|
479
|
+
- 添加通知:发送企业微信/钉钉通知
|
|
480
|
+
|
|
481
|
+
### 多环境配置
|
|
482
|
+
|
|
483
|
+
如果需要更多环境(如 staging、pre-production),可以:
|
|
484
|
+
1. 创建新分支(如 `staging`)
|
|
485
|
+
2. 在 `.gitlab-ci.yml` 中添加对应的 deploy job
|
|
486
|
+
3. 在 GitLab 中添加对应的 CI/CD 变量(如 `STAGING_ENV_FILE`)
|
|
161
487
|
|
|
162
488
|
## 开发
|
|
163
489
|
|
|
164
490
|
### 本地开发
|
|
165
491
|
|
|
166
492
|
```bash
|
|
493
|
+
cd clouddreamai-cicd-setup
|
|
167
494
|
npm install
|
|
495
|
+
npm run build
|
|
168
496
|
npm run dev
|
|
169
497
|
```
|
|
170
498
|
|
|
171
|
-
###
|
|
499
|
+
### 发布到 npm
|
|
172
500
|
|
|
173
501
|
```bash
|
|
174
|
-
|
|
175
|
-
|
|
502
|
+
# 更新版本号
|
|
503
|
+
npm version patch # 或 minor, major
|
|
176
504
|
|
|
177
|
-
|
|
505
|
+
# 编译
|
|
506
|
+
npm run build
|
|
178
507
|
|
|
179
|
-
|
|
508
|
+
# 发布
|
|
180
509
|
npm publish
|
|
181
510
|
```
|
|
182
511
|
|
package/dist/cli.js
CHANGED
|
@@ -49,11 +49,14 @@ const gitlab_client_1 = require("./core/gitlab-client");
|
|
|
49
49
|
const variables_1 = require("./core/variables");
|
|
50
50
|
const template_1 = require("./utils/template");
|
|
51
51
|
const path = __importStar(require("path"));
|
|
52
|
+
const fs_1 = require("fs");
|
|
53
|
+
// 读取 package.json 获取版本号
|
|
54
|
+
const packageJson = JSON.parse((0, fs_1.readFileSync)(path.join(__dirname, '../package.json'), 'utf-8'));
|
|
52
55
|
const program = new commander_1.Command();
|
|
53
56
|
program
|
|
54
57
|
.name('cicd-setup')
|
|
55
58
|
.description('CloudDreamAI GitLab CI/CD 自动配置工具')
|
|
56
|
-
.version(
|
|
59
|
+
.version(packageJson.version);
|
|
57
60
|
program
|
|
58
61
|
.command('init')
|
|
59
62
|
.description('初始化 CI/CD 配置(交互式)')
|
|
@@ -77,7 +80,7 @@ program
|
|
|
77
80
|
// 3. 生成文件
|
|
78
81
|
spinner.start('正在生成 CI/CD 配置文件...');
|
|
79
82
|
const templateGenerator = (0, template_1.createTemplateGenerator)();
|
|
80
|
-
const generateResult = templateGenerator.generateAll(options.output, config.project.type, config.project, config.gitlab.baseUrl);
|
|
83
|
+
const generateResult = await templateGenerator.generateAll(options.output, config.project.type, config.project, config.gitlab.baseUrl, config.registry.type);
|
|
81
84
|
if (!generateResult.success) {
|
|
82
85
|
spinner.fail(chalk_1.default.red(`文件生成失败: ${generateResult.error}`));
|
|
83
86
|
process.exit(1);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;AAEA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,yCAAoC;AACpC,kDAA0B;AAC1B,8CAAsB;AACtB,6CAAwD;AACxD,wDAA0D;AAC1D,gDAA8D;AAC9D,+CAA2D;AAC3D,2CAA6B;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gitlab-client.d.ts","sourceRoot":"","sources":["../../src/core/gitlab-client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,YAAY,EACZ,aAAa,EACb,cAAc,EACd,YAAY,EACZ,SAAS,EACV,MAAM,SAAS,CAAC;AAEjB;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAe;gBAEjB,MAAM,EAAE,YAAY;
|
|
1
|
+
{"version":3,"file":"gitlab-client.d.ts","sourceRoot":"","sources":["../../src/core/gitlab-client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,YAAY,EACZ,aAAa,EACb,cAAc,EACd,YAAY,EACZ,SAAS,EACV,MAAM,SAAS,CAAC;AAEjB;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAe;gBAEjB,MAAM,EAAE,YAAY;IAchC;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,SAAS,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAYhE;;;OAGG;IACG,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAUxE;;OAEG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAS1E;;;OAGG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC;IAezE;;OAEG;IACG,YAAY,CAAC,IAAI,SAAI,EAAE,OAAO,SAAK,GAAG,OAAO,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC;IAmB/E;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC;IAS5E;;OAEG;IACG,WAAW,CACf,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAWrC;;OAEG;IACG,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,YAAY,GACrB,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAoBrC;;OAEG;IACG,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,YAAY,GACrB,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAmBrC;;OAEG;IACG,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,YAAY,GACrB,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAarC;;OAEG;IACG,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAW3B;;OAEG;IACG,oBAAoB,CACxB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,YAAY,EAAE,GACxB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,KAAK,CAAC;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IAgBhF;;OAEG;IACH,OAAO,CAAC,WAAW;CAwBpB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAErE"}
|