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,110 @@
1
+ "use strict";
2
+ /**
3
+ * Jenkins 部署器
4
+ * 用于触发 Jenkins 构建并监听构建状态
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.JenkinsDeployer = void 0;
8
+ /**
9
+ * Jenkins 部署器类
10
+ */
11
+ class JenkinsDeployer {
12
+ constructor(jenkinsClient) {
13
+ this.jenkinsClient = jenkinsClient;
14
+ }
15
+ /**
16
+ * 触发部署并等待完成
17
+ * @param jobName Jenkins Job 名称
18
+ * @param parameters 构建参数
19
+ * @param options 部署选项
20
+ * @returns 最终的构建信息
21
+ */
22
+ async deploy(jobName, parameters, options = {}) {
23
+ const { pollInterval = 10000, // 默认 10 秒
24
+ timeout = 30 * 60 * 1000, // 默认 30 分钟
25
+ onProgress, } = options;
26
+ const startTime = Date.now();
27
+ console.log(`触发 Jenkins 部署: ${jobName}`);
28
+ console.log(`参数:`, parameters);
29
+ /** 触发构建 */
30
+ const queueId = await this.jenkinsClient.triggerBuild(jobName, parameters);
31
+ console.log(`构建已加入队列: ${queueId}`);
32
+ /** 等待构建开始(从队列中获取构建编号) */
33
+ console.log(`等待构建开始...`);
34
+ const buildNumber = await this.jenkinsClient.waitForQueueToBuild(queueId, 10 * 60 * 1000 // 最多等待 10 分钟
35
+ );
36
+ console.log(`🔨 构建已开始: #${buildNumber}`);
37
+ /** 轮询构建状态 */
38
+ while (true) {
39
+ /** 检查超时 */
40
+ if (Date.now() - startTime > timeout) {
41
+ throw new Error(`构建超时 (${timeout / 1000}秒),构建编号: #${buildNumber}`);
42
+ }
43
+ /** 获取构建状态 */
44
+ const buildInfo = await this.jenkinsClient.getBuildInfo(jobName, buildNumber);
45
+ /** 调用进度回调 */
46
+ if (onProgress) {
47
+ onProgress(buildInfo);
48
+ }
49
+ console.log(`构建状态: ${buildInfo.result || "BUILDING"} - ${this.getElapsedTime(startTime)}`);
50
+ /** 判断是否完成 */
51
+ if (!buildInfo.building) {
52
+ if (buildInfo.result === "SUCCESS") {
53
+ console.log(`构建成功: #${buildNumber}`);
54
+ return buildInfo;
55
+ }
56
+ else if (buildInfo.result === "FAILURE") {
57
+ throw new Error(`构建失败: #${buildNumber}`);
58
+ }
59
+ else if (buildInfo.result === "ABORTED") {
60
+ throw new Error(`构建已中止: #${buildNumber}`);
61
+ }
62
+ else if (buildInfo.result === "UNSTABLE") {
63
+ console.log(`构建不稳定: #${buildNumber}`);
64
+ return buildInfo;
65
+ }
66
+ }
67
+ /** 等待下一次轮询 */
68
+ await this.sleep(pollInterval);
69
+ }
70
+ }
71
+ /**
72
+ * 触发部署(不等待完成)
73
+ * @param jobName Jenkins Job 名称
74
+ * @param parameters 构建参数
75
+ * @returns 队列项 URL
76
+ */
77
+ async triggerDeploy(jobName, parameters) {
78
+ console.log(`触发 Jenkins 部署: ${jobName}`);
79
+ console.log(`参数:`, parameters);
80
+ const queueItemUrl = await this.jenkinsClient.triggerBuild(jobName, parameters);
81
+ console.log(`构建已加入队列: ${queueItemUrl}`);
82
+ return queueItemUrl;
83
+ }
84
+ /**
85
+ * 获取构建状态
86
+ * @param jobName Jenkins Job 名称
87
+ * @param buildNumber 构建编号
88
+ * @returns 构建信息
89
+ */
90
+ async getBuildStatus(jobName, buildNumber) {
91
+ return this.jenkinsClient.getBuildInfo(jobName, buildNumber);
92
+ }
93
+ /**
94
+ * 获取已用时间(格式化)
95
+ */
96
+ getElapsedTime(startTime) {
97
+ const elapsed = Math.floor((Date.now() - startTime) / 1000);
98
+ const minutes = Math.floor(elapsed / 60);
99
+ const seconds = elapsed % 60;
100
+ return `${minutes}分${seconds}秒`;
101
+ }
102
+ /**
103
+ * 睡眠指定毫秒数
104
+ */
105
+ sleep(ms) {
106
+ return new Promise((resolve) => setTimeout(resolve, ms));
107
+ }
108
+ }
109
+ exports.JenkinsDeployer = JenkinsDeployer;
110
+ //# sourceMappingURL=jenkins-deployer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jenkins-deployer.js","sourceRoot":"","sources":["../../../src/devops/deployer/jenkins-deployer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Pipeline 监听器
3
+ * 用于监听 Bitbucket Pipeline 的执行状态
4
+ */
5
+ import { BitbucketClient } from "../api/bitbucket-client";
6
+ import { PipelineStatus, WaitOptions } from "../types";
7
+ /**
8
+ * Pipeline 监听器类
9
+ */
10
+ export declare class PipelineMonitor {
11
+ private bitbucketClient;
12
+ constructor(bitbucketClient: BitbucketClient);
13
+ /**
14
+ * 监听 Build Status(用于 AWS CodeBuild 等外部构建系统)
15
+ * @param workspace Bitbucket workspace
16
+ * @param repoSlug 仓库 slug
17
+ * @param tagName Tag 名称
18
+ * @param options 等待选项
19
+ * @returns Build status
20
+ */
21
+ monitorBuildStatus(workspace: string, repoSlug: string, tagName: string, options?: WaitOptions): Promise<any>;
22
+ /**
23
+ * 监听指定 tag 的 Pipeline 状态
24
+ * @param workspace Bitbucket workspace
25
+ * @param repoSlug 仓库 slug
26
+ * @param tagName tag 名称
27
+ * @param options 等待选项
28
+ * @returns Pipeline 最终状态
29
+ */
30
+ monitorPipeline(workspace: string, repoSlug: string, tagName: string, options?: WaitOptions): Promise<PipelineStatus>;
31
+ /**
32
+ * 根据 tag 名称查找 Pipeline
33
+ */
34
+ private findPipelineByTag;
35
+ /**
36
+ * 判断 Pipeline 是否已完成
37
+ */
38
+ private isPipelineCompleted;
39
+ /**
40
+ * 获取已用时间(格式化)
41
+ */
42
+ private getElapsedTime;
43
+ /**
44
+ * 睡眠指定毫秒数
45
+ */
46
+ private sleep;
47
+ /**
48
+ * 判断是否为网络错误
49
+ */
50
+ private isNetworkError;
51
+ }
52
+ //# sourceMappingURL=pipeline-monitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline-monitor.d.ts","sourceRoot":"","sources":["../../../src/devops/monitor/pipeline-monitor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvD;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,eAAe,CAAkB;gBAE7B,eAAe,EAAE,eAAe;IAI5C;;;;;;;OAOG;IACG,kBAAkB,CACtB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,GAAG,CAAC;IAuGf;;;;;;;OAOG;IACG,eAAe,CACnB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,cAAc,CAAC;IA6E1B;;OAEG;YACW,iBAAiB;IAe/B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAK3B;;OAEG;IACH,OAAO,CAAC,cAAc;IAOtB;;OAEG;IACH,OAAO,CAAC,KAAK;IAIb;;OAEG;IACH,OAAO,CAAC,cAAc;CAqBvB"}
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+ /**
3
+ * Pipeline 监听器
4
+ * 用于监听 Bitbucket Pipeline 的执行状态
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.PipelineMonitor = void 0;
8
+ /**
9
+ * Pipeline 监听器类
10
+ */
11
+ class PipelineMonitor {
12
+ constructor(bitbucketClient) {
13
+ this.bitbucketClient = bitbucketClient;
14
+ }
15
+ /**
16
+ * 监听 Build Status(用于 AWS CodeBuild 等外部构建系统)
17
+ * @param workspace Bitbucket workspace
18
+ * @param repoSlug 仓库 slug
19
+ * @param tagName Tag 名称
20
+ * @param options 等待选项
21
+ * @returns Build status
22
+ */
23
+ async monitorBuildStatus(workspace, repoSlug, tagName, options = {}) {
24
+ const { pollInterval = 15000, // 默认 15 秒
25
+ timeout = 30 * 60 * 1000, // 默认 30 分钟
26
+ onProgress, } = options;
27
+ console.log(`获取 tag ${tagName} 的 commit hash...`);
28
+ /** 获取 tag 对应的 commit hash */
29
+ const commitHash = await this.bitbucketClient.getTagCommit(workspace, repoSlug, tagName);
30
+ console.log(`Commit hash: ${commitHash.substring(0, 7)}`);
31
+ console.log(`等待 build status 出现...`);
32
+ /** 等待 build status 出现(最多等待 2 分钟,独立计时) */
33
+ let buildStatuses = [];
34
+ const maxWaitTime = 2 * 60 * 1000; // 2 分钟
35
+ const checkInterval = 5000; // 5 秒检查一次
36
+ const waitStartTime = Date.now();
37
+ while (buildStatuses.length === 0 && Date.now() - waitStartTime < maxWaitTime) {
38
+ buildStatuses = await this.bitbucketClient.getCommitBuildStatus(workspace, repoSlug, commitHash);
39
+ if (buildStatuses.length === 0) {
40
+ console.log(`Build status 尚未出现,等待 ${checkInterval / 1000} 秒后重试...`);
41
+ await this.sleep(checkInterval);
42
+ }
43
+ }
44
+ if (buildStatuses.length === 0) {
45
+ throw new Error(`未找到 commit ${commitHash.substring(0, 7)} 的 build status,可能构建尚未触发`);
46
+ }
47
+ console.log(`开始监听 build status...`);
48
+ /** 重置开始时间,开始 30 分钟的监听 */
49
+ const monitorStartTime = Date.now();
50
+ /** 轮询 build status */
51
+ while (true) {
52
+ /** 检查超时(从找到 build status 后开始计时) */
53
+ if (Date.now() - monitorStartTime > timeout) {
54
+ throw new Error(`Build status 监听超时 (${timeout / 1000}秒)`);
55
+ }
56
+ /** 获取最新状态(带重试) */
57
+ try {
58
+ buildStatuses = await this.bitbucketClient.getCommitBuildStatus(workspace, repoSlug, commitHash);
59
+ }
60
+ catch (error) {
61
+ // 网络错误重试
62
+ if (this.isNetworkError(error)) {
63
+ console.log(`网络错误,5秒后重试...`);
64
+ await this.sleep(5000);
65
+ continue;
66
+ }
67
+ throw error;
68
+ }
69
+ /** 检查是否所有 build 都完成 */
70
+ const allCompleted = buildStatuses.every((status) => {
71
+ return ['SUCCESSFUL', 'FAILED', 'STOPPED'].includes(status.state);
72
+ });
73
+ const anyFailed = buildStatuses.some((status) => {
74
+ return status.state === 'FAILED';
75
+ });
76
+ /** 调用进度回调 */
77
+ if (onProgress) {
78
+ onProgress({ statuses: buildStatuses });
79
+ }
80
+ console.log(`Build status: ${buildStatuses.map((s) => `${s.name || s.key}=${s.state}`).join(', ')} (${this.getElapsedTime(monitorStartTime)})`);
81
+ if (allCompleted) {
82
+ if (anyFailed) {
83
+ throw new Error(`构建失败`);
84
+ }
85
+ console.log(`所有构建已完成`);
86
+ return buildStatuses;
87
+ }
88
+ /** 等待下一次轮询 */
89
+ await this.sleep(pollInterval);
90
+ }
91
+ }
92
+ /**
93
+ * 监听指定 tag 的 Pipeline 状态
94
+ * @param workspace Bitbucket workspace
95
+ * @param repoSlug 仓库 slug
96
+ * @param tagName tag 名称
97
+ * @param options 等待选项
98
+ * @returns Pipeline 最终状态
99
+ */
100
+ async monitorPipeline(workspace, repoSlug, tagName, options = {}) {
101
+ const { pollInterval = 15000, // 默认 15 秒
102
+ timeout = 30 * 60 * 1000, // 默认 30 分钟
103
+ onProgress, } = options;
104
+ const startTime = Date.now();
105
+ console.log(`等待 Pipeline 被触发...`);
106
+ /** 等待 Pipeline 被触发(最多等待 2 分钟) */
107
+ let pipeline = null;
108
+ const maxWaitTime = 2 * 60 * 1000; // 2 分钟
109
+ const checkInterval = 5000; // 5 秒检查一次
110
+ while (!pipeline && Date.now() - startTime < maxWaitTime) {
111
+ pipeline = await this.findPipelineByTag(workspace, repoSlug, tagName);
112
+ if (!pipeline) {
113
+ console.log(`Pipeline 尚未触发,等待 ${checkInterval / 1000} 秒后重试...`);
114
+ await new Promise(resolve => setTimeout(resolve, checkInterval));
115
+ }
116
+ }
117
+ if (!pipeline) {
118
+ throw new Error(`未找到 tag "${tagName}" 的 Pipeline,可能 Bitbucket 未配置自动触发 Pipeline`);
119
+ }
120
+ console.log(`开始监听 Pipeline: ${pipeline.uuid} (tag: ${tagName})`);
121
+ /** 轮询 Pipeline 状态 */
122
+ while (true) {
123
+ /** 检查超时 */
124
+ if (Date.now() - startTime > timeout) {
125
+ throw new Error(`Pipeline 监听超时 (${timeout / 1000}秒),当前状态: ${pipeline.state.name}`);
126
+ }
127
+ /** 获取最新状态 */
128
+ const status = await this.bitbucketClient.getPipelineStatus(workspace, repoSlug, pipeline.uuid);
129
+ /** 调用进度回调 */
130
+ if (onProgress) {
131
+ onProgress(status);
132
+ }
133
+ console.log(`Pipeline 状态: ${status.state.name} (${this.getElapsedTime(startTime)})`);
134
+ /** 判断是否完成 */
135
+ if (this.isPipelineCompleted(status)) {
136
+ if (status.state.name === "SUCCESSFUL") {
137
+ console.log(`Pipeline 执行成功`);
138
+ return status;
139
+ }
140
+ else if (status.state.name === "FAILED") {
141
+ throw new Error(`Pipeline 执行失败: ${status.state.result?.name || "未知原因"}`);
142
+ }
143
+ else if (status.state.name === "STOPPED") {
144
+ throw new Error(`Pipeline 已停止`);
145
+ }
146
+ }
147
+ /** 等待下一次轮询 */
148
+ await this.sleep(pollInterval);
149
+ }
150
+ }
151
+ /**
152
+ * 根据 tag 名称查找 Pipeline
153
+ */
154
+ async findPipelineByTag(workspace, repoSlug, tagName) {
155
+ const pipelines = await this.bitbucketClient.getPipelinesByTag(workspace, repoSlug, tagName);
156
+ /** 返回最新的 Pipeline(已按创建时间倒序排序) */
157
+ return pipelines.length > 0 ? pipelines[0] : null;
158
+ }
159
+ /**
160
+ * 判断 Pipeline 是否已完成
161
+ */
162
+ isPipelineCompleted(status) {
163
+ const completedStates = ["SUCCESSFUL", "FAILED", "STOPPED"];
164
+ return completedStates.includes(status.state.name);
165
+ }
166
+ /**
167
+ * 获取已用时间(格式化)
168
+ */
169
+ getElapsedTime(startTime) {
170
+ const elapsed = Math.floor((Date.now() - startTime) / 1000);
171
+ const minutes = Math.floor(elapsed / 60);
172
+ const seconds = elapsed % 60;
173
+ return `${minutes}分${seconds}秒`;
174
+ }
175
+ /**
176
+ * 睡眠指定毫秒数
177
+ */
178
+ sleep(ms) {
179
+ return new Promise((resolve) => setTimeout(resolve, ms));
180
+ }
181
+ /**
182
+ * 判断是否为网络错误
183
+ */
184
+ isNetworkError(error) {
185
+ if (!error)
186
+ return false;
187
+ const errorCode = error.code;
188
+ const errorMessage = error.message?.toLowerCase() || '';
189
+ // 常见的网络错误代码
190
+ const networkErrorCodes = [
191
+ 'ECONNRESET',
192
+ 'ETIMEDOUT',
193
+ 'ECONNREFUSED',
194
+ 'ENOTFOUND',
195
+ 'ENETUNREACH',
196
+ 'EAI_AGAIN',
197
+ ];
198
+ return networkErrorCodes.includes(errorCode) ||
199
+ errorMessage.includes('network') ||
200
+ errorMessage.includes('timeout') ||
201
+ errorMessage.includes('econnreset');
202
+ }
203
+ }
204
+ exports.PipelineMonitor = PipelineMonitor;
205
+ //# sourceMappingURL=pipeline-monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline-monitor.js","sourceRoot":"","sources":["../../../src/devops/monitor/pipeline-monitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Web UI 测试脚本
3
+ * 用于测试 Web UI 服务器
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=test-ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-ui.d.ts","sourceRoot":"","sources":["../../src/devops/test-ui.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ /**
3
+ * Web UI 测试脚本
4
+ * 用于测试 Web UI 服务器
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const server_1 = require("./ui/server");
8
+ async function main() {
9
+ console.log("🧪 启动 Web UI 测试...\n");
10
+ const server = new server_1.WebUIServer();
11
+ try {
12
+ /** 启动服务器 */
13
+ await server.start();
14
+ /** 打开浏览器 */
15
+ await server.openBrowser();
16
+ console.log("\nWeb UI 测试服务器已启动");
17
+ console.log("按 Ctrl+C 停止服务器\n");
18
+ /** 监听退出信号 */
19
+ process.on("SIGINT", async () => {
20
+ console.log("\n\n🛑 正在关闭服务器...");
21
+ await server.stop();
22
+ process.exit(0);
23
+ });
24
+ }
25
+ catch (error) {
26
+ console.error("启动失败:", error);
27
+ process.exit(1);
28
+ }
29
+ }
30
+ main();
31
+ //# sourceMappingURL=test-ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-ui.js","sourceRoot":"","sources":["../../src/devops/test-ui.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAEH,wCAA0C;AAE1C,KAAK,UAAU,IAAI;IACjB,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAEpC,MAAM,MAAM,GAAG,IAAI,oBAAW,EAAE,CAAC;IAEjC,IAAI,CAAC;QACH,YAAY;QACZ,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QAErB,YAAY;QACZ,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;QAE3B,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAEhC,aAAa;QACb,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;YAC9B,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACjC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * 自动化部署功能的类型定义
3
+ */
4
+ /**
5
+ * 部署配置
6
+ */
7
+ export interface DeployConfig {
8
+ version: string;
9
+ projects: {
10
+ [projectPath: string]: ProjectConfig;
11
+ };
12
+ bitbucket: BitbucketConfig;
13
+ jenkins: JenkinsConfig[];
14
+ }
15
+ /**
16
+ * 项目配置
17
+ */
18
+ export interface ProjectConfig {
19
+ name: string;
20
+ path: string;
21
+ repository: {
22
+ workspace: string;
23
+ repoSlug: string;
24
+ };
25
+ jenkinsInstance: "app" | "pcalpha";
26
+ tagFormat: string;
27
+ environments: {
28
+ [env: string]: EnvironmentConfig;
29
+ };
30
+ }
31
+ /**
32
+ * 环境配置
33
+ */
34
+ export interface EnvironmentConfig {
35
+ /** 环境名称: 'test-01', 'test-02', 'test-03', 'test-04', 'uat' */
36
+ name: string;
37
+ /** Tag 格式: 'test-v00.00.0000', 'uat-v00.00.0000' */
38
+ tagFormat: string;
39
+ /** Jenkins Job 名称 */
40
+ jenkinsJobName: string;
41
+ /** Jenkins Tag 参数名 */
42
+ jenkinsTagParameter: string;
43
+ /** 部署状态(可选) */
44
+ deployStatus?: {
45
+ status: 'building' | 'deploying' | 'success' | 'failed';
46
+ tagName: string;
47
+ step: 'pipeline' | 'jenkins' | 'completed' | 'unknown';
48
+ startTime?: string;
49
+ completedTime?: string;
50
+ failedTime?: string;
51
+ jenkinsBuildNumber?: number;
52
+ jenkinsBuildUrl?: string;
53
+ error?: string;
54
+ lastUpdated?: string;
55
+ };
56
+ }
57
+ /**
58
+ * Bitbucket 配置
59
+ */
60
+ export interface BitbucketConfig {
61
+ username: string;
62
+ /** @deprecated 使用 apiTokenHash 代替 (2026年6月9日前仍可用) */
63
+ appPasswordHash?: string;
64
+ /** 加密后的 API Token (推荐使用) */
65
+ apiTokenHash?: string;
66
+ }
67
+ /**
68
+ * Jenkins 配置
69
+ */
70
+ export interface JenkinsConfig {
71
+ type: "app" | "pcalpha";
72
+ url: string;
73
+ username: string;
74
+ /** 加密后的 API Token */
75
+ apiTokenHash: string;
76
+ }
77
+ /**
78
+ * Pipeline 状态
79
+ */
80
+ export interface PipelineStatus {
81
+ uuid: string;
82
+ state: {
83
+ name: "PENDING" | "IN_PROGRESS" | "SUCCESSFUL" | "FAILED" | "STOPPED";
84
+ result?: {
85
+ name: string;
86
+ };
87
+ };
88
+ created_on: string;
89
+ completed_on?: string;
90
+ target: {
91
+ /** tag 名称 */
92
+ ref_name: string;
93
+ };
94
+ }
95
+ /**
96
+ * 等待选项
97
+ */
98
+ export interface WaitOptions {
99
+ /** 轮询间隔(毫秒),默认 15 秒 */
100
+ pollInterval?: number;
101
+ /** 超时时间(毫秒),默认 30 分钟 */
102
+ timeout?: number;
103
+ /** 进度回调 */
104
+ onProgress?: (status: PipelineStatus) => void;
105
+ }
106
+ /**
107
+ * Jenkins 构建信息
108
+ */
109
+ export interface JenkinsBuildInfo {
110
+ number: number;
111
+ url: string;
112
+ result: "SUCCESS" | "FAILURE" | "ABORTED" | "UNSTABLE" | null;
113
+ building: boolean;
114
+ duration: number;
115
+ timestamp: number;
116
+ }
117
+ /**
118
+ * 部署选项
119
+ */
120
+ export interface DeployOptions {
121
+ tag?: string;
122
+ environment?: string;
123
+ project?: string;
124
+ skipBuild?: boolean;
125
+ }
126
+ /**
127
+ * 错误代码枚举
128
+ */
129
+ export declare enum ErrorCode {
130
+ CONFIG_MISSING = "CONFIG_MISSING",
131
+ CONFIG_INVALID = "CONFIG_INVALID",
132
+ AUTH_FAILED = "AUTH_FAILED",
133
+ PIPELINE_FAILED = "PIPELINE_FAILED",
134
+ PIPELINE_TIMEOUT = "PIPELINE_TIMEOUT",
135
+ DEPLOYMENT_FAILED = "DEPLOYMENT_FAILED",
136
+ NETWORK_ERROR = "NETWORK_ERROR"
137
+ }
138
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/devops/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ /**
3
+ * 自动化部署功能的类型定义
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ErrorCode = void 0;
7
+ /**
8
+ * 错误代码枚举
9
+ */
10
+ var ErrorCode;
11
+ (function (ErrorCode) {
12
+ ErrorCode["CONFIG_MISSING"] = "CONFIG_MISSING";
13
+ ErrorCode["CONFIG_INVALID"] = "CONFIG_INVALID";
14
+ ErrorCode["AUTH_FAILED"] = "AUTH_FAILED";
15
+ ErrorCode["PIPELINE_FAILED"] = "PIPELINE_FAILED";
16
+ ErrorCode["PIPELINE_TIMEOUT"] = "PIPELINE_TIMEOUT";
17
+ ErrorCode["DEPLOYMENT_FAILED"] = "DEPLOYMENT_FAILED";
18
+ ErrorCode["NETWORK_ERROR"] = "NETWORK_ERROR";
19
+ })(ErrorCode || (exports.ErrorCode = ErrorCode = {}));
20
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/devops/types.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAqIH;;GAEG;AACH,IAAY,SAQX;AARD,WAAY,SAAS;IACnB,8CAAiC,CAAA;IACjC,8CAAiC,CAAA;IACjC,wCAA2B,CAAA;IAC3B,gDAAmC,CAAA;IACnC,kDAAqC,CAAA;IACrC,oDAAuC,CAAA;IACvC,4CAA+B,CAAA;AACjC,CAAC,EARW,SAAS,yBAAT,SAAS,QAQpB"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Web UI 服务器
3
+ * 提供配置管理的 Web 界面
4
+ */
5
+ import KoaRouter from "@koa/router";
6
+ import { ConfigManager } from "../config/config-manager";
7
+ type Router = InstanceType<typeof KoaRouter>;
8
+ /**
9
+ * Web UI 服务器类
10
+ */
11
+ export declare class WebUIServer {
12
+ private app;
13
+ private router;
14
+ private port;
15
+ private host;
16
+ private server;
17
+ private configManager;
18
+ constructor(configManager?: ConfigManager, port?: number, host?: string);
19
+ /**
20
+ * 配置中间件
21
+ */
22
+ private setupMiddleware;
23
+ /**
24
+ * 配置路由
25
+ */
26
+ private setupRoutes;
27
+ /**
28
+ * 启动服务器
29
+ */
30
+ start(): Promise<void>;
31
+ /**
32
+ * 停止服务器
33
+ */
34
+ stop(): Promise<void>;
35
+ /**
36
+ * 打开浏览器
37
+ */
38
+ openBrowser(): Promise<void>;
39
+ /**
40
+ * 获取路由器实例(用于添加更多路由)
41
+ */
42
+ getRouter(): Router;
43
+ /**
44
+ * 解析 Git 仓库信息
45
+ */
46
+ private parseGitRepo;
47
+ /**
48
+ * 选择文件夹(使用系统对话框)
49
+ */
50
+ private selectFolder;
51
+ }
52
+ export {};
53
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/devops/ui/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,SAAS,MAAM,aAAa,CAAC;AAMpC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAIzD,KAAK,MAAM,GAAG,YAAY,CAAC,OAAO,SAAS,CAAC,CAAC;AAE7C;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,aAAa,CAAgB;gBAGnC,aAAa,CAAC,EAAE,aAAa,EAC7B,IAAI,GAAE,MAAoB,EAC1B,IAAI,GAAE,MAAoB;IAY5B;;OAEG;IACH,OAAO,CAAC,eAAe;IA+BvB;;OAEG;IACH,OAAO,CAAC,WAAW;IAixCnB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB3B;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAWlC;;OAEG;IACH,SAAS,IAAI,MAAM;IAInB;;OAEG;YACW,YAAY;IA0D1B;;OAEG;YACW,YAAY;CA+C3B"}