clouddreamai-cicd-setup 1.0.0
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 +189 -0
- package/bin/cicd-setup.js +3 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +187 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/gitlab-client.d.ts +80 -0
- package/dist/core/gitlab-client.d.ts.map +1 -0
- package/dist/core/gitlab-client.js +252 -0
- package/dist/core/gitlab-client.js.map +1 -0
- package/dist/core/types.d.ts +152 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +6 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/variables.d.ts +50 -0
- package/dist/core/variables.d.ts.map +1 -0
- package/dist/core/variables.js +243 -0
- package/dist/core/variables.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/prompts.d.ts +47 -0
- package/dist/utils/prompts.d.ts.map +1 -0
- package/dist/utils/prompts.js +369 -0
- package/dist/utils/prompts.js.map +1 -0
- package/dist/utils/template.d.ts +50 -0
- package/dist/utils/template.d.ts.map +1 -0
- package/dist/utils/template.js +189 -0
- package/dist/utils/template.js.map +1 -0
- package/package.json +50 -0
- package/templates/gitlab-ci/nestjs.yml +167 -0
- package/templates/gitlab-ci/vue.yml +167 -0
- package/templates/scripts/deploy.sh +141 -0
- package/templates/scripts/generate-env.sh +84 -0
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CloudDreamAI CI/CD Setup - GitLab API 客户端
|
|
4
|
+
*/
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.GitLabClient = void 0;
|
|
10
|
+
exports.createGitLabClient = createGitLabClient;
|
|
11
|
+
const axios_1 = __importDefault(require("axios"));
|
|
12
|
+
/**
|
|
13
|
+
* GitLab API 客户端
|
|
14
|
+
* 封装 GitLab REST API 调用
|
|
15
|
+
*/
|
|
16
|
+
class GitLabClient {
|
|
17
|
+
constructor(config) {
|
|
18
|
+
this.config = config;
|
|
19
|
+
// 确保 baseUrl 格式正确
|
|
20
|
+
const baseUrl = config.baseUrl.replace(/\/$/, '');
|
|
21
|
+
this.client = axios_1.default.create({
|
|
22
|
+
baseURL: `${baseUrl}/api/v4`,
|
|
23
|
+
headers: {
|
|
24
|
+
'PRIVATE-TOKEN': config.token,
|
|
25
|
+
'Content-Type': 'application/json',
|
|
26
|
+
},
|
|
27
|
+
// 忽略 SSL 证书验证(自签名证书)
|
|
28
|
+
httpsAgent: new (require('https').Agent)({
|
|
29
|
+
rejectUnauthorized: false,
|
|
30
|
+
}),
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 测试连接和 Token 有效性
|
|
35
|
+
*/
|
|
36
|
+
async testConnection() {
|
|
37
|
+
try {
|
|
38
|
+
const response = await this.client.get('/user');
|
|
39
|
+
return {
|
|
40
|
+
success: true,
|
|
41
|
+
data: { username: response.data.username },
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
return this.handleError(error, '连接测试失败');
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 获取项目信息
|
|
50
|
+
* @param projectPath 项目路径,如 "group/project-name"
|
|
51
|
+
*/
|
|
52
|
+
async getProject(projectPath) {
|
|
53
|
+
try {
|
|
54
|
+
const encodedPath = encodeURIComponent(projectPath);
|
|
55
|
+
const response = await this.client.get(`/projects/${encodedPath}`);
|
|
56
|
+
return { success: true, data: response.data };
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
return this.handleError(error, `获取项目 ${projectPath} 失败`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 根据项目 ID 获取项目信息
|
|
64
|
+
*/
|
|
65
|
+
async getProjectById(projectId) {
|
|
66
|
+
try {
|
|
67
|
+
const response = await this.client.get(`/projects/${projectId}`);
|
|
68
|
+
return { success: true, data: response.data };
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
return this.handleError(error, `获取项目 ID ${projectId} 失败`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* 搜索项目
|
|
76
|
+
* @param search 搜索关键词
|
|
77
|
+
*/
|
|
78
|
+
async searchProjects(search) {
|
|
79
|
+
try {
|
|
80
|
+
const response = await this.client.get('/projects', {
|
|
81
|
+
params: {
|
|
82
|
+
search,
|
|
83
|
+
membership: true,
|
|
84
|
+
per_page: 20,
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
return { success: true, data: response.data };
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
return this.handleError(error, '搜索项目失败');
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* 列出用户有权限的所有项目
|
|
95
|
+
*/
|
|
96
|
+
async listProjects(page = 1, perPage = 20) {
|
|
97
|
+
try {
|
|
98
|
+
const response = await this.client.get('/projects', {
|
|
99
|
+
params: {
|
|
100
|
+
membership: true,
|
|
101
|
+
page,
|
|
102
|
+
per_page: perPage,
|
|
103
|
+
order_by: 'last_activity_at',
|
|
104
|
+
sort: 'desc',
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
return { success: true, data: response.data };
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
return this.handleError(error, '获取项目列表失败');
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// ============ CI/CD 变量管理 ============
|
|
114
|
+
/**
|
|
115
|
+
* 获取项目的所有 CI/CD 变量
|
|
116
|
+
*/
|
|
117
|
+
async listVariables(projectId) {
|
|
118
|
+
try {
|
|
119
|
+
const response = await this.client.get(`/projects/${projectId}/variables`);
|
|
120
|
+
return { success: true, data: response.data };
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
return this.handleError(error, '获取变量列表失败');
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* 获取单个变量
|
|
128
|
+
*/
|
|
129
|
+
async getVariable(projectId, key) {
|
|
130
|
+
try {
|
|
131
|
+
const response = await this.client.get(`/projects/${projectId}/variables/${encodeURIComponent(key)}`);
|
|
132
|
+
return { success: true, data: response.data };
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
return this.handleError(error, `获取变量 ${key} 失败`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* 创建 CI/CD 变量
|
|
140
|
+
*/
|
|
141
|
+
async createVariable(projectId, variable) {
|
|
142
|
+
try {
|
|
143
|
+
const response = await this.client.post(`/projects/${projectId}/variables`, {
|
|
144
|
+
key: variable.key,
|
|
145
|
+
value: variable.value,
|
|
146
|
+
variable_type: variable.variable_type || 'env_var',
|
|
147
|
+
protected: variable.protected ?? false,
|
|
148
|
+
masked: variable.masked ?? false,
|
|
149
|
+
environment_scope: variable.environment_scope || '*',
|
|
150
|
+
description: variable.description,
|
|
151
|
+
});
|
|
152
|
+
return { success: true, data: response.data };
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
return this.handleError(error, `创建变量 ${variable.key} 失败`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* 更新 CI/CD 变量
|
|
160
|
+
*/
|
|
161
|
+
async updateVariable(projectId, variable) {
|
|
162
|
+
try {
|
|
163
|
+
const response = await this.client.put(`/projects/${projectId}/variables/${encodeURIComponent(variable.key)}`, {
|
|
164
|
+
value: variable.value,
|
|
165
|
+
variable_type: variable.variable_type || 'env_var',
|
|
166
|
+
protected: variable.protected ?? false,
|
|
167
|
+
masked: variable.masked ?? false,
|
|
168
|
+
environment_scope: variable.environment_scope || '*',
|
|
169
|
+
description: variable.description,
|
|
170
|
+
});
|
|
171
|
+
return { success: true, data: response.data };
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
return this.handleError(error, `更新变量 ${variable.key} 失败`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* 创建或更新变量(如果存在则更新,不存在则创建)
|
|
179
|
+
*/
|
|
180
|
+
async upsertVariable(projectId, variable) {
|
|
181
|
+
// 先尝试获取变量
|
|
182
|
+
const existing = await this.getVariable(projectId, variable.key);
|
|
183
|
+
if (existing.success) {
|
|
184
|
+
// 变量已存在,更新
|
|
185
|
+
return this.updateVariable(projectId, variable);
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
// 变量不存在,创建
|
|
189
|
+
return this.createVariable(projectId, variable);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* 删除 CI/CD 变量
|
|
194
|
+
*/
|
|
195
|
+
async deleteVariable(projectId, key) {
|
|
196
|
+
try {
|
|
197
|
+
await this.client.delete(`/projects/${projectId}/variables/${encodeURIComponent(key)}`);
|
|
198
|
+
return { success: true };
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
return this.handleError(error, `删除变量 ${key} 失败`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* 批量创建或更新变量
|
|
206
|
+
*/
|
|
207
|
+
async batchUpsertVariables(projectId, variables) {
|
|
208
|
+
const success = [];
|
|
209
|
+
const failed = [];
|
|
210
|
+
for (const variable of variables) {
|
|
211
|
+
const result = await this.upsertVariable(projectId, variable);
|
|
212
|
+
if (result.success) {
|
|
213
|
+
success.push(variable.key);
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
failed.push({ key: variable.key, error: result.error || '未知错误' });
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return { success, failed };
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* 统一错误处理
|
|
223
|
+
*/
|
|
224
|
+
handleError(error, context) {
|
|
225
|
+
if (axios_1.default.isAxiosError(error)) {
|
|
226
|
+
const axiosError = error;
|
|
227
|
+
const status = axiosError.response?.status;
|
|
228
|
+
const message = axiosError.response?.data?.message ||
|
|
229
|
+
axiosError.response?.data?.error ||
|
|
230
|
+
axiosError.message;
|
|
231
|
+
if (status === 401) {
|
|
232
|
+
return { success: false, error: `${context}: Token 无效或已过期` };
|
|
233
|
+
}
|
|
234
|
+
if (status === 403) {
|
|
235
|
+
return { success: false, error: `${context}: 权限不足` };
|
|
236
|
+
}
|
|
237
|
+
if (status === 404) {
|
|
238
|
+
return { success: false, error: `${context}: 资源不存在` };
|
|
239
|
+
}
|
|
240
|
+
return { success: false, error: `${context}: ${message}` };
|
|
241
|
+
}
|
|
242
|
+
return { success: false, error: `${context}: ${String(error)}` };
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
exports.GitLabClient = GitLabClient;
|
|
246
|
+
/**
|
|
247
|
+
* 创建 GitLab 客户端实例
|
|
248
|
+
*/
|
|
249
|
+
function createGitLabClient(config) {
|
|
250
|
+
return new GitLabClient(config);
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=gitlab-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitlab-client.js","sourceRoot":"","sources":["../../src/core/gitlab-client.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;AAiSH,gDAEC;AAjSD,kDAAyD;AASzD;;;GAGG;AACH,MAAa,YAAY;IAIvB,YAAY,MAAoB;QAC9B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,kBAAkB;QAClB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAElD,IAAI,CAAC,MAAM,GAAG,eAAK,CAAC,MAAM,CAAC;YACzB,OAAO,EAAE,GAAG,OAAO,SAAS;YAC5B,OAAO,EAAE;gBACP,eAAe,EAAE,MAAM,CAAC,KAAK;gBAC7B,cAAc,EAAE,kBAAkB;aACnC;YACD,qBAAqB;YACrB,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC;gBACvC,kBAAkB,EAAE,KAAK;aAC1B,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc;QAClB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAChD,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE;aAC3C,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CAAC,WAAmB;QAClC,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;YACpD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,WAAW,EAAE,CAAC,CAAC;YACnE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,WAAW,KAAK,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,SAAiB;QACpC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,SAAS,EAAE,CAAC,CAAC;YACjE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,SAAS,KAAK,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc,CAAC,MAAc;QACjC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE;gBAClD,MAAM,EAAE;oBACN,MAAM;oBACN,UAAU,EAAE,IAAI;oBAChB,QAAQ,EAAE,EAAE;iBACb;aACF,CAAC,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,EAAE,OAAO,GAAG,EAAE;QACvC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE;gBAClD,MAAM,EAAE;oBACN,UAAU,EAAE,IAAI;oBAChB,IAAI;oBACJ,QAAQ,EAAE,OAAO;oBACjB,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,MAAM;iBACb;aACF,CAAC,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,uCAAuC;IAEvC;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,SAAiB;QACnC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,SAAS,YAAY,CAAC,CAAC;YAC3E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CACf,SAAiB,EACjB,GAAW;QAEX,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CACpC,aAAa,SAAS,cAAc,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAC9D,CAAC;YACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,KAAK,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAClB,SAAiB,EACjB,QAAsB;QAEtB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACrC,aAAa,SAAS,YAAY,EAClC;gBACE,GAAG,EAAE,QAAQ,CAAC,GAAG;gBACjB,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,aAAa,EAAE,QAAQ,CAAC,aAAa,IAAI,SAAS;gBAClD,SAAS,EAAE,QAAQ,CAAC,SAAS,IAAI,KAAK;gBACtC,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,KAAK;gBAChC,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,IAAI,GAAG;gBACpD,WAAW,EAAE,QAAQ,CAAC,WAAW;aAClC,CACF,CAAC;YACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,QAAQ,CAAC,GAAG,KAAK,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAClB,SAAiB,EACjB,QAAsB;QAEtB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CACpC,aAAa,SAAS,cAAc,kBAAkB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EACtE;gBACE,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,aAAa,EAAE,QAAQ,CAAC,aAAa,IAAI,SAAS;gBAClD,SAAS,EAAE,QAAQ,CAAC,SAAS,IAAI,KAAK;gBACtC,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,KAAK;gBAChC,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,IAAI,GAAG;gBACpD,WAAW,EAAE,QAAQ,CAAC,WAAW;aAClC,CACF,CAAC;YACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,QAAQ,CAAC,GAAG,KAAK,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAClB,SAAiB,EACjB,QAAsB;QAEtB,UAAU;QACV,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;QAEjE,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,WAAW;YACX,OAAO,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAClD,CAAC;aAAM,CAAC;YACN,WAAW;YACX,OAAO,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAClB,SAAiB,EACjB,GAAW;QAEX,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CACtB,aAAa,SAAS,cAAc,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAC9D,CAAC;YACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,KAAK,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,oBAAoB,CACxB,SAAiB,EACjB,SAAyB;QAEzB,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,MAAM,GAA0C,EAAE,CAAC;QAEzD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC9D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,MAAM,EAAE,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,KAAc,EAAE,OAAe;QACjD,IAAI,eAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,UAAU,GAAG,KAAyD,CAAC;YAC7E,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC;YAC3C,MAAM,OAAO,GACX,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO;gBAClC,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK;gBAChC,UAAU,CAAC,OAAO,CAAC;YAErB,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;gBACnB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,OAAO,gBAAgB,EAAE,CAAC;YAC/D,CAAC;YACD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;gBACnB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,OAAO,QAAQ,EAAE,CAAC;YACvD,CAAC;YACD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;gBACnB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,OAAO,SAAS,EAAE,CAAC;YACxD,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,OAAO,KAAK,OAAO,EAAE,EAAE,CAAC;QAC7D,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,OAAO,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;IACnE,CAAC;CACF;AA7QD,oCA6QC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,MAAoB;IACrD,OAAO,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CloudDreamAI CI/CD Setup - 类型定义
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* GitLab 实例配置
|
|
6
|
+
*/
|
|
7
|
+
export interface GitLabConfig {
|
|
8
|
+
/** GitLab 实例 URL,如 https://gitlab.clouddreamai.com */
|
|
9
|
+
baseUrl: string;
|
|
10
|
+
/** Personal Access Token */
|
|
11
|
+
token: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* GitLab 项目信息
|
|
15
|
+
*/
|
|
16
|
+
export interface GitLabProject {
|
|
17
|
+
id: number;
|
|
18
|
+
name: string;
|
|
19
|
+
path: string;
|
|
20
|
+
path_with_namespace: string;
|
|
21
|
+
web_url: string;
|
|
22
|
+
default_branch: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* CI/CD 变量类型
|
|
26
|
+
*/
|
|
27
|
+
export type VariableType = 'env_var' | 'file';
|
|
28
|
+
/**
|
|
29
|
+
* CI/CD 变量定义
|
|
30
|
+
*/
|
|
31
|
+
export interface CICDVariable {
|
|
32
|
+
/** 变量名 */
|
|
33
|
+
key: string;
|
|
34
|
+
/** 变量值 */
|
|
35
|
+
value: string;
|
|
36
|
+
/** 变量类型:env_var 或 file */
|
|
37
|
+
variable_type?: VariableType;
|
|
38
|
+
/** 是否仅在 protected 分支可用 */
|
|
39
|
+
protected?: boolean;
|
|
40
|
+
/** 是否在日志中遮蔽 */
|
|
41
|
+
masked?: boolean;
|
|
42
|
+
/** 环境范围,默认 * 表示所有环境 */
|
|
43
|
+
environment_scope?: string;
|
|
44
|
+
/** 变量描述 */
|
|
45
|
+
description?: string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* GitLab API 返回的变量格式
|
|
49
|
+
*/
|
|
50
|
+
export interface GitLabVariable extends CICDVariable {
|
|
51
|
+
hidden?: boolean;
|
|
52
|
+
raw?: boolean;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 项目类型
|
|
56
|
+
*/
|
|
57
|
+
export type ProjectType = 'nestjs' | 'vue' | 'react' | 'node';
|
|
58
|
+
/**
|
|
59
|
+
* 部署环境类型
|
|
60
|
+
*/
|
|
61
|
+
export type EnvironmentType = 'development' | 'production';
|
|
62
|
+
/**
|
|
63
|
+
* 项目配置
|
|
64
|
+
*/
|
|
65
|
+
export interface ProjectConfig {
|
|
66
|
+
/** 项目名称 */
|
|
67
|
+
name: string;
|
|
68
|
+
/** 项目类型 */
|
|
69
|
+
type: ProjectType;
|
|
70
|
+
/** Docker Hub 镜像名称 */
|
|
71
|
+
dockerImage: string;
|
|
72
|
+
/** 部署目录 */
|
|
73
|
+
deployDir: string;
|
|
74
|
+
/** 开发环境端口 */
|
|
75
|
+
devPort: number;
|
|
76
|
+
/** 生产环境端口 */
|
|
77
|
+
prodPort: number;
|
|
78
|
+
/** 开发环境 URL */
|
|
79
|
+
devUrl?: string;
|
|
80
|
+
/** 生产环境 URL */
|
|
81
|
+
prodUrl?: string;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* 服务器配置
|
|
85
|
+
*/
|
|
86
|
+
export interface ServerConfig {
|
|
87
|
+
/** 测试/开发服务器主机 */
|
|
88
|
+
testServerHost: string;
|
|
89
|
+
/** 生产服务器主机(单服务器模式下与测试服务器相同) */
|
|
90
|
+
prodServerHost: string;
|
|
91
|
+
/** 是否单服务器多环境模式 */
|
|
92
|
+
singleServer: boolean;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Docker Hub 配置
|
|
96
|
+
*/
|
|
97
|
+
export interface DockerHubConfig {
|
|
98
|
+
username: string;
|
|
99
|
+
password: string;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* 完整的 CI/CD 配置
|
|
103
|
+
*/
|
|
104
|
+
export interface CICDConfig {
|
|
105
|
+
gitlab: GitLabConfig;
|
|
106
|
+
project: ProjectConfig;
|
|
107
|
+
server: ServerConfig;
|
|
108
|
+
dockerHub: DockerHubConfig;
|
|
109
|
+
/** SSH 私钥 */
|
|
110
|
+
sshPrivateKey: string;
|
|
111
|
+
/** 开发环境 .env 文件内容 */
|
|
112
|
+
devEnvFile?: string;
|
|
113
|
+
/** 生产环境 .env 文件内容 */
|
|
114
|
+
prodEnvFile?: string;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* CLI 提示问题定义
|
|
118
|
+
*/
|
|
119
|
+
export interface PromptQuestion {
|
|
120
|
+
type: 'input' | 'password' | 'list' | 'confirm' | 'editor';
|
|
121
|
+
name: string;
|
|
122
|
+
message: string;
|
|
123
|
+
default?: string | boolean;
|
|
124
|
+
choices?: Array<{
|
|
125
|
+
name: string;
|
|
126
|
+
value: string;
|
|
127
|
+
}>;
|
|
128
|
+
validate?: (input: string) => boolean | string;
|
|
129
|
+
when?: (answers: Record<string, unknown>) => boolean;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* 模板变量
|
|
133
|
+
*/
|
|
134
|
+
export interface TemplateVariables {
|
|
135
|
+
appName: string;
|
|
136
|
+
dockerImage: string;
|
|
137
|
+
deployDir: string;
|
|
138
|
+
devPort: number;
|
|
139
|
+
prodPort: number;
|
|
140
|
+
devUrl: string;
|
|
141
|
+
prodUrl: string;
|
|
142
|
+
lintCommand: string;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* API 响应结果
|
|
146
|
+
*/
|
|
147
|
+
export interface ApiResult<T> {
|
|
148
|
+
success: boolean;
|
|
149
|
+
data?: T;
|
|
150
|
+
error?: string;
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CloudDreamAI CI/CD Setup - 变量配置器
|
|
3
|
+
* 根据项目类型生成所需的 CI/CD 变量列表
|
|
4
|
+
*/
|
|
5
|
+
import { CICDVariable, CICDConfig, ProjectType } from './types';
|
|
6
|
+
/**
|
|
7
|
+
* 变量定义模板
|
|
8
|
+
* 定义每个变量的属性和描述
|
|
9
|
+
*/
|
|
10
|
+
interface VariableDefinition {
|
|
11
|
+
key: string;
|
|
12
|
+
description: string;
|
|
13
|
+
protected: boolean;
|
|
14
|
+
masked: boolean;
|
|
15
|
+
variable_type: 'env_var' | 'file';
|
|
16
|
+
/** 从配置中获取值的路径 */
|
|
17
|
+
configPath?: string;
|
|
18
|
+
/** 是否必需 */
|
|
19
|
+
required: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 变量配置器
|
|
23
|
+
*/
|
|
24
|
+
export declare class VariableConfigurator {
|
|
25
|
+
/**
|
|
26
|
+
* 根据项目类型获取所需的变量定义
|
|
27
|
+
*/
|
|
28
|
+
getVariableDefinitions(projectType: ProjectType): VariableDefinition[];
|
|
29
|
+
/**
|
|
30
|
+
* 从配置对象生成变量列表
|
|
31
|
+
*/
|
|
32
|
+
generateVariables(config: CICDConfig): CICDVariable[];
|
|
33
|
+
/**
|
|
34
|
+
* 验证配置完整性
|
|
35
|
+
*/
|
|
36
|
+
validateConfig(config: CICDConfig): {
|
|
37
|
+
valid: boolean;
|
|
38
|
+
errors: string[];
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* 获取变量的简要说明(用于显示)
|
|
42
|
+
*/
|
|
43
|
+
getVariableSummary(variables: CICDVariable[]): string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* 创建变量配置器实例
|
|
47
|
+
*/
|
|
48
|
+
export declare function createVariableConfigurator(): VariableConfigurator;
|
|
49
|
+
export {};
|
|
50
|
+
//# sourceMappingURL=variables.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variables.d.ts","sourceRoot":"","sources":["../../src/core/variables.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEhE;;;GAGG;AACH,UAAU,kBAAkB;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,SAAS,GAAG,MAAM,CAAC;IAClC,iBAAiB;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW;IACX,QAAQ,EAAE,OAAO,CAAC;CACnB;AA8ED;;GAEG;AACH,qBAAa,oBAAoB;IAC/B;;OAEG;IACH,sBAAsB,CAAC,WAAW,EAAE,WAAW,GAAG,kBAAkB,EAAE;IAgBtE;;OAEG;IACH,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,YAAY,EAAE;IAuFrD;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IAqCxE;;OAEG;IACH,kBAAkB,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,MAAM;CAetD;AAED;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,oBAAoB,CAEjE"}
|