API: delete job_artifacts of a single job
This commit is contained in:
parent
79305b77f4
commit
4db8336786
|
@ -278,6 +278,7 @@ class ProjectPolicy < BasePolicy
|
|||
enable :admin_cluster
|
||||
enable :create_environment_terminal
|
||||
enable :destroy_release
|
||||
enable :destroy_artifacts
|
||||
enable :daily_statistics
|
||||
end
|
||||
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Extend the Gitlab API for deletion of job_artifacts of a single job.
|
||||
merge_request: 25522
|
||||
author: rroger
|
||||
type: added
|
|
@ -10,7 +10,7 @@ GET /projects/:id/jobs
|
|||
|
||||
| Attribute | Type | Required | Description |
|
||||
|-----------|--------------------------------|----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
|
||||
| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
|
||||
| `scope` | string **or** array of strings | no | Scope of jobs to show. Either one of or an array of the following: `created`, `pending`, `running`, `failed`, `success`, `canceled`, `skipped`, or `manual`. All jobs are returned if `scope` is not provided. |
|
||||
|
||||
```sh
|
||||
|
@ -142,8 +142,8 @@ GET /projects/:id/pipelines/:pipeline_id/jobs
|
|||
|
||||
| Attribute | Type | Required | Description |
|
||||
|---------------|--------------------------------|----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
|
||||
| `pipeline_id` | integer | yes | The ID of a pipeline. |
|
||||
| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
|
||||
| `pipeline_id` | integer | yes | ID of a pipeline. |
|
||||
| `scope` | string **or** array of strings | no | Scope of jobs to show. Either one of or an array of the following: `created`, `pending`, `running`, `failed`, `success`, `canceled`, `skipped`, or `manual`. All jobs are returned if `scope` is not provided. |
|
||||
|
||||
```sh
|
||||
|
@ -275,8 +275,8 @@ GET /projects/:id/jobs/:job_id
|
|||
|
||||
| Attribute | Type | Required | Description |
|
||||
|-----------|----------------|----------|------------------------------------------------------------------------------------------------------------------|
|
||||
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
|
||||
| `job_id` | integer | yes | The ID of a job. |
|
||||
| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
|
||||
| `job_id` | integer | yes | ID of a job. |
|
||||
|
||||
```sh
|
||||
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/jobs/8"
|
||||
|
@ -350,8 +350,8 @@ GET /projects/:id/jobs/:job_id/artifacts
|
|||
|
||||
| Attribute | Type | Required | Description |
|
||||
|-----------|----------------|----------|------------------------------------------------------------------------------------------------------------------|
|
||||
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
|
||||
| `job_id` | integer | yes | The ID of a job. |
|
||||
| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
|
||||
| `job_id` | integer | yes | ID of a job. |
|
||||
|
||||
Example requests:
|
||||
|
||||
|
@ -385,7 +385,7 @@ Parameters
|
|||
|
||||
| Attribute | Type | Required | Description |
|
||||
|------------|----------------|----------|------------------------------------------------------------------------------------------------------------------|
|
||||
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
|
||||
| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
|
||||
| `ref_name` | string | yes | Branch or tag name in repository. HEAD or SHA references are not supported. |
|
||||
| `job` | string | yes | The name of the job. |
|
||||
|
||||
|
@ -420,7 +420,7 @@ Parameters
|
|||
|
||||
| Attribute | Type | Required | Description |
|
||||
|-----------------|----------------|----------|------------------------------------------------------------------------------------------------------------------|
|
||||
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
|
||||
| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
|
||||
| `job_id ` | integer | yes | The unique job identifier. |
|
||||
| `artifact_path` | string | yes | Path to a file inside the artifacts archive. |
|
||||
|
||||
|
@ -454,7 +454,7 @@ Parameters:
|
|||
|
||||
| Attribute | Type | Required | Description |
|
||||
|-----------------|----------------|----------|------------------------------------------------------------------------------------------------------------------|
|
||||
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
|
||||
| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
|
||||
| `ref_name` | string | yes | Branch or tag name in repository. HEAD or SHA references are not supported. |
|
||||
| `artifact_path` | string | yes | Path to a file inside the artifacts archive. |
|
||||
| `job` | string | yes | The name of the job. |
|
||||
|
@ -483,8 +483,8 @@ GET /projects/:id/jobs/:job_id/trace
|
|||
|
||||
| Attribute | Type | Required | Description |
|
||||
|-----------|----------------|----------|------------------------------------------------------------------------------------------------------------------|
|
||||
| id | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
|
||||
| job_id | integer | yes | The ID of a job. |
|
||||
| id | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
|
||||
| job_id | integer | yes | ID of a job. |
|
||||
|
||||
```sh
|
||||
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/jobs/8/trace"
|
||||
|
@ -507,8 +507,8 @@ POST /projects/:id/jobs/:job_id/cancel
|
|||
|
||||
| Attribute | Type | Required | Description |
|
||||
|-----------|----------------|----------|------------------------------------------------------------------------------------------------------------------|
|
||||
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
|
||||
| `job_id` | integer | yes | The ID of a job. |
|
||||
| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
|
||||
| `job_id` | integer | yes | ID of a job. |
|
||||
|
||||
```sh
|
||||
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/jobs/1/cancel"
|
||||
|
@ -555,8 +555,8 @@ POST /projects/:id/jobs/:job_id/retry
|
|||
|
||||
| Attribute | Type | Required | Description |
|
||||
|-----------|----------------|----------|------------------------------------------------------------------------------------------------------------------|
|
||||
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
|
||||
| `job_id` | integer | yes | The ID of a job. |
|
||||
| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
|
||||
| `job_id` | integer | yes | ID of a job. |
|
||||
|
||||
```sh
|
||||
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/jobs/1/retry"
|
||||
|
@ -605,8 +605,8 @@ Parameters
|
|||
|
||||
| Attribute | Type | Required | Description |
|
||||
|-----------|----------------|----------|------------------------------------------------------------------------------------------------------------------|
|
||||
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
|
||||
| `job_id` | integer | yes | The ID of a job. |
|
||||
| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
|
||||
| `job_id` | integer | yes | ID of a job. |
|
||||
|
||||
Example of request
|
||||
|
||||
|
@ -658,8 +658,8 @@ Parameters
|
|||
|
||||
| Attribute | Type | Required | Description |
|
||||
|-----------|----------------|----------|------------------------------------------------------------------------------------------------------------------|
|
||||
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
|
||||
| `job_id` | integer | yes | The ID of a job. |
|
||||
| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
|
||||
| `job_id` | integer | yes | ID of a job. |
|
||||
|
||||
Example request:
|
||||
|
||||
|
@ -699,6 +699,33 @@ Example response:
|
|||
}
|
||||
```
|
||||
|
||||
## Delete artifacts
|
||||
|
||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/25522) in GitLab 11.9.
|
||||
|
||||
Delete artifacts of a job.
|
||||
|
||||
```
|
||||
DELETE /projects/:id/jobs/:job_id/artifacts
|
||||
```
|
||||
|
||||
| Attribute | Type | Required | Description |
|
||||
|-----------|----------------|----------|------------------------------------------------------------------------------------------------------------------|
|
||||
| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
|
||||
| `job_id` | integer | yes | ID of a job. |
|
||||
|
||||
|
||||
Example request:
|
||||
|
||||
```sh
|
||||
curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/jobs/1/artifacts"
|
||||
```
|
||||
|
||||
NOTE: **Note:**
|
||||
At least Maintainer role is required to delete artifacts.
|
||||
|
||||
If the artifacts were deleted successfully, a response with status `204 No Content` is returned.
|
||||
|
||||
## Play a job
|
||||
|
||||
Triggers a manual action to start a job.
|
||||
|
@ -709,8 +736,8 @@ POST /projects/:id/jobs/:job_id/play
|
|||
|
||||
| Attribute | Type | Required | Description |
|
||||
|-----------|----------------|----------|------------------------------------------------------------------------------------------------------------------|
|
||||
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
|
||||
| `job_id` | integer | yes | The ID of a job. |
|
||||
| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
|
||||
| `job_id` | integer | yes | ID of a job. |
|
||||
|
||||
```sh
|
||||
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/jobs/1/play"
|
||||
|
|
|
@ -244,6 +244,10 @@ module API
|
|||
authorize! :read_build, user_project
|
||||
end
|
||||
|
||||
def authorize_destroy_artifacts!
|
||||
authorize! :destroy_artifacts, user_project
|
||||
end
|
||||
|
||||
def authorize_update_builds!
|
||||
authorize! :update_build, user_project
|
||||
end
|
||||
|
|
|
@ -109,6 +109,22 @@ module API
|
|||
status 200
|
||||
present build, with: Entities::Job
|
||||
end
|
||||
|
||||
desc 'Delete the artifacts files from a job' do
|
||||
detail 'This feature was introduced in GitLab 11.9'
|
||||
end
|
||||
params do
|
||||
requires :job_id, type: Integer, desc: 'The ID of a job'
|
||||
end
|
||||
delete ':id/jobs/:job_id/artifacts' do
|
||||
authorize_destroy_artifacts!
|
||||
build = find_build!(params[:job_id])
|
||||
authorize!(:destroy_artifacts, build)
|
||||
|
||||
build.erase_erasable_artifacts!
|
||||
|
||||
status :no_content
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -321,6 +321,49 @@ describe API::Jobs do
|
|||
end
|
||||
end
|
||||
|
||||
describe 'DELETE /projects/:id/jobs/:job_id/artifacts' do
|
||||
let!(:job) { create(:ci_build, :artifacts, pipeline: pipeline, user: api_user) }
|
||||
|
||||
before do
|
||||
delete api("/projects/#{project.id}/jobs/#{job.id}/artifacts", api_user)
|
||||
end
|
||||
|
||||
context 'when user is anonymous' do
|
||||
let(:api_user) { nil }
|
||||
|
||||
it 'does not delete artifacts' do
|
||||
expect(job.job_artifacts.size).to eq 2
|
||||
end
|
||||
|
||||
it 'returns status 401 (unauthorized)' do
|
||||
expect(response).to have_http_status :unauthorized
|
||||
end
|
||||
end
|
||||
|
||||
context 'with developer' do
|
||||
it 'does not delete artifacts' do
|
||||
expect(job.job_artifacts.size).to eq 2
|
||||
end
|
||||
|
||||
it 'returns status 403 (forbidden)' do
|
||||
expect(response).to have_http_status :forbidden
|
||||
end
|
||||
end
|
||||
|
||||
context 'with authorized user' do
|
||||
let(:maintainer) { create(:project_member, :maintainer, project: project).user }
|
||||
let!(:api_user) { maintainer }
|
||||
|
||||
it 'deletes artifacts' do
|
||||
expect(job.job_artifacts.size).to eq 0
|
||||
end
|
||||
|
||||
it 'returns status 204 (no content)' do
|
||||
expect(response).to have_http_status :no_content
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'GET /projects/:id/jobs/:job_id/artifacts/:artifact_path' do
|
||||
context 'when job has artifacts' do
|
||||
let(:job) { create(:ci_build, :artifacts, pipeline: pipeline) }
|
||||
|
|
Loading…
Reference in New Issue