summaryrefslogtreecommitdiff
path: root/app/services/ci/retry_pipeline_service.rb
diff options
context:
space:
mode:
authorGrzegorz Bizon <grzesiek.bizon@gmail.com>2017-02-14 13:29:58 +0100
committerGrzegorz Bizon <grzesiek.bizon@gmail.com>2017-02-14 13:29:58 +0100
commit056f1b702042382c99dcfdaf1e292bf68b8f55ba (patch)
tree38fa1c55ce9c67ac48faa1d35dfb9d68561af25c /app/services/ci/retry_pipeline_service.rb
parent94495f984c0a81d32b6f748fd977848dc5c6721e (diff)
downloadgitlab-ce-056f1b702042382c99dcfdaf1e292bf68b8f55ba.tar.gz
Simplify implementation of pipeline retry service
Diffstat (limited to 'app/services/ci/retry_pipeline_service.rb')
-rw-r--r--app/services/ci/retry_pipeline_service.rb42
1 files changed, 5 insertions, 37 deletions
diff --git a/app/services/ci/retry_pipeline_service.rb b/app/services/ci/retry_pipeline_service.rb
index 1b931455fb8..8a1a9191478 100644
--- a/app/services/ci/retry_pipeline_service.rb
+++ b/app/services/ci/retry_pipeline_service.rb
@@ -1,57 +1,25 @@
module Ci
class RetryPipelineService < ::BaseService
def execute(pipeline)
- @pipeline = pipeline
-
unless can?(current_user, :update_pipeline, pipeline)
raise Gitlab::Access::AccessDeniedError
end
- pipeline.mark_as_processable_after_stage(resume_stage.index)
+ each_build(pipeline.builds.failed_or_canceled) do |build|
+ next unless build.retryable?
- retryable_builds_in_subsequent_stages do |build|
Ci::RetryBuildService.new(project, current_user)
.reprocess(build)
end
- retryable_builds_in_first_unsuccessful_stage do |build|
- Ci::RetryBuildService.new(project, current_user)
- .retry(build)
- end
+ pipeline.process!
end
private
- def retryable_builds_in_subsequent_stages
- relation = @pipeline.builds
- .after_stage(resume_stage.index)
- .failed_or_canceled
-
- each_retryable_build_with_locking(relation) do |build|
- yield build
- end
- end
-
- def retryable_builds_in_first_unsuccessful_stage
- relation = resume_stage.builds.failed_or_canceled
-
- each_retryable_build_with_locking(relation) do |build|
- yield build
- end
- end
-
- def each_retryable_build_with_locking(relation)
+ def each_build(relation)
Gitlab::OptimisticLocking.retry_lock(relation) do |builds|
- builds.find_each do |build|
- next unless build.retryable?
- yield build
- end
- end
- end
-
- def resume_stage
- @resume_stage ||= @pipeline.stages.find do |stage|
- stage.failed? || stage.canceled?
+ builds.find_each { |build| yield build }
end
end
end