Class: Gitlab::Ci::Config

Inherits:
Object
  • Object
show all
Includes:
Utils::StrongMemoize
Defined in:
lib/gitlab/ci/config.rb,
lib/gitlab/ci/config/yaml.rb,
lib/gitlab/ci/config/entry/job.rb,
lib/gitlab/ci/config/entry/key.rb,
lib/gitlab/ci/config/yaml/tags.rb,
lib/gitlab/ci/config/entry/jobs.rb,
lib/gitlab/ci/config/entry/need.rb,
lib/gitlab/ci/config/entry/port.rb,
lib/gitlab/ci/config/entry/root.rb,
lib/gitlab/ci/config/entry/tags.rb,
lib/gitlab/ci/config/extendable.rb,
lib/gitlab/ci/config/normalizer.rb,
lib/gitlab/ci/config/entry/cache.rb,
lib/gitlab/ci/config/entry/files.rb,
lib/gitlab/ci/config/entry/hooks.rb,
lib/gitlab/ci/config/entry/image.rb,
lib/gitlab/ci/config/entry/needs.rb,
lib/gitlab/ci/config/entry/paths.rb,
lib/gitlab/ci/config/entry/ports.rb,
lib/gitlab/ci/config/entry/retry.rb,
lib/gitlab/ci/config/entry/rules.rb,
lib/gitlab/ci/config/entry/stage.rb,
lib/gitlab/ci/config/header/root.rb,
lib/gitlab/ci/config/header/spec.rb,
lib/gitlab/ci/config/yaml/loader.rb,
lib/gitlab/ci/config/yaml/result.rb,
lib/gitlab/ci/config/entry/bridge.rb,
lib/gitlab/ci/config/entry/caches.rb,
lib/gitlab/ci/config/entry/hidden.rb,
lib/gitlab/ci/config/entry/policy.rb,
lib/gitlab/ci/config/entry/prefix.rb,
lib/gitlab/ci/config/entry/stages.rb,
lib/gitlab/ci/config/header/input.rb,
lib/gitlab/ci/config/entry/default.rb,
lib/gitlab/ci/config/entry/include.rb,
lib/gitlab/ci/config/entry/inherit.rb,
lib/gitlab/ci/config/entry/publish.rb,
lib/gitlab/ci/config/entry/release.rb,
lib/gitlab/ci/config/entry/reports.rb,
lib/gitlab/ci/config/entry/service.rb,
lib/gitlab/ci/config/entry/timeout.rb,
lib/gitlab/ci/config/entry/trigger.rb,
lib/gitlab/ci/config/entry/commands.rb,
lib/gitlab/ci/config/entry/coverage.rb,
lib/gitlab/ci/config/entry/id_token.rb,
lib/gitlab/ci/config/entry/includes.rb,
lib/gitlab/ci/config/entry/services.rb,
lib/gitlab/ci/config/entry/variable.rb,
lib/gitlab/ci/config/entry/workflow.rb,
lib/gitlab/ci/config/external/rules.rb,
lib/gitlab/ci/config/yaml/tags/base.rb,
lib/gitlab/ci/config/entry/artifacts.rb,
lib/gitlab/ci/config/entry/imageable.rb,
lib/gitlab/ci/config/entry/variables.rb,
lib/gitlab/ci/config/external/mapper.rb,
lib/gitlab/ci/config/entry/kubernetes.rb,
lib/gitlab/ci/config/entry/rules/rule.rb,
lib/gitlab/ci/config/extendable/entry.rb,
lib/gitlab/ci/config/external/context.rb,
lib/gitlab/ci/config/entry/environment.rb,
lib/gitlab/ci/config/entry/processable.rb,
lib/gitlab/ci/config/entry/pull_policy.rb,
lib/gitlab/ci/config/external/file/base.rb,
lib/gitlab/ci/config/external/processor.rb,
lib/gitlab/ci/config/normalizer/factory.rb,
lib/gitlab/ci/config/yaml/tags/resolver.rb,
lib/gitlab/ci/config/entry/allow_failure.rb,
lib/gitlab/ci/config/entry/include/rules.rb,
lib/gitlab/ci/config/external/file/local.rb,
lib/gitlab/ci/config/interpolation/block.rb,
lib/gitlab/ci/config/yaml/tags/reference.rb,
lib/gitlab/ci/config/edge_stages_injector.rb,
lib/gitlab/ci/config/entry/product/matrix.rb,
lib/gitlab/ci/config/entry/release/assets.rb,
lib/gitlab/ci/config/external/file/remote.rb,
lib/gitlab/ci/config/external/mapper/base.rb,
lib/gitlab/ci/config/interpolation/access.rb,
lib/gitlab/ci/config/interpolation/config.rb,
lib/gitlab/ci/config/interpolation/inputs.rb,
lib/gitlab/ci/config/entry/inherit/default.rb,
lib/gitlab/ci/config/entry/trigger/forward.rb,
lib/gitlab/ci/config/external/file/project.rb,
lib/gitlab/ci/config/interpolation/context.rb,
lib/gitlab/ci/config/entry/product/parallel.rb,
lib/gitlab/ci/config/external/file/artifact.rb,
lib/gitlab/ci/config/external/file/template.rb,
lib/gitlab/ci/config/external/mapper/filter.rb,
lib/gitlab/ci/config/interpolation/template.rb,
lib/gitlab/ci/config/entry/inherit/variables.rb,
lib/gitlab/ci/config/entry/product/variables.rb,
lib/gitlab/ci/config/external/file/component.rb,
lib/gitlab/ci/config/external/mapper/matcher.rb,
lib/gitlab/ci/config/entry/include/rules/rule.rb,
lib/gitlab/ci/config/entry/rules/rule/changes.rb,
lib/gitlab/ci/config/external/mapper/verifier.rb,
lib/gitlab/ci/config/entry/release/assets/link.rb,
lib/gitlab/ci/config/entry/release/assets/links.rb,
lib/gitlab/ci/config/external/mapper/normalizer.rb,
lib/gitlab/ci/config/interpolation/interpolator.rb,
lib/gitlab/ci/config/normalizer/matrix_strategy.rb,
lib/gitlab/ci/config/normalizer/number_strategy.rb,
lib/gitlab/ci/config/interpolation/functions/base.rb,
lib/gitlab/ci/config/entry/reports/coverage_report.rb,
lib/gitlab/ci/config/interpolation/functions_stack.rb,
lib/gitlab/ci/config/interpolation/inputs/base_input.rb,
lib/gitlab/ci/config/interpolation/functions/truncate.rb,
lib/gitlab/ci/config/external/mapper/location_expander.rb,
lib/gitlab/ci/config/interpolation/inputs/number_input.rb,
lib/gitlab/ci/config/interpolation/inputs/string_input.rb,
lib/gitlab/ci/config/external/mapper/variables_expander.rb,
lib/gitlab/ci/config/interpolation/inputs/boolean_input.rb

Overview

Base GitLab CI Configuration facade

Defined Under Namespace

Modules: Entry, External, Header, Interpolation, Yaml Classes: EdgeStagesInjector, Extendable, Normalizer

Constant Summary collapse

ConfigError =
Class.new(StandardError)
TIMEOUT_SECONDS =
ENV.fetch('GITLAB_CI_CONFIG_FETCH_TIMEOUT_SECONDS', 30).to_i.clamp(0, 60).seconds
TIMEOUT_MESSAGE =
'Request timed out when fetching configuration files.'
RESCUE_ERRORS =
[
  Gitlab::Config::Loader::FormatError,
  Extendable::ExtensionError,
  External::Processor::IncludeError,
  Config::Yaml::Tags::TagError
].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(config, project: nil, pipeline: nil, sha: nil, user: nil, parent_pipeline: nil, source: nil, pipeline_config: nil, logger: nil) ⇒ Config

rubocop: disable Metrics/ParameterLists



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/gitlab/ci/config.rb', line 25

def initialize(config, project: nil, pipeline: nil, sha: nil, user: nil, parent_pipeline: nil, source: nil, pipeline_config: nil, logger: nil)
  @logger = logger || ::Gitlab::Ci::Pipeline::Logger.new(project: project)
  @source_ref_path = pipeline&.source_ref_path
  @project = project

  @context = self.logger.instrument(:config_build_context, once: true) do
    pipeline ||= ::Ci::Pipeline.new(project: project, sha: sha, user: user, source: source)
    build_context(project: project, pipeline: pipeline, sha: sha, user: user, parent_pipeline: parent_pipeline, pipeline_config: pipeline_config)
  end

  @context.set_deadline(TIMEOUT_SECONDS)

  @source = source

  @config = self.logger.instrument(:config_expand, once: true) do
    expand_config(config)
  end

  @root = self.logger.instrument(:config_root, once: true) do
    Entry::Root.new(@config, project: project, user: user, logger: self.logger)
  end

  self.logger.instrument(:config_root_compose, once: true) do
    @root.compose!
  end
rescue *rescue_errors => e
  raise Config::ConfigError, e.message
end

Instance Attribute Details

#contextObject (readonly)

Returns the value of attribute context.



22
23
24
# File 'lib/gitlab/ci/config.rb', line 22

def context
  @context
end

#loggerObject (readonly)

Returns the value of attribute logger.



22
23
24
# File 'lib/gitlab/ci/config.rb', line 22

def logger
  @logger
end

#rootObject (readonly)

Returns the value of attribute root.



22
23
24
# File 'lib/gitlab/ci/config.rb', line 22

def root
  @root
end

#sourceObject (readonly)

Returns the value of attribute source.



22
23
24
# File 'lib/gitlab/ci/config.rb', line 22

def source
  @source
end

#source_ref_pathObject (readonly)

Returns the value of attribute source_ref_path.



22
23
24
# File 'lib/gitlab/ci/config.rb', line 22

def source_ref_path
  @source_ref_path
end

Instance Method Details

#errorsObject



59
60
61
# File 'lib/gitlab/ci/config.rb', line 59

def errors
  @root.errors
end

#included_templatesObject



106
107
108
# File 'lib/gitlab/ci/config.rb', line 106

def included_templates
  @context.includes.filter_map { |i| i[:location] if i[:type] == :template }
end

#jobsObject



90
91
92
# File 'lib/gitlab/ci/config.rb', line 90

def jobs
  root.jobs_value
end

#metadataObject



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

def 
  {
    includes: @context.includes,
    merged_yaml: @config&.deep_stringify_keys&.to_yaml
  }
end

#normalized_jobsObject



102
103
104
# File 'lib/gitlab/ci/config.rb', line 102

def normalized_jobs
  @normalized_jobs ||= Ci::Config::Normalizer.new(jobs).normalize_jobs
end

#stagesObject



86
87
88
# File 'lib/gitlab/ci/config.rb', line 86

def stages
  root.stages_value
end

#to_hashObject



67
68
69
# File 'lib/gitlab/ci/config.rb', line 67

def to_hash
  @config
end

#valid?Boolean

rubocop: enable Metrics/ParameterLists

Returns:

  • (Boolean)


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

def valid?
  @root.valid?
end

#variablesObject

Temporary method that should be removed after refactoring



74
75
76
# File 'lib/gitlab/ci/config.rb', line 74

def variables
  root.variables_value
end

#variables_with_dataObject



78
79
80
# File 'lib/gitlab/ci/config.rb', line 78

def variables_with_data
  root.variables_entry.value_with_data
end

#variables_with_prefill_dataObject



82
83
84
# File 'lib/gitlab/ci/config.rb', line 82

def variables_with_prefill_data
  root.variables_entry.value_with_prefill_data
end

#warningsObject



63
64
65
# File 'lib/gitlab/ci/config.rb', line 63

def warnings
  @root.warnings
end

#workflow_nameObject



98
99
100
# File 'lib/gitlab/ci/config.rb', line 98

def workflow_name
  root.workflow_entry.name
end

#workflow_rulesObject



94
95
96
# File 'lib/gitlab/ci/config.rb', line 94

def workflow_rules
  root.workflow_entry.rules_value
end