summaryrefslogtreecommitdiff
path: root/app/services/ci/retry_pipeline_service.rb
blob: 9d8e4d361f449aa2c25fd8d94f9c7e5517ff2725 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
module Ci
  class RetryPipelineService
    include Gitlab::Allowable

    def initialize(pipeline, user)
      @pipeline = pipeline
      @user = user
    end

    def execute
      unless can?(@user, :update_pipeline, @pipeline)
        raise Gitlab::Access::AccessDeniedError
      end

      ##
      # 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
end