Read about our upcoming Code of Conduct on this issue

Commit 86f17f41 authored by Kamil Trzciński's avatar Kamil Trzciński
Browse files

Merge branch '50461-add-retried-builds-in-pipeline-stage-endpoint' into 'master'

Add retried jobs to pipeline stages

Closes #50461

See merge request gitlab-org/gitlab-ce!21558
......@@ -96,7 +96,7 @@ def stage
render json: StageSerializer
.new(project: @project, current_user: @current_user)
.represent(@stage, details: true)
.represent(@stage, details: true, retried: params[:retried])
end
# TODO: This endpoint is used by mini-pipeline-graph
......
......@@ -19,6 +19,12 @@ class StageEntity < Grape::Entity
latest_statuses
end
expose :retried,
if: -> (_, opts) { opts[:retried] },
with: JobEntity do |stage|
retried_statuses
end
expose :detailed_status, as: :status, with: DetailedStatusEntity
expose :path do |stage|
......@@ -48,9 +54,19 @@ def grouped_statuses
@grouped_statuses ||= stage.statuses.latest_ordered.group_by(&:status)
end
def grouped_retried_statuses
@grouped_retried_statuses ||= stage.statuses.retried_ordered.group_by(&:status)
end
def latest_statuses
HasStatus::ORDERED_STATUSES.map do |ordered_status|
grouped_statuses.fetch(ordered_status, [])
end.flatten
end
def retried_statuses
HasStatus::ORDERED_STATUSES.map do |ordered_status|
grouped_retried_statuses.fetch(ordered_status, [])
end.flatten
end
end
---
title: Add retried jobs to pipeline stage
merge_request: 21558
author:
type: other
......@@ -193,14 +193,34 @@ def create_build(stage, stage_idx, name)
context 'when accessing existing stage' do
before do
create(:ci_build, :retried, :failed, pipeline: pipeline, stage: 'build')
create(:ci_build, pipeline: pipeline, stage: 'build')
end
context 'without retried' do
before do
get_stage('build')
end
get_stage('build')
it 'returns pipeline jobs without the retried builds' do
expect(response).to have_gitlab_http_status(:ok)
expect(response).to match_response_schema('pipeline_stage')
expect(json_response['latest_statuses'].length).to eq 1
expect(json_response).not_to have_key('retried')
end
end
it 'returns html source for stage dropdown' do
expect(response).to have_gitlab_http_status(:ok)
expect(response).to match_response_schema('pipeline_stage')
context 'with retried' do
before do
get_stage('build', retried: true)
end
it 'returns pipelines jobs with the retried builds' do
expect(response).to have_gitlab_http_status(:ok)
expect(response).to match_response_schema('pipeline_stage')
expect(json_response['latest_statuses'].length).to eq 1
expect(json_response['retried'].length).to eq 1
end
end
end
......@@ -214,12 +234,13 @@ def create_build(stage, stage_idx, name)
end
end
def get_stage(name)
get :stage, namespace_id: project.namespace,
project_id: project,
id: pipeline.id,
stage: name,
format: :json
def get_stage(name, params = {})
get :stage, **params.merge(
namespace_id: project.namespace,
project_id: project,
id: pipeline.id,
stage: name,
format: :json)
end
end
......
......@@ -25,7 +25,9 @@
"playable": { "type": "boolean" },
"created_at": { "type": "string" },
"updated_at": { "type": "string" },
"status": { "$ref": "../status/ci_detailed_status.json" }
"status": { "$ref": "../status/ci_detailed_status.json" },
"callout_message": { "type": "string" },
"recoverable": { "type": "boolean" }
},
"additionalProperties": true
}
......@@ -16,6 +16,11 @@
"items": { "$ref": "job/job.json" },
"optional": true
},
"retried": {
"type": "array",
"items": { "$ref": "job/job.json" },
"optional": true
},
"status": { "$ref": "status/ci_detailed_status.json" },
"path": { "type": "string" },
"dropdown_path": { "type": "string" }
......
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