abceda6cc5
It keeps track of the memory being used when loading the YAML file as well as the depth of nesting. Track exception when YAML is too big
84 lines
1.9 KiB
Ruby
84 lines
1.9 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Gitlab
|
|
module Ci
|
|
#
|
|
# Base GitLab CI Configuration facade
|
|
#
|
|
class Config
|
|
ConfigError = Class.new(StandardError)
|
|
|
|
RESCUE_ERRORS = [
|
|
Gitlab::Config::Loader::FormatError,
|
|
Extendable::ExtensionError,
|
|
External::Processor::IncludeError
|
|
].freeze
|
|
|
|
attr_reader :root
|
|
|
|
def initialize(config, project: nil, sha: nil, user: nil)
|
|
@config = Config::Extendable
|
|
.new(build_config(config, project: project, sha: sha, user: user))
|
|
.to_hash
|
|
|
|
@root = Entry::Root.new(@config)
|
|
@root.compose!
|
|
|
|
rescue Gitlab::Config::Loader::Yaml::DataTooLargeError => e
|
|
Gitlab::Sentry.track_exception(e, extra: { user: user.inspect, project: project.inspect })
|
|
raise Config::ConfigError, e.message
|
|
|
|
rescue *rescue_errors => e
|
|
raise Config::ConfigError, e.message
|
|
end
|
|
|
|
def valid?
|
|
@root.valid?
|
|
end
|
|
|
|
def errors
|
|
@root.errors
|
|
end
|
|
|
|
def to_hash
|
|
@config
|
|
end
|
|
|
|
##
|
|
# Temporary method that should be removed after refactoring
|
|
#
|
|
def variables
|
|
root.variables_value
|
|
end
|
|
|
|
def stages
|
|
root.stages_value
|
|
end
|
|
|
|
def jobs
|
|
root.jobs_value
|
|
end
|
|
|
|
private
|
|
|
|
def build_config(config, project:, sha:, user:)
|
|
initial_config = Gitlab::Config::Loader::Yaml.new(config).load!
|
|
|
|
process_external_files(initial_config, project: project, sha: sha, user: user)
|
|
end
|
|
|
|
def process_external_files(config, project:, sha:, user:)
|
|
Config::External::Processor.new(config,
|
|
project: project,
|
|
sha: sha || project&.repository&.root_ref_sha,
|
|
user: user,
|
|
expandset: Set.new).perform
|
|
end
|
|
|
|
# Overriden in EE
|
|
def rescue_errors
|
|
RESCUE_ERRORS
|
|
end
|
|
end
|
|
end
|
|
end
|