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.
- package/README.md +148 -0
- package/dist/commands/config.d.ts +9 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +33 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/deploy.d.ts +14 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +342 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/tag.d.ts.map +1 -1
- package/dist/commands/tag.js +4 -4
- package/dist/commands/tag.js.map +1 -1
- package/dist/devops/api/bitbucket-client.d.ts +101 -0
- package/dist/devops/api/bitbucket-client.d.ts.map +1 -0
- package/dist/devops/api/bitbucket-client.js +335 -0
- package/dist/devops/api/bitbucket-client.js.map +1 -0
- package/dist/devops/api/jenkins-client.d.ts +96 -0
- package/dist/devops/api/jenkins-client.d.ts.map +1 -0
- package/dist/devops/api/jenkins-client.js +240 -0
- package/dist/devops/api/jenkins-client.js.map +1 -0
- package/dist/devops/config/config-manager.d.ts +96 -0
- package/dist/devops/config/config-manager.d.ts.map +1 -0
- package/dist/devops/config/config-manager.js +331 -0
- package/dist/devops/config/config-manager.js.map +1 -0
- package/dist/devops/config/encryption.d.ts +39 -0
- package/dist/devops/config/encryption.d.ts.map +1 -0
- package/dist/devops/config/encryption.js +133 -0
- package/dist/devops/config/encryption.js.map +1 -0
- package/dist/devops/config/storage.d.ts +37 -0
- package/dist/devops/config/storage.d.ts.map +1 -0
- package/dist/devops/config/storage.js +132 -0
- package/dist/devops/config/storage.js.map +1 -0
- package/dist/devops/constants.d.ts +51 -0
- package/dist/devops/constants.d.ts.map +1 -0
- package/dist/devops/constants.js +95 -0
- package/dist/devops/constants.js.map +1 -0
- package/dist/devops/deployer/full-deployer.d.ts +77 -0
- package/dist/devops/deployer/full-deployer.d.ts.map +1 -0
- package/dist/devops/deployer/full-deployer.js +221 -0
- package/dist/devops/deployer/full-deployer.js.map +1 -0
- package/dist/devops/deployer/jenkins-deployer.d.ts +55 -0
- package/dist/devops/deployer/jenkins-deployer.d.ts.map +1 -0
- package/dist/devops/deployer/jenkins-deployer.js +110 -0
- package/dist/devops/deployer/jenkins-deployer.js.map +1 -0
- package/dist/devops/monitor/pipeline-monitor.d.ts +48 -0
- package/dist/devops/monitor/pipeline-monitor.d.ts.map +1 -0
- package/dist/devops/monitor/pipeline-monitor.js +170 -0
- package/dist/devops/monitor/pipeline-monitor.js.map +1 -0
- package/dist/devops/test-ui.d.ts +6 -0
- package/dist/devops/test-ui.d.ts.map +1 -0
- package/dist/devops/test-ui.js +31 -0
- package/dist/devops/test-ui.js.map +1 -0
- package/dist/devops/types.d.ts +138 -0
- package/dist/devops/types.d.ts.map +1 -0
- package/dist/devops/types.js +20 -0
- package/dist/devops/types.js.map +1 -0
- package/dist/devops/ui/server.d.ts +53 -0
- package/dist/devops/ui/server.d.ts.map +1 -0
- package/dist/devops/ui/server.js +1310 -0
- package/dist/devops/ui/server.js.map +1 -0
- package/dist/index.js +31 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/message.d.ts +0 -2
- package/dist/utils/message.d.ts.map +1 -1
- package/dist/utils/message.js +7 -15
- package/dist/utils/message.js.map +1 -1
- package/dist/utils/tag.d.ts +65 -6
- package/dist/utils/tag.d.ts.map +1 -1
- package/dist/utils/tag.js +148 -14
- package/dist/utils/tag.js.map +1 -1
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"test-ui.d.ts","sourceRoot":"","sources":["../../src/devops/test-ui.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|