Commit 00e8d26e authored by Rémy Coutable's avatar Rémy Coutable

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
parent be111259
...@@ -431,13 +431,13 @@ class Project < ActiveRecord::Base ...@@ -431,13 +431,13 @@ class Project < ActiveRecord::Base
# ref can't be HEAD, can only be branch/tag name or SHA # ref can't be HEAD, can only be branch/tag name or SHA
def latest_successful_builds_for(ref = default_branch) def latest_successful_builds_for(ref = default_branch)
pipeline = pipelines.latest_successful_for(ref).to_sql latest_pipeline = pipelines.latest_successful_for(ref).first
join_sql = "INNER JOIN (#{pipeline}) pipelines" +
" ON pipelines.id = #{Ci::Build.quoted_table_name}.commit_id" if latest_pipeline
builds.joins(join_sql).latest.with_artifacts latest_pipeline.builds.latest.with_artifacts
# TODO: Whenever we dropped support for MySQL, we could change to: else
# pipeline = pipelines.latest_successful_for(ref) builds.none
# builds.where(pipeline: pipeline).latest.with_artifacts end
end end
def merge_base_commit(first_commit_id, second_commit_id) def merge_base_commit(first_commit_id, second_commit_id)
......
...@@ -283,6 +283,40 @@ Response: ...@@ -283,6 +283,40 @@ Response:
[ce-2893]: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/2893 [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 file
Get a trace of a specific build of a project Get a trace of a specific build of a project
...@@ -409,7 +443,7 @@ POST /projects/:id/builds/:build_id/erase ...@@ -409,7 +443,7 @@ POST /projects/:id/builds/:build_id/erase
Parameters Parameters
| Attribute | Type | required | Description | | Attribute | Type | Required | Description |
|-------------|---------|----------|---------------------| |-------------|---------|----------|---------------------|
| `id` | integer | yes | The ID of a project | | `id` | integer | yes | The ID of a project |
| `build_id` | integer | yes | The ID of a build | | `build_id` | integer | yes | The ID of a build |
...@@ -459,7 +493,7 @@ POST /projects/:id/builds/:build_id/artifacts/keep ...@@ -459,7 +493,7 @@ POST /projects/:id/builds/:build_id/artifacts/keep
Parameters Parameters
| Attribute | Type | required | Description | | Attribute | Type | Required | Description |
|-------------|---------|----------|---------------------| |-------------|---------|----------|---------------------|
| `id` | integer | yes | The ID of a project | | `id` | integer | yes | The ID of a project |
| `build_id` | integer | yes | The ID of a build | | `build_id` | integer | yes | The ID of a build |
......
...@@ -80,7 +80,7 @@ module API ...@@ -80,7 +80,7 @@ module API
# ref_name (required) - The ref from repository # ref_name (required) - The ref from repository
# job (required) - The name for the build # job (required) - The name for the build
# Example Request: # 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', get ':id/builds/artifacts/:ref_name/download',
requirements: { ref_name: /.+/ } do requirements: { ref_name: /.+/ } do
authorize_read_builds! authorize_read_builds!
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment