summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRémy Coutable <remy@rymai.me>2016-07-22 08:46:04 +0000
committerRémy Coutable <remy@rymai.me>2016-07-22 08:46:04 +0000
commit50124864e389e6813296cc803efac76f7c23b633 (patch)
treef75e74fbab5674a9e89f26b33b8aa6634d5d5cf1
parentcbe787c5872318befb9d3cbd2918a44878e04497 (diff)
parent0b67945c99fde0d2c1ac6287f826001ef4c5d03b (diff)
downloadgitlab-ce-50124864e389e6813296cc803efac76f7c23b633.tar.gz
Merge branch 'artifacts-from-ref-and-build-name-api' into 'master'
Simpler two queries than one JOIN with subquery This is a follow up from !5347 Originally it was: ``` ruby pipeline = pipelines.latest_successful_for(ref) builds.where(pipeline: pipeline).latest.with_artifacts ``` However MySQL would complain that we can't use `IN` against a subquery which has `LIMIT`. Using `INNER JOIN` would be a workaround, however, doing that is too complicated in current version of Rails. So let's just use two queries in this case. Closes #14419 See merge request !5388
-rw-r--r--app/models/project.rb14
-rw-r--r--doc/api/builds.md38
-rw-r--r--lib/api/builds.rb2
3 files changed, 44 insertions, 10 deletions
diff --git a/app/models/project.rb b/app/models/project.rb
index f09d915f20e..5452d9f768f 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -431,13 +431,13 @@ class Project < ActiveRecord::Base
# ref can't be HEAD, can only be branch/tag name or SHA
def latest_successful_builds_for(ref = default_branch)
- pipeline = pipelines.latest_successful_for(ref).to_sql
- join_sql = "INNER JOIN (#{pipeline}) pipelines" +
- " ON pipelines.id = #{Ci::Build.quoted_table_name}.commit_id"
- builds.joins(join_sql).latest.with_artifacts
- # TODO: Whenever we dropped support for MySQL, we could change to:
- # pipeline = pipelines.latest_successful_for(ref)
- # builds.where(pipeline: pipeline).latest.with_artifacts
+ latest_pipeline = pipelines.latest_successful_for(ref).first
+
+ if latest_pipeline
+ latest_pipeline.builds.latest.with_artifacts
+ else
+ builds.none
+ end
end
def merge_base_commit(first_commit_id, second_commit_id)
diff --git a/doc/api/builds.md b/doc/api/builds.md
index 2adea11247e..24d90e22a9b 100644
--- a/doc/api/builds.md
+++ b/doc/api/builds.md
@@ -283,6 +283,40 @@ Response:
[ce-2893]: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/2893
+## Download the artifacts file
+
+> [Introduced][ce-5347] in GitLab 8.10.
+
+Download the artifacts file from the given reference name and job provided the
+build finished successfully.
+
+```
+GET /projects/:id/builds/artifacts/:ref_name/download?job=name
+```
+
+Parameters
+
+| Attribute | Type | Required | Description |
+|-------------|---------|----------|-------------------------- |
+| `id` | integer | yes | The ID of a project |
+| `ref_name` | string | yes | The ref from a repository |
+| `job` | string | yes | The name of the job |
+
+Example request:
+
+```
+curl -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" "https://gitlab.example.com/api/v3/projects/1/builds/artifacts/master/download?job=test"
+```
+
+Example response:
+
+| Status | Description |
+|-----------|---------------------------------|
+| 200 | Serves the artifacts file |
+| 404 | Build not found or no artifacts |
+
+[ce-5347]: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/5347
+
## Get a trace file
Get a trace of a specific build of a project
@@ -409,7 +443,7 @@ POST /projects/:id/builds/:build_id/erase
Parameters
-| Attribute | Type | required | Description |
+| Attribute | Type | Required | Description |
|-------------|---------|----------|---------------------|
| `id` | integer | yes | The ID of a project |
| `build_id` | integer | yes | The ID of a build |
@@ -459,7 +493,7 @@ POST /projects/:id/builds/:build_id/artifacts/keep
Parameters
-| Attribute | Type | required | Description |
+| Attribute | Type | Required | Description |
|-------------|---------|----------|---------------------|
| `id` | integer | yes | The ID of a project |
| `build_id` | integer | yes | The ID of a build |
diff --git a/lib/api/builds.rb b/lib/api/builds.rb
index 657d421fe97..be5a3484ec8 100644
--- a/lib/api/builds.rb
+++ b/lib/api/builds.rb
@@ -80,7 +80,7 @@ module API
# ref_name (required) - The ref from repository
# job (required) - The name for the build
# Example Request:
- # GET /projects/:id/artifacts/:ref_name/download?job=name
+ # GET /projects/:id/builds/artifacts/:ref_name/download?job=name
get ':id/builds/artifacts/:ref_name/download',
requirements: { ref_name: /.+/ } do
authorize_read_builds!