@apiclient.xyz/gitlab 2.3.0 → 2.5.0
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/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/gitlab.classes.gitlabclient.d.ts +61 -5
- package/dist_ts/gitlab.classes.gitlabclient.js +123 -8
- package/dist_ts/gitlab.interfaces.d.ts +124 -7
- package/dist_ts/gitlab.interfaces.js +4 -1
- package/dist_ts/index.d.ts +1 -1
- package/dist_ts/index.js +1 -1
- package/package.json +1 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/gitlab.classes.gitlabclient.ts +174 -11
- package/ts/gitlab.interfaces.ts +172 -7
- package/ts/index.ts +8 -0
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@apiclient.xyz/gitlab',
|
|
6
|
-
version: '2.
|
|
6
|
+
version: '2.5.0',
|
|
7
7
|
description: 'A TypeScript client for the GitLab API, providing easy access to projects, groups, CI/CD variables, and pipelines.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx1QkFBdUI7SUFDN0IsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLG9IQUFvSDtDQUNsSSxDQUFBIn0=
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { IGitLabProject, IGitLabGroup, IGitLabVariable, IVariableOptions, IGitLabProtectedBranch, IGitLabPipeline, IGitLabJob, ITestConnectionResult, IListOptions } from './gitlab.interfaces.js';
|
|
1
|
+
import type { IGitLabProject, IGitLabGroup, IGitLabVariable, IVariableOptions, IGitLabProtectedBranch, IGitLabBranch, IGitLabTag, IGitLabPipeline, IGitLabPipelineVariable, IGitLabTestReport, IGitLabJob, ITestConnectionResult, IListOptions, IPipelineListOptions, IJobListOptions } from './gitlab.interfaces.js';
|
|
2
2
|
export declare class GitLabClient {
|
|
3
3
|
private baseUrl;
|
|
4
4
|
private token;
|
|
@@ -41,11 +41,67 @@ export declare class GitLabClient {
|
|
|
41
41
|
createGroupVariable(groupId: number | string, key: string, value: string, opts?: IVariableOptions): Promise<IGitLabVariable>;
|
|
42
42
|
updateGroupVariable(groupId: number | string, key: string, value: string, opts?: IVariableOptions): Promise<IGitLabVariable>;
|
|
43
43
|
deleteGroupVariable(groupId: number | string, key: string): Promise<void>;
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
/**
|
|
45
|
+
* List pipelines for a project with optional filters.
|
|
46
|
+
* Supports status, ref, source, scope, username, date range, ordering.
|
|
47
|
+
*/
|
|
48
|
+
getPipelines(projectId: number | string, opts?: IPipelineListOptions): Promise<IGitLabPipeline[]>;
|
|
49
|
+
/**
|
|
50
|
+
* Get a single pipeline's full details.
|
|
51
|
+
*/
|
|
52
|
+
getPipeline(projectId: number | string, pipelineId: number): Promise<IGitLabPipeline>;
|
|
53
|
+
/**
|
|
54
|
+
* Trigger a new pipeline on the given ref, optionally with variables.
|
|
55
|
+
*/
|
|
56
|
+
triggerPipeline(projectId: number | string, ref: string, variables?: {
|
|
57
|
+
key: string;
|
|
58
|
+
value: string;
|
|
59
|
+
variable_type?: string;
|
|
60
|
+
}[]): Promise<IGitLabPipeline>;
|
|
61
|
+
/**
|
|
62
|
+
* Delete a pipeline and all its jobs.
|
|
63
|
+
*/
|
|
64
|
+
deletePipeline(projectId: number | string, pipelineId: number): Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* Get variables used in a specific pipeline run.
|
|
67
|
+
*/
|
|
68
|
+
getPipelineVariables(projectId: number | string, pipelineId: number): Promise<IGitLabPipelineVariable[]>;
|
|
69
|
+
/**
|
|
70
|
+
* Get the test report for a pipeline.
|
|
71
|
+
*/
|
|
72
|
+
getPipelineTestReport(projectId: number | string, pipelineId: number): Promise<IGitLabTestReport>;
|
|
73
|
+
retryPipeline(projectId: number | string, pipelineId: number): Promise<IGitLabPipeline>;
|
|
74
|
+
cancelPipeline(projectId: number | string, pipelineId: number): Promise<IGitLabPipeline>;
|
|
75
|
+
/**
|
|
76
|
+
* List jobs for a pipeline with optional scope filter and pagination.
|
|
77
|
+
*/
|
|
78
|
+
getPipelineJobs(projectId: number | string, pipelineId: number, opts?: IJobListOptions): Promise<IGitLabJob[]>;
|
|
79
|
+
/**
|
|
80
|
+
* Get a single job's full details.
|
|
81
|
+
*/
|
|
82
|
+
getJob(projectId: number | string, jobId: number): Promise<IGitLabJob>;
|
|
83
|
+
/**
|
|
84
|
+
* Get a job's raw log (trace) output.
|
|
85
|
+
*/
|
|
46
86
|
getJobLog(projectId: number | string, jobId: number): Promise<string>;
|
|
47
|
-
|
|
48
|
-
|
|
87
|
+
/**
|
|
88
|
+
* Retry a single job.
|
|
89
|
+
*/
|
|
90
|
+
retryJob(projectId: number | string, jobId: number): Promise<IGitLabJob>;
|
|
91
|
+
/**
|
|
92
|
+
* Cancel a running job.
|
|
93
|
+
*/
|
|
94
|
+
cancelJob(projectId: number | string, jobId: number): Promise<IGitLabJob>;
|
|
95
|
+
/**
|
|
96
|
+
* Trigger a manual job (play action).
|
|
97
|
+
*/
|
|
98
|
+
playJob(projectId: number | string, jobId: number): Promise<IGitLabJob>;
|
|
99
|
+
/**
|
|
100
|
+
* Erase a job's trace and artifacts.
|
|
101
|
+
*/
|
|
102
|
+
eraseJob(projectId: number | string, jobId: number): Promise<void>;
|
|
103
|
+
getRepoBranches(projectId: number | string, opts?: IListOptions): Promise<IGitLabBranch[]>;
|
|
104
|
+
getRepoTags(projectId: number | string, opts?: IListOptions): Promise<IGitLabTag[]>;
|
|
49
105
|
getProtectedBranches(projectId: number | string): Promise<IGitLabProtectedBranch[]>;
|
|
50
106
|
unprotectBranch(projectId: number | string, branchName: string): Promise<void>;
|
|
51
107
|
deleteProject(projectId: number | string): Promise<void>;
|
|
@@ -225,22 +225,137 @@ export class GitLabClient {
|
|
|
225
225
|
// ---------------------------------------------------------------------------
|
|
226
226
|
// Pipelines
|
|
227
227
|
// ---------------------------------------------------------------------------
|
|
228
|
+
/**
|
|
229
|
+
* List pipelines for a project with optional filters.
|
|
230
|
+
* Supports status, ref, source, scope, username, date range, ordering.
|
|
231
|
+
*/
|
|
228
232
|
async getPipelines(projectId, opts) {
|
|
229
233
|
const page = opts?.page || 1;
|
|
230
234
|
const perPage = opts?.perPage || 30;
|
|
231
|
-
|
|
235
|
+
const orderBy = opts?.orderBy || 'updated_at';
|
|
236
|
+
const sort = opts?.sort || 'desc';
|
|
237
|
+
let url = `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines?page=${page}&per_page=${perPage}&order_by=${orderBy}&sort=${sort}`;
|
|
238
|
+
if (opts?.status)
|
|
239
|
+
url += `&status=${encodeURIComponent(opts.status)}`;
|
|
240
|
+
if (opts?.ref)
|
|
241
|
+
url += `&ref=${encodeURIComponent(opts.ref)}`;
|
|
242
|
+
if (opts?.source)
|
|
243
|
+
url += `&source=${encodeURIComponent(opts.source)}`;
|
|
244
|
+
if (opts?.scope)
|
|
245
|
+
url += `&scope=${encodeURIComponent(opts.scope)}`;
|
|
246
|
+
if (opts?.username)
|
|
247
|
+
url += `&username=${encodeURIComponent(opts.username)}`;
|
|
248
|
+
if (opts?.updatedAfter)
|
|
249
|
+
url += `&updated_after=${encodeURIComponent(opts.updatedAfter)}`;
|
|
250
|
+
if (opts?.updatedBefore)
|
|
251
|
+
url += `&updated_before=${encodeURIComponent(opts.updatedBefore)}`;
|
|
252
|
+
return this.request('GET', url);
|
|
232
253
|
}
|
|
233
|
-
|
|
234
|
-
|
|
254
|
+
/**
|
|
255
|
+
* Get a single pipeline's full details.
|
|
256
|
+
*/
|
|
257
|
+
async getPipeline(projectId, pipelineId) {
|
|
258
|
+
return this.request('GET', `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}`);
|
|
235
259
|
}
|
|
236
|
-
|
|
237
|
-
|
|
260
|
+
/**
|
|
261
|
+
* Trigger a new pipeline on the given ref, optionally with variables.
|
|
262
|
+
*/
|
|
263
|
+
async triggerPipeline(projectId, ref, variables) {
|
|
264
|
+
const body = { ref };
|
|
265
|
+
if (variables && variables.length > 0) {
|
|
266
|
+
body.variables = variables;
|
|
267
|
+
}
|
|
268
|
+
return this.request('POST', `/api/v4/projects/${encodeURIComponent(projectId)}/pipeline`, body);
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Delete a pipeline and all its jobs.
|
|
272
|
+
*/
|
|
273
|
+
async deletePipeline(projectId, pipelineId) {
|
|
274
|
+
await this.request('DELETE', `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}`);
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Get variables used in a specific pipeline run.
|
|
278
|
+
*/
|
|
279
|
+
async getPipelineVariables(projectId, pipelineId) {
|
|
280
|
+
return this.request('GET', `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/variables`);
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Get the test report for a pipeline.
|
|
284
|
+
*/
|
|
285
|
+
async getPipelineTestReport(projectId, pipelineId) {
|
|
286
|
+
return this.request('GET', `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/test_report`);
|
|
238
287
|
}
|
|
239
288
|
async retryPipeline(projectId, pipelineId) {
|
|
240
|
-
|
|
289
|
+
return this.request('POST', `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/retry`);
|
|
241
290
|
}
|
|
242
291
|
async cancelPipeline(projectId, pipelineId) {
|
|
243
|
-
|
|
292
|
+
return this.request('POST', `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/cancel`);
|
|
293
|
+
}
|
|
294
|
+
// ---------------------------------------------------------------------------
|
|
295
|
+
// Jobs
|
|
296
|
+
// ---------------------------------------------------------------------------
|
|
297
|
+
/**
|
|
298
|
+
* List jobs for a pipeline with optional scope filter and pagination.
|
|
299
|
+
*/
|
|
300
|
+
async getPipelineJobs(projectId, pipelineId, opts) {
|
|
301
|
+
const page = opts?.page || 1;
|
|
302
|
+
const perPage = opts?.perPage || 100;
|
|
303
|
+
let url = `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/jobs?page=${page}&per_page=${perPage}`;
|
|
304
|
+
if (opts?.scope && opts.scope.length > 0) {
|
|
305
|
+
for (const s of opts.scope) {
|
|
306
|
+
url += `&scope[]=${encodeURIComponent(s)}`;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
return this.request('GET', url);
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Get a single job's full details.
|
|
313
|
+
*/
|
|
314
|
+
async getJob(projectId, jobId) {
|
|
315
|
+
return this.request('GET', `/api/v4/projects/${encodeURIComponent(projectId)}/jobs/${jobId}`);
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Get a job's raw log (trace) output.
|
|
319
|
+
*/
|
|
320
|
+
async getJobLog(projectId, jobId) {
|
|
321
|
+
return this.requestText('GET', `/api/v4/projects/${encodeURIComponent(projectId)}/jobs/${jobId}/trace`);
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Retry a single job.
|
|
325
|
+
*/
|
|
326
|
+
async retryJob(projectId, jobId) {
|
|
327
|
+
return this.request('POST', `/api/v4/projects/${encodeURIComponent(projectId)}/jobs/${jobId}/retry`);
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Cancel a running job.
|
|
331
|
+
*/
|
|
332
|
+
async cancelJob(projectId, jobId) {
|
|
333
|
+
return this.request('POST', `/api/v4/projects/${encodeURIComponent(projectId)}/jobs/${jobId}/cancel`);
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Trigger a manual job (play action).
|
|
337
|
+
*/
|
|
338
|
+
async playJob(projectId, jobId) {
|
|
339
|
+
return this.request('POST', `/api/v4/projects/${encodeURIComponent(projectId)}/jobs/${jobId}/play`);
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Erase a job's trace and artifacts.
|
|
343
|
+
*/
|
|
344
|
+
async eraseJob(projectId, jobId) {
|
|
345
|
+
await this.request('POST', `/api/v4/projects/${encodeURIComponent(projectId)}/jobs/${jobId}/erase`);
|
|
346
|
+
}
|
|
347
|
+
// ---------------------------------------------------------------------------
|
|
348
|
+
// Repository Branches & Tags
|
|
349
|
+
// ---------------------------------------------------------------------------
|
|
350
|
+
async getRepoBranches(projectId, opts) {
|
|
351
|
+
const page = opts?.page || 1;
|
|
352
|
+
const perPage = opts?.perPage || 50;
|
|
353
|
+
return this.request('GET', `/api/v4/projects/${encodeURIComponent(projectId)}/repository/branches?page=${page}&per_page=${perPage}`);
|
|
354
|
+
}
|
|
355
|
+
async getRepoTags(projectId, opts) {
|
|
356
|
+
const page = opts?.page || 1;
|
|
357
|
+
const perPage = opts?.perPage || 50;
|
|
358
|
+
return this.request('GET', `/api/v4/projects/${encodeURIComponent(projectId)}/repository/tags?page=${page}&per_page=${perPage}`);
|
|
244
359
|
}
|
|
245
360
|
// ---------------------------------------------------------------------------
|
|
246
361
|
// Protected Branches
|
|
@@ -258,4 +373,4 @@ export class GitLabClient {
|
|
|
258
373
|
await this.request('DELETE', `/api/v4/projects/${encodeURIComponent(projectId)}`);
|
|
259
374
|
}
|
|
260
375
|
}
|
|
261
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0bGFiLmNsYXNzZXMuZ2l0bGFiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvZ2l0bGFiLmNsYXNzZXMuZ2l0bGFiY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0scUJBQXFCLENBQUM7QUFDL0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBYzdDLE1BQU0sT0FBTyxZQUFZO0lBSXZCLFlBQVksT0FBZSxFQUFFLEtBQWE7UUFDeEMsbUNBQW1DO1FBQ25DLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDckIsQ0FBQztJQUVELDhFQUE4RTtJQUM5RSxlQUFlO0lBQ2YsOEVBQThFO0lBRXRFLEtBQUssQ0FBQyxPQUFPLENBQ25CLE1BQXlDLEVBQ3pDLElBQVksRUFDWixJQUFVLEVBQ1YsYUFBc0M7UUFFdEMsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksRUFBRSxDQUFDO1FBRXJDLElBQUksT0FBTyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRTthQUNyRCxHQUFHLENBQUMsR0FBRyxDQUFDO2FBQ1IsTUFBTSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDO2FBQ25DLE1BQU0sQ0FBQyxjQUFjLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUU5QyxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2xCLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7Z0JBQ25ELE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFD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
|
|
376
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0bGFiLmNsYXNzZXMuZ2l0bGFiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvZ2l0bGFiLmNsYXNzZXMuZ2l0bGFiY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0scUJBQXFCLENBQUM7QUFDL0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBb0I3QyxNQUFNLE9BQU8sWUFBWTtJQUl2QixZQUFZLE9BQWUsRUFBRSxLQUFhO1FBQ3hDLG1DQUFtQztRQUNuQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsZUFBZTtJQUNmLDhFQUE4RTtJQUV0RSxLQUFLLENBQUMsT0FBTyxDQUNuQixNQUF5QyxFQUN6QyxJQUFZLEVBQ1osSUFBVSxFQUNWLGFBQXNDO1FBRXRDLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUVyQyxJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUU7YUFDckQsR0FBRyxDQUFDLEdBQUcsQ0FBQzthQUNSLE1BQU0sQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQzthQUNuQyxNQUFNLENBQUMsY0FBYyxFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFFOUMsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQixLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO2dCQUNuRCxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FB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
|
|
@@ -1,3 +1,36 @@
|
|
|
1
|
+
export interface ITestConnectionResult {
|
|
2
|
+
ok: boolean;
|
|
3
|
+
error?: string;
|
|
4
|
+
}
|
|
5
|
+
export interface IListOptions {
|
|
6
|
+
search?: string;
|
|
7
|
+
page?: number;
|
|
8
|
+
perPage?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface IPipelineListOptions extends IListOptions {
|
|
11
|
+
/** Filter by pipeline status */
|
|
12
|
+
status?: string;
|
|
13
|
+
/** Filter by branch or tag ref */
|
|
14
|
+
ref?: string;
|
|
15
|
+
/** Filter by trigger source (push, web, trigger, schedule, api, external, pipeline, chat, merge_request_event, …) */
|
|
16
|
+
source?: string;
|
|
17
|
+
/** Filter by scope (running, pending, finished, branches, tags) */
|
|
18
|
+
scope?: string;
|
|
19
|
+
/** Filter by the user who triggered the pipeline */
|
|
20
|
+
username?: string;
|
|
21
|
+
/** Return pipelines updated after this ISO 8601 date */
|
|
22
|
+
updatedAfter?: string;
|
|
23
|
+
/** Return pipelines updated before this ISO 8601 date */
|
|
24
|
+
updatedBefore?: string;
|
|
25
|
+
/** Order by field (id, status, ref, updated_at, user_id). Default: id */
|
|
26
|
+
orderBy?: string;
|
|
27
|
+
/** Sort direction (asc, desc). Default: desc */
|
|
28
|
+
sort?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface IJobListOptions extends IListOptions {
|
|
31
|
+
/** Filter by job scope(s) */
|
|
32
|
+
scope?: string[];
|
|
33
|
+
}
|
|
1
34
|
export interface IGitLabUser {
|
|
2
35
|
id: number;
|
|
3
36
|
username: string;
|
|
@@ -46,28 +79,112 @@ export interface IGitLabProtectedBranch {
|
|
|
46
79
|
}
|
|
47
80
|
export interface IGitLabPipeline {
|
|
48
81
|
id: number;
|
|
82
|
+
iid: number;
|
|
49
83
|
project_id: number;
|
|
50
84
|
status: string;
|
|
51
85
|
ref: string;
|
|
52
86
|
sha: string;
|
|
87
|
+
before_sha: string;
|
|
88
|
+
tag: boolean;
|
|
53
89
|
web_url: string;
|
|
54
90
|
duration: number;
|
|
91
|
+
queued_duration: number;
|
|
55
92
|
created_at: string;
|
|
93
|
+
updated_at: string;
|
|
94
|
+
started_at: string;
|
|
95
|
+
finished_at: string;
|
|
56
96
|
source: string;
|
|
97
|
+
coverage: string;
|
|
98
|
+
user: IGitLabUser;
|
|
99
|
+
detailed_status: {
|
|
100
|
+
icon: string;
|
|
101
|
+
text: string;
|
|
102
|
+
label: string;
|
|
103
|
+
group: string;
|
|
104
|
+
tooltip: string;
|
|
105
|
+
has_details: boolean;
|
|
106
|
+
details_path: string;
|
|
107
|
+
favicon: string;
|
|
108
|
+
};
|
|
109
|
+
yaml_errors: string;
|
|
110
|
+
}
|
|
111
|
+
export interface IGitLabPipelineVariable {
|
|
112
|
+
key: string;
|
|
113
|
+
value: string;
|
|
114
|
+
variable_type: string;
|
|
115
|
+
}
|
|
116
|
+
export interface IGitLabTestReport {
|
|
117
|
+
total_time: number;
|
|
118
|
+
total_count: number;
|
|
119
|
+
success_count: number;
|
|
120
|
+
failed_count: number;
|
|
121
|
+
skipped_count: number;
|
|
122
|
+
error_count: number;
|
|
123
|
+
test_suites: IGitLabTestSuite[];
|
|
124
|
+
}
|
|
125
|
+
export interface IGitLabTestSuite {
|
|
126
|
+
name: string;
|
|
127
|
+
total_time: number;
|
|
128
|
+
total_count: number;
|
|
129
|
+
success_count: number;
|
|
130
|
+
failed_count: number;
|
|
131
|
+
skipped_count: number;
|
|
132
|
+
error_count: number;
|
|
133
|
+
test_cases: IGitLabTestCase[];
|
|
134
|
+
}
|
|
135
|
+
export interface IGitLabTestCase {
|
|
136
|
+
status: string;
|
|
137
|
+
name: string;
|
|
138
|
+
classname: string;
|
|
139
|
+
execution_time: number;
|
|
140
|
+
system_output: string;
|
|
141
|
+
stack_trace: string;
|
|
57
142
|
}
|
|
58
143
|
export interface IGitLabJob {
|
|
59
144
|
id: number;
|
|
60
145
|
name: string;
|
|
61
146
|
stage: string;
|
|
62
147
|
status: string;
|
|
148
|
+
ref: string;
|
|
149
|
+
tag: boolean;
|
|
150
|
+
web_url: string;
|
|
151
|
+
created_at: string;
|
|
152
|
+
started_at: string;
|
|
153
|
+
finished_at: string;
|
|
63
154
|
duration: number;
|
|
155
|
+
queued_duration: number;
|
|
156
|
+
coverage: number;
|
|
157
|
+
allow_failure: boolean;
|
|
158
|
+
failure_reason: string;
|
|
159
|
+
pipeline: {
|
|
160
|
+
id: number;
|
|
161
|
+
project_id: number;
|
|
162
|
+
ref: string;
|
|
163
|
+
sha: string;
|
|
164
|
+
status: string;
|
|
165
|
+
};
|
|
166
|
+
user: IGitLabUser;
|
|
167
|
+
runner: {
|
|
168
|
+
id: number;
|
|
169
|
+
description: string;
|
|
170
|
+
active: boolean;
|
|
171
|
+
is_shared: boolean;
|
|
172
|
+
};
|
|
173
|
+
artifacts: {
|
|
174
|
+
filename: string;
|
|
175
|
+
size: number;
|
|
176
|
+
}[];
|
|
177
|
+
artifacts_expire_at: string;
|
|
64
178
|
}
|
|
65
|
-
export interface
|
|
66
|
-
|
|
67
|
-
|
|
179
|
+
export interface IGitLabBranch {
|
|
180
|
+
name: string;
|
|
181
|
+
commit: {
|
|
182
|
+
id: string;
|
|
183
|
+
};
|
|
68
184
|
}
|
|
69
|
-
export interface
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
185
|
+
export interface IGitLabTag {
|
|
186
|
+
name: string;
|
|
187
|
+
commit: {
|
|
188
|
+
id: string;
|
|
189
|
+
};
|
|
73
190
|
}
|
|
@@ -1,2 +1,5 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Common
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
1
4
|
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0bGFiLmludGVyZmFjZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9naXRsYWIuaW50ZXJmYWNlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw4RUFBOEU7QUFDOUUsU0FBUztBQUNULDhFQUE4RSJ9
|
package/dist_ts/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { GitLabClient } from './gitlab.classes.gitlabclient.js';
|
|
2
|
-
export type { IGitLabUser, IGitLabProject, IGitLabGroup, IGitLabVariable, IGitLabProtectedBranch, IVariableOptions, IGitLabPipeline, IGitLabJob, ITestConnectionResult, IListOptions, } from './gitlab.interfaces.js';
|
|
2
|
+
export type { IGitLabUser, IGitLabProject, IGitLabGroup, IGitLabVariable, IGitLabProtectedBranch, IGitLabBranch, IGitLabTag, IVariableOptions, IGitLabPipeline, IGitLabPipelineVariable, IGitLabTestReport, IGitLabTestSuite, IGitLabTestCase, IGitLabJob, ITestConnectionResult, IListOptions, IPipelineListOptions, IJobListOptions, } from './gitlab.interfaces.js';
|
|
3
3
|
export { commitinfo } from './00_commitinfo_data.js';
|
package/dist_ts/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { GitLabClient } from './gitlab.classes.gitlabclient.js';
|
|
2
2
|
export { commitinfo } from './00_commitinfo_data.js';
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFxQmhFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQyJ9
|
package/package.json
CHANGED
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -7,10 +7,16 @@ import type {
|
|
|
7
7
|
IGitLabVariable,
|
|
8
8
|
IVariableOptions,
|
|
9
9
|
IGitLabProtectedBranch,
|
|
10
|
+
IGitLabBranch,
|
|
11
|
+
IGitLabTag,
|
|
10
12
|
IGitLabPipeline,
|
|
13
|
+
IGitLabPipelineVariable,
|
|
14
|
+
IGitLabTestReport,
|
|
11
15
|
IGitLabJob,
|
|
12
16
|
ITestConnectionResult,
|
|
13
17
|
IListOptions,
|
|
18
|
+
IPipelineListOptions,
|
|
19
|
+
IJobListOptions,
|
|
14
20
|
} from './gitlab.interfaces.js';
|
|
15
21
|
|
|
16
22
|
export class GitLabClient {
|
|
@@ -333,22 +339,131 @@ export class GitLabClient {
|
|
|
333
339
|
// Pipelines
|
|
334
340
|
// ---------------------------------------------------------------------------
|
|
335
341
|
|
|
336
|
-
|
|
342
|
+
/**
|
|
343
|
+
* List pipelines for a project with optional filters.
|
|
344
|
+
* Supports status, ref, source, scope, username, date range, ordering.
|
|
345
|
+
*/
|
|
346
|
+
public async getPipelines(projectId: number | string, opts?: IPipelineListOptions): Promise<IGitLabPipeline[]> {
|
|
337
347
|
const page = opts?.page || 1;
|
|
338
348
|
const perPage = opts?.perPage || 30;
|
|
339
|
-
|
|
349
|
+
const orderBy = opts?.orderBy || 'updated_at';
|
|
350
|
+
const sort = opts?.sort || 'desc';
|
|
351
|
+
let url = `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines?page=${page}&per_page=${perPage}&order_by=${orderBy}&sort=${sort}`;
|
|
352
|
+
if (opts?.status) url += `&status=${encodeURIComponent(opts.status)}`;
|
|
353
|
+
if (opts?.ref) url += `&ref=${encodeURIComponent(opts.ref)}`;
|
|
354
|
+
if (opts?.source) url += `&source=${encodeURIComponent(opts.source)}`;
|
|
355
|
+
if (opts?.scope) url += `&scope=${encodeURIComponent(opts.scope)}`;
|
|
356
|
+
if (opts?.username) url += `&username=${encodeURIComponent(opts.username)}`;
|
|
357
|
+
if (opts?.updatedAfter) url += `&updated_after=${encodeURIComponent(opts.updatedAfter)}`;
|
|
358
|
+
if (opts?.updatedBefore) url += `&updated_before=${encodeURIComponent(opts.updatedBefore)}`;
|
|
359
|
+
return this.request<IGitLabPipeline[]>('GET', url);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/**
|
|
363
|
+
* Get a single pipeline's full details.
|
|
364
|
+
*/
|
|
365
|
+
public async getPipeline(projectId: number | string, pipelineId: number): Promise<IGitLabPipeline> {
|
|
366
|
+
return this.request<IGitLabPipeline>(
|
|
367
|
+
'GET',
|
|
368
|
+
`/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}`,
|
|
369
|
+
);
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* Trigger a new pipeline on the given ref, optionally with variables.
|
|
374
|
+
*/
|
|
375
|
+
public async triggerPipeline(
|
|
376
|
+
projectId: number | string,
|
|
377
|
+
ref: string,
|
|
378
|
+
variables?: { key: string; value: string; variable_type?: string }[],
|
|
379
|
+
): Promise<IGitLabPipeline> {
|
|
380
|
+
const body: any = { ref };
|
|
381
|
+
if (variables && variables.length > 0) {
|
|
382
|
+
body.variables = variables;
|
|
383
|
+
}
|
|
384
|
+
return this.request<IGitLabPipeline>(
|
|
385
|
+
'POST',
|
|
386
|
+
`/api/v4/projects/${encodeURIComponent(projectId)}/pipeline`,
|
|
387
|
+
body,
|
|
388
|
+
);
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/**
|
|
392
|
+
* Delete a pipeline and all its jobs.
|
|
393
|
+
*/
|
|
394
|
+
public async deletePipeline(projectId: number | string, pipelineId: number): Promise<void> {
|
|
395
|
+
await this.request(
|
|
396
|
+
'DELETE',
|
|
397
|
+
`/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}`,
|
|
398
|
+
);
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
/**
|
|
402
|
+
* Get variables used in a specific pipeline run.
|
|
403
|
+
*/
|
|
404
|
+
public async getPipelineVariables(projectId: number | string, pipelineId: number): Promise<IGitLabPipelineVariable[]> {
|
|
405
|
+
return this.request<IGitLabPipelineVariable[]>(
|
|
406
|
+
'GET',
|
|
407
|
+
`/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/variables`,
|
|
408
|
+
);
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
/**
|
|
412
|
+
* Get the test report for a pipeline.
|
|
413
|
+
*/
|
|
414
|
+
public async getPipelineTestReport(projectId: number | string, pipelineId: number): Promise<IGitLabTestReport> {
|
|
415
|
+
return this.request<IGitLabTestReport>(
|
|
340
416
|
'GET',
|
|
341
|
-
`/api/v4/projects/${encodeURIComponent(projectId)}/pipelines
|
|
417
|
+
`/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/test_report`,
|
|
342
418
|
);
|
|
343
419
|
}
|
|
344
420
|
|
|
345
|
-
public async
|
|
346
|
-
return this.request<
|
|
421
|
+
public async retryPipeline(projectId: number | string, pipelineId: number): Promise<IGitLabPipeline> {
|
|
422
|
+
return this.request<IGitLabPipeline>(
|
|
423
|
+
'POST',
|
|
424
|
+
`/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/retry`,
|
|
425
|
+
);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
public async cancelPipeline(projectId: number | string, pipelineId: number): Promise<IGitLabPipeline> {
|
|
429
|
+
return this.request<IGitLabPipeline>(
|
|
430
|
+
'POST',
|
|
431
|
+
`/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/cancel`,
|
|
432
|
+
);
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
// ---------------------------------------------------------------------------
|
|
436
|
+
// Jobs
|
|
437
|
+
// ---------------------------------------------------------------------------
|
|
438
|
+
|
|
439
|
+
/**
|
|
440
|
+
* List jobs for a pipeline with optional scope filter and pagination.
|
|
441
|
+
*/
|
|
442
|
+
public async getPipelineJobs(projectId: number | string, pipelineId: number, opts?: IJobListOptions): Promise<IGitLabJob[]> {
|
|
443
|
+
const page = opts?.page || 1;
|
|
444
|
+
const perPage = opts?.perPage || 100;
|
|
445
|
+
let url = `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/jobs?page=${page}&per_page=${perPage}`;
|
|
446
|
+
if (opts?.scope && opts.scope.length > 0) {
|
|
447
|
+
for (const s of opts.scope) {
|
|
448
|
+
url += `&scope[]=${encodeURIComponent(s)}`;
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
return this.request<IGitLabJob[]>('GET', url);
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
/**
|
|
455
|
+
* Get a single job's full details.
|
|
456
|
+
*/
|
|
457
|
+
public async getJob(projectId: number | string, jobId: number): Promise<IGitLabJob> {
|
|
458
|
+
return this.request<IGitLabJob>(
|
|
347
459
|
'GET',
|
|
348
|
-
`/api/v4/projects/${encodeURIComponent(projectId)}/
|
|
460
|
+
`/api/v4/projects/${encodeURIComponent(projectId)}/jobs/${jobId}`,
|
|
349
461
|
);
|
|
350
462
|
}
|
|
351
463
|
|
|
464
|
+
/**
|
|
465
|
+
* Get a job's raw log (trace) output.
|
|
466
|
+
*/
|
|
352
467
|
public async getJobLog(projectId: number | string, jobId: number): Promise<string> {
|
|
353
468
|
return this.requestText(
|
|
354
469
|
'GET',
|
|
@@ -356,17 +471,65 @@ export class GitLabClient {
|
|
|
356
471
|
);
|
|
357
472
|
}
|
|
358
473
|
|
|
359
|
-
|
|
360
|
-
|
|
474
|
+
/**
|
|
475
|
+
* Retry a single job.
|
|
476
|
+
*/
|
|
477
|
+
public async retryJob(projectId: number | string, jobId: number): Promise<IGitLabJob> {
|
|
478
|
+
return this.request<IGitLabJob>(
|
|
361
479
|
'POST',
|
|
362
|
-
`/api/v4/projects/${encodeURIComponent(projectId)}/
|
|
480
|
+
`/api/v4/projects/${encodeURIComponent(projectId)}/jobs/${jobId}/retry`,
|
|
481
|
+
);
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
/**
|
|
485
|
+
* Cancel a running job.
|
|
486
|
+
*/
|
|
487
|
+
public async cancelJob(projectId: number | string, jobId: number): Promise<IGitLabJob> {
|
|
488
|
+
return this.request<IGitLabJob>(
|
|
489
|
+
'POST',
|
|
490
|
+
`/api/v4/projects/${encodeURIComponent(projectId)}/jobs/${jobId}/cancel`,
|
|
491
|
+
);
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
/**
|
|
495
|
+
* Trigger a manual job (play action).
|
|
496
|
+
*/
|
|
497
|
+
public async playJob(projectId: number | string, jobId: number): Promise<IGitLabJob> {
|
|
498
|
+
return this.request<IGitLabJob>(
|
|
499
|
+
'POST',
|
|
500
|
+
`/api/v4/projects/${encodeURIComponent(projectId)}/jobs/${jobId}/play`,
|
|
363
501
|
);
|
|
364
502
|
}
|
|
365
503
|
|
|
366
|
-
|
|
504
|
+
/**
|
|
505
|
+
* Erase a job's trace and artifacts.
|
|
506
|
+
*/
|
|
507
|
+
public async eraseJob(projectId: number | string, jobId: number): Promise<void> {
|
|
367
508
|
await this.request(
|
|
368
509
|
'POST',
|
|
369
|
-
`/api/v4/projects/${encodeURIComponent(projectId)}/
|
|
510
|
+
`/api/v4/projects/${encodeURIComponent(projectId)}/jobs/${jobId}/erase`,
|
|
511
|
+
);
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
// ---------------------------------------------------------------------------
|
|
515
|
+
// Repository Branches & Tags
|
|
516
|
+
// ---------------------------------------------------------------------------
|
|
517
|
+
|
|
518
|
+
public async getRepoBranches(projectId: number | string, opts?: IListOptions): Promise<IGitLabBranch[]> {
|
|
519
|
+
const page = opts?.page || 1;
|
|
520
|
+
const perPage = opts?.perPage || 50;
|
|
521
|
+
return this.request<IGitLabBranch[]>(
|
|
522
|
+
'GET',
|
|
523
|
+
`/api/v4/projects/${encodeURIComponent(projectId)}/repository/branches?page=${page}&per_page=${perPage}`,
|
|
524
|
+
);
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
public async getRepoTags(projectId: number | string, opts?: IListOptions): Promise<IGitLabTag[]> {
|
|
528
|
+
const page = opts?.page || 1;
|
|
529
|
+
const perPage = opts?.perPage || 50;
|
|
530
|
+
return this.request<IGitLabTag[]>(
|
|
531
|
+
'GET',
|
|
532
|
+
`/api/v4/projects/${encodeURIComponent(projectId)}/repository/tags?page=${page}&per_page=${perPage}`,
|
|
370
533
|
);
|
|
371
534
|
}
|
|
372
535
|
|
package/ts/gitlab.interfaces.ts
CHANGED
|
@@ -1,3 +1,52 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Common
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
|
|
5
|
+
export interface ITestConnectionResult {
|
|
6
|
+
ok: boolean;
|
|
7
|
+
error?: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface IListOptions {
|
|
11
|
+
search?: string;
|
|
12
|
+
page?: number;
|
|
13
|
+
perPage?: number;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// Pipeline / Job list options
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
|
|
20
|
+
export interface IPipelineListOptions extends IListOptions {
|
|
21
|
+
/** Filter by pipeline status */
|
|
22
|
+
status?: string;
|
|
23
|
+
/** Filter by branch or tag ref */
|
|
24
|
+
ref?: string;
|
|
25
|
+
/** Filter by trigger source (push, web, trigger, schedule, api, external, pipeline, chat, merge_request_event, …) */
|
|
26
|
+
source?: string;
|
|
27
|
+
/** Filter by scope (running, pending, finished, branches, tags) */
|
|
28
|
+
scope?: string;
|
|
29
|
+
/** Filter by the user who triggered the pipeline */
|
|
30
|
+
username?: string;
|
|
31
|
+
/** Return pipelines updated after this ISO 8601 date */
|
|
32
|
+
updatedAfter?: string;
|
|
33
|
+
/** Return pipelines updated before this ISO 8601 date */
|
|
34
|
+
updatedBefore?: string;
|
|
35
|
+
/** Order by field (id, status, ref, updated_at, user_id). Default: id */
|
|
36
|
+
orderBy?: string;
|
|
37
|
+
/** Sort direction (asc, desc). Default: desc */
|
|
38
|
+
sort?: string;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface IJobListOptions extends IListOptions {
|
|
42
|
+
/** Filter by job scope(s) */
|
|
43
|
+
scope?: string[];
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
// Users
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
|
|
1
50
|
export interface IGitLabUser {
|
|
2
51
|
id: number;
|
|
3
52
|
username: string;
|
|
@@ -8,6 +57,10 @@ export interface IGitLabUser {
|
|
|
8
57
|
state: string;
|
|
9
58
|
}
|
|
10
59
|
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
// Projects
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
|
|
11
64
|
export interface IGitLabProject {
|
|
12
65
|
id: number;
|
|
13
66
|
name: string;
|
|
@@ -20,6 +73,10 @@ export interface IGitLabProject {
|
|
|
20
73
|
last_activity_at: string;
|
|
21
74
|
}
|
|
22
75
|
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
// Groups
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
|
|
23
80
|
export interface IGitLabGroup {
|
|
24
81
|
id: number;
|
|
25
82
|
name: string;
|
|
@@ -29,6 +86,10 @@ export interface IGitLabGroup {
|
|
|
29
86
|
visibility: string;
|
|
30
87
|
}
|
|
31
88
|
|
|
89
|
+
// ---------------------------------------------------------------------------
|
|
90
|
+
// Variables
|
|
91
|
+
// ---------------------------------------------------------------------------
|
|
92
|
+
|
|
32
93
|
export interface IGitLabVariable {
|
|
33
94
|
key: string;
|
|
34
95
|
value: string;
|
|
@@ -44,39 +105,143 @@ export interface IVariableOptions {
|
|
|
44
105
|
environment_scope?: string;
|
|
45
106
|
}
|
|
46
107
|
|
|
108
|
+
// ---------------------------------------------------------------------------
|
|
109
|
+
// Protected Branches
|
|
110
|
+
// ---------------------------------------------------------------------------
|
|
111
|
+
|
|
47
112
|
export interface IGitLabProtectedBranch {
|
|
48
113
|
id: number;
|
|
49
114
|
name: string;
|
|
50
115
|
allow_force_push: boolean;
|
|
51
116
|
}
|
|
52
117
|
|
|
118
|
+
// ---------------------------------------------------------------------------
|
|
119
|
+
// Pipelines
|
|
120
|
+
// ---------------------------------------------------------------------------
|
|
121
|
+
|
|
53
122
|
export interface IGitLabPipeline {
|
|
54
123
|
id: number;
|
|
124
|
+
iid: number;
|
|
55
125
|
project_id: number;
|
|
56
126
|
status: string;
|
|
57
127
|
ref: string;
|
|
58
128
|
sha: string;
|
|
129
|
+
before_sha: string;
|
|
130
|
+
tag: boolean;
|
|
59
131
|
web_url: string;
|
|
60
132
|
duration: number;
|
|
133
|
+
queued_duration: number;
|
|
61
134
|
created_at: string;
|
|
135
|
+
updated_at: string;
|
|
136
|
+
started_at: string;
|
|
137
|
+
finished_at: string;
|
|
62
138
|
source: string;
|
|
139
|
+
coverage: string;
|
|
140
|
+
user: IGitLabUser;
|
|
141
|
+
detailed_status: {
|
|
142
|
+
icon: string;
|
|
143
|
+
text: string;
|
|
144
|
+
label: string;
|
|
145
|
+
group: string;
|
|
146
|
+
tooltip: string;
|
|
147
|
+
has_details: boolean;
|
|
148
|
+
details_path: string;
|
|
149
|
+
favicon: string;
|
|
150
|
+
};
|
|
151
|
+
yaml_errors: string;
|
|
63
152
|
}
|
|
64
153
|
|
|
154
|
+
export interface IGitLabPipelineVariable {
|
|
155
|
+
key: string;
|
|
156
|
+
value: string;
|
|
157
|
+
variable_type: string;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export interface IGitLabTestReport {
|
|
161
|
+
total_time: number;
|
|
162
|
+
total_count: number;
|
|
163
|
+
success_count: number;
|
|
164
|
+
failed_count: number;
|
|
165
|
+
skipped_count: number;
|
|
166
|
+
error_count: number;
|
|
167
|
+
test_suites: IGitLabTestSuite[];
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export interface IGitLabTestSuite {
|
|
171
|
+
name: string;
|
|
172
|
+
total_time: number;
|
|
173
|
+
total_count: number;
|
|
174
|
+
success_count: number;
|
|
175
|
+
failed_count: number;
|
|
176
|
+
skipped_count: number;
|
|
177
|
+
error_count: number;
|
|
178
|
+
test_cases: IGitLabTestCase[];
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export interface IGitLabTestCase {
|
|
182
|
+
status: string;
|
|
183
|
+
name: string;
|
|
184
|
+
classname: string;
|
|
185
|
+
execution_time: number;
|
|
186
|
+
system_output: string;
|
|
187
|
+
stack_trace: string;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// ---------------------------------------------------------------------------
|
|
191
|
+
// Jobs
|
|
192
|
+
// ---------------------------------------------------------------------------
|
|
193
|
+
|
|
65
194
|
export interface IGitLabJob {
|
|
66
195
|
id: number;
|
|
67
196
|
name: string;
|
|
68
197
|
stage: string;
|
|
69
198
|
status: string;
|
|
199
|
+
ref: string;
|
|
200
|
+
tag: boolean;
|
|
201
|
+
web_url: string;
|
|
202
|
+
created_at: string;
|
|
203
|
+
started_at: string;
|
|
204
|
+
finished_at: string;
|
|
70
205
|
duration: number;
|
|
206
|
+
queued_duration: number;
|
|
207
|
+
coverage: number;
|
|
208
|
+
allow_failure: boolean;
|
|
209
|
+
failure_reason: string;
|
|
210
|
+
pipeline: {
|
|
211
|
+
id: number;
|
|
212
|
+
project_id: number;
|
|
213
|
+
ref: string;
|
|
214
|
+
sha: string;
|
|
215
|
+
status: string;
|
|
216
|
+
};
|
|
217
|
+
user: IGitLabUser;
|
|
218
|
+
runner: {
|
|
219
|
+
id: number;
|
|
220
|
+
description: string;
|
|
221
|
+
active: boolean;
|
|
222
|
+
is_shared: boolean;
|
|
223
|
+
};
|
|
224
|
+
artifacts: {
|
|
225
|
+
filename: string;
|
|
226
|
+
size: number;
|
|
227
|
+
}[];
|
|
228
|
+
artifacts_expire_at: string;
|
|
71
229
|
}
|
|
72
230
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
231
|
+
// ---------------------------------------------------------------------------
|
|
232
|
+
// Branches & Tags
|
|
233
|
+
// ---------------------------------------------------------------------------
|
|
234
|
+
|
|
235
|
+
export interface IGitLabBranch {
|
|
236
|
+
name: string;
|
|
237
|
+
commit: {
|
|
238
|
+
id: string;
|
|
239
|
+
};
|
|
76
240
|
}
|
|
77
241
|
|
|
78
|
-
export interface
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
242
|
+
export interface IGitLabTag {
|
|
243
|
+
name: string;
|
|
244
|
+
commit: {
|
|
245
|
+
id: string;
|
|
246
|
+
};
|
|
82
247
|
}
|
package/ts/index.ts
CHANGED
|
@@ -5,10 +5,18 @@ export type {
|
|
|
5
5
|
IGitLabGroup,
|
|
6
6
|
IGitLabVariable,
|
|
7
7
|
IGitLabProtectedBranch,
|
|
8
|
+
IGitLabBranch,
|
|
9
|
+
IGitLabTag,
|
|
8
10
|
IVariableOptions,
|
|
9
11
|
IGitLabPipeline,
|
|
12
|
+
IGitLabPipelineVariable,
|
|
13
|
+
IGitLabTestReport,
|
|
14
|
+
IGitLabTestSuite,
|
|
15
|
+
IGitLabTestCase,
|
|
10
16
|
IGitLabJob,
|
|
11
17
|
ITestConnectionResult,
|
|
12
18
|
IListOptions,
|
|
19
|
+
IPipelineListOptions,
|
|
20
|
+
IJobListOptions,
|
|
13
21
|
} from './gitlab.interfaces.js';
|
|
14
22
|
export { commitinfo } from './00_commitinfo_data.js';
|