summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKamil Trzcinski <ayufan@ayufan.eu>2016-06-10 17:11:27 +0200
committerPhil Hughes <me@iamphill.com>2016-06-13 11:07:23 +0100
commit6013768fec33e3bf084019d97dbfb7cca78f8e82 (patch)
tree6d79ea67c7ea8bdae03f0cdfd958b6586b817dd6
parent7e9273dd946f46b2b2bcc0a751316dc704089a16 (diff)
downloadgitlab-ce-6013768fec33e3bf084019d97dbfb7cca78f8e82.tar.gz
Added keep artifacts API endpoint
-rw-r--r--doc/api/builds.md50
-rw-r--r--lib/api/builds.rb19
-rw-r--r--spec/requests/api/builds_spec.rb27
3 files changed, 96 insertions, 0 deletions
diff --git a/doc/api/builds.md b/doc/api/builds.md
index 5669bd0cdda..0f9f4e99ea2 100644
--- a/doc/api/builds.md
+++ b/doc/api/builds.md
@@ -443,3 +443,53 @@ Example of response
"user": null
}
```
+
+## Keep artifacts
+
+Prevents artifacts from being deleted when expiration is set
+
+```
+POST /projects/:id/builds/:build_id/artifacts/keep
+```
+
+Parameters
+
+| Attribute | Type | required | Description |
+|-------------|---------|----------|---------------------|
+| `id` | integer | yes | The ID of a project |
+| `build_id` | integer | yes | The ID of a build |
+
+Example of request
+
+```
+curl -X POST -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" "https://gitlab.example.com/api/v3/projects/1/builds/1/artifacts/keep"
+```
+
+Example of response
+
+```json
+{
+ "commit": {
+ "author_email": "admin@example.com",
+ "author_name": "Administrator",
+ "created_at": "2015-12-24T16:51:14.000+01:00",
+ "id": "0ff3ae198f8601a285adcf5c0fff204ee6fba5fd",
+ "message": "Test the CI integration.",
+ "short_id": "0ff3ae19",
+ "title": "Test the CI integration."
+ },
+ "coverage": null,
+ "download_url": null,
+ "id": 69,
+ "name": "rubocop",
+ "ref": "master",
+ "runner": null,
+ "stage": "test",
+ "created_at": "2016-01-11T10:13:33.506Z",
+ "started_at": "2016-01-11T10:13:33.506Z",
+ "finished_at": "2016-01-11T10:15:10.506Z",
+ "status": "failed",
+ "tag": false,
+ "user": null
+}
+```
diff --git a/lib/api/builds.rb b/lib/api/builds.rb
index 0ff8fa74a84..704654e9e8c 100644
--- a/lib/api/builds.rb
+++ b/lib/api/builds.rb
@@ -166,6 +166,25 @@ module API
present build, with: Entities::Build,
user_can_download_artifacts: can?(current_user, :download_build_artifacts, user_project)
end
+
+ # Keep the artifacts to prevent them to be deleted
+ #
+ # Parameters:
+ # id (required) - The ID of a build
+ # Example Request:
+ # POST /projects/:id/builds/:build_id/artifacts/keep
+ post ':id/builds/:build_id/artifacts/keep' do
+ authorize_update_builds!
+
+ build = get_build(params[:build_id])
+ return not_found!(build) unless build && build.artifacts?
+
+ build.keep_artifacts!
+
+ status 200
+ present build, with: Entities::Build,
+ user_can_download_artifacts: can?(current_user, :read_build, user_project)
+ end
end
helpers do
diff --git a/spec/requests/api/builds_spec.rb b/spec/requests/api/builds_spec.rb
index 6cb7be188ef..b92d991b998 100644
--- a/spec/requests/api/builds_spec.rb
+++ b/spec/requests/api/builds_spec.rb
@@ -241,4 +241,31 @@ describe API::API, api: true do
end
end
end
+
+ describe 'POST /projects/:id/builds/:build_id/artifacts/keep' do
+ before do
+ post api("/projects/#{project.id}/builds/#{build.id}/artifacts/keep", user)
+ end
+
+ context 'artifacts did not expire' do
+ let(:build) do
+ create(:ci_build, :trace, :artifacts, :success,
+ project: project, pipeline: pipeline, artifacts_expire_at: Time.now + 7.days)
+ end
+
+ it 'should keep artifacts' do
+ expect(response.status).to eq 200
+ build.reload
+ expect(build.artifacts_expire_at).to be_nil
+ end
+ end
+
+ context 'no artifacts' do
+ let(:build) { create(:ci_build, project: project, pipeline: pipeline) }
+
+ it 'should respond with not found' do
+ expect(response.status).to eq 404
+ end
+ end
+ end
end