summaryrefslogtreecommitdiff
path: root/app/services/ci/retry_pipeline_service.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/ci/retry_pipeline_service.rb')
-rw-r--r--app/services/ci/retry_pipeline_service.rb27
1 files changed, 24 insertions, 3 deletions
diff --git a/app/services/ci/retry_pipeline_service.rb b/app/services/ci/retry_pipeline_service.rb
index f873acc9964..9d8e4d361f4 100644
--- a/app/services/ci/retry_pipeline_service.rb
+++ b/app/services/ci/retry_pipeline_service.rb
@@ -12,10 +12,31 @@ module Ci
raise Gitlab::Access::AccessDeniedError
end
- @pipeline.stages.each do |stage|
- stage.builds.failed_or_canceled.find_each do |build|
- Ci::Build.retry(build, @user)
+ ##
+ # Reprocess builds in subsequent stages if any
+ #
+ # TODO, refactor.
+ #
+ @pipeline.builds
+ .where('stage_idx > ?', resume_stage.index)
+ .failed_or_canceled.find_each do |build|
+ Ci::RetryBuildService.new(build, @user).reprocess!
end
+
+ ##
+ # Retry builds in the first unsuccessful stage
+ #
+ resume_stage.builds.failed_or_canceled.find_each do |build|
+ Ci::Build.retry(build, @user)
+ end
+
+ end
+
+ private
+
+ def resume_stage
+ @resume_stage ||= @pipeline.stages.find do |stage|
+ stage.failed? || stage.canceled?
end
end
end