retry_pipeline_service.rb 943 字节
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14
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

15 16 17 18 19 20 21 22 23
      ##
      # 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!
24
        end
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39

      ##
      # 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?
40 41 42 43
      end
    end
  end
end