feat(gitlab): add pipelines and jobs API support, including list/get/trigger/delete/retry/cancel operations, job controls, and related types and list options
This commit is contained in:
@@ -10,9 +10,13 @@ import type {
|
||||
IGitLabBranch,
|
||||
IGitLabTag,
|
||||
IGitLabPipeline,
|
||||
IGitLabPipelineVariable,
|
||||
IGitLabTestReport,
|
||||
IGitLabJob,
|
||||
ITestConnectionResult,
|
||||
IListOptions,
|
||||
IPipelineListOptions,
|
||||
IJobListOptions,
|
||||
} from './gitlab.interfaces.js';
|
||||
|
||||
export class GitLabClient {
|
||||
@@ -335,22 +339,131 @@ export class GitLabClient {
|
||||
// Pipelines
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
public async getPipelines(projectId: number | string, opts?: IListOptions): Promise<IGitLabPipeline[]> {
|
||||
/**
|
||||
* List pipelines for a project with optional filters.
|
||||
* Supports status, ref, source, scope, username, date range, ordering.
|
||||
*/
|
||||
public async getPipelines(projectId: number | string, opts?: IPipelineListOptions): Promise<IGitLabPipeline[]> {
|
||||
const page = opts?.page || 1;
|
||||
const perPage = opts?.perPage || 30;
|
||||
return this.request<IGitLabPipeline[]>(
|
||||
const orderBy = opts?.orderBy || 'updated_at';
|
||||
const sort = opts?.sort || 'desc';
|
||||
let url = `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines?page=${page}&per_page=${perPage}&order_by=${orderBy}&sort=${sort}`;
|
||||
if (opts?.status) url += `&status=${encodeURIComponent(opts.status)}`;
|
||||
if (opts?.ref) url += `&ref=${encodeURIComponent(opts.ref)}`;
|
||||
if (opts?.source) url += `&source=${encodeURIComponent(opts.source)}`;
|
||||
if (opts?.scope) url += `&scope=${encodeURIComponent(opts.scope)}`;
|
||||
if (opts?.username) url += `&username=${encodeURIComponent(opts.username)}`;
|
||||
if (opts?.updatedAfter) url += `&updated_after=${encodeURIComponent(opts.updatedAfter)}`;
|
||||
if (opts?.updatedBefore) url += `&updated_before=${encodeURIComponent(opts.updatedBefore)}`;
|
||||
return this.request<IGitLabPipeline[]>('GET', url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a single pipeline's full details.
|
||||
*/
|
||||
public async getPipeline(projectId: number | string, pipelineId: number): Promise<IGitLabPipeline> {
|
||||
return this.request<IGitLabPipeline>(
|
||||
'GET',
|
||||
`/api/v4/projects/${encodeURIComponent(projectId)}/pipelines?page=${page}&per_page=${perPage}&order_by=updated_at&sort=desc`,
|
||||
`/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}`,
|
||||
);
|
||||
}
|
||||
|
||||
public async getPipelineJobs(projectId: number | string, pipelineId: number): Promise<IGitLabJob[]> {
|
||||
return this.request<IGitLabJob[]>(
|
||||
'GET',
|
||||
`/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/jobs`,
|
||||
/**
|
||||
* Trigger a new pipeline on the given ref, optionally with variables.
|
||||
*/
|
||||
public async triggerPipeline(
|
||||
projectId: number | string,
|
||||
ref: string,
|
||||
variables?: { key: string; value: string; variable_type?: string }[],
|
||||
): Promise<IGitLabPipeline> {
|
||||
const body: any = { ref };
|
||||
if (variables && variables.length > 0) {
|
||||
body.variables = variables;
|
||||
}
|
||||
return this.request<IGitLabPipeline>(
|
||||
'POST',
|
||||
`/api/v4/projects/${encodeURIComponent(projectId)}/pipeline`,
|
||||
body,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete a pipeline and all its jobs.
|
||||
*/
|
||||
public async deletePipeline(projectId: number | string, pipelineId: number): Promise<void> {
|
||||
await this.request(
|
||||
'DELETE',
|
||||
`/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}`,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get variables used in a specific pipeline run.
|
||||
*/
|
||||
public async getPipelineVariables(projectId: number | string, pipelineId: number): Promise<IGitLabPipelineVariable[]> {
|
||||
return this.request<IGitLabPipelineVariable[]>(
|
||||
'GET',
|
||||
`/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/variables`,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the test report for a pipeline.
|
||||
*/
|
||||
public async getPipelineTestReport(projectId: number | string, pipelineId: number): Promise<IGitLabTestReport> {
|
||||
return this.request<IGitLabTestReport>(
|
||||
'GET',
|
||||
`/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/test_report`,
|
||||
);
|
||||
}
|
||||
|
||||
public async retryPipeline(projectId: number | string, pipelineId: number): Promise<IGitLabPipeline> {
|
||||
return this.request<IGitLabPipeline>(
|
||||
'POST',
|
||||
`/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/retry`,
|
||||
);
|
||||
}
|
||||
|
||||
public async cancelPipeline(projectId: number | string, pipelineId: number): Promise<IGitLabPipeline> {
|
||||
return this.request<IGitLabPipeline>(
|
||||
'POST',
|
||||
`/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/cancel`,
|
||||
);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Jobs
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* List jobs for a pipeline with optional scope filter and pagination.
|
||||
*/
|
||||
public async getPipelineJobs(projectId: number | string, pipelineId: number, opts?: IJobListOptions): Promise<IGitLabJob[]> {
|
||||
const page = opts?.page || 1;
|
||||
const perPage = opts?.perPage || 100;
|
||||
let url = `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/jobs?page=${page}&per_page=${perPage}`;
|
||||
if (opts?.scope && opts.scope.length > 0) {
|
||||
for (const s of opts.scope) {
|
||||
url += `&scope[]=${encodeURIComponent(s)}`;
|
||||
}
|
||||
}
|
||||
return this.request<IGitLabJob[]>('GET', url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a single job's full details.
|
||||
*/
|
||||
public async getJob(projectId: number | string, jobId: number): Promise<IGitLabJob> {
|
||||
return this.request<IGitLabJob>(
|
||||
'GET',
|
||||
`/api/v4/projects/${encodeURIComponent(projectId)}/jobs/${jobId}`,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a job's raw log (trace) output.
|
||||
*/
|
||||
public async getJobLog(projectId: number | string, jobId: number): Promise<string> {
|
||||
return this.requestText(
|
||||
'GET',
|
||||
@@ -358,17 +471,43 @@ export class GitLabClient {
|
||||
);
|
||||
}
|
||||
|
||||
public async retryPipeline(projectId: number | string, pipelineId: number): Promise<void> {
|
||||
await this.request(
|
||||
/**
|
||||
* Retry a single job.
|
||||
*/
|
||||
public async retryJob(projectId: number | string, jobId: number): Promise<IGitLabJob> {
|
||||
return this.request<IGitLabJob>(
|
||||
'POST',
|
||||
`/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/retry`,
|
||||
`/api/v4/projects/${encodeURIComponent(projectId)}/jobs/${jobId}/retry`,
|
||||
);
|
||||
}
|
||||
|
||||
public async cancelPipeline(projectId: number | string, pipelineId: number): Promise<void> {
|
||||
/**
|
||||
* Cancel a running job.
|
||||
*/
|
||||
public async cancelJob(projectId: number | string, jobId: number): Promise<IGitLabJob> {
|
||||
return this.request<IGitLabJob>(
|
||||
'POST',
|
||||
`/api/v4/projects/${encodeURIComponent(projectId)}/jobs/${jobId}/cancel`,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Trigger a manual job (play action).
|
||||
*/
|
||||
public async playJob(projectId: number | string, jobId: number): Promise<IGitLabJob> {
|
||||
return this.request<IGitLabJob>(
|
||||
'POST',
|
||||
`/api/v4/projects/${encodeURIComponent(projectId)}/jobs/${jobId}/play`,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Erase a job's trace and artifacts.
|
||||
*/
|
||||
public async eraseJob(projectId: number | string, jobId: number): Promise<void> {
|
||||
await this.request(
|
||||
'POST',
|
||||
`/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/cancel`,
|
||||
`/api/v4/projects/${encodeURIComponent(projectId)}/jobs/${jobId}/erase`,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user