53 lines
1.8 KiB
Ruby
53 lines
1.8 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
module Gitlab
|
||
|
module Ci
|
||
|
# Locates project CI config
|
||
|
class ProjectConfig
|
||
|
# The order of sources is important:
|
||
|
# - EE uses Compliance first since it must be used first if compliance templates are enabled.
|
||
|
# (see ee/lib/ee/gitlab/ci/project_config.rb)
|
||
|
# - Parameter is used by on-demand security scanning which passes the actual CI YAML to use as argument.
|
||
|
# - Bridge is used for downstream pipelines since the config is defined in the bridge job. If lower in priority,
|
||
|
# it would evaluate the project's YAML file instead.
|
||
|
# - Repository / ExternalProject / Remote: their order is not important between each other.
|
||
|
# - AutoDevops is used as default option if nothing else is found and if AutoDevops is enabled.
|
||
|
SOURCES = [
|
||
|
ProjectConfig::Parameter,
|
||
|
ProjectConfig::Bridge,
|
||
|
ProjectConfig::Repository,
|
||
|
ProjectConfig::ExternalProject,
|
||
|
ProjectConfig::Remote,
|
||
|
ProjectConfig::AutoDevops
|
||
|
].freeze
|
||
|
|
||
|
def initialize(project:, sha:, custom_content: nil, pipeline_source: nil, pipeline_source_bridge: nil)
|
||
|
@config = find_config(project, sha, custom_content, pipeline_source, pipeline_source_bridge)
|
||
|
end
|
||
|
|
||
|
delegate :content, :source, to: :@config, allow_nil: true
|
||
|
|
||
|
def exists?
|
||
|
!!@config&.exists?
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def find_config(project, sha, custom_content, pipeline_source, pipeline_source_bridge)
|
||
|
sources.each do |source|
|
||
|
config = source.new(project, sha, custom_content, pipeline_source, pipeline_source_bridge)
|
||
|
return config if config.exists?
|
||
|
end
|
||
|
|
||
|
nil
|
||
|
end
|
||
|
|
||
|
def sources
|
||
|
SOURCES
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
Gitlab::Ci::ProjectConfig.prepend_mod_with('Gitlab::Ci::ProjectConfig')
|