long-git-cli 1.0.12 → 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 +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 +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
package/dist/commands/tag.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tag.js","sourceRoot":"","sources":["../../src/commands/tag.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"tag.js","sourceRoot":"","sources":["../../src/commands/tag.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bitbucket API 客户端
|
|
3
|
+
* 负责与 Bitbucket API 交互,获取 Pipeline 状态
|
|
4
|
+
*/
|
|
5
|
+
import { PipelineStatus, WaitOptions } from "../types";
|
|
6
|
+
/**
|
|
7
|
+
* Bitbucket API 客户端类
|
|
8
|
+
*/
|
|
9
|
+
export declare class BitbucketClient {
|
|
10
|
+
private client;
|
|
11
|
+
private username;
|
|
12
|
+
private token;
|
|
13
|
+
/**
|
|
14
|
+
* 构造函数
|
|
15
|
+
* @param username Bitbucket 用户名
|
|
16
|
+
* @param token Bitbucket API Token 或 App Password(明文)
|
|
17
|
+
*/
|
|
18
|
+
constructor(username: string, token: string);
|
|
19
|
+
/**
|
|
20
|
+
* 测试连接
|
|
21
|
+
* @returns 连接是否成功
|
|
22
|
+
*/
|
|
23
|
+
testConnection(): Promise<boolean>;
|
|
24
|
+
/**
|
|
25
|
+
* 获取指定 tag 的 Pipeline 列表
|
|
26
|
+
* @param workspace Bitbucket workspace
|
|
27
|
+
* @param repoSlug 仓库 slug
|
|
28
|
+
* @param tag Tag 名称
|
|
29
|
+
* @returns Pipeline 列表
|
|
30
|
+
*/
|
|
31
|
+
getPipelinesByTag(workspace: string, repoSlug: string, tag: string): Promise<PipelineStatus[]>;
|
|
32
|
+
/**
|
|
33
|
+
* 获取 tag 对应的 commit hash
|
|
34
|
+
* @param workspace Bitbucket workspace
|
|
35
|
+
* @param repoSlug 仓库 slug
|
|
36
|
+
* @param tag Tag 名称
|
|
37
|
+
* @returns Commit hash
|
|
38
|
+
*/
|
|
39
|
+
getTagCommit(workspace: string, repoSlug: string, tag: string): Promise<string>;
|
|
40
|
+
/**
|
|
41
|
+
* 获取 commit 的 build status
|
|
42
|
+
* @param workspace Bitbucket workspace
|
|
43
|
+
* @param repoSlug 仓库 slug
|
|
44
|
+
* @param commitHash Commit hash
|
|
45
|
+
* @returns Build status 列表
|
|
46
|
+
*/
|
|
47
|
+
getCommitBuildStatus(workspace: string, repoSlug: string, commitHash: string): Promise<any[]>;
|
|
48
|
+
/**
|
|
49
|
+
* 获取分支的最新 commit hash
|
|
50
|
+
* @param workspace Bitbucket workspace
|
|
51
|
+
* @param repoSlug 仓库 slug
|
|
52
|
+
* @param branch 分支名称
|
|
53
|
+
* @returns Commit hash
|
|
54
|
+
*/
|
|
55
|
+
getBranchLatestCommit(workspace: string, repoSlug: string, branch: string): Promise<string>;
|
|
56
|
+
/**
|
|
57
|
+
* 创建 tag(通过 API)
|
|
58
|
+
* @param workspace Bitbucket workspace
|
|
59
|
+
* @param repoSlug 仓库 slug
|
|
60
|
+
* @param tagName Tag 名称
|
|
61
|
+
* @param commitHash Commit hash(可选,不提供则使用当前 HEAD)
|
|
62
|
+
* @returns 创建的 tag 信息
|
|
63
|
+
*/
|
|
64
|
+
createTag(workspace: string, repoSlug: string, tagName: string, commitHash?: string): Promise<any>;
|
|
65
|
+
/**
|
|
66
|
+
* 获取仓库的所有 tags
|
|
67
|
+
* @param workspace Bitbucket workspace
|
|
68
|
+
* @param repoSlug 仓库 slug
|
|
69
|
+
* @returns Tag 列表
|
|
70
|
+
*/
|
|
71
|
+
getTags(workspace: string, repoSlug: string): Promise<any[]>;
|
|
72
|
+
/**
|
|
73
|
+
* 获取指定 Pipeline 的状态
|
|
74
|
+
* @param workspace Bitbucket workspace
|
|
75
|
+
* @param repoSlug 仓库 slug
|
|
76
|
+
* @param pipelineUuid Pipeline UUID
|
|
77
|
+
* @returns Pipeline 状态
|
|
78
|
+
*/
|
|
79
|
+
getPipelineStatus(workspace: string, repoSlug: string, pipelineUuid: string): Promise<PipelineStatus>;
|
|
80
|
+
/**
|
|
81
|
+
* 等待 Pipeline 完成
|
|
82
|
+
* @param workspace Bitbucket workspace
|
|
83
|
+
* @param repoSlug 仓库 slug
|
|
84
|
+
* @param tag Tag 名称
|
|
85
|
+
* @param options 等待选项
|
|
86
|
+
* @returns 最终的 Pipeline 状态
|
|
87
|
+
*/
|
|
88
|
+
waitForPipelineCompletion(workspace: string, repoSlug: string, tag: string, options?: WaitOptions): Promise<PipelineStatus>;
|
|
89
|
+
/**
|
|
90
|
+
* 休眠指定毫秒数
|
|
91
|
+
* @param ms 毫秒数
|
|
92
|
+
*/
|
|
93
|
+
private sleep;
|
|
94
|
+
/**
|
|
95
|
+
* 处理错误
|
|
96
|
+
* @param error 错误对象
|
|
97
|
+
* @param message 错误消息
|
|
98
|
+
*/
|
|
99
|
+
private handleError;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=bitbucket-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitbucket-client.d.ts","sourceRoot":"","sources":["../../../src/devops/api/bitbucket-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,cAAc,EACd,WAAW,EACZ,MAAM,UAAU,CAAC;AAkBlB;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAAS;IAEtB;;;;OAIG;gBACS,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAmB3C;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAgDxC;;;;;;OAMG;IACG,iBAAiB,CACrB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,cAAc,EAAE,CAAC;IA4B5B;;;;;;OAMG;IACG,YAAY,CAChB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC;IAYlB;;;;;;OAMG;IACG,oBAAoB,CACxB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,GAAG,EAAE,CAAC;IA2BjB;;;;;;OAMG;IACG,qBAAqB,CACzB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC;IAkBlB;;;;;;;OAOG;IACG,SAAS,CACb,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,GAAG,CAAC;IA2Bf;;;;;OAKG;IACG,OAAO,CACX,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,GAAG,EAAE,CAAC;IAwBjB;;;;;;OAMG;IACG,iBAAiB,CACrB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,cAAc,CAAC;IAgB1B;;;;;;;OAOG;IACG,yBAAyB,CAC7B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,cAAc,CAAC;IAsD1B;;;OAGG;IACH,OAAO,CAAC,KAAK;IAIb;;;;OAIG;IACH,OAAO,CAAC,WAAW;CAqBpB"}
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Bitbucket API 客户端
|
|
4
|
+
* 负责与 Bitbucket API 交互,获取 Pipeline 状态
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.BitbucketClient = void 0;
|
|
11
|
+
const axios_1 = __importDefault(require("axios"));
|
|
12
|
+
const constants_1 = require("../constants");
|
|
13
|
+
/**
|
|
14
|
+
* Bitbucket API 客户端类
|
|
15
|
+
*/
|
|
16
|
+
class BitbucketClient {
|
|
17
|
+
/**
|
|
18
|
+
* 构造函数
|
|
19
|
+
* @param username Bitbucket 用户名
|
|
20
|
+
* @param token Bitbucket API Token 或 App Password(明文)
|
|
21
|
+
*/
|
|
22
|
+
constructor(username, token) {
|
|
23
|
+
this.username = username;
|
|
24
|
+
this.token = token;
|
|
25
|
+
// Bitbucket API Token 和 App Password 都使用 Basic Auth
|
|
26
|
+
// 用户名作为 username,token 作为 password
|
|
27
|
+
this.client = axios_1.default.create({
|
|
28
|
+
baseURL: constants_1.BITBUCKET_API_BASE_URL,
|
|
29
|
+
auth: {
|
|
30
|
+
username: this.username,
|
|
31
|
+
password: token,
|
|
32
|
+
},
|
|
33
|
+
headers: {
|
|
34
|
+
"Content-Type": "application/json",
|
|
35
|
+
},
|
|
36
|
+
timeout: 30000, // 30 秒超时
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 测试连接
|
|
41
|
+
* @returns 连接是否成功
|
|
42
|
+
*/
|
|
43
|
+
async testConnection() {
|
|
44
|
+
try {
|
|
45
|
+
// 尝试获取用户的 repositories 来测试连接
|
|
46
|
+
// 这个端点支持 API Token 和 App Password
|
|
47
|
+
const response = await this.client.get(`/user/permissions/repositories`);
|
|
48
|
+
console.log('Bitbucket 连接测试成功');
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
if (axios_1.default.isAxiosError(error)) {
|
|
53
|
+
const axiosError = error;
|
|
54
|
+
if (axiosError.response) {
|
|
55
|
+
console.error('Bitbucket 连接失败:', {
|
|
56
|
+
status: axiosError.response.status,
|
|
57
|
+
statusText: axiosError.response.statusText,
|
|
58
|
+
data: axiosError.response.data,
|
|
59
|
+
});
|
|
60
|
+
// 401 表示认证失败
|
|
61
|
+
if (axiosError.response.status === 401) {
|
|
62
|
+
console.error('认证失败:请检查以下几点:');
|
|
63
|
+
console.error('1. 用户名是否正确(应该是 Bitbucket 邮箱或用户名)');
|
|
64
|
+
console.error('2. API Token 是否正确(应该以 ATAT 开头)');
|
|
65
|
+
console.error('3. API Token 是否已过期');
|
|
66
|
+
console.error('4. API Token 是否有正确的 scopes:');
|
|
67
|
+
console.error(' - account (或 account:read)');
|
|
68
|
+
console.error(' - repository (或 repository:read)');
|
|
69
|
+
console.error(' - pullrequest (或 pullrequest:read)');
|
|
70
|
+
}
|
|
71
|
+
// 403 表示权限不足
|
|
72
|
+
else if (axiosError.response.status === 403) {
|
|
73
|
+
console.error('权限不足:API Token 缺少必要的 scopes');
|
|
74
|
+
console.error('请确保 Token 有以下权限:');
|
|
75
|
+
console.error(' - account (或 account:read)');
|
|
76
|
+
console.error(' - repository (或 repository:read)');
|
|
77
|
+
console.error(' - pullrequest (或 pullrequest:read)');
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
else if (axiosError.request) {
|
|
81
|
+
console.error('网络错误:无法连接到 Bitbucket API');
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
console.error('请求配置错误:', axiosError.message);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
console.error('未知错误:', error);
|
|
89
|
+
}
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* 获取指定 tag 的 Pipeline 列表
|
|
95
|
+
* @param workspace Bitbucket workspace
|
|
96
|
+
* @param repoSlug 仓库 slug
|
|
97
|
+
* @param tag Tag 名称
|
|
98
|
+
* @returns Pipeline 列表
|
|
99
|
+
*/
|
|
100
|
+
async getPipelinesByTag(workspace, repoSlug, tag) {
|
|
101
|
+
try {
|
|
102
|
+
console.log(`查询 Pipeline: workspace=${workspace}, repo=${repoSlug}, tag=${tag}`);
|
|
103
|
+
const response = await this.client.get(`/repositories/${workspace}/${repoSlug}/pipelines/`, {
|
|
104
|
+
params: {
|
|
105
|
+
// 按 tag 过滤 - 使用 target.ref_name 而不是带引号的
|
|
106
|
+
'target.ref_name': tag,
|
|
107
|
+
// 按创建时间倒序排序
|
|
108
|
+
sort: "-created_on",
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
console.log(`找到 ${response.data.values?.length || 0} 个 Pipeline`);
|
|
112
|
+
if (response.data.values && response.data.values.length > 0) {
|
|
113
|
+
console.log(`最新 Pipeline: ${response.data.values[0].uuid}, 状态: ${response.data.values[0].state.name}`);
|
|
114
|
+
}
|
|
115
|
+
return response.data.values || [];
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
this.handleError(error, "获取 Pipeline 列表失败");
|
|
119
|
+
throw error;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* 获取 tag 对应的 commit hash
|
|
124
|
+
* @param workspace Bitbucket workspace
|
|
125
|
+
* @param repoSlug 仓库 slug
|
|
126
|
+
* @param tag Tag 名称
|
|
127
|
+
* @returns Commit hash
|
|
128
|
+
*/
|
|
129
|
+
async getTagCommit(workspace, repoSlug, tag) {
|
|
130
|
+
try {
|
|
131
|
+
const response = await this.client.get(`/repositories/${workspace}/${repoSlug}/refs/tags/${tag}`);
|
|
132
|
+
return response.data.target.hash;
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
this.handleError(error, `获取 tag ${tag} 的 commit 失败`);
|
|
136
|
+
throw error;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* 获取 commit 的 build status
|
|
141
|
+
* @param workspace Bitbucket workspace
|
|
142
|
+
* @param repoSlug 仓库 slug
|
|
143
|
+
* @param commitHash Commit hash
|
|
144
|
+
* @returns Build status 列表
|
|
145
|
+
*/
|
|
146
|
+
async getCommitBuildStatus(workspace, repoSlug, commitHash) {
|
|
147
|
+
try {
|
|
148
|
+
console.log(`查询 commit ${commitHash.substring(0, 7)} 的 build status...`);
|
|
149
|
+
// 使用 /statuses 而不是 /statuses/build 来读取状态
|
|
150
|
+
// /statuses/build 是用于创建/更新状态,需要 OAuth
|
|
151
|
+
// /statuses 是用于读取所有状态,支持 API Token
|
|
152
|
+
const response = await this.client.get(`/repositories/${workspace}/${repoSlug}/commit/${commitHash}/statuses`);
|
|
153
|
+
const statuses = response.data.values || [];
|
|
154
|
+
console.log(`找到 ${statuses.length} 个 status`);
|
|
155
|
+
if (statuses.length > 0) {
|
|
156
|
+
statuses.forEach((status) => {
|
|
157
|
+
console.log(` - ${status.name || status.key}: ${status.state}`);
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
return statuses;
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
this.handleError(error, "获取 commit build status 失败");
|
|
164
|
+
throw error;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* 获取分支的最新 commit hash
|
|
169
|
+
* @param workspace Bitbucket workspace
|
|
170
|
+
* @param repoSlug 仓库 slug
|
|
171
|
+
* @param branch 分支名称
|
|
172
|
+
* @returns Commit hash
|
|
173
|
+
*/
|
|
174
|
+
async getBranchLatestCommit(workspace, repoSlug, branch) {
|
|
175
|
+
try {
|
|
176
|
+
console.log(`获取分支 ${branch} 的最新 commit...`);
|
|
177
|
+
const response = await this.client.get(`/repositories/${workspace}/${repoSlug}/refs/branches/${branch}`);
|
|
178
|
+
const commitHash = response.data.target.hash;
|
|
179
|
+
console.log(`分支 ${branch} 最新 commit: ${commitHash.substring(0, 7)}`);
|
|
180
|
+
return commitHash;
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
this.handleError(error, `获取分支 ${branch} 的最新 commit 失败`);
|
|
184
|
+
throw error;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* 创建 tag(通过 API)
|
|
189
|
+
* @param workspace Bitbucket workspace
|
|
190
|
+
* @param repoSlug 仓库 slug
|
|
191
|
+
* @param tagName Tag 名称
|
|
192
|
+
* @param commitHash Commit hash(可选,不提供则使用当前 HEAD)
|
|
193
|
+
* @returns 创建的 tag 信息
|
|
194
|
+
*/
|
|
195
|
+
async createTag(workspace, repoSlug, tagName, commitHash) {
|
|
196
|
+
try {
|
|
197
|
+
console.log(`创建 tag: ${tagName}${commitHash ? ` (commit: ${commitHash.substring(0, 7)})` : ''}`);
|
|
198
|
+
const payload = {
|
|
199
|
+
name: tagName,
|
|
200
|
+
target: {}
|
|
201
|
+
};
|
|
202
|
+
if (commitHash) {
|
|
203
|
+
payload.target.hash = commitHash;
|
|
204
|
+
}
|
|
205
|
+
const response = await this.client.post(`/repositories/${workspace}/${repoSlug}/refs/tags`, payload);
|
|
206
|
+
console.log(`Tag ${tagName} 创建成功`);
|
|
207
|
+
return response.data;
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
this.handleError(error, `创建 tag ${tagName} 失败`);
|
|
211
|
+
throw error;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* 获取仓库的所有 tags
|
|
216
|
+
* @param workspace Bitbucket workspace
|
|
217
|
+
* @param repoSlug 仓库 slug
|
|
218
|
+
* @returns Tag 列表
|
|
219
|
+
*/
|
|
220
|
+
async getTags(workspace, repoSlug) {
|
|
221
|
+
try {
|
|
222
|
+
console.log(`获取仓库 tags: ${workspace}/${repoSlug}`);
|
|
223
|
+
const response = await this.client.get(`/repositories/${workspace}/${repoSlug}/refs/tags`, {
|
|
224
|
+
params: {
|
|
225
|
+
pagelen: 100, // 获取最近 100 个 tags
|
|
226
|
+
sort: '-target.date', // 按日期倒序
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
const tags = response.data.values || [];
|
|
230
|
+
console.log(`找到 ${tags.length} 个 tags`);
|
|
231
|
+
return tags;
|
|
232
|
+
}
|
|
233
|
+
catch (error) {
|
|
234
|
+
this.handleError(error, "获取 tags 失败");
|
|
235
|
+
throw error;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* 获取指定 Pipeline 的状态
|
|
240
|
+
* @param workspace Bitbucket workspace
|
|
241
|
+
* @param repoSlug 仓库 slug
|
|
242
|
+
* @param pipelineUuid Pipeline UUID
|
|
243
|
+
* @returns Pipeline 状态
|
|
244
|
+
*/
|
|
245
|
+
async getPipelineStatus(workspace, repoSlug, pipelineUuid) {
|
|
246
|
+
try {
|
|
247
|
+
// 移除 UUID 中的大括号(如果有)
|
|
248
|
+
const cleanUuid = pipelineUuid.replace(/[{}]/g, "");
|
|
249
|
+
const response = await this.client.get(`/repositories/${workspace}/${repoSlug}/pipelines/${cleanUuid}`);
|
|
250
|
+
return response.data;
|
|
251
|
+
}
|
|
252
|
+
catch (error) {
|
|
253
|
+
this.handleError(error, "获取 Pipeline 状态失败");
|
|
254
|
+
throw error;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* 等待 Pipeline 完成
|
|
259
|
+
* @param workspace Bitbucket workspace
|
|
260
|
+
* @param repoSlug 仓库 slug
|
|
261
|
+
* @param tag Tag 名称
|
|
262
|
+
* @param options 等待选项
|
|
263
|
+
* @returns 最终的 Pipeline 状态
|
|
264
|
+
*/
|
|
265
|
+
async waitForPipelineCompletion(workspace, repoSlug, tag, options) {
|
|
266
|
+
const pollInterval = options?.pollInterval || constants_1.BITBUCKET_POLL_INTERVAL;
|
|
267
|
+
const timeout = options?.timeout || constants_1.BITBUCKET_TIMEOUT;
|
|
268
|
+
const onProgress = options?.onProgress;
|
|
269
|
+
const startTime = Date.now();
|
|
270
|
+
// 首先获取该 tag 的 Pipeline
|
|
271
|
+
const pipelines = await this.getPipelinesByTag(workspace, repoSlug, tag);
|
|
272
|
+
if (pipelines.length === 0) {
|
|
273
|
+
throw new Error(`未找到 tag "${tag}" 的 Pipeline`);
|
|
274
|
+
}
|
|
275
|
+
// 获取最新的 Pipeline
|
|
276
|
+
const pipeline = pipelines[0];
|
|
277
|
+
const pipelineUuid = pipeline.uuid;
|
|
278
|
+
// 轮询 Pipeline 状态
|
|
279
|
+
while (true) {
|
|
280
|
+
// 检查超时
|
|
281
|
+
if (Date.now() - startTime > timeout) {
|
|
282
|
+
throw new Error(`Pipeline 监听超时(${timeout / 1000}秒),tag: ${tag}`);
|
|
283
|
+
}
|
|
284
|
+
// 获取当前状态
|
|
285
|
+
const status = await this.getPipelineStatus(workspace, repoSlug, pipelineUuid);
|
|
286
|
+
// 调用进度回调
|
|
287
|
+
if (onProgress) {
|
|
288
|
+
onProgress(status);
|
|
289
|
+
}
|
|
290
|
+
// 检查是否完成
|
|
291
|
+
const stateName = status.state.name;
|
|
292
|
+
if (stateName === "SUCCESSFUL" ||
|
|
293
|
+
stateName === "FAILED" ||
|
|
294
|
+
stateName === "STOPPED") {
|
|
295
|
+
return status;
|
|
296
|
+
}
|
|
297
|
+
// 等待下一次轮询
|
|
298
|
+
await this.sleep(pollInterval);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* 休眠指定毫秒数
|
|
303
|
+
* @param ms 毫秒数
|
|
304
|
+
*/
|
|
305
|
+
sleep(ms) {
|
|
306
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* 处理错误
|
|
310
|
+
* @param error 错误对象
|
|
311
|
+
* @param message 错误消息
|
|
312
|
+
*/
|
|
313
|
+
handleError(error, message) {
|
|
314
|
+
if (axios_1.default.isAxiosError(error)) {
|
|
315
|
+
const axiosError = error;
|
|
316
|
+
if (axiosError.response) {
|
|
317
|
+
// 服务器返回错误响应
|
|
318
|
+
console.error(`${message}: ${axiosError.response.status} - ${JSON.stringify(axiosError.response.data)}`);
|
|
319
|
+
}
|
|
320
|
+
else if (axiosError.request) {
|
|
321
|
+
// 请求已发送但没有收到响应
|
|
322
|
+
console.error(`${message}: 网络错误,无法连接到 Bitbucket API`);
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
// 请求配置错误
|
|
326
|
+
console.error(`${message}: ${axiosError.message}`);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
else {
|
|
330
|
+
console.error(`${message}:`, error);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
exports.BitbucketClient = BitbucketClient;
|
|
335
|
+
//# sourceMappingURL=bitbucket-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitbucket-client.js","sourceRoot":"","sources":["../../../src/devops/api/bitbucket-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Jenkins API 客户端
|
|
3
|
+
* 负责与 Jenkins API 交互,触发构建和获取构建状态
|
|
4
|
+
*/
|
|
5
|
+
import { JenkinsBuildInfo, WaitOptions } from "../types";
|
|
6
|
+
/**
|
|
7
|
+
* Jenkins 队列项响应
|
|
8
|
+
*/
|
|
9
|
+
interface QueueItemResponse {
|
|
10
|
+
id: number;
|
|
11
|
+
executable?: {
|
|
12
|
+
number: number;
|
|
13
|
+
url: string;
|
|
14
|
+
};
|
|
15
|
+
why?: string;
|
|
16
|
+
blocked?: boolean;
|
|
17
|
+
buildable?: boolean;
|
|
18
|
+
stuck?: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Jenkins API 客户端类
|
|
22
|
+
*/
|
|
23
|
+
export declare class JenkinsClient {
|
|
24
|
+
private client;
|
|
25
|
+
private baseUrl;
|
|
26
|
+
private username;
|
|
27
|
+
private apiToken;
|
|
28
|
+
/**
|
|
29
|
+
* 构造函数
|
|
30
|
+
* @param baseUrl Jenkins 服务器地址
|
|
31
|
+
* @param username Jenkins 用户名
|
|
32
|
+
* @param apiToken Jenkins API Token(明文)
|
|
33
|
+
*/
|
|
34
|
+
constructor(baseUrl: string, username: string, apiToken: string);
|
|
35
|
+
/**
|
|
36
|
+
* 测试连接
|
|
37
|
+
* @returns 连接是否成功
|
|
38
|
+
*/
|
|
39
|
+
testConnection(): Promise<boolean>;
|
|
40
|
+
/**
|
|
41
|
+
* 触发构建
|
|
42
|
+
* @param jobName Job 名称(可以包含文件夹路径,如 "folder/job-name")
|
|
43
|
+
* @param parameters 构建参数
|
|
44
|
+
* @returns 队列 ID
|
|
45
|
+
*/
|
|
46
|
+
triggerBuild(jobName: string, parameters: Record<string, string>): Promise<string>;
|
|
47
|
+
/**
|
|
48
|
+
* 获取队列项信息
|
|
49
|
+
* @param queueId 队列 ID
|
|
50
|
+
* @returns 队列项信息
|
|
51
|
+
*/
|
|
52
|
+
getQueueItem(queueId: string): Promise<QueueItemResponse>;
|
|
53
|
+
/**
|
|
54
|
+
* 获取构建信息
|
|
55
|
+
* @param jobName Job 名称(可以包含文件夹路径,如 "folder/job-name")
|
|
56
|
+
* @param buildNumber 构建号
|
|
57
|
+
* @returns 构建信息
|
|
58
|
+
*/
|
|
59
|
+
getBuildInfo(jobName: string, buildNumber: number): Promise<JenkinsBuildInfo>;
|
|
60
|
+
/**
|
|
61
|
+
* 等待构建完成
|
|
62
|
+
* @param jobName Job 名称
|
|
63
|
+
* @param buildNumber 构建号
|
|
64
|
+
* @param options 等待选项
|
|
65
|
+
* @returns 最终的构建信息
|
|
66
|
+
*/
|
|
67
|
+
waitForBuildCompletion(jobName: string, buildNumber: number, options?: WaitOptions): Promise<JenkinsBuildInfo>;
|
|
68
|
+
/**
|
|
69
|
+
* 等待队列项变成构建
|
|
70
|
+
* @param queueId 队列 ID
|
|
71
|
+
* @param timeout 超时时间(毫秒)
|
|
72
|
+
* @returns 构建号
|
|
73
|
+
*/
|
|
74
|
+
waitForQueueToBuild(queueId: string, timeout?: number): Promise<number>;
|
|
75
|
+
/**
|
|
76
|
+
* 触发构建并等待完成
|
|
77
|
+
* @param jobName Job 名称
|
|
78
|
+
* @param parameters 构建参数
|
|
79
|
+
* @param options 等待选项
|
|
80
|
+
* @returns 最终的构建信息
|
|
81
|
+
*/
|
|
82
|
+
triggerAndWait(jobName: string, parameters: Record<string, string>, options?: WaitOptions): Promise<JenkinsBuildInfo>;
|
|
83
|
+
/**
|
|
84
|
+
* 休眠指定毫秒数
|
|
85
|
+
* @param ms 毫秒数
|
|
86
|
+
*/
|
|
87
|
+
private sleep;
|
|
88
|
+
/**
|
|
89
|
+
* 处理错误
|
|
90
|
+
* @param error 错误对象
|
|
91
|
+
* @param message 错误消息
|
|
92
|
+
*/
|
|
93
|
+
private handleError;
|
|
94
|
+
}
|
|
95
|
+
export {};
|
|
96
|
+
//# sourceMappingURL=jenkins-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jenkins-client.d.ts","sourceRoot":"","sources":["../../../src/devops/api/jenkins-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,gBAAgB,EAChB,WAAW,EACZ,MAAM,UAAU,CAAC;AAMlB;;GAEG;AACH,UAAU,iBAAiB;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,CAAC,EAAE;QACX,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAgBD;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAS;IAEzB;;;;;OAKG;gBACS,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAmB/D;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAUxC;;;;;OAKG;IACG,YAAY,CAChB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,OAAO,CAAC,MAAM,CAAC;IAwClB;;;;OAIG;IACG,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAY/D;;;;;OAKG;IACG,YAAY,CAChB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,gBAAgB,CAAC;IAuB5B;;;;;;OAMG;IACG,sBAAsB,CAC1B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,gBAAgB,CAAC;IAkC5B;;;;;OAKG;IACG,mBAAmB,CACvB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,MAAc,GACtB,OAAO,CAAC,MAAM,CAAC;IA4BlB;;;;;;OAMG;IACG,cAAc,CAClB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAClC,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,gBAAgB,CAAC;IAW5B;;;OAGG;IACH,OAAO,CAAC,KAAK;IAIb;;;;OAIG;IACH,OAAO,CAAC,WAAW;CAqBpB"}
|