long-git-cli 1.0.12 → 1.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/README.md +148 -0
  2. package/dist/commands/config.d.ts +9 -0
  3. package/dist/commands/config.d.ts.map +1 -0
  4. package/dist/commands/config.js +33 -0
  5. package/dist/commands/config.js.map +1 -0
  6. package/dist/commands/deploy.d.ts +15 -0
  7. package/dist/commands/deploy.d.ts.map +1 -0
  8. package/dist/commands/deploy.js +413 -0
  9. package/dist/commands/deploy.js.map +1 -0
  10. package/dist/commands/tag.d.ts.map +1 -1
  11. package/dist/commands/tag.js +9 -7
  12. package/dist/commands/tag.js.map +1 -1
  13. package/dist/devops/api/bitbucket-client.d.ts +101 -0
  14. package/dist/devops/api/bitbucket-client.d.ts.map +1 -0
  15. package/dist/devops/api/bitbucket-client.js +335 -0
  16. package/dist/devops/api/bitbucket-client.js.map +1 -0
  17. package/dist/devops/api/jenkins-client.d.ts +110 -0
  18. package/dist/devops/api/jenkins-client.d.ts.map +1 -0
  19. package/dist/devops/api/jenkins-client.js +345 -0
  20. package/dist/devops/api/jenkins-client.js.map +1 -0
  21. package/dist/devops/config/config-manager.d.ts +96 -0
  22. package/dist/devops/config/config-manager.d.ts.map +1 -0
  23. package/dist/devops/config/config-manager.js +331 -0
  24. package/dist/devops/config/config-manager.js.map +1 -0
  25. package/dist/devops/config/encryption.d.ts +39 -0
  26. package/dist/devops/config/encryption.d.ts.map +1 -0
  27. package/dist/devops/config/encryption.js +133 -0
  28. package/dist/devops/config/encryption.js.map +1 -0
  29. package/dist/devops/config/storage.d.ts +37 -0
  30. package/dist/devops/config/storage.d.ts.map +1 -0
  31. package/dist/devops/config/storage.js +132 -0
  32. package/dist/devops/config/storage.js.map +1 -0
  33. package/dist/devops/constants.d.ts +51 -0
  34. package/dist/devops/constants.d.ts.map +1 -0
  35. package/dist/devops/constants.js +95 -0
  36. package/dist/devops/constants.js.map +1 -0
  37. package/dist/devops/deployer/full-deployer.d.ts +77 -0
  38. package/dist/devops/deployer/full-deployer.d.ts.map +1 -0
  39. package/dist/devops/deployer/full-deployer.js +221 -0
  40. package/dist/devops/deployer/full-deployer.js.map +1 -0
  41. package/dist/devops/deployer/jenkins-deployer.d.ts +55 -0
  42. package/dist/devops/deployer/jenkins-deployer.d.ts.map +1 -0
  43. package/dist/devops/deployer/jenkins-deployer.js +110 -0
  44. package/dist/devops/deployer/jenkins-deployer.js.map +1 -0
  45. package/dist/devops/monitor/pipeline-monitor.d.ts +52 -0
  46. package/dist/devops/monitor/pipeline-monitor.d.ts.map +1 -0
  47. package/dist/devops/monitor/pipeline-monitor.js +205 -0
  48. package/dist/devops/monitor/pipeline-monitor.js.map +1 -0
  49. package/dist/devops/test-ui.d.ts +6 -0
  50. package/dist/devops/test-ui.d.ts.map +1 -0
  51. package/dist/devops/test-ui.js +31 -0
  52. package/dist/devops/test-ui.js.map +1 -0
  53. package/dist/devops/types.d.ts +138 -0
  54. package/dist/devops/types.d.ts.map +1 -0
  55. package/dist/devops/types.js +20 -0
  56. package/dist/devops/types.js.map +1 -0
  57. package/dist/devops/ui/server.d.ts +53 -0
  58. package/dist/devops/ui/server.d.ts.map +1 -0
  59. package/dist/devops/ui/server.js +1310 -0
  60. package/dist/devops/ui/server.js.map +1 -0
  61. package/dist/index.js +32 -1
  62. package/dist/index.js.map +1 -1
  63. package/dist/utils/jenkins-auto-login.d.ts +41 -0
  64. package/dist/utils/jenkins-auto-login.d.ts.map +1 -0
  65. package/dist/utils/jenkins-auto-login.js +189 -0
  66. package/dist/utils/jenkins-auto-login.js.map +1 -0
  67. package/dist/utils/message.d.ts +0 -2
  68. package/dist/utils/message.d.ts.map +1 -1
  69. package/dist/utils/message.js +7 -15
  70. package/dist/utils/message.js.map +1 -1
  71. package/dist/utils/tag.d.ts +65 -6
  72. package/dist/utils/tag.d.ts.map +1 -1
  73. package/dist/utils/tag.js +148 -14
  74. package/dist/utils/tag.js.map +1 -1
  75. package/package.json +20 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jenkins-client.d.ts","sourceRoot":"","sources":["../../../src/devops/api/jenkins-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,gBAAgB,EAChB,WAAW,EACZ,MAAM,UAAU,CAAC;AAMlB;;GAEG;AACH,UAAU,iBAAiB;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,CAAC,EAAE;QACX,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAgBD;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAS;IAEzB;;;;;OAKG;gBACS,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAmB/D;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IA4CxC;;;OAGG;YACW,gBAAgB;IAoB9B;;;;;;OAMG;YACW,gBAAgB;IA+C9B;;;;;;OAMG;IACG,YAAY,CAChB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAClC,UAAU,GAAE,MAAU,GACrB,OAAO,CAAC,MAAM,CAAC;IA6ClB;;;;OAIG;IACG,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAY/D;;;;;OAKG;IACG,YAAY,CAChB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,gBAAgB,CAAC;IAuB5B;;;;;;OAMG;IACG,sBAAsB,CAC1B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,gBAAgB,CAAC;IAkC5B;;;;;OAKG;IACG,mBAAmB,CACvB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,MAAc,GACtB,OAAO,CAAC,MAAM,CAAC;IA4BlB;;;;;;OAMG;IACG,cAAc,CAClB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAClC,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,gBAAgB,CAAC;IAW5B;;;OAGG;IACH,OAAO,CAAC,KAAK;IAIb;;;;OAIG;IACH,OAAO,CAAC,WAAW;CAqBpB"}
@@ -0,0 +1,345 @@
1
+ "use strict";
2
+ /**
3
+ * Jenkins API 客户端
4
+ * 负责与 Jenkins API 交互,触发构建和获取构建状态
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.JenkinsClient = void 0;
11
+ const axios_1 = __importDefault(require("axios"));
12
+ const constants_1 = require("../constants");
13
+ /**
14
+ * Jenkins API 客户端类
15
+ */
16
+ class JenkinsClient {
17
+ /**
18
+ * 构造函数
19
+ * @param baseUrl Jenkins 服务器地址
20
+ * @param username Jenkins 用户名
21
+ * @param apiToken Jenkins API Token(明文)
22
+ */
23
+ constructor(baseUrl, username, apiToken) {
24
+ this.baseUrl = baseUrl.replace(/\/$/, ""); // 移除末尾斜杠
25
+ this.username = username;
26
+ this.apiToken = apiToken;
27
+ // 创建 axios 实例,配置 Basic Auth
28
+ this.client = axios_1.default.create({
29
+ baseURL: this.baseUrl,
30
+ auth: {
31
+ username: this.username,
32
+ password: this.apiToken,
33
+ },
34
+ headers: {
35
+ "Content-Type": "application/json",
36
+ },
37
+ timeout: 30000, // 30 秒超时
38
+ });
39
+ }
40
+ /**
41
+ * 测试连接
42
+ * @returns 连接是否成功
43
+ */
44
+ async testConnection() {
45
+ try {
46
+ // 直接测试连接,不需要 crumb(使用 API Token 时)
47
+ await this.client.get("/api/json");
48
+ console.log('Jenkins 连接测试成功');
49
+ return true;
50
+ }
51
+ catch (error) {
52
+ if (axios_1.default.isAxiosError(error)) {
53
+ const axiosError = error;
54
+ if (axiosError.response) {
55
+ console.error('Jenkins 连接失败:', {
56
+ status: axiosError.response.status,
57
+ statusText: axiosError.response.statusText,
58
+ data: typeof axiosError.response.data === 'string'
59
+ ? axiosError.response.data.substring(0, 200)
60
+ : axiosError.response.data,
61
+ });
62
+ if (axiosError.response.status === 403) {
63
+ console.error('\n检测到 Jenkins SSO 认证问题:');
64
+ console.error('你的 Jenkins 使用了 OpenID Connect (SSO) 认证');
65
+ console.error('API Token 需要浏览器 Session 才能工作\n');
66
+ console.error('解决方法:');
67
+ console.error('1. 在浏览器打开:' + this.baseUrl);
68
+ console.error('2. 登录你的账号(通过 SSO)');
69
+ console.error('3. 保持浏览器标签页打开');
70
+ console.error('4. 重新运行此命令\n');
71
+ console.error('这是 Jenkins OpenID Connect 插件的已知限制');
72
+ console.error('详见:https://github.com/jenkinsci/oic-auth-plugin/issues/41');
73
+ }
74
+ }
75
+ else if (axiosError.request) {
76
+ console.error('Jenkins 连接失败: 网络错误,无法连接到 Jenkins');
77
+ console.error('错误代码:', axiosError.code);
78
+ console.error('错误消息:', axiosError.message);
79
+ }
80
+ else {
81
+ console.error('Jenkins 连接失败:', axiosError.message);
82
+ }
83
+ }
84
+ else {
85
+ console.error('Jenkins 连接失败:', error);
86
+ }
87
+ return false;
88
+ }
89
+ }
90
+ /**
91
+ * 获取 Jenkins Crumb(实时获取,不缓存)
92
+ * @returns Crumb 信息,如果 Jenkins 未启用 CSRF 保护则返回 null
93
+ */
94
+ async getCrumbRealtime() {
95
+ try {
96
+ const response = await this.client.get('/crumbIssuer/api/json');
97
+ return {
98
+ field: response.data.crumbRequestField,
99
+ value: response.data.crumb,
100
+ };
101
+ }
102
+ catch (error) {
103
+ if (axios_1.default.isAxiosError(error)) {
104
+ const axiosError = error;
105
+ if (axiosError.response?.status === 404) {
106
+ // Jenkins 未启用 CSRF 保护
107
+ return null;
108
+ }
109
+ }
110
+ // 其他错误抛出
111
+ throw error;
112
+ }
113
+ }
114
+ /**
115
+ * 触发构建(单次尝试)
116
+ * @param jobName Job 名称
117
+ * @param parameters 构建参数
118
+ * @param crumb Crumb 信息
119
+ * @returns 队列 ID
120
+ */
121
+ async triggerBuildOnce(jobName, parameters, crumb) {
122
+ // 处理文件夹路径:将 "folder/job" 转换为 "/job/folder/job/job"
123
+ const jobPath = jobName.split('/').map(part => `job/${encodeURIComponent(part)}`).join('/');
124
+ // 准备请求头
125
+ const headers = {
126
+ 'Content-Type': 'application/x-www-form-urlencoded',
127
+ };
128
+ // 如果有 Crumb,添加到请求头
129
+ if (crumb) {
130
+ headers[crumb.field] = crumb.value;
131
+ }
132
+ // 将参数转换为 URLSearchParams
133
+ const formData = new URLSearchParams();
134
+ Object.entries(parameters).forEach(([key, value]) => {
135
+ formData.append(key, value);
136
+ });
137
+ // 触发带参数的构建
138
+ const response = await this.client.post(`/${jobPath}/buildWithParameters`, formData.toString(), { headers });
139
+ // Jenkins 返回 201 状态码,Location header 包含队列 URL
140
+ const location = response.headers["location"];
141
+ if (!location) {
142
+ throw new Error("未获取到队列 URL");
143
+ }
144
+ // 从 Location 中提取队列 ID
145
+ // 格式: http://jenkins.example.com/queue/item/123/
146
+ const queueIdMatch = location.match(/\/queue\/item\/(\d+)/);
147
+ if (!queueIdMatch) {
148
+ throw new Error("无法解析队列 ID");
149
+ }
150
+ return queueIdMatch[1];
151
+ }
152
+ /**
153
+ * 触发构建(生产级实现,带重试)
154
+ * @param jobName Job 名称(可以包含文件夹路径,如 "folder/job-name")
155
+ * @param parameters 构建参数
156
+ * @param maxRetries 最大重试次数,默认 1
157
+ * @returns 队列 ID
158
+ */
159
+ async triggerBuild(jobName, parameters, maxRetries = 1) {
160
+ let lastError = null;
161
+ let attempt = 0;
162
+ while (attempt <= maxRetries) {
163
+ try {
164
+ // 1. 实时获取 Crumb(每次都重新获取,不缓存)
165
+ const crumb = await this.getCrumbRealtime();
166
+ // 2. 立即使用 Crumb 触发构建
167
+ const queueId = await this.triggerBuildOnce(jobName, parameters, crumb);
168
+ // 3. 成功,返回结果
169
+ return queueId;
170
+ }
171
+ catch (error) {
172
+ lastError = error;
173
+ // 检查是否是 403 错误
174
+ if (axios_1.default.isAxiosError(error)) {
175
+ const axiosError = error;
176
+ if (axiosError.response?.status === 403) {
177
+ console.warn(`Jenkins 返回 403 (尝试 ${attempt + 1}/${maxRetries + 1})`);
178
+ // 如果还有重试次数,继续重试
179
+ if (attempt < maxRetries) {
180
+ attempt++;
181
+ console.log(`准备重试 (${attempt}/${maxRetries})...`);
182
+ // 等待 1 秒后重试
183
+ await this.sleep(1000);
184
+ continue;
185
+ }
186
+ }
187
+ }
188
+ // 其他错误或重试次数用尽,抛出错误
189
+ this.handleError(error, "触发构建失败");
190
+ throw error;
191
+ }
192
+ }
193
+ // 所有尝试都失败
194
+ throw lastError || new Error("触发构建失败");
195
+ }
196
+ /**
197
+ * 获取队列项信息
198
+ * @param queueId 队列 ID
199
+ * @returns 队列项信息
200
+ */
201
+ async getQueueItem(queueId) {
202
+ try {
203
+ const response = await this.client.get(`/queue/item/${queueId}/api/json`);
204
+ return response.data;
205
+ }
206
+ catch (error) {
207
+ this.handleError(error, "获取队列信息失败");
208
+ throw error;
209
+ }
210
+ }
211
+ /**
212
+ * 获取构建信息
213
+ * @param jobName Job 名称(可以包含文件夹路径,如 "folder/job-name")
214
+ * @param buildNumber 构建号
215
+ * @returns 构建信息
216
+ */
217
+ async getBuildInfo(jobName, buildNumber) {
218
+ try {
219
+ // 处理文件夹路径:将 "folder/job" 转换为 "/job/folder/job/job"
220
+ const jobPath = jobName.split('/').map(part => `job/${encodeURIComponent(part)}`).join('/');
221
+ const response = await this.client.get(`/${jobPath}/${buildNumber}/api/json`);
222
+ return {
223
+ number: response.data.number,
224
+ url: response.data.url,
225
+ result: response.data.result,
226
+ building: response.data.building,
227
+ duration: response.data.duration,
228
+ timestamp: response.data.timestamp,
229
+ };
230
+ }
231
+ catch (error) {
232
+ this.handleError(error, "获取构建信息失败");
233
+ throw error;
234
+ }
235
+ }
236
+ /**
237
+ * 等待构建完成
238
+ * @param jobName Job 名称
239
+ * @param buildNumber 构建号
240
+ * @param options 等待选项
241
+ * @returns 最终的构建信息
242
+ */
243
+ async waitForBuildCompletion(jobName, buildNumber, options) {
244
+ const pollInterval = options?.pollInterval || constants_1.JENKINS_POLL_INTERVAL;
245
+ const timeout = options?.timeout || constants_1.JENKINS_TIMEOUT;
246
+ const onProgress = options?.onProgress;
247
+ const startTime = Date.now();
248
+ // 轮询构建状态
249
+ while (true) {
250
+ // 检查超时
251
+ if (Date.now() - startTime > timeout) {
252
+ throw new Error(`构建监听超时(${timeout / 1000}秒),Job: ${jobName}, Build: ${buildNumber}`);
253
+ }
254
+ // 获取当前状态
255
+ const buildInfo = await this.getBuildInfo(jobName, buildNumber);
256
+ // 调用进度回调
257
+ if (onProgress) {
258
+ onProgress(buildInfo);
259
+ }
260
+ // 检查是否完成
261
+ if (!buildInfo.building) {
262
+ return buildInfo;
263
+ }
264
+ // 等待下一次轮询
265
+ await this.sleep(pollInterval);
266
+ }
267
+ }
268
+ /**
269
+ * 等待队列项变成构建
270
+ * @param queueId 队列 ID
271
+ * @param timeout 超时时间(毫秒)
272
+ * @returns 构建号
273
+ */
274
+ async waitForQueueToBuild(queueId, timeout = 60000) {
275
+ const startTime = Date.now();
276
+ const pollInterval = 2000; // 2 秒
277
+ while (true) {
278
+ // 检查超时
279
+ if (Date.now() - startTime > timeout) {
280
+ throw new Error(`等待队列转换为构建超时(${timeout / 1000}秒)`);
281
+ }
282
+ // 获取队列项
283
+ const queueItem = await this.getQueueItem(queueId);
284
+ // 检查是否已经开始构建
285
+ if (queueItem.executable?.number) {
286
+ return queueItem.executable.number;
287
+ }
288
+ // 检查是否被阻塞或卡住
289
+ if (queueItem.stuck) {
290
+ throw new Error("构建队列卡住,无法启动");
291
+ }
292
+ // 等待下一次轮询
293
+ await this.sleep(pollInterval);
294
+ }
295
+ }
296
+ /**
297
+ * 触发构建并等待完成
298
+ * @param jobName Job 名称
299
+ * @param parameters 构建参数
300
+ * @param options 等待选项
301
+ * @returns 最终的构建信息
302
+ */
303
+ async triggerAndWait(jobName, parameters, options) {
304
+ // 触发构建
305
+ const queueId = await this.triggerBuild(jobName, parameters);
306
+ // 等待队列转换为构建
307
+ const buildNumber = await this.waitForQueueToBuild(queueId);
308
+ // 等待构建完成
309
+ return await this.waitForBuildCompletion(jobName, buildNumber, options);
310
+ }
311
+ /**
312
+ * 休眠指定毫秒数
313
+ * @param ms 毫秒数
314
+ */
315
+ sleep(ms) {
316
+ return new Promise((resolve) => setTimeout(resolve, ms));
317
+ }
318
+ /**
319
+ * 处理错误
320
+ * @param error 错误对象
321
+ * @param message 错误消息
322
+ */
323
+ handleError(error, message) {
324
+ if (axios_1.default.isAxiosError(error)) {
325
+ const axiosError = error;
326
+ if (axiosError.response) {
327
+ // 服务器返回错误响应
328
+ console.error(`${message}: ${axiosError.response.status} - ${JSON.stringify(axiosError.response.data)}`);
329
+ }
330
+ else if (axiosError.request) {
331
+ // 请求已发送但没有收到响应
332
+ console.error(`${message}: 网络错误,无法连接到 Jenkins`);
333
+ }
334
+ else {
335
+ // 请求配置错误
336
+ console.error(`${message}: ${axiosError.message}`);
337
+ }
338
+ }
339
+ else {
340
+ console.error(`${message}:`, error);
341
+ }
342
+ }
343
+ }
344
+ exports.JenkinsClient = JenkinsClient;
345
+ //# sourceMappingURL=jenkins-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jenkins-client.js","sourceRoot":"","sources":["../../../src/devops/api/jenkins-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * 配置管理器
3
+ * 管理所有配置数据的读取、写入、验证和加密
4
+ */
5
+ import { Storage } from "./storage";
6
+ import { DeployConfig, ProjectConfig, JenkinsConfig } from "../types";
7
+ /**
8
+ * ConfigManager 类
9
+ * 负责配置的 CRUD 操作
10
+ */
11
+ export declare class ConfigManager {
12
+ private storage;
13
+ private configFilename;
14
+ /** 内存缓存(用于存储明文密码,仅在运行时有效) */
15
+ private credentialsCache;
16
+ constructor(storage?: Storage);
17
+ /**
18
+ * 加载配置
19
+ */
20
+ loadConfig(): Promise<DeployConfig>;
21
+ /**
22
+ * 保存配置(不验证完整性)
23
+ * 用于部分更新配置
24
+ */
25
+ saveConfigWithoutValidation(config: DeployConfig): Promise<void>;
26
+ /**
27
+ * 保存配置
28
+ */
29
+ saveConfig(config: DeployConfig): Promise<void>;
30
+ /**
31
+ * 验证配置完整性
32
+ */
33
+ validateConfig(config: DeployConfig): Promise<boolean>;
34
+ /**
35
+ * 获取项目配置
36
+ */
37
+ getProjectConfig(projectPath: string): Promise<ProjectConfig | null>;
38
+ /**
39
+ * 更新项目配置
40
+ */
41
+ updateProjectConfig(projectPath: string, projectConfig: ProjectConfig): Promise<void>;
42
+ /**
43
+ * 删除项目配置
44
+ */
45
+ deleteProjectConfig(projectPath: string): Promise<void>;
46
+ /**
47
+ * 加密 Token
48
+ */
49
+ encryptToken(token: string): Promise<string>;
50
+ /**
51
+ * 解密 Token
52
+ */
53
+ decryptToken(encryptedToken: string): string;
54
+ /**
55
+ * 验证 Token
56
+ * @deprecated 不再需要,直接解密使用
57
+ */
58
+ verifyToken(token: string, hash: string): Promise<boolean>;
59
+ /**
60
+ * 更新 Bitbucket 配置
61
+ * @param username Bitbucket 用户名
62
+ * @param token API Token 或 App Password(兼容旧版)
63
+ */
64
+ updateBitbucketConfig(username: string, token: string): Promise<void>;
65
+ /**
66
+ * 获取 Bitbucket 明文密码
67
+ * 优先从缓存获取,如果没有则从配置文件解密
68
+ */
69
+ getBitbucketPassword(): Promise<string | undefined>;
70
+ /**
71
+ * 更新 Jenkins 配置
72
+ */
73
+ updateJenkinsConfig(jenkinsConfigs: JenkinsConfig[]): Promise<void>;
74
+ /**
75
+ * 添加 Jenkins 实例
76
+ */
77
+ addJenkinsInstance(type: "app" | "pcalpha", url: string, username: string, apiToken: string): Promise<void>;
78
+ /**
79
+ * 获取 Jenkins 明文 token
80
+ * 优先从缓存获取,如果没有则从配置文件解密
81
+ */
82
+ getJenkinsToken(type: "app" | "pcalpha"): Promise<string | undefined>;
83
+ /**
84
+ * 更新部署状态
85
+ */
86
+ updateDeployStatus(projectPath: string, environment: string, status: any): Promise<void>;
87
+ /**
88
+ * 获取默认配置
89
+ */
90
+ private getDefaultConfig;
91
+ /**
92
+ * 检查配置文件是否存在
93
+ */
94
+ configExists(): Promise<boolean>;
95
+ }
96
+ //# sourceMappingURL=config-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../../src/devops/config/config-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACL,YAAY,EACZ,aAAa,EAEb,aAAa,EACd,MAAM,UAAU,CAAC;AAIlB;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,cAAc,CAAS;IAC/B,6BAA6B;IAC7B,OAAO,CAAC,gBAAgB,CAKtB;gBAEU,OAAO,CAAC,EAAE,OAAO;IAK7B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,YAAY,CAAC;IAWzC;;;OAGG;IACG,2BAA2B,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAItE;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAUrD;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAsD5D;;OAEG;IACG,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAK1E;;OAEG;IACG,mBAAmB,CACvB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,aAAa,GAC3B,OAAO,CAAC,IAAI,CAAC;IAOhB;;OAEG;IACG,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO7D;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIlD;;OAEG;IACH,YAAY,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM;IAI5C;;;OAGG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIhE;;;;OAIG;IACG,qBAAqB,CACzB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC;IAkBhB;;;OAGG;IACG,oBAAoB,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAyBzD;;OAEG;IACG,mBAAmB,CAAC,cAAc,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAOzE;;OAEG;IACG,kBAAkB,CACtB,IAAI,EAAE,KAAK,GAAG,SAAS,EACvB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC;IA4BhB;;;OAGG;IACG,eAAe,CAAC,IAAI,EAAE,KAAK,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IA0B3E;;OAEG;IACG,kBAAkB,CACtB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,GAAG,GACV,OAAO,CAAC,IAAI,CAAC;IAuBhB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAYxB;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;CAGvC"}