Commit 4899dfca authored by Eva Kadlecová's avatar Eva Kadlecová

Redirect to the pipeline builds page when a build is canceled

parent 120ce02e
class Projects::JobsController < Projects::ApplicationController class Projects::JobsController < Projects::ApplicationController
include SendFileUpload include SendFileUpload
include ContinueParams
before_action :build, except: [:index, :cancel_all] before_action :build, except: [:index, :cancel_all]
before_action :authorize_read_build! before_action :authorize_read_build!
...@@ -101,7 +102,12 @@ class Projects::JobsController < Projects::ApplicationController ...@@ -101,7 +102,12 @@ class Projects::JobsController < Projects::ApplicationController
return respond_422 unless @build.cancelable? return respond_422 unless @build.cancelable?
@build.cancel @build.cancel
redirect_to build_path(@build)
if continue_params
redirect_to continue_params[:to]
else
redirect_to builds_project_pipeline_path(@project, @build.pipeline.id)
end
end end
def status def status
......
...@@ -99,7 +99,7 @@ ...@@ -99,7 +99,7 @@
= sprite_icon('download') = sprite_icon('download')
- if can?(current_user, :update_build, job) - if can?(current_user, :update_build, job)
- if job.active? - if job.active?
= link_to cancel_project_job_path(job.project, job, return_to: request.original_url), method: :post, title: 'Cancel', class: 'btn btn-build' do = link_to cancel_project_job_path(job.project, job, continue: { to: request.fullpath }), method: :post, title: 'Cancel', class: 'btn btn-build' do
= icon('remove', class: 'cred') = icon('remove', class: 'cred')
- elsif allow_retry - elsif allow_retry
- if job.playable? && !admin && can?(current_user, :update_build, job) - if job.playable? && !admin && can?(current_user, :update_build, job)
......
---
title: Redirect to the pipeline builds page when a build is canceled
merge_request:
author: Eva Kadlecova
type: fixed
...@@ -356,35 +356,68 @@ describe Projects::JobsController, :clean_gitlab_redis_shared_state do ...@@ -356,35 +356,68 @@ describe Projects::JobsController, :clean_gitlab_redis_shared_state do
before do before do
project.add_developer(user) project.add_developer(user)
sign_in(user) sign_in(user)
post_cancel
end end
context 'when job is cancelable' do context 'when continue url is present' do
let(:job) { create(:ci_build, :cancelable, pipeline: pipeline) } let(:job) { create(:ci_build, :cancelable, pipeline: pipeline) }
it 'redirects to the canceled job page' do context 'when continue to is a safe url' do
expect(response).to have_gitlab_http_status(:found) let(:url) { '/test' }
expect(response).to redirect_to(namespace_project_job_path(id: job.id))
before do
post_cancel(continue: { to: url })
end
it 'redirects to the continue url' do
expect(response).to have_gitlab_http_status(:found)
expect(response).to redirect_to(url)
end
it 'transits to canceled' do
expect(job.reload).to be_canceled
end
end end
it 'transits to canceled' do context 'when continue to is not a safe url' do
expect(job.reload).to be_canceled let(:url) { 'http://example.com' }
it 'raises an error' do
expect { cancel_with_redirect(url) }.to raise_error
end
end end
end end
context 'when job is not cancelable' do context 'when continue url is not present' do
let(:job) { create(:ci_build, :canceled, pipeline: pipeline) } before do
post_cancel
end
it 'returns unprocessable_entity' do context 'when job is cancelable' do
expect(response).to have_gitlab_http_status(:unprocessable_entity) let(:job) { create(:ci_build, :cancelable, pipeline: pipeline) }
it 'redirects to the builds page' do
expect(response).to have_gitlab_http_status(:found)
expect(response).to redirect_to(builds_namespace_project_pipeline_path(id: pipeline.id))
end
it 'transits to canceled' do
expect(job.reload).to be_canceled
end
end
context 'when job is not cancelable' do
let(:job) { create(:ci_build, :canceled, pipeline: pipeline) }
it 'returns unprocessable_entity' do
expect(response).to have_gitlab_http_status(:unprocessable_entity)
end
end end
end end
def post_cancel def post_cancel(additional_params = {})
post :cancel, namespace_id: project.namespace, post :cancel, { namespace_id: project.namespace,
project_id: project, project_id: project,
id: job.id id: job.id }.merge(additional_params)
end end
end end
......
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