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/dist/utils/prompts.js
CHANGED
|
@@ -55,22 +55,22 @@ class PromptCollector {
|
|
|
55
55
|
console.log('\n🚀 CloudDreamAI CI/CD 自动配置工具\n');
|
|
56
56
|
// 1. GitLab 配置
|
|
57
57
|
const gitlabConfig = await this.collectGitLabConfig();
|
|
58
|
-
// 2.
|
|
59
|
-
const
|
|
60
|
-
// 3.
|
|
58
|
+
// 2. 镜像仓库配置
|
|
59
|
+
const registryConfig = await this.collectRegistryConfig(gitlabConfig.baseUrl);
|
|
60
|
+
// 3. 项目配置
|
|
61
|
+
const projectConfig = await this.collectProjectConfig(registryConfig);
|
|
62
|
+
// 4. 服务器配置
|
|
61
63
|
const serverConfig = await this.collectServerConfig();
|
|
62
|
-
//
|
|
63
|
-
const
|
|
64
|
-
// 5. SSH 私钥
|
|
65
|
-
const sshPrivateKey = await this.collectSSHKey();
|
|
64
|
+
// 5. SSH 密码
|
|
65
|
+
const sshPassword = await this.collectSSHPassword();
|
|
66
66
|
// 6. 环境变量文件
|
|
67
67
|
const envFiles = await this.collectEnvFiles();
|
|
68
68
|
return {
|
|
69
69
|
gitlab: gitlabConfig,
|
|
70
70
|
project: projectConfig,
|
|
71
71
|
server: serverConfig,
|
|
72
|
-
|
|
73
|
-
|
|
72
|
+
registry: registryConfig,
|
|
73
|
+
sshPassword,
|
|
74
74
|
...envFiles,
|
|
75
75
|
};
|
|
76
76
|
}
|
|
@@ -103,10 +103,78 @@ class PromptCollector {
|
|
|
103
103
|
]);
|
|
104
104
|
return answers;
|
|
105
105
|
}
|
|
106
|
+
/**
|
|
107
|
+
* 收集镜像仓库配置
|
|
108
|
+
*/
|
|
109
|
+
async collectRegistryConfig(gitlabUrl) {
|
|
110
|
+
console.log('\n📦 镜像仓库配置\n');
|
|
111
|
+
const { registryType } = await inquirer_1.default.prompt([
|
|
112
|
+
{
|
|
113
|
+
type: 'list',
|
|
114
|
+
name: 'registryType',
|
|
115
|
+
message: '选择镜像仓库类型:',
|
|
116
|
+
choices: [
|
|
117
|
+
{
|
|
118
|
+
name: 'GitLab Container Registry(推荐,无需额外配置)',
|
|
119
|
+
value: 'gitlab',
|
|
120
|
+
},
|
|
121
|
+
{ name: '自建 Docker Registry', value: 'custom' },
|
|
122
|
+
{ name: '不使用 Registry(服务器本地构建)', value: 'none' },
|
|
123
|
+
],
|
|
124
|
+
default: 'gitlab',
|
|
125
|
+
},
|
|
126
|
+
]);
|
|
127
|
+
// 根据类型收集不同的配置
|
|
128
|
+
if (registryType === 'gitlab') {
|
|
129
|
+
// GitLab Registry 无需额外配置,使用预定义变量
|
|
130
|
+
const registryUrl = gitlabUrl.replace(/^https?:\/\//, '') + ':5050';
|
|
131
|
+
console.log(`\n✅ 将使用 GitLab Container Registry: ${registryUrl}`);
|
|
132
|
+
console.log(' 使用 GitLab CI/CD 预定义变量,无需额外配置\n');
|
|
133
|
+
return {
|
|
134
|
+
type: 'gitlab',
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
else if (registryType === 'custom') {
|
|
138
|
+
console.log('\n🏗️ 自建 Registry 配置\n');
|
|
139
|
+
const customConfig = await inquirer_1.default.prompt([
|
|
140
|
+
{
|
|
141
|
+
type: 'input',
|
|
142
|
+
name: 'url',
|
|
143
|
+
message: 'Registry URL (如 registry.example.com:5000):',
|
|
144
|
+
validate: (input) => (input ? true : '请输入 Registry URL'),
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
type: 'input',
|
|
148
|
+
name: 'username',
|
|
149
|
+
message: 'Registry 用户名:',
|
|
150
|
+
validate: (input) => (input ? true : '请输入用户名'),
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
type: 'input',
|
|
154
|
+
name: 'password',
|
|
155
|
+
message: 'Registry 密码:',
|
|
156
|
+
validate: (input) => (input ? true : '请输入密码'),
|
|
157
|
+
},
|
|
158
|
+
]);
|
|
159
|
+
return {
|
|
160
|
+
type: 'custom',
|
|
161
|
+
url: customConfig.url,
|
|
162
|
+
username: customConfig.username,
|
|
163
|
+
password: customConfig.password,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
// none
|
|
168
|
+
console.log('\n⚠️ 不使用镜像仓库,将在服务器上本地构建镜像\n');
|
|
169
|
+
return {
|
|
170
|
+
type: 'none',
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
}
|
|
106
174
|
/**
|
|
107
175
|
* 收集项目配置
|
|
108
176
|
*/
|
|
109
|
-
async collectProjectConfig() {
|
|
177
|
+
async collectProjectConfig(registryConfig) {
|
|
110
178
|
console.log('\n🔧 项目配置\n');
|
|
111
179
|
const answers = await inquirer_1.default.prompt([
|
|
112
180
|
{
|
|
@@ -133,32 +201,6 @@ class PromptCollector {
|
|
|
133
201
|
{ name: 'Node.js 通用', value: 'node' },
|
|
134
202
|
],
|
|
135
203
|
},
|
|
136
|
-
{
|
|
137
|
-
type: 'input',
|
|
138
|
-
name: 'dockerImage',
|
|
139
|
-
message: 'Docker Hub 镜像名称 (格式: username/image):',
|
|
140
|
-
validate: (input) => {
|
|
141
|
-
if (!input)
|
|
142
|
-
return '请输入镜像名称';
|
|
143
|
-
if (!input.includes('/')) {
|
|
144
|
-
return '格式错误,应为 username/image-name';
|
|
145
|
-
}
|
|
146
|
-
return true;
|
|
147
|
-
},
|
|
148
|
-
},
|
|
149
|
-
{
|
|
150
|
-
type: 'input',
|
|
151
|
-
name: 'deployDir',
|
|
152
|
-
message: '部署目录 (服务器上的绝对路径):',
|
|
153
|
-
default: (answers) => `/www/wwwroot/${answers.name}`,
|
|
154
|
-
validate: (input) => {
|
|
155
|
-
if (!input)
|
|
156
|
-
return '请输入部署目录';
|
|
157
|
-
if (!input.startsWith('/'))
|
|
158
|
-
return '必须是绝对路径';
|
|
159
|
-
return true;
|
|
160
|
-
},
|
|
161
|
-
},
|
|
162
204
|
{
|
|
163
205
|
type: 'number',
|
|
164
206
|
name: 'devPort',
|
|
@@ -198,165 +240,168 @@ class PromptCollector {
|
|
|
198
240
|
default: '',
|
|
199
241
|
},
|
|
200
242
|
]);
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
243
|
+
// 自动生成部署目录和镜像名称
|
|
244
|
+
const projectName = answers.name;
|
|
245
|
+
answers.deployDir = `/www/wwwroot/${projectName}`;
|
|
246
|
+
answers.dockerImage = registryConfig.type === 'gitlab' ? '' : projectName;
|
|
247
|
+
console.log(`\n✓ 部署目录: ${answers.deployDir}`);
|
|
248
|
+
if (answers.dockerImage) {
|
|
249
|
+
console.log(`✓ 镜像名称: ${answers.dockerImage}\n`);
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
console.log(`✓ 镜像名称: 使用 GitLab 项目路径\n`);
|
|
253
|
+
}
|
|
254
|
+
// 询问是否配置 Nginx 反向代理
|
|
255
|
+
console.log('\n📝 Nginx 反向代理配置(可选)\n');
|
|
256
|
+
const nginxConfig = await inquirer_1.default.prompt([
|
|
209
257
|
{
|
|
210
258
|
type: 'confirm',
|
|
211
|
-
name: '
|
|
212
|
-
message: '
|
|
259
|
+
name: 'configureNginx',
|
|
260
|
+
message: '是否自动配置宝塔 Nginx 反向代理?',
|
|
213
261
|
default: true,
|
|
214
262
|
},
|
|
215
263
|
{
|
|
216
264
|
type: 'input',
|
|
217
|
-
name: '
|
|
218
|
-
message: '
|
|
219
|
-
|
|
265
|
+
name: 'devDomain',
|
|
266
|
+
message: '开发环境域名 (如 backend-test.example.com):',
|
|
267
|
+
when: (answers) => answers.configureNginx,
|
|
268
|
+
validate: (input) => {
|
|
269
|
+
if (!input)
|
|
270
|
+
return '请输入开发环境域名';
|
|
271
|
+
if (!/^[a-z0-9.-]+$/.test(input)) {
|
|
272
|
+
return '域名只能包含小写字母、数字、点和连字符';
|
|
273
|
+
}
|
|
274
|
+
return true;
|
|
275
|
+
},
|
|
220
276
|
},
|
|
221
277
|
{
|
|
222
278
|
type: 'input',
|
|
223
|
-
name: '
|
|
224
|
-
message: '
|
|
225
|
-
|
|
226
|
-
validate: (input) =>
|
|
279
|
+
name: 'prodDomain',
|
|
280
|
+
message: '生产环境域名 (如 backend.example.com):',
|
|
281
|
+
when: (answers) => answers.configureNginx,
|
|
282
|
+
validate: (input) => {
|
|
283
|
+
if (!input)
|
|
284
|
+
return '请输入生产环境域名';
|
|
285
|
+
if (!/^[a-z0-9.-]+$/.test(input)) {
|
|
286
|
+
return '域名只能包含小写字母、数字、点和连字符';
|
|
287
|
+
}
|
|
288
|
+
return true;
|
|
289
|
+
},
|
|
227
290
|
},
|
|
228
291
|
]);
|
|
229
|
-
return answers;
|
|
292
|
+
return { ...answers, ...nginxConfig };
|
|
230
293
|
}
|
|
231
294
|
/**
|
|
232
|
-
*
|
|
295
|
+
* 收集服务器配置(默认单服务器模式)
|
|
233
296
|
*/
|
|
234
|
-
async
|
|
235
|
-
console.log('\n
|
|
297
|
+
async collectServerConfig() {
|
|
298
|
+
console.log('\n🖥️ 服务器配置\n');
|
|
299
|
+
console.log('ℹ️ 使用单服务器模式(开发和生产环境在同一台服务器)\n');
|
|
236
300
|
const answers = await inquirer_1.default.prompt([
|
|
237
301
|
{
|
|
238
302
|
type: 'input',
|
|
239
|
-
name: '
|
|
240
|
-
message: '
|
|
241
|
-
validate: (input) => (input ? true : '
|
|
242
|
-
},
|
|
243
|
-
{
|
|
244
|
-
type: 'input',
|
|
245
|
-
name: 'password',
|
|
246
|
-
message: 'Docker Hub 密码或 Access Token:',
|
|
247
|
-
validate: (input) => (input ? true : '请输入密码'),
|
|
303
|
+
name: 'testServerHost',
|
|
304
|
+
message: '服务器地址 (IP 或域名):',
|
|
305
|
+
validate: (input) => (input ? true : '请输入服务器地址'),
|
|
248
306
|
},
|
|
249
307
|
]);
|
|
250
|
-
|
|
308
|
+
// 默认单服务器模式,开发和生产使用同一台服务器
|
|
309
|
+
return {
|
|
310
|
+
singleServer: true,
|
|
311
|
+
testServerHost: answers.testServerHost,
|
|
312
|
+
prodServerHost: answers.testServerHost,
|
|
313
|
+
};
|
|
251
314
|
}
|
|
252
315
|
/**
|
|
253
|
-
* 收集 SSH
|
|
316
|
+
* 收集 SSH 密码
|
|
254
317
|
*/
|
|
255
|
-
async
|
|
256
|
-
console.log('\n🔑 SSH
|
|
257
|
-
const {
|
|
318
|
+
async collectSSHPassword() {
|
|
319
|
+
console.log('\n🔑 SSH 密码配置\n');
|
|
320
|
+
const { password } = await inquirer_1.default.prompt([
|
|
258
321
|
{
|
|
259
|
-
type: '
|
|
260
|
-
name: '
|
|
261
|
-
message: '
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
322
|
+
type: 'password',
|
|
323
|
+
name: 'password',
|
|
324
|
+
message: '服务器 SSH 密码:',
|
|
325
|
+
validate: (input) => {
|
|
326
|
+
if (!input)
|
|
327
|
+
return '请输入 SSH 密码';
|
|
328
|
+
return true;
|
|
329
|
+
},
|
|
266
330
|
},
|
|
267
331
|
]);
|
|
268
|
-
|
|
269
|
-
const { filePath } = await inquirer_1.default.prompt([
|
|
270
|
-
{
|
|
271
|
-
type: 'input',
|
|
272
|
-
name: 'filePath',
|
|
273
|
-
message: 'SSH 私钥文件路径:',
|
|
274
|
-
default: '~/.ssh/id_rsa',
|
|
275
|
-
validate: (input) => {
|
|
276
|
-
const expandedPath = input.replace(/^~/, process.env.HOME || '~');
|
|
277
|
-
if (!fs.existsSync(expandedPath)) {
|
|
278
|
-
return '文件不存在';
|
|
279
|
-
}
|
|
280
|
-
return true;
|
|
281
|
-
},
|
|
282
|
-
},
|
|
283
|
-
]);
|
|
284
|
-
const expandedPath = filePath.replace(/^~/, process.env.HOME || '~');
|
|
285
|
-
return fs.readFileSync(expandedPath, 'utf-8');
|
|
286
|
-
}
|
|
287
|
-
else {
|
|
288
|
-
const { key } = await inquirer_1.default.prompt([
|
|
289
|
-
{
|
|
290
|
-
type: 'editor',
|
|
291
|
-
name: 'key',
|
|
292
|
-
message: '请在编辑器中粘贴 SSH 私钥内容 (保存并关闭编辑器):',
|
|
293
|
-
validate: (input) => {
|
|
294
|
-
if (!input)
|
|
295
|
-
return '请提供 SSH 私钥';
|
|
296
|
-
if (!input.includes('PRIVATE KEY')) {
|
|
297
|
-
return 'SSH 私钥格式不正确';
|
|
298
|
-
}
|
|
299
|
-
return true;
|
|
300
|
-
},
|
|
301
|
-
},
|
|
302
|
-
]);
|
|
303
|
-
return key;
|
|
304
|
-
}
|
|
332
|
+
return password;
|
|
305
333
|
}
|
|
306
334
|
/**
|
|
307
|
-
*
|
|
335
|
+
* 收集环境变量文件(必需)
|
|
308
336
|
*/
|
|
309
337
|
async collectEnvFiles() {
|
|
310
|
-
console.log('\n📄
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
]);
|
|
319
|
-
if (!includeEnvFiles) {
|
|
320
|
-
return {};
|
|
338
|
+
console.log('\n📄 环境变量文件配置(必需)\n');
|
|
339
|
+
console.log('⚠️ NestJS 项目需要 .env 文件来配置数据库、密钥等信息');
|
|
340
|
+
console.log(' 请确保已创建 .env.dev 和 .env.prod 文件\n');
|
|
341
|
+
// 检查是否存在 .env.example
|
|
342
|
+
const envExampleExists = fs.existsSync('.env.example');
|
|
343
|
+
if (!envExampleExists) {
|
|
344
|
+
console.log('⚠️ 未找到 .env.example 文件');
|
|
345
|
+
console.log(' 建议创建 .env.example 作为环境变量模板\n');
|
|
321
346
|
}
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
console.log('\n⚠️ 跳过 .env 文件配置,请稍后在 GitLab CI/CD 变量中手动添加');
|
|
335
|
-
return {};
|
|
347
|
+
// 强制要求提供环境变量文件
|
|
348
|
+
const devEnvFile = await this.readEnvFile('开发环境', '.env.dev', true);
|
|
349
|
+
const prodEnvFile = await this.readEnvFile('生产环境', '.env.prod', true);
|
|
350
|
+
if (!devEnvFile || !prodEnvFile) {
|
|
351
|
+
console.log('\n❌ 环境变量文件配置不完整');
|
|
352
|
+
console.log('请创建以下文件后重新运行:');
|
|
353
|
+
if (!devEnvFile)
|
|
354
|
+
console.log(' - .env.dev');
|
|
355
|
+
if (!prodEnvFile)
|
|
356
|
+
console.log(' - .env.prod');
|
|
357
|
+
console.log('\n提示: 可以从 .env.example 复制并修改\n');
|
|
358
|
+
process.exit(1);
|
|
336
359
|
}
|
|
337
|
-
const devEnvFile = await this.readEnvFile('开发环境', '.env.dev');
|
|
338
|
-
const prodEnvFile = await this.readEnvFile('生产环境', '.env.prod');
|
|
339
360
|
return { devEnvFile, prodEnvFile };
|
|
340
361
|
}
|
|
341
362
|
/**
|
|
342
363
|
* 读取环境变量文件
|
|
343
364
|
*/
|
|
344
|
-
async readEnvFile(envName, defaultPath) {
|
|
365
|
+
async readEnvFile(envName, defaultPath, required = false) {
|
|
345
366
|
const { filePath } = await inquirer_1.default.prompt([
|
|
346
367
|
{
|
|
347
368
|
type: 'input',
|
|
348
369
|
name: 'filePath',
|
|
349
|
-
message:
|
|
370
|
+
message: required
|
|
371
|
+
? `${envName} .env 文件路径 (必需):`
|
|
372
|
+
: `${envName} .env 文件路径 (回车跳过):`,
|
|
350
373
|
default: defaultPath,
|
|
374
|
+
validate: (input) => {
|
|
375
|
+
if (required && !input) {
|
|
376
|
+
return '此文件为必需,请提供文件路径';
|
|
377
|
+
}
|
|
378
|
+
if (input && !fs.existsSync(input)) {
|
|
379
|
+
return `文件 ${input} 不存在,请检查路径`;
|
|
380
|
+
}
|
|
381
|
+
return true;
|
|
382
|
+
},
|
|
351
383
|
},
|
|
352
384
|
]);
|
|
353
|
-
if (!filePath)
|
|
385
|
+
if (!filePath) {
|
|
354
386
|
return undefined;
|
|
387
|
+
}
|
|
355
388
|
if (!fs.existsSync(filePath)) {
|
|
389
|
+
if (required) {
|
|
390
|
+
console.log(`\n❌ 错误: 文件 ${filePath} 不存在`);
|
|
391
|
+
// 如果是默认路径且存在 .env.example,提示用户创建
|
|
392
|
+
if (filePath === defaultPath && fs.existsSync('.env.example')) {
|
|
393
|
+
console.log(`\n提示: 你可以运行以下命令创建文件:`);
|
|
394
|
+
console.log(` cp .env.example ${filePath}`);
|
|
395
|
+
console.log(` 然后编辑 ${filePath} 填写${envName}的配置\n`);
|
|
396
|
+
}
|
|
397
|
+
return undefined;
|
|
398
|
+
}
|
|
356
399
|
console.log(`⚠️ 文件 ${filePath} 不存在,跳过`);
|
|
357
400
|
return undefined;
|
|
358
401
|
}
|
|
359
|
-
|
|
402
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
403
|
+
console.log(`✓ 成功读取 ${filePath} (${content.split('\n').length} 行)`);
|
|
404
|
+
return content;
|
|
360
405
|
}
|
|
361
406
|
}
|
|
362
407
|
exports.PromptCollector = PromptCollector;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/utils/prompts.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/utils/prompts.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/template.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* CloudDreamAI CI/CD Setup - 模板生成器
|
|
3
3
|
* 负责读取模板文件并替换占位符生成最终文件
|
|
4
4
|
*/
|
|
5
|
-
import { ProjectConfig, ProjectType } from '../core/types';
|
|
5
|
+
import { ProjectConfig, ProjectType, RegistryType } from '../core/types';
|
|
6
6
|
/**
|
|
7
7
|
* 模板生成器
|
|
8
8
|
*/
|
|
@@ -12,7 +12,7 @@ export declare class TemplateGenerator {
|
|
|
12
12
|
/**
|
|
13
13
|
* 生成 .gitlab-ci.yml 文件内容
|
|
14
14
|
*/
|
|
15
|
-
generateGitLabCI(projectType: ProjectType, config: ProjectConfig, gitlabHost: string): string;
|
|
15
|
+
generateGitLabCI(projectType: ProjectType, config: ProjectConfig, gitlabHost: string, registryType: RegistryType): string;
|
|
16
16
|
/**
|
|
17
17
|
* 生成 deploy.sh 脚本内容
|
|
18
18
|
*/
|
|
@@ -21,23 +21,31 @@ export declare class TemplateGenerator {
|
|
|
21
21
|
* 生成 generate-env.sh 脚本内容
|
|
22
22
|
*/
|
|
23
23
|
generateEnvScript(config: ProjectConfig): string;
|
|
24
|
+
/**
|
|
25
|
+
* 生成 docker-compose.yml 文件内容
|
|
26
|
+
*/
|
|
27
|
+
generateDockerCompose(projectType: ProjectType, config: ProjectConfig): string;
|
|
24
28
|
/**
|
|
25
29
|
* 生成所有文件到指定目录
|
|
26
30
|
*/
|
|
27
|
-
generateAll(outputDir: string, projectType: ProjectType, config: ProjectConfig, gitlabHost: string): {
|
|
31
|
+
generateAll(outputDir: string, projectType: ProjectType, config: ProjectConfig, gitlabHost: string, registryType: RegistryType): Promise<{
|
|
28
32
|
success: boolean;
|
|
29
33
|
files: string[];
|
|
30
34
|
error?: string;
|
|
31
|
-
}
|
|
35
|
+
}>;
|
|
32
36
|
/**
|
|
33
37
|
* 替换模板中的占位符
|
|
34
38
|
* 占位符格式:{{VARIABLE_NAME}}
|
|
35
39
|
*/
|
|
36
40
|
private replacePlaceholders;
|
|
37
41
|
/**
|
|
38
|
-
*
|
|
42
|
+
* 根据项目类型和 Registry 类型获取模板名称
|
|
39
43
|
*/
|
|
40
44
|
private getTemplateNameByType;
|
|
45
|
+
/**
|
|
46
|
+
* 根据项目类型获取 docker-compose 模板名称
|
|
47
|
+
*/
|
|
48
|
+
private getDockerComposeTemplate;
|
|
41
49
|
/**
|
|
42
50
|
* 根据项目类型获取 lint 命令
|
|
43
51
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/utils/template.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,aAAa,EAAE,WAAW,EAAqB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/utils/template.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,aAAa,EAAE,WAAW,EAAqB,YAAY,EAAE,MAAM,eAAe,CAAC;AAE5F;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,YAAY,CAAS;;IAO7B;;OAEG;IACH,gBAAgB,CACd,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,YAAY,GACzB,MAAM;IA8BT;;OAEG;IACH,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM;IAgBnD;;OAEG;IACH,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM;IAehD;;OAEG;IACH,qBAAqB,CACnB,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,aAAa,GACpB,MAAM;IAqBT;;OAEG;IACG,WAAW,CACf,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAqFjE;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAc3B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAoB7B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAWhC;;OAEG;IACH,OAAO,CAAC,cAAc;CAUvB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,iBAAiB,CAE3D"}
|