long-git-cli 1.0.11 → 1.0.13

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 (71) 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 +14 -0
  7. package/dist/commands/deploy.d.ts.map +1 -0
  8. package/dist/commands/deploy.js +342 -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 +4 -4
  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 +96 -0
  18. package/dist/devops/api/jenkins-client.d.ts.map +1 -0
  19. package/dist/devops/api/jenkins-client.js +240 -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 +48 -0
  46. package/dist/devops/monitor/pipeline-monitor.d.ts.map +1 -0
  47. package/dist/devops/monitor/pipeline-monitor.js +170 -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 +31 -1
  62. package/dist/index.js.map +1 -1
  63. package/dist/utils/message.d.ts +0 -2
  64. package/dist/utils/message.d.ts.map +1 -1
  65. package/dist/utils/message.js +7 -15
  66. package/dist/utils/message.js.map +1 -1
  67. package/dist/utils/tag.d.ts +65 -6
  68. package/dist/utils/tag.d.ts.map +1 -1
  69. package/dist/utils/tag.js +148 -14
  70. package/dist/utils/tag.js.map +1 -1
  71. package/package.json +19 -2
@@ -0,0 +1,221 @@
1
+ "use strict";
2
+ /**
3
+ * 完整部署流程编排器
4
+ * 整合 Git Tag 创建、Pipeline 监听、Jenkins 部署等功能
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.FullDeployer = exports.DeployStep = void 0;
41
+ const pipeline_monitor_1 = require("../monitor/pipeline-monitor");
42
+ const jenkins_deployer_1 = require("./jenkins-deployer");
43
+ const simpleGit = __importStar(require("simple-git"));
44
+ const tag_1 = require("../../utils/tag");
45
+ /**
46
+ * 部署步骤枚举
47
+ */
48
+ var DeployStep;
49
+ (function (DeployStep) {
50
+ DeployStep["CREATING_TAG"] = "CREATING_TAG";
51
+ DeployStep["PUSHING_TAG"] = "PUSHING_TAG";
52
+ DeployStep["MONITORING_PIPELINE"] = "MONITORING_PIPELINE";
53
+ DeployStep["DEPLOYING_JENKINS"] = "DEPLOYING_JENKINS";
54
+ DeployStep["COMPLETED"] = "COMPLETED";
55
+ DeployStep["FAILED"] = "FAILED";
56
+ })(DeployStep || (exports.DeployStep = DeployStep = {}));
57
+ /**
58
+ * 完整部署流程编排器类
59
+ */
60
+ class FullDeployer {
61
+ constructor(bitbucketClient, jenkinsClient, projectConfig, environmentConfig) {
62
+ this.bitbucketClient = bitbucketClient;
63
+ this.jenkinsClient = jenkinsClient;
64
+ this.projectConfig = projectConfig;
65
+ this.environmentConfig = environmentConfig;
66
+ }
67
+ /**
68
+ * 执行完整部署流程
69
+ */
70
+ async deploy(options = {}) {
71
+ const { createNewTag = false, tagName, onProgress } = options;
72
+ let currentTag = tagName;
73
+ try {
74
+ /** 步骤 1: 创建 Tag(如果需要) */
75
+ if (createNewTag) {
76
+ this.reportProgress(onProgress, {
77
+ step: DeployStep.CREATING_TAG,
78
+ message: "正在创建 Git Tag...",
79
+ timestamp: new Date(),
80
+ });
81
+ currentTag = await this.createTag();
82
+ this.reportProgress(onProgress, {
83
+ step: DeployStep.CREATING_TAG,
84
+ message: `Tag 创建成功: ${currentTag}`,
85
+ timestamp: new Date(),
86
+ data: { tagName: currentTag },
87
+ });
88
+ }
89
+ if (!currentTag) {
90
+ throw new Error("Tag 名称不能为空");
91
+ }
92
+ /** 步骤 2: 推送 Tag */
93
+ if (createNewTag) {
94
+ this.reportProgress(onProgress, {
95
+ step: DeployStep.PUSHING_TAG,
96
+ message: `正在推送 Tag: ${currentTag}...`,
97
+ timestamp: new Date(),
98
+ });
99
+ await this.pushTag(currentTag);
100
+ this.reportProgress(onProgress, {
101
+ step: DeployStep.PUSHING_TAG,
102
+ message: `Tag 推送成功: ${currentTag}`,
103
+ timestamp: new Date(),
104
+ });
105
+ }
106
+ /** 步骤 3: 监听 Bitbucket Pipeline */
107
+ this.reportProgress(onProgress, {
108
+ step: DeployStep.MONITORING_PIPELINE,
109
+ message: `正在监听 Pipeline: ${currentTag}...`,
110
+ timestamp: new Date(),
111
+ });
112
+ const pipelineMonitor = new pipeline_monitor_1.PipelineMonitor(this.bitbucketClient);
113
+ const pipelineResult = await pipelineMonitor.monitorPipeline(this.projectConfig.repository.workspace, this.projectConfig.repository.repoSlug, currentTag, {
114
+ pollInterval: 15000,
115
+ timeout: 30 * 60 * 1000,
116
+ onProgress: (status) => {
117
+ this.reportProgress(onProgress, {
118
+ step: DeployStep.MONITORING_PIPELINE,
119
+ message: `Pipeline 状态: ${status.state.name}`,
120
+ timestamp: new Date(),
121
+ data: { pipelineStatus: status.state.name },
122
+ });
123
+ },
124
+ });
125
+ this.reportProgress(onProgress, {
126
+ step: DeployStep.MONITORING_PIPELINE,
127
+ message: `Pipeline 执行成功: ${pipelineResult.state.name}`,
128
+ timestamp: new Date(),
129
+ data: { pipelineStatus: pipelineResult.state.name },
130
+ });
131
+ /** 步骤 4: 触发 Jenkins 部署 */
132
+ this.reportProgress(onProgress, {
133
+ step: DeployStep.DEPLOYING_JENKINS,
134
+ message: `正在触发 Jenkins 部署: ${this.environmentConfig.jenkinsJobName}...`,
135
+ timestamp: new Date(),
136
+ });
137
+ const jenkinsDeployer = new jenkins_deployer_1.JenkinsDeployer(this.jenkinsClient);
138
+ const jenkinsResult = await jenkinsDeployer.deploy(this.environmentConfig.jenkinsJobName, {
139
+ [this.environmentConfig.jenkinsTagParameter]: currentTag,
140
+ }, {
141
+ pollInterval: 10000,
142
+ timeout: 30 * 60 * 1000,
143
+ onProgress: (build) => {
144
+ this.reportProgress(onProgress, {
145
+ step: DeployStep.DEPLOYING_JENKINS,
146
+ message: `Jenkins 构建 #${build.number}: ${build.result || "BUILDING"}`,
147
+ timestamp: new Date(),
148
+ data: {
149
+ buildNumber: build.number,
150
+ buildResult: build.result,
151
+ },
152
+ });
153
+ },
154
+ });
155
+ this.reportProgress(onProgress, {
156
+ step: DeployStep.COMPLETED,
157
+ message: `部署完成!`,
158
+ timestamp: new Date(),
159
+ data: {
160
+ buildNumber: jenkinsResult.number,
161
+ buildResult: jenkinsResult.result,
162
+ buildUrl: jenkinsResult.url,
163
+ },
164
+ });
165
+ return {
166
+ success: true,
167
+ tagName: currentTag,
168
+ pipelineStatus: pipelineResult.state.name,
169
+ jenkinsResult: jenkinsResult.result || "SUCCESS",
170
+ jenkinsBuildNumber: jenkinsResult.number,
171
+ jenkinsBuildUrl: jenkinsResult.url,
172
+ };
173
+ }
174
+ catch (error) {
175
+ this.reportProgress(onProgress, {
176
+ step: DeployStep.FAILED,
177
+ message: `部署失败: ${error.message}`,
178
+ timestamp: new Date(),
179
+ data: { error: error.message },
180
+ });
181
+ return {
182
+ success: false,
183
+ tagName: currentTag || "",
184
+ error: error.message,
185
+ };
186
+ }
187
+ }
188
+ /**
189
+ * 创建 Git Tag
190
+ */
191
+ async createTag() {
192
+ const git = simpleGit.simpleGit(this.projectConfig.path);
193
+ /** 获取所有 tags */
194
+ const tags = await git.tags();
195
+ /** 解析 tag 格式 */
196
+ const tagFormat = (0, tag_1.parseTagFormat)(this.environmentConfig.tagFormat);
197
+ /** 生成新的 tag */
198
+ const newTag = (0, tag_1.generateNextTag)(tags.all, tagFormat);
199
+ /** 创建 tag */
200
+ await git.addTag(newTag);
201
+ return newTag;
202
+ }
203
+ /**
204
+ * 推送 Tag 到远程仓库
205
+ */
206
+ async pushTag(tagName) {
207
+ const git = simpleGit.simpleGit(this.projectConfig.path);
208
+ await git.pushTags("origin");
209
+ }
210
+ /**
211
+ * 报告进度
212
+ */
213
+ reportProgress(callback, progress) {
214
+ console.log(`[${progress.step}] ${progress.message}`);
215
+ if (callback) {
216
+ callback(progress);
217
+ }
218
+ }
219
+ }
220
+ exports.FullDeployer = FullDeployer;
221
+ //# sourceMappingURL=full-deployer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"full-deployer.js","sourceRoot":"","sources":["../../../src/devops/deployer/full-deployer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Jenkins 部署器
3
+ * 用于触发 Jenkins 构建并监听构建状态
4
+ */
5
+ import { JenkinsClient } from "../api/jenkins-client";
6
+ import { JenkinsBuildInfo } from "../types";
7
+ /**
8
+ * 部署选项
9
+ */
10
+ export interface DeployOptions {
11
+ /** 轮询间隔(毫秒),默认 10 秒 */
12
+ pollInterval?: number;
13
+ /** 超时时间(毫秒),默认 30 分钟 */
14
+ timeout?: number;
15
+ /** 进度回调 */
16
+ onProgress?: (build: JenkinsBuildInfo) => void;
17
+ }
18
+ /**
19
+ * Jenkins 部署器类
20
+ */
21
+ export declare class JenkinsDeployer {
22
+ private jenkinsClient;
23
+ constructor(jenkinsClient: JenkinsClient);
24
+ /**
25
+ * 触发部署并等待完成
26
+ * @param jobName Jenkins Job 名称
27
+ * @param parameters 构建参数
28
+ * @param options 部署选项
29
+ * @returns 最终的构建信息
30
+ */
31
+ deploy(jobName: string, parameters: Record<string, string>, options?: DeployOptions): Promise<JenkinsBuildInfo>;
32
+ /**
33
+ * 触发部署(不等待完成)
34
+ * @param jobName Jenkins Job 名称
35
+ * @param parameters 构建参数
36
+ * @returns 队列项 URL
37
+ */
38
+ triggerDeploy(jobName: string, parameters: Record<string, string>): Promise<string>;
39
+ /**
40
+ * 获取构建状态
41
+ * @param jobName Jenkins Job 名称
42
+ * @param buildNumber 构建编号
43
+ * @returns 构建信息
44
+ */
45
+ getBuildStatus(jobName: string, buildNumber: number): Promise<JenkinsBuildInfo>;
46
+ /**
47
+ * 获取已用时间(格式化)
48
+ */
49
+ private getElapsedTime;
50
+ /**
51
+ * 睡眠指定毫秒数
52
+ */
53
+ private sleep;
54
+ }
55
+ //# sourceMappingURL=jenkins-deployer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jenkins-deployer.d.ts","sourceRoot":"","sources":["../../../src/devops/deployer/jenkins-deployer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,uBAAuB;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wBAAwB;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW;IACX,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;CAChD;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,aAAa,CAAgB;gBAEzB,aAAa,EAAE,aAAa;IAIxC;;;;;;OAMG;IACG,MAAM,CACV,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAClC,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,gBAAgB,CAAC;IAsE5B;;;;;OAKG;IACG,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,OAAO,CAAC,MAAM,CAAC;IAalB;;;;;OAKG;IACG,cAAc,CAClB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,gBAAgB,CAAC;IAI5B;;OAEG;IACH,OAAO,CAAC,cAAc;IAOtB;;OAEG;IACH,OAAO,CAAC,KAAK;CAGd"}
@@ -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,48 @@
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
+ //# 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;IA2Ff;;;;;;;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;CAGd"}
@@ -0,0 +1,170 @@
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
+ const startTime = Date.now();
28
+ console.log(`获取 tag ${tagName} 的 commit hash...`);
29
+ /** 获取 tag 对应的 commit hash */
30
+ const commitHash = await this.bitbucketClient.getTagCommit(workspace, repoSlug, tagName);
31
+ console.log(`Commit hash: ${commitHash.substring(0, 7)}`);
32
+ console.log(`等待 build status 出现...`);
33
+ /** 等待 build status 出现(最多等待 2 分钟) */
34
+ let buildStatuses = [];
35
+ const maxWaitTime = 2 * 60 * 1000; // 2 分钟
36
+ const checkInterval = 5000; // 5 秒检查一次
37
+ while (buildStatuses.length === 0 && Date.now() - startTime < 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
+ /** 轮询 build status */
49
+ while (true) {
50
+ /** 检查超时 */
51
+ if (Date.now() - startTime > timeout) {
52
+ throw new Error(`Build status 监听超时 (${timeout / 1000}秒)`);
53
+ }
54
+ /** 获取最新状态 */
55
+ buildStatuses = await this.bitbucketClient.getCommitBuildStatus(workspace, repoSlug, commitHash);
56
+ /** 检查是否所有 build 都完成 */
57
+ const allCompleted = buildStatuses.every((status) => {
58
+ return ['SUCCESSFUL', 'FAILED', 'STOPPED'].includes(status.state);
59
+ });
60
+ const anyFailed = buildStatuses.some((status) => {
61
+ return status.state === 'FAILED';
62
+ });
63
+ /** 调用进度回调 */
64
+ if (onProgress) {
65
+ onProgress({ statuses: buildStatuses });
66
+ }
67
+ console.log(`Build status: ${buildStatuses.map((s) => `${s.name || s.key}=${s.state}`).join(', ')} (${this.getElapsedTime(startTime)})`);
68
+ if (allCompleted) {
69
+ if (anyFailed) {
70
+ throw new Error(`构建失败`);
71
+ }
72
+ console.log(`所有构建已完成`);
73
+ return buildStatuses;
74
+ }
75
+ /** 等待下一次轮询 */
76
+ await this.sleep(pollInterval);
77
+ }
78
+ }
79
+ /**
80
+ * 监听指定 tag 的 Pipeline 状态
81
+ * @param workspace Bitbucket workspace
82
+ * @param repoSlug 仓库 slug
83
+ * @param tagName tag 名称
84
+ * @param options 等待选项
85
+ * @returns Pipeline 最终状态
86
+ */
87
+ async monitorPipeline(workspace, repoSlug, tagName, options = {}) {
88
+ const { pollInterval = 15000, // 默认 15 秒
89
+ timeout = 30 * 60 * 1000, // 默认 30 分钟
90
+ onProgress, } = options;
91
+ const startTime = Date.now();
92
+ console.log(`等待 Pipeline 被触发...`);
93
+ /** 等待 Pipeline 被触发(最多等待 2 分钟) */
94
+ let pipeline = null;
95
+ const maxWaitTime = 2 * 60 * 1000; // 2 分钟
96
+ const checkInterval = 5000; // 5 秒检查一次
97
+ while (!pipeline && Date.now() - startTime < maxWaitTime) {
98
+ pipeline = await this.findPipelineByTag(workspace, repoSlug, tagName);
99
+ if (!pipeline) {
100
+ console.log(`Pipeline 尚未触发,等待 ${checkInterval / 1000} 秒后重试...`);
101
+ await new Promise(resolve => setTimeout(resolve, checkInterval));
102
+ }
103
+ }
104
+ if (!pipeline) {
105
+ throw new Error(`未找到 tag "${tagName}" 的 Pipeline,可能 Bitbucket 未配置自动触发 Pipeline`);
106
+ }
107
+ console.log(`开始监听 Pipeline: ${pipeline.uuid} (tag: ${tagName})`);
108
+ /** 轮询 Pipeline 状态 */
109
+ while (true) {
110
+ /** 检查超时 */
111
+ if (Date.now() - startTime > timeout) {
112
+ throw new Error(`Pipeline 监听超时 (${timeout / 1000}秒),当前状态: ${pipeline.state.name}`);
113
+ }
114
+ /** 获取最新状态 */
115
+ const status = await this.bitbucketClient.getPipelineStatus(workspace, repoSlug, pipeline.uuid);
116
+ /** 调用进度回调 */
117
+ if (onProgress) {
118
+ onProgress(status);
119
+ }
120
+ console.log(`Pipeline 状态: ${status.state.name} (${this.getElapsedTime(startTime)})`);
121
+ /** 判断是否完成 */
122
+ if (this.isPipelineCompleted(status)) {
123
+ if (status.state.name === "SUCCESSFUL") {
124
+ console.log(`Pipeline 执行成功`);
125
+ return status;
126
+ }
127
+ else if (status.state.name === "FAILED") {
128
+ throw new Error(`Pipeline 执行失败: ${status.state.result?.name || "未知原因"}`);
129
+ }
130
+ else if (status.state.name === "STOPPED") {
131
+ throw new Error(`Pipeline 已停止`);
132
+ }
133
+ }
134
+ /** 等待下一次轮询 */
135
+ await this.sleep(pollInterval);
136
+ }
137
+ }
138
+ /**
139
+ * 根据 tag 名称查找 Pipeline
140
+ */
141
+ async findPipelineByTag(workspace, repoSlug, tagName) {
142
+ const pipelines = await this.bitbucketClient.getPipelinesByTag(workspace, repoSlug, tagName);
143
+ /** 返回最新的 Pipeline(已按创建时间倒序排序) */
144
+ return pipelines.length > 0 ? pipelines[0] : null;
145
+ }
146
+ /**
147
+ * 判断 Pipeline 是否已完成
148
+ */
149
+ isPipelineCompleted(status) {
150
+ const completedStates = ["SUCCESSFUL", "FAILED", "STOPPED"];
151
+ return completedStates.includes(status.state.name);
152
+ }
153
+ /**
154
+ * 获取已用时间(格式化)
155
+ */
156
+ getElapsedTime(startTime) {
157
+ const elapsed = Math.floor((Date.now() - startTime) / 1000);
158
+ const minutes = Math.floor(elapsed / 60);
159
+ const seconds = elapsed % 60;
160
+ return `${minutes}分${seconds}秒`;
161
+ }
162
+ /**
163
+ * 睡眠指定毫秒数
164
+ */
165
+ sleep(ms) {
166
+ return new Promise((resolve) => setTimeout(resolve, ms));
167
+ }
168
+ }
169
+ exports.PipelineMonitor = PipelineMonitor;
170
+ //# 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"}