org.aoju.bus.gitlab.JobApi Maven / Gradle / Ivy
/*********************************************************************************
* *
* The MIT License (MIT) *
* *
* Copyright (c) 2015-2022 aoju.org Greg Messner and other contributors. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy *
* of this software and associated documentation files (the "Software"), to deal *
* in the Software without restriction, including without limitation the rights *
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell *
* copies of the Software, and to permit persons to whom the Software is *
* furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included in *
* all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE *
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, *
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN *
* THE SOFTWARE. *
* *
********************************************************************************/
package org.aoju.bus.gitlab;
import org.aoju.bus.gitlab.models.ArtifactsFile;
import org.aoju.bus.gitlab.models.Job;
import javax.ws.rs.core.Form;
import javax.ws.rs.core.GenericType;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;
/**
* This class provides an entry point to all the GitLab API job calls.
*/
public class JobApi extends AbstractApi implements Constants {
public JobApi(GitLabApi gitLabApi) {
super(gitLabApi);
}
/**
* Get a list of jobs in a project.
*
* GitLab Endpoint: GET /projects/:id/jobs
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path
* @return a list containing the jobs for the specified project ID
* @throws GitLabApiException if any exception occurs during execution
*/
public List getJobs(Object projectIdOrPath) throws GitLabApiException {
return (getJobs(projectIdOrPath, getDefaultPerPage()).all());
}
/**
* Get a list of jobs in a project in the specified page range.
*
* GitLab Endpoint: GET /projects/:id/jobs
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path to get the jobs for
* @param page the page to get
* @param perPage the number of Job instances per page
* @return a list containing the jobs for the specified project ID in the specified page range
* @throws GitLabApiException if any exception occurs during execution
*/
public List getJobs(Object projectIdOrPath, int page, int perPage) throws GitLabApiException {
Response response = get(Response.Status.OK, getPageQueryParams(page, perPage), "projects", getProjectIdOrPath(projectIdOrPath), "jobs");
return (response.readEntity(new GenericType>() {
}));
}
/**
* Get a Pager of jobs in a project.
*
* GitLab Endpoint: GET /projects/:id/jobs
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path to get the jobs for
* @param itemsPerPage the number of Job instances that will be fetched per page
* @return a Pager containing the jobs for the specified project ID
* @throws GitLabApiException if any exception occurs during execution
*/
public Pager getJobs(Object projectIdOrPath, int itemsPerPage) throws GitLabApiException {
return (new Pager(this, Job.class, itemsPerPage, null, "projects", getProjectIdOrPath(projectIdOrPath), "jobs"));
}
/**
* Get a Stream of jobs in a project.
*
* GitLab Endpoint: GET /projects/:id/jobs
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path
* @return a Stream containing the jobs for the specified project ID
* @throws GitLabApiException if any exception occurs during execution
*/
public Stream getJobsStream(Object projectIdOrPath) throws GitLabApiException {
return (getJobs(projectIdOrPath, getDefaultPerPage()).stream());
}
/**
* Get a list of jobs in a project.
*
* GitLab Endpoint: GET /projects/:id/jobs
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path to get the jobs for
* @param scope the scope of jobs, one of: CREATED, PENDING, RUNNING, FAILED, SUCCESS, CANCELED, SKIPPED, MANUAL
* @return a list containing the jobs for the specified project ID
* @throws GitLabApiException if any exception occurs during execution
*/
public List getJobs(Object projectIdOrPath, JobScope scope) throws GitLabApiException {
return (getJobs(projectIdOrPath, scope, getDefaultPerPage()).all());
}
/**
* Get a list of jobs in a project.
*
* GitLab Endpoint: GET /projects/:id/jobs
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path to get the jobs for
* @param scope the scope of jobs, one of: CREATED, PENDING, RUNNING, FAILED, SUCCESS, CANCELED, SKIPPED, MANUAL
* @param itemsPerPage the number of Job instances that will be fetched per page
* @return a list containing the jobs for the specified project ID
* @throws GitLabApiException if any exception occurs during execution
*/
public Pager getJobs(Object projectIdOrPath, JobScope scope, int itemsPerPage) throws GitLabApiException {
GitLabApiForm formData = new GitLabApiForm().withParam("scope", scope);
return (new Pager(this, Job.class, itemsPerPage, formData.asMap(),
"projects", getProjectIdOrPath(projectIdOrPath), "jobs"));
}
/**
* Get a Stream of jobs in a project.
*
* GitLab Endpoint: GET /projects/:id/jobs
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path to get the jobs for
* @param scope the scope of jobs, one of: CREATED, PENDING, RUNNING, FAILED, SUCCESS, CANCELED, SKIPPED, MANUAL
* @return a Stream containing the jobs for the specified project ID
* @throws GitLabApiException if any exception occurs during execution
*/
public Stream getJobsStream(Object projectIdOrPath, JobScope scope) throws GitLabApiException {
return (getJobs(projectIdOrPath, scope, getDefaultPerPage()).stream());
}
/**
* Get a list of jobs in a pipeline.
*
* GitLab Endpoint: GET /projects/:id/pipelines/:pipeline_id/jobs
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path to get the pipelines for
* @param pipelineId the pipeline ID to get the list of jobs for
* @return a list containing the jobs for the specified project ID and pipeline ID
* @throws GitLabApiException if any exception occurs during execution
*/
public List getJobsForPipeline(Object projectIdOrPath, long pipelineId) throws GitLabApiException {
Response response = get(Response.Status.OK, getDefaultPerPageParam(),
"projects", getProjectIdOrPath(projectIdOrPath), "pipelines", pipelineId, "jobs");
return (response.readEntity(new GenericType>() {
}));
}
/**
* Get a list of jobs in a pipeline.
*
* GitLab Endpoint: GET /projects/:id/pipelines/:pipeline_id/jobs
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path to get the pipelines for
* @param pipelineId the pipeline ID to get the list of jobs for
* @param scope the scope of jobs, one of: CREATED, PENDING, RUNNING, FAILED, SUCCESS, CANCELED, SKIPPED, MANUAL
* @return a list containing the jobs for the specified project ID and pipeline ID
* @throws GitLabApiException if any exception occurs during execution
*/
public List getJobsForPipeline(Object projectIdOrPath, long pipelineId, JobScope scope) throws GitLabApiException {
GitLabApiForm formData = new GitLabApiForm().withParam("scope", scope).withParam(PER_PAGE_PARAM, getDefaultPerPage());
Response response = get(Response.Status.OK, formData.asMap(), "projects", getProjectIdOrPath(projectIdOrPath), "pipelines", pipelineId, "jobs");
return (response.readEntity(new GenericType>() {
}));
}
/**
* Get a Pager of jobs in a pipeline.
*
* GitLab Endpoint: GET /projects/:id/pipelines/:pipeline_id/jobs
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path to get the pipelines for
* @param pipelineId the pipeline ID to get the list of jobs for
* @param itemsPerPage the number of Job instances that will be fetched per page
* @return a list containing the jobs for the specified project ID and pipeline ID
* @throws GitLabApiException if any exception occurs during execution
*/
public Pager getJobsForPipeline(Object projectIdOrPath, long pipelineId, int itemsPerPage) throws GitLabApiException {
return (new Pager(this, Job.class, itemsPerPage, getDefaultPerPageParam(),
"projects", getProjectIdOrPath(projectIdOrPath), "pipelines", pipelineId, "jobs"));
}
/**
* Get a Stream of jobs in a pipeline.
* GitLab Endpoint: GET /projects/:id/pipelines/:pipeline_id/jobs
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path
* @param pipelineId the pipeline ID to get the list of jobs for
* @return a Stream containing the jobs for the specified project ID
* @throws GitLabApiException if any exception occurs during execution
*/
public Stream getJobsStream(Object projectIdOrPath, long pipelineId) throws GitLabApiException {
return (getJobsForPipeline(projectIdOrPath, pipelineId, getDefaultPerPage()).stream());
}
/**
* Get single job in a project.
*
* GitLab Endpoint: GET /projects/:id/jobs/:job_id
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path to get the job for
* @param jobId the job ID to get
* @return a single job for the specified project ID
* @throws GitLabApiException if any exception occurs during execution
*/
public Job getJob(Object projectIdOrPath, Long jobId) throws GitLabApiException {
Response response = get(Response.Status.OK, null, "projects", getProjectIdOrPath(projectIdOrPath), "jobs", jobId);
return (response.readEntity(Job.class));
}
/**
* Get single job in a project as an Optional instance.
*
* GitLab Endpoint: GET /projects/:id/jobs/:job_id
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path to get the job for
* @param jobId the job ID to get
* @return a single job for the specified project ID as an Optional intance
*/
public Optional getOptionalJob(Object projectIdOrPath, Long jobId) {
try {
return (Optional.ofNullable(getJob(projectIdOrPath, jobId)));
} catch (GitLabApiException glae) {
return (GitLabApi.createOptionalFromException(glae));
}
}
/**
* Download the artifacts file from the given reference name and job provided the job finished successfully.
* The file will be saved to the specified directory. If the file already exists in the directory it will
* be overwritten.
*
* GitLab Endpoint: GET /projects/:id/jobs/artifacts/:ref_name/download?job=name
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path
* @param ref the ref from a repository
* @param jobName the name of the job to download the artifacts for
* @param directory the File instance of the directory to save the file to, if null will use "java.io.tmpdir"
* @return a File instance pointing to the download of the specified artifacts file
* @throws GitLabApiException if any exception occurs
*/
public File downloadArtifactsFile(Object projectIdOrPath, String ref, String jobName, File directory) throws GitLabApiException {
Form formData = new GitLabApiForm().withParam("job", jobName, true);
Response response = getWithAccepts(Response.Status.OK, formData.asMap(), MediaType.MEDIA_TYPE_WILDCARD,
"projects", getProjectIdOrPath(projectIdOrPath), "jobs", "artifacts", urlEncode(ref), "download");
try {
if (directory == null)
directory = new File(System.getProperty("java.io.tmpdir"));
String filename = jobName + "-artifacts.zip";
File file = new File(directory, filename);
InputStream in = response.readEntity(InputStream.class);
Files.copy(in, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
return (file);
} catch (IOException ioe) {
throw new GitLabApiException(ioe);
}
}
/**
* Get an InputStream pointing to the artifacts file from the given reference name and job
* provided the job finished successfully. The file will be saved to the specified directory.
* If the file already exists in the directory it will be overwritten.
*
* GitLab Endpoint: GET /projects/:id/jobs/artifacts/:ref_name/download?job=name
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path
* @param ref the ref from a repository
* @param jobName the name of the job to download the artifacts for
* @return an InputStream to read the specified artifacts file from
* @throws GitLabApiException if any exception occurs
*/
public InputStream downloadArtifactsFile(Object projectIdOrPath, String ref, String jobName) throws GitLabApiException {
Form formData = new GitLabApiForm().withParam("job", jobName, true);
Response response = getWithAccepts(Response.Status.OK, formData.asMap(), MediaType.MEDIA_TYPE_WILDCARD,
"projects", getProjectIdOrPath(projectIdOrPath), "jobs", "artifacts", urlEncode(ref), "download");
return (response.readEntity(InputStream.class));
}
/**
* Download the job artifacts file for the specified job ID. The artifacts file will be saved in the
* specified directory with the following name pattern: job-{jobid}-artifacts.zip. If the file already
* exists in the directory it will be overwritten.
*
* GitLab Endpoint: GET /projects/:id/jobs/:job_id/artifacts
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path
* @param jobId the job ID to get the artifacts for
* @param directory the File instance of the directory to save the file to, if null will use "java.io.tmpdir"
* @return a File instance pointing to the download of the specified job artifacts file
* @throws GitLabApiException if any exception occurs
*/
public File downloadArtifactsFile(Object projectIdOrPath, Long jobId, File directory) throws GitLabApiException {
Response response = getWithAccepts(Response.Status.OK, null, MediaType.MEDIA_TYPE_WILDCARD,
"projects", getProjectIdOrPath(projectIdOrPath), "jobs", jobId, "artifacts");
try {
if (directory == null)
directory = new File(System.getProperty("java.io.tmpdir"));
String filename = "job-" + jobId + "-artifacts.zip";
File file = new File(directory, filename);
InputStream in = response.readEntity(InputStream.class);
Files.copy(in, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
return (file);
} catch (IOException ioe) {
throw new GitLabApiException(ioe);
}
}
/**
* Get an InputStream pointing to the job artifacts file for the specified job ID.
*
* GitLab Endpoint: GET /projects/:id/jobs/:job_id/artifacts
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path
* @param jobId the job ID to get the artifacts for
* @return an InputStream to read the specified job artifacts file
* @throws GitLabApiException if any exception occurs
*/
public InputStream downloadArtifactsFile(Object projectIdOrPath, Long jobId) throws GitLabApiException {
Response response = getWithAccepts(Response.Status.OK, null, MediaType.MEDIA_TYPE_WILDCARD,
"projects", getProjectIdOrPath(projectIdOrPath), "jobs", jobId, "artifacts");
return (response.readEntity(InputStream.class));
}
/**
* Download a single artifact file from within the job's artifacts archive.
*
* Only a single file is going to be extracted from the archive and streamed to a client.
*
*
GitLab Endpoint: GET /projects/:id/jobs/:job_id/artifacts/*artifact_path
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path
* @param jobId the unique job identifier
* @param artifactsFile an ArtifactsFile instance for the artifact to download
* @param directory the File instance of the directory to save the file to, if null will use "java.io.tmpdir"
* @return a File instance pointing to the download of the specified artifacts file
* @throws GitLabApiException if any exception occurs
*/
public File downloadArtifactsFile(Object projectIdOrPath, Long jobId, ArtifactsFile artifactsFile, File directory) throws GitLabApiException {
Response response = get(Response.Status.OK, getDefaultPerPageParam(),
"projects", getProjectIdOrPath(projectIdOrPath), "jobs", jobId, "artifacts", artifactsFile.getFilename());
try {
if (directory == null)
directory = new File(System.getProperty("java.io.tmpdir"));
String filename = artifactsFile.getFilename();
File file = new File(directory, filename);
InputStream in = response.readEntity(InputStream.class);
Files.copy(in, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
return (file);
} catch (IOException ioe) {
throw new GitLabApiException(ioe);
}
}
/**
* Download a single artifact file from within the job's artifacts archive.
*
* Only a single file is going to be extracted from the archive and streamed to a client.
*
*
GitLab Endpoint: GET /projects/:id/jobs/:job_id/artifacts/*artifact_path
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path
* @param jobId the unique job identifier
* @param artifactsFile an ArtifactsFile instance for the artifact to download
* @return an InputStream to read the specified artifacts file from
* @throws GitLabApiException if any exception occurs
*/
public InputStream downloadArtifactsFile(Object projectIdOrPath, Long jobId, ArtifactsFile artifactsFile) throws GitLabApiException {
Response response = get(Response.Status.OK, getDefaultPerPageParam(),
"projects", getProjectIdOrPath(projectIdOrPath), "jobs", jobId, "artifacts", artifactsFile.getFilename());
return (response.readEntity(InputStream.class));
}
/**
* Download a single artifact file from within the job's artifacts archive.
*
* Only a single file is going to be extracted from the archive and streamed to a client.
*
*
GitLab Endpoint: GET /projects/:id/jobs/:job_id/artifacts/*artifact_path
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path
* @param jobId the unique job identifier
* @param artifactPath the Path to a file inside the artifacts archive
* @param directory the File instance of the directory to save the file to, if null will use "java.io.tmpdir"
* @return a File instance pointing to the download of the specified artifacts file
* @throws GitLabApiException if any exception occurs
*/
public File downloadSingleArtifactsFile(Object projectIdOrPath, Long jobId, Path artifactPath, File directory) throws GitLabApiException {
String path = artifactPath.toString().replace("\\", "/");
Response response = get(Response.Status.OK, getDefaultPerPageParam(),
"projects", getProjectIdOrPath(projectIdOrPath), "jobs", jobId, "artifacts", path);
try {
if (directory == null)
directory = new File(System.getProperty("java.io.tmpdir"));
String filename = artifactPath.getFileName().toString();
File file = new File(directory, filename);
InputStream in = response.readEntity(InputStream.class);
Files.copy(in, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
return (file);
} catch (IOException ioe) {
throw new GitLabApiException(ioe);
}
}
/**
* Download a single artifact file from within the job's artifacts archive.
*
* Only a single file is going to be extracted from the archive and streamed to a client.
*
*
GitLab Endpoint: GET /projects/:id/jobs/:job_id/artifacts/*artifact_path
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path
* @param jobId the unique job identifier
* @param artifactPath the Path to a file inside the artifacts archive
* @return an InputStream to read the specified artifacts file from
* @throws GitLabApiException if any exception occurs
*/
public InputStream downloadSingleArtifactsFile(Object projectIdOrPath, Long jobId, Path artifactPath) throws GitLabApiException {
String path = artifactPath.toString().replace("\\", "/");
Response response = get(Response.Status.OK, getDefaultPerPageParam(),
"projects", getProjectIdOrPath(projectIdOrPath), "jobs", jobId, "artifacts", path);
return (response.readEntity(InputStream.class));
}
/**
* Get a trace of a specific job of a project
*
* GitLab Endpoint: GET /projects/:id/jobs/:id/trace
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path
* to get the specified job's trace for
* @param jobId the job ID to get the trace for
* @return a String containing the specified job's trace
* @throws GitLabApiException if any exception occurs during execution
*/
public String getTrace(Object projectIdOrPath, Long jobId) throws GitLabApiException {
Response response = get(Response.Status.OK, getDefaultPerPageParam(),
"projects", getProjectIdOrPath(projectIdOrPath), "jobs", jobId, "trace");
return (response.readEntity(String.class));
}
/**
* Cancel specified job in a project.
*
* GitLab Endpoint: POST /projects/:id/jobs/:job_id/cancel
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path
* @param jobId the ID to cancel job
* @return job instance which just canceled
* @throws GitLabApiException if any exception occurs during execution
* @deprecated replaced by {@link #cancelJob(Object, Long)}
*/
@Deprecated
public Job cancleJob(Object projectIdOrPath, Long jobId) throws GitLabApiException {
return (cancelJob(projectIdOrPath, jobId));
}
/**
* Cancel specified job in a project.
*
* GitLab Endpoint: POST /projects/:id/jobs/:job_id/cancel
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path
* @param jobId the ID to cancel job
* @return job instance which just canceled
* @throws GitLabApiException if any exception occurs during execution
*/
public Job cancelJob(Object projectIdOrPath, Long jobId) throws GitLabApiException {
GitLabApiForm formData = null;
Response response = post(Response.Status.CREATED, formData, "projects", getProjectIdOrPath(projectIdOrPath), "jobs", jobId, "cancel");
return (response.readEntity(Job.class));
}
/**
* Retry specified job in a project.
*
* GitLab Endpoint: POST /projects/:id/jobs/:job_id/retry
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path
* @param jobId the ID to retry job
* @return job instance which just retried
* @throws GitLabApiException if any exception occurs during execution
*/
public Job retryJob(Object projectIdOrPath, Long jobId) throws GitLabApiException {
GitLabApiForm formData = null;
Response response = post(Status.CREATED, formData, "projects", getProjectIdOrPath(projectIdOrPath), "jobs", jobId, "retry");
return (response.readEntity(Job.class));
}
/**
* Erase specified job in a project.
*
* GitLab Endpoint: POST /projects/:id/jobs/:job_id/erase
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path
* @param jobId the ID to erase job
* @return job instance which just erased
* @throws GitLabApiException if any exception occurs during execution
*/
public Job eraseJob(Object projectIdOrPath, Long jobId) throws GitLabApiException {
GitLabApiForm formData = null;
Response response = post(Status.CREATED, formData, "projects", getProjectIdOrPath(projectIdOrPath), "jobs", jobId, "erase");
return (response.readEntity(Job.class));
}
/**
* Play specified job in a project.
*
* GitLab Endpoint: POST /projects/:id/jobs/:job_id/play
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path
* @param jobId the ID to play job
* @return job instance which just played
* @throws GitLabApiException if any exception occurs during execution
*/
public Job playJob(Object projectIdOrPath, Long jobId) throws GitLabApiException {
GitLabApiForm formData = null;
Response response = post(Status.CREATED, formData, "projects", getProjectIdOrPath(projectIdOrPath), "jobs", jobId, "play");
return (response.readEntity(Job.class));
}
/**
* Prevents artifacts from being deleted when expiration is set.
*
* GitLab Endpoint: POST /projects/:id/jobs/:job_id/keep
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path
* @param jobId the ID to keep artifacts for
* @return the Job instance that was just modified
* @throws GitLabApiException if any exception occurs during execution
*/
public Job keepArtifacts(Object projectIdOrPath, Long jobId) throws GitLabApiException {
GitLabApiForm formData = null;
Response response = post(Status.OK, formData, "projects", getProjectIdOrPath(projectIdOrPath), "jobs", jobId, "keep");
return (response.readEntity(Job.class));
}
/**
* Delete artifacts of a job.
*
* GitLab Endpoint: DELETE /projects/:id/jobs/:job_id/artifacts
*
* @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path
* @param jobId the ID to delete artifacts for
* @throws GitLabApiException if any exception occurs during execution
*/
public void deleteArtifacts(Object projectIdOrPath, Long jobId) throws GitLabApiException {
delete(Status.NO_CONTENT, null, "projects", getProjectIdOrPath(projectIdOrPath), "jobs", jobId, "artifacts");
}
}