diff options
Diffstat (limited to 'app/services/ci/retry_pipeline_service.rb')
-rw-r--r-- | app/services/ci/retry_pipeline_service.rb | 27 |
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 |