Class: Gitlab::Ci::Config::External::Context

Inherits:
Object
  • Object
show all
Includes:
Utils::StrongMemoize
Defined in:
lib/gitlab/ci/config/external/context.rb

Constant Summary collapse

TimeoutError =
Class.new(StandardError)
MAX_PARALLEL_REMOTE_REQUESTS =

We try to keep the number of parallel HTTP requests to a minimum to avoid overloading IO.

4

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(project: nil, pipeline: nil, sha: nil, user: nil, parent_pipeline: nil, variables: nil, pipeline_config: nil, logger: nil, pipeline_policy_context: nil, component_data: nil) {|_self| ... } ⇒ Context

rubocop:disable Metrics/ParameterLists – all arguments needed

Yields:

  • (_self)

Yield Parameters:



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/gitlab/ci/config/external/context.rb', line 24

def initialize(
  project: nil, pipeline: nil, sha: nil, user: nil, parent_pipeline: nil, variables: nil,
  pipeline_config: nil, logger: nil, pipeline_policy_context: nil, component_data: nil
)
  @project = project
  @pipeline = pipeline
  @sha = sha
  @user = user
  @parent_pipeline = parent_pipeline
  @variables = variables || Ci::Variables::Collection.new
  @pipeline_config = pipeline_config
  @pipeline_policy_context = pipeline_policy_context
  @component_data = component_data || {}
  @expandset = []
  @parallel_requests = []
  @execution_deadline = 0
  @logger = logger || Gitlab::Ci::Pipeline::Logger.new(project: project)
  @max_includes = Gitlab::CurrentSettings.current_application_settings.ci_max_includes
  @max_total_yaml_size_bytes =
    Gitlab::CurrentSettings.current_application_settings.ci_max_total_yaml_size_bytes
  @total_file_size_in_bytes = 0
  yield self if block_given?
end

Instance Attribute Details

#component_dataObject

Returns the value of attribute component_data.



12
13
14
# File 'lib/gitlab/ci/config/external/context.rb', line 12

def component_data
  @component_data
end

#execution_deadlineObject

Returns the value of attribute execution_deadline.



12
13
14
# File 'lib/gitlab/ci/config/external/context.rb', line 12

def execution_deadline
  @execution_deadline
end

#expandsetObject

Returns the value of attribute expandset.



12
13
14
# File 'lib/gitlab/ci/config/external/context.rb', line 12

def expandset
  @expandset
end

#loggerObject

Returns the value of attribute logger.



12
13
14
# File 'lib/gitlab/ci/config/external/context.rb', line 12

def logger
  @logger
end

#max_includesObject

Returns the value of attribute max_includes.



12
13
14
# File 'lib/gitlab/ci/config/external/context.rb', line 12

def max_includes
  @max_includes
end

#max_total_yaml_size_bytesObject

Returns the value of attribute max_total_yaml_size_bytes.



12
13
14
# File 'lib/gitlab/ci/config/external/context.rb', line 12

def max_total_yaml_size_bytes
  @max_total_yaml_size_bytes
end

#parallel_requestsObject

Returns the value of attribute parallel_requests.



12
13
14
# File 'lib/gitlab/ci/config/external/context.rb', line 12

def parallel_requests
  @parallel_requests
end

#parent_pipelineObject (readonly)

Returns the value of attribute parent_pipeline.



12
13
14
# File 'lib/gitlab/ci/config/external/context.rb', line 12

def parent_pipeline
  @parent_pipeline
end

#pipelineObject

Returns the value of attribute pipeline.



12
13
14
# File 'lib/gitlab/ci/config/external/context.rb', line 12

def pipeline
  @pipeline
end

#pipeline_configObject (readonly)

Returns the value of attribute pipeline_config.



12
13
14
# File 'lib/gitlab/ci/config/external/context.rb', line 12

def pipeline_config
  @pipeline_config
end

#pipeline_policy_contextObject (readonly)

Returns the value of attribute pipeline_policy_context.



12
13
14
# File 'lib/gitlab/ci/config/external/context.rb', line 12

def pipeline_policy_context
  @pipeline_policy_context
end

#projectObject (readonly)

Returns the value of attribute project.



12
13
14
# File 'lib/gitlab/ci/config/external/context.rb', line 12

def project
  @project
end

#shaObject (readonly)

Returns the value of attribute sha.



12
13
14
# File 'lib/gitlab/ci/config/external/context.rb', line 12

def sha
  @sha
end

#total_file_size_in_bytesObject

Returns the value of attribute total_file_size_in_bytes.



16
17
18
# File 'lib/gitlab/ci/config/external/context.rb', line 16

def total_file_size_in_bytes
  @total_file_size_in_bytes
end

#userObject (readonly)

Returns the value of attribute user.



12
13
14
# File 'lib/gitlab/ci/config/external/context.rb', line 12

def user
  @user
end

#variablesObject (readonly)

Returns the value of attribute variables.



12
13
14
# File 'lib/gitlab/ci/config/external/context.rb', line 12

def variables
  @variables
end

Instance Method Details

#all_worktree_pathsObject



55
56
57
58
59
# File 'lib/gitlab/ci/config/external/context.rb', line 55

def all_worktree_paths
  strong_memoize(:all_worktree_paths) do
    project.repository.ls_files(sha)
  end
end

#check_execution_time!Object

Raises:



96
97
98
# File 'lib/gitlab/ci/config/external/context.rb', line 96

def check_execution_time!
  raise TimeoutError if execution_expired?
end

#execute_remote_parallel_request(lazy_response) ⇒ Object



100
101
102
103
104
105
106
107
108
# File 'lib/gitlab/ci/config/external/context.rb', line 100

def execute_remote_parallel_request(lazy_response)
  parallel_requests.delete_if(&:complete?)

  # We are "assuming" that the first request in the queue is the first one to complete.
  # This is good enough approximation.
  parallel_requests.first&.wait unless parallel_requests.size < MAX_PARALLEL_REMOTE_REQUESTS

  parallel_requests << lazy_response.execute
end

#includesObject



127
128
129
# File 'lib/gitlab/ci/config/external/context.rb', line 127

def includes
  expandset.map(&:metadata)
end

#internal_include?Boolean

Some Ci::ProjectConfig sources prepend the config content with an “internal” ‘include`, which becomes the first included file. When running a pipeline, we pass pipeline_config into the context of the first included file, which we use in this method to determine if the file is an “internal” one.

Returns:

  • (Boolean)


134
135
136
# File 'lib/gitlab/ci/config/external/context.rb', line 134

def internal_include?
  !!pipeline_config&.internal_include_prepended?
end

#mask_variables_from(string) ⇒ Object



117
118
119
120
121
122
123
124
125
# File 'lib/gitlab/ci/config/external/context.rb', line 117

def mask_variables_from(string)
  variables.reduce(string.dup) do |str, variable|
    if variable[:masked]
      Gitlab::Ci::MaskSecret.mask!(str, variable[:value])
    else
      str
    end
  end
end

#mutate(attrs = {}) ⇒ Object



79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/gitlab/ci/config/external/context.rb', line 79

def mutate(attrs = {})
  self.class.new(**attrs) do |ctx|
    ctx.pipeline = pipeline
    ctx.expandset = expandset
    ctx.execution_deadline = execution_deadline
    ctx.logger = logger
    ctx.max_includes = max_includes
    ctx.max_total_yaml_size_bytes = max_total_yaml_size_bytes
    ctx.parallel_requests = parallel_requests
    ctx.component_data = component_data
  end
end

#sentry_payloadObject



110
111
112
113
114
115
# File 'lib/gitlab/ci/config/external/context.rb', line 110

def sentry_payload
  {
    user: user.inspect,
    project: project.inspect
  }
end

#set_deadline(timeout_seconds) ⇒ Object



92
93
94
# File 'lib/gitlab/ci/config/external/context.rb', line 92

def set_deadline(timeout_seconds)
  @execution_deadline = current_monotonic_time + timeout_seconds.to_f
end

#top_level_worktree_pathsObject

rubocop:enable Metrics/ParameterLists



49
50
51
52
53
# File 'lib/gitlab/ci/config/external/context.rb', line 49

def top_level_worktree_paths
  strong_memoize(:top_level_worktree_paths) do
    project.repository.tree(sha).blobs.map(&:path)
  end
end

#variables_hashObject



61
62
63
64
65
# File 'lib/gitlab/ci/config/external/context.rb', line 61

def variables_hash
  strong_memoize(:variables_hash) do
    variables.to_hash
  end
end

#variables_hash_expandedObject



67
68
69
70
71
# File 'lib/gitlab/ci/config/external/context.rb', line 67

def variables_hash_expanded
  strong_memoize(:variables_hash_expanded) do
    variables_sorted_and_expanded.to_hash
  end
end

#variables_sorted_and_expandedObject



73
74
75
76
77
# File 'lib/gitlab/ci/config/external/context.rb', line 73

def variables_sorted_and_expanded
  strong_memoize(:variables_sorted_and_expanded) do
    variables.sort_and_expand_all
  end
end