Class: Gitlab::Ci::Pipeline::Preloader

Inherits:
Object
  • Object
show all
Defined in:
lib/gitlab/ci/pipeline/preloader.rb

Overview

Class for preloading data associated with pipelines such as commit authors.

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(pipeline) ⇒ Preloader

Returns a new instance of Preloader.



28
29
30
# File 'lib/gitlab/ci/pipeline/preloader.rb', line 28

def initialize(pipeline)
  @pipeline = pipeline
end

Class Method Details

.preload!(pipelines) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/gitlab/ci/pipeline/preloader.rb', line 9

def self.preload!(pipelines)
  ##
  # This preloads all commits at once, because `Ci::Pipeline#commit` is
  # using a lazy batch loading, what results in only one batched Gitaly
  # call.
  #
  pipelines.each(&:commit)

  pipelines.each do |pipeline|
    self.new(pipeline).tap do |preloader|
      preloader.preload_commit_authors
      preloader.preload_ref_commits
      preloader.preload_pipeline_warnings
      preloader.preload_stages_warnings
      preloader.preload_persisted_environments
    end
  end
end

Instance Method Details

#preload_commit_authorsObject

This also preloads the author of every commit. We’re using “lazy_author” here since “author” immediately loads the data on the first call.



34
35
36
# File 'lib/gitlab/ci/pipeline/preloader.rb', line 34

def preload_commit_authors
  @pipeline.commit.try(:lazy_author)
end

#preload_persisted_environmentsObject

This batch loads the associated environments of multiple actions (builds) that can’t use ‘preload` due to the indirect relationship.



61
62
63
64
# File 'lib/gitlab/ci/pipeline/preloader.rb', line 61

def preload_persisted_environments
  @pipeline.scheduled_actions.each { |action| action.persisted_environment }
  @pipeline.manual_actions.each { |action| action.persisted_environment }
end

#preload_pipeline_warningsObject



45
46
47
48
49
50
# File 'lib/gitlab/ci/pipeline/preloader.rb', line 45

def preload_pipeline_warnings
  # This preloads the number of warnings for every pipeline, ensuring
  # that Ci::Pipeline#has_warnings? doesn't execute any additional
  # queries.
  @pipeline.number_of_warnings
end

#preload_ref_commitsObject

This preloads latest commits for given refs and therefore makes it much less expensive to check if a pipeline is a latest one for given branch.



41
42
43
# File 'lib/gitlab/ci/pipeline/preloader.rb', line 41

def preload_ref_commits
  @pipeline.lazy_ref_commit
end

#preload_stages_warningsObject

This preloads the number of warnings for every stage, ensuring that Ci::Stage#has_warnings? doesn’t execute any additional queries.



55
56
57
# File 'lib/gitlab/ci/pipeline/preloader.rb', line 55

def preload_stages_warnings
  @pipeline.stages.each { |stage| stage.number_of_warnings }
end