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.
- 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 +15 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +413 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/tag.d.ts.map +1 -1
- package/dist/commands/tag.js +9 -7
- 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 +110 -0
- package/dist/devops/api/jenkins-client.d.ts.map +1 -0
- package/dist/devops/api/jenkins-client.js +345 -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 +52 -0
- package/dist/devops/monitor/pipeline-monitor.d.ts.map +1 -0
- package/dist/devops/monitor/pipeline-monitor.js +205 -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 +32 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/jenkins-auto-login.d.ts +41 -0
- package/dist/utils/jenkins-auto-login.d.ts.map +1 -0
- package/dist/utils/jenkins-auto-login.js +189 -0
- package/dist/utils/jenkins-auto-login.js.map +1 -0
- 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 +20 -2
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 本地存储模块
|
|
4
|
+
* 处理本地 JSON 文件的读写操作
|
|
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.Storage = void 0;
|
|
41
|
+
const fs = __importStar(require("fs/promises"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const constants_1 = require("../constants");
|
|
44
|
+
/**
|
|
45
|
+
* Storage 类
|
|
46
|
+
* 负责本地文件的读写操作
|
|
47
|
+
*/
|
|
48
|
+
class Storage {
|
|
49
|
+
constructor(storagePath = constants_1.CONFIG_DIR) {
|
|
50
|
+
this.storagePath = storagePath;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 读取文件
|
|
54
|
+
*/
|
|
55
|
+
async read(filename) {
|
|
56
|
+
try {
|
|
57
|
+
const filePath = path.join(this.storagePath, filename);
|
|
58
|
+
const data = await fs.readFile(filePath, "utf-8");
|
|
59
|
+
return JSON.parse(data);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
if (error.code === "ENOENT") {
|
|
63
|
+
/** 文件不存在 */
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
throw new Error(`读取文件失败: ${error.message}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 写入文件
|
|
71
|
+
*/
|
|
72
|
+
async write(filename, data) {
|
|
73
|
+
try {
|
|
74
|
+
/** 确保目录存在 */
|
|
75
|
+
await this.ensureDir();
|
|
76
|
+
const filePath = path.join(this.storagePath, filename);
|
|
77
|
+
const jsonData = JSON.stringify(data, null, 2);
|
|
78
|
+
await fs.writeFile(filePath, jsonData, "utf-8");
|
|
79
|
+
/** 设置文件权限为仅当前用户可读写 (600) */
|
|
80
|
+
await fs.chmod(filePath, 0o600);
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
throw new Error(`写入文件失败: ${error.message}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 检查文件是否存在
|
|
88
|
+
*/
|
|
89
|
+
async exists(filename) {
|
|
90
|
+
try {
|
|
91
|
+
const filePath = path.join(this.storagePath, filename);
|
|
92
|
+
await fs.access(filePath);
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* 删除文件
|
|
101
|
+
*/
|
|
102
|
+
async delete(filename) {
|
|
103
|
+
try {
|
|
104
|
+
const filePath = path.join(this.storagePath, filename);
|
|
105
|
+
await fs.unlink(filePath);
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
if (error.code !== "ENOENT") {
|
|
109
|
+
throw new Error(`删除文件失败: ${error.message}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* 获取存储路径
|
|
115
|
+
*/
|
|
116
|
+
getStoragePath() {
|
|
117
|
+
return this.storagePath;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* 确保目录存在
|
|
121
|
+
*/
|
|
122
|
+
async ensureDir() {
|
|
123
|
+
try {
|
|
124
|
+
await fs.mkdir(this.storagePath, { recursive: true });
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
throw new Error(`创建目录失败: ${error.message}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
exports.Storage = Storage;
|
|
132
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/devops/config/storage.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,gDAAkC;AAClC,2CAA6B;AAC7B,4CAA0C;AAE1C;;;GAGG;AACH,MAAa,OAAO;IAGlB,YAAY,cAAsB,sBAAU;QAC1C,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAI,QAAgB;QAC5B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YACvD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAClD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC5B,YAAY;gBACZ,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAI,QAAgB,EAAE,IAAO;QACtC,IAAI,CAAC;YACH,aAAa;YACb,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YAEvB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC/C,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YAEhD,4BAA4B;YAC5B,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,QAAgB;QAC3B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YACvD,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,QAAgB;QAC3B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YACvD,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC5B,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,SAAS;QACrB,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;CACF;AAvFD,0BAuFC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 自动化部署功能的常量定义
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* 配置文件存储路径
|
|
6
|
+
*/
|
|
7
|
+
export declare const CONFIG_DIR: string;
|
|
8
|
+
export declare const CONFIG_FILE: string;
|
|
9
|
+
/**
|
|
10
|
+
* 配置版本
|
|
11
|
+
*/
|
|
12
|
+
export declare const CONFIG_VERSION = "1.0.0";
|
|
13
|
+
/**
|
|
14
|
+
* Web UI 服务器配置
|
|
15
|
+
*/
|
|
16
|
+
export declare const WEB_UI_PORT = 3456;
|
|
17
|
+
export declare const WEB_UI_HOST = "localhost";
|
|
18
|
+
/**
|
|
19
|
+
* Bitbucket API 配置
|
|
20
|
+
*/
|
|
21
|
+
export declare const BITBUCKET_API_BASE_URL = "https://api.bitbucket.org/2.0";
|
|
22
|
+
export declare const BITBUCKET_POLL_INTERVAL = 15000;
|
|
23
|
+
export declare const BITBUCKET_TIMEOUT: number;
|
|
24
|
+
/**
|
|
25
|
+
* Jenkins API 配置
|
|
26
|
+
*/
|
|
27
|
+
export declare const JENKINS_POLL_INTERVAL = 10000;
|
|
28
|
+
export declare const JENKINS_TIMEOUT: number;
|
|
29
|
+
/**
|
|
30
|
+
* 支持的环境列表
|
|
31
|
+
*/
|
|
32
|
+
export declare const SUPPORTED_ENVIRONMENTS: readonly ["test-01", "test-02", "test-03", "test-04", "uat"];
|
|
33
|
+
/**
|
|
34
|
+
* 支持的 Jenkins 实例类型
|
|
35
|
+
*/
|
|
36
|
+
export declare const JENKINS_INSTANCE_TYPES: readonly ["app", "pcalpha"];
|
|
37
|
+
/**
|
|
38
|
+
* 默认 Tag 格式
|
|
39
|
+
*/
|
|
40
|
+
export declare const DEFAULT_TAG_FORMATS: {
|
|
41
|
+
readonly "test-01": "test-v00.00.0000";
|
|
42
|
+
readonly "test-02": "test-v00.00.0000";
|
|
43
|
+
readonly "test-03": "test-v00.00.0000";
|
|
44
|
+
readonly "test-04": "test-v00.00.0000";
|
|
45
|
+
readonly uat: "uat-v00.00.0000";
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* bcrypt 加密轮数
|
|
49
|
+
*/
|
|
50
|
+
export declare const BCRYPT_ROUNDS = 10;
|
|
51
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/devops/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,eAAO,MAAM,UAAU,QAAuC,CAAC;AAC/D,eAAO,MAAM,WAAW,QAAuC,CAAC;AAEhE;;GAEG;AACH,eAAO,MAAM,cAAc,UAAU,CAAC;AAEtC;;GAEG;AACH,eAAO,MAAM,WAAW,OAAO,CAAC;AAChC,eAAO,MAAM,WAAW,cAAc,CAAC;AAEvC;;GAEG;AACH,eAAO,MAAM,sBAAsB,kCAAkC,CAAC;AACtE,eAAO,MAAM,uBAAuB,QAAQ,CAAC;AAC7C,eAAO,MAAM,iBAAiB,QAAiB,CAAC;AAEhD;;GAEG;AACH,eAAO,MAAM,qBAAqB,QAAQ,CAAC;AAC3C,eAAO,MAAM,eAAe,QAAiB,CAAC;AAE9C;;GAEG;AACH,eAAO,MAAM,sBAAsB,8DAMzB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,sBAAsB,6BAA8B,CAAC;AAElE;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;;CAMtB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,aAAa,KAAK,CAAC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 自动化部署功能的常量定义
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.BCRYPT_ROUNDS = exports.DEFAULT_TAG_FORMATS = exports.JENKINS_INSTANCE_TYPES = exports.SUPPORTED_ENVIRONMENTS = exports.JENKINS_TIMEOUT = exports.JENKINS_POLL_INTERVAL = exports.BITBUCKET_TIMEOUT = exports.BITBUCKET_POLL_INTERVAL = exports.BITBUCKET_API_BASE_URL = exports.WEB_UI_HOST = exports.WEB_UI_PORT = exports.CONFIG_VERSION = exports.CONFIG_FILE = exports.CONFIG_DIR = void 0;
|
|
40
|
+
const os = __importStar(require("os"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
/**
|
|
43
|
+
* 配置文件存储路径
|
|
44
|
+
*/
|
|
45
|
+
exports.CONFIG_DIR = path.join(os.homedir(), ".long-cli");
|
|
46
|
+
exports.CONFIG_FILE = path.join(exports.CONFIG_DIR, "config.json");
|
|
47
|
+
/**
|
|
48
|
+
* 配置版本
|
|
49
|
+
*/
|
|
50
|
+
exports.CONFIG_VERSION = "1.0.0";
|
|
51
|
+
/**
|
|
52
|
+
* Web UI 服务器配置
|
|
53
|
+
*/
|
|
54
|
+
exports.WEB_UI_PORT = 3456;
|
|
55
|
+
exports.WEB_UI_HOST = "localhost";
|
|
56
|
+
/**
|
|
57
|
+
* Bitbucket API 配置
|
|
58
|
+
*/
|
|
59
|
+
exports.BITBUCKET_API_BASE_URL = "https://api.bitbucket.org/2.0";
|
|
60
|
+
exports.BITBUCKET_POLL_INTERVAL = 15000; // 15 秒
|
|
61
|
+
exports.BITBUCKET_TIMEOUT = 30 * 60 * 1000; // 30 分钟
|
|
62
|
+
/**
|
|
63
|
+
* Jenkins API 配置
|
|
64
|
+
*/
|
|
65
|
+
exports.JENKINS_POLL_INTERVAL = 10000; // 10 秒
|
|
66
|
+
exports.JENKINS_TIMEOUT = 60 * 60 * 1000; // 60 分钟
|
|
67
|
+
/**
|
|
68
|
+
* 支持的环境列表
|
|
69
|
+
*/
|
|
70
|
+
exports.SUPPORTED_ENVIRONMENTS = [
|
|
71
|
+
"test-01",
|
|
72
|
+
"test-02",
|
|
73
|
+
"test-03",
|
|
74
|
+
"test-04",
|
|
75
|
+
"uat",
|
|
76
|
+
];
|
|
77
|
+
/**
|
|
78
|
+
* 支持的 Jenkins 实例类型
|
|
79
|
+
*/
|
|
80
|
+
exports.JENKINS_INSTANCE_TYPES = ["app", "pcalpha"];
|
|
81
|
+
/**
|
|
82
|
+
* 默认 Tag 格式
|
|
83
|
+
*/
|
|
84
|
+
exports.DEFAULT_TAG_FORMATS = {
|
|
85
|
+
"test-01": "test-v00.00.0000",
|
|
86
|
+
"test-02": "test-v00.00.0000",
|
|
87
|
+
"test-03": "test-v00.00.0000",
|
|
88
|
+
"test-04": "test-v00.00.0000",
|
|
89
|
+
uat: "uat-v00.00.0000",
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* bcrypt 加密轮数
|
|
93
|
+
*/
|
|
94
|
+
exports.BCRYPT_ROUNDS = 10;
|
|
95
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/devops/constants.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,2CAA6B;AAE7B;;GAEG;AACU,QAAA,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAClD,QAAA,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAU,EAAE,aAAa,CAAC,CAAC;AAEhE;;GAEG;AACU,QAAA,cAAc,GAAG,OAAO,CAAC;AAEtC;;GAEG;AACU,QAAA,WAAW,GAAG,IAAI,CAAC;AACnB,QAAA,WAAW,GAAG,WAAW,CAAC;AAEvC;;GAEG;AACU,QAAA,sBAAsB,GAAG,+BAA+B,CAAC;AACzD,QAAA,uBAAuB,GAAG,KAAK,CAAC,CAAC,OAAO;AACxC,QAAA,iBAAiB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,QAAQ;AAEzD;;GAEG;AACU,QAAA,qBAAqB,GAAG,KAAK,CAAC,CAAC,OAAO;AACtC,QAAA,eAAe,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,QAAQ;AAEvD;;GAEG;AACU,QAAA,sBAAsB,GAAG;IACpC,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,KAAK;CACG,CAAC;AAEX;;GAEG;AACU,QAAA,sBAAsB,GAAG,CAAC,KAAK,EAAE,SAAS,CAAU,CAAC;AAElE;;GAEG;AACU,QAAA,mBAAmB,GAAG;IACjC,SAAS,EAAE,kBAAkB;IAC7B,SAAS,EAAE,kBAAkB;IAC7B,SAAS,EAAE,kBAAkB;IAC7B,SAAS,EAAE,kBAAkB;IAC7B,GAAG,EAAE,iBAAiB;CACd,CAAC;AAEX;;GAEG;AACU,QAAA,aAAa,GAAG,EAAE,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 完整部署流程编排器
|
|
3
|
+
* 整合 Git Tag 创建、Pipeline 监听、Jenkins 部署等功能
|
|
4
|
+
*/
|
|
5
|
+
import { BitbucketClient } from "../api/bitbucket-client";
|
|
6
|
+
import { JenkinsClient } from "../api/jenkins-client";
|
|
7
|
+
import { ProjectConfig, EnvironmentConfig } from "../types";
|
|
8
|
+
/**
|
|
9
|
+
* 部署步骤枚举
|
|
10
|
+
*/
|
|
11
|
+
export declare enum DeployStep {
|
|
12
|
+
CREATING_TAG = "CREATING_TAG",
|
|
13
|
+
PUSHING_TAG = "PUSHING_TAG",
|
|
14
|
+
MONITORING_PIPELINE = "MONITORING_PIPELINE",
|
|
15
|
+
DEPLOYING_JENKINS = "DEPLOYING_JENKINS",
|
|
16
|
+
COMPLETED = "COMPLETED",
|
|
17
|
+
FAILED = "FAILED"
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 部署进度信息
|
|
21
|
+
*/
|
|
22
|
+
export interface DeployProgress {
|
|
23
|
+
step: DeployStep;
|
|
24
|
+
message: string;
|
|
25
|
+
timestamp: Date;
|
|
26
|
+
data?: any;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 完整部署选项
|
|
30
|
+
*/
|
|
31
|
+
export interface FullDeployOptions {
|
|
32
|
+
/** 是否创建新 tag(如果为 false,则使用现有 tag) */
|
|
33
|
+
createNewTag?: boolean;
|
|
34
|
+
/** Tag 名称(如果 createNewTag 为 false,则必须提供) */
|
|
35
|
+
tagName?: string;
|
|
36
|
+
/** 进度回调 */
|
|
37
|
+
onProgress?: (progress: DeployProgress) => void;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 完整部署结果
|
|
41
|
+
*/
|
|
42
|
+
export interface FullDeployResult {
|
|
43
|
+
success: boolean;
|
|
44
|
+
tagName: string;
|
|
45
|
+
pipelineStatus?: string;
|
|
46
|
+
jenkinsResult?: string;
|
|
47
|
+
jenkinsBuildNumber?: number;
|
|
48
|
+
jenkinsBuildUrl?: string;
|
|
49
|
+
error?: string;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* 完整部署流程编排器类
|
|
53
|
+
*/
|
|
54
|
+
export declare class FullDeployer {
|
|
55
|
+
private bitbucketClient;
|
|
56
|
+
private jenkinsClient;
|
|
57
|
+
private projectConfig;
|
|
58
|
+
private environmentConfig;
|
|
59
|
+
constructor(bitbucketClient: BitbucketClient, jenkinsClient: JenkinsClient, projectConfig: ProjectConfig, environmentConfig: EnvironmentConfig);
|
|
60
|
+
/**
|
|
61
|
+
* 执行完整部署流程
|
|
62
|
+
*/
|
|
63
|
+
deploy(options?: FullDeployOptions): Promise<FullDeployResult>;
|
|
64
|
+
/**
|
|
65
|
+
* 创建 Git Tag
|
|
66
|
+
*/
|
|
67
|
+
private createTag;
|
|
68
|
+
/**
|
|
69
|
+
* 推送 Tag 到远程仓库
|
|
70
|
+
*/
|
|
71
|
+
private pushTag;
|
|
72
|
+
/**
|
|
73
|
+
* 报告进度
|
|
74
|
+
*/
|
|
75
|
+
private reportProgress;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=full-deployer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"full-deployer.d.ts","sourceRoot":"","sources":["../../../src/devops/deployer/full-deployer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGtD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAI5D;;GAEG;AACH,oBAAY,UAAU;IACpB,YAAY,iBAAiB;IAC7B,WAAW,gBAAgB;IAC3B,mBAAmB,wBAAwB;IAC3C,iBAAiB,sBAAsB;IACvC,SAAS,cAAc;IACvB,MAAM,WAAW;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,qCAAqC;IACrC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW;IACX,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,CAAC;CACjD;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,iBAAiB,CAAoB;gBAG3C,eAAe,EAAE,eAAe,EAChC,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,aAAa,EAC5B,iBAAiB,EAAE,iBAAiB;IAQtC;;OAEG;IACG,MAAM,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA+IxE;;OAEG;YACW,SAAS;IAkBvB;;OAEG;YACW,OAAO;IAKrB;;OAEG;IACH,OAAO,CAAC,cAAc;CASvB"}
|
|
@@ -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"}
|