From c80abb40fcb3b2dc35c62aa30d374f2889247746 Mon Sep 17 00:00:00 2001 From: Steve Azzopardi Date: Thu, 6 Sep 2018 12:21:58 +0200 Subject: [PATCH] Add retried jobs to pipeline stages closes https://gitlab.com/gitlab-org/gitlab-ce/issues/50461 --- .../projects/pipelines_controller.rb | 2 +- app/serializers/stage_entity.rb | 16 +++++++ ...ried-builds-in-pipeline-stage-endpoint.yml | 5 +++ .../projects/pipelines_controller_spec.rb | 43 ++++++++++++++----- spec/fixtures/api/schemas/job/job.json | 4 +- spec/fixtures/api/schemas/pipeline_stage.json | 5 +++ 6 files changed, 62 insertions(+), 13 deletions(-) create mode 100644 changelogs/unreleased/50461-add-retried-builds-in-pipeline-stage-endpoint.yml diff --git a/app/controllers/projects/pipelines_controller.rb b/app/controllers/projects/pipelines_controller.rb index 2cc721dfeec..5b2091d68f8 100644 --- a/app/controllers/projects/pipelines_controller.rb +++ b/app/controllers/projects/pipelines_controller.rb @@ -96,7 +96,7 @@ class Projects::PipelinesController < Projects::ApplicationController 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 diff --git a/app/serializers/stage_entity.rb b/app/serializers/stage_entity.rb index ca8fa7e7877..029dd3d0684 100644 --- a/app/serializers/stage_entity.rb +++ b/app/serializers/stage_entity.rb @@ -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 @@ class StageEntity < Grape::Entity @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 diff --git a/changelogs/unreleased/50461-add-retried-builds-in-pipeline-stage-endpoint.yml b/changelogs/unreleased/50461-add-retried-builds-in-pipeline-stage-endpoint.yml new file mode 100644 index 00000000000..539aea4f333 --- /dev/null +++ b/changelogs/unreleased/50461-add-retried-builds-in-pipeline-stage-endpoint.yml @@ -0,0 +1,5 @@ +--- +title: Add retried jobs to pipeline stage +merge_request: 21558 +author: +type: other diff --git a/spec/controllers/projects/pipelines_controller_spec.rb b/spec/controllers/projects/pipelines_controller_spec.rb index d89716b1b50..0d49033c691 100644 --- a/spec/controllers/projects/pipelines_controller_spec.rb +++ b/spec/controllers/projects/pipelines_controller_spec.rb @@ -193,14 +193,34 @@ describe Projects::PipelinesController do context 'when accessing existing stage' do before do + create(:ci_build, :retried, :failed, pipeline: pipeline, stage: 'build') create(:ci_build, pipeline: pipeline, stage: 'build') - - get_stage('build') 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 'without retried' do + before do + get_stage('build') + end + + 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 + + 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 @@ describe Projects::PipelinesController do 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 diff --git a/spec/fixtures/api/schemas/job/job.json b/spec/fixtures/api/schemas/job/job.json index f5d58b21e3d..734c535ef70 100644 --- a/spec/fixtures/api/schemas/job/job.json +++ b/spec/fixtures/api/schemas/job/job.json @@ -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 } diff --git a/spec/fixtures/api/schemas/pipeline_stage.json b/spec/fixtures/api/schemas/pipeline_stage.json index f72988a3d3d..c01a1946185 100644 --- a/spec/fixtures/api/schemas/pipeline_stage.json +++ b/spec/fixtures/api/schemas/pipeline_stage.json @@ -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" }