Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2019-12-05 21:07:51 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2019-12-05 21:07:51 +0300
commit6a7cc8c14727f6fac64a5be6838764d8d5d41468 (patch)
tree97c8a3c2f180d26f0f8f0baaa3230352b8ef1efb /lib/gitlab/ci
parent872319738757edc0483346c75a2407f7019b963f (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'lib/gitlab/ci')
-rw-r--r--lib/gitlab/ci/pipeline/chain/config/content.rb60
-rw-r--r--lib/gitlab/ci/pipeline/chain/config/content/auto_devops.rb28
-rw-r--r--lib/gitlab/ci/pipeline/chain/config/content/external_project.rb35
-rw-r--r--lib/gitlab/ci/pipeline/chain/config/content/legacy_auto_devops.rb28
-rw-r--r--lib/gitlab/ci/pipeline/chain/config/content/legacy_repository.rb31
-rw-r--r--lib/gitlab/ci/pipeline/chain/config/content/remote.rb27
-rw-r--r--lib/gitlab/ci/pipeline/chain/config/content/repository.rb38
-rw-r--r--lib/gitlab/ci/pipeline/chain/config/content/runtime.rb30
-rw-r--r--lib/gitlab/ci/pipeline/chain/config/content/source.rb46
9 files changed, 295 insertions, 28 deletions
diff --git a/lib/gitlab/ci/pipeline/chain/config/content.rb b/lib/gitlab/ci/pipeline/chain/config/content.rb
index a8cd99b8e92..d4b7444005e 100644
--- a/lib/gitlab/ci/pipeline/chain/config/content.rb
+++ b/lib/gitlab/ci/pipeline/chain/config/content.rb
@@ -8,21 +8,28 @@ module Gitlab
class Content < Chain::Base
include Chain::Helpers
- def perform!
- return if @command.config_content
-
- if content = content_from_repo
- @command.config_content = content
- @pipeline.config_source = :repository_source
- # TODO: we should persist ci_config_path
- # @pipeline.config_path = ci_config_path
- elsif content = content_from_auto_devops
- @command.config_content = content
- @pipeline.config_source = :auto_devops_source
- end
+ SOURCES = [
+ Gitlab::Ci::Pipeline::Chain::Config::Content::Runtime,
+ Gitlab::Ci::Pipeline::Chain::Config::Content::Repository,
+ Gitlab::Ci::Pipeline::Chain::Config::Content::ExternalProject,
+ Gitlab::Ci::Pipeline::Chain::Config::Content::Remote,
+ Gitlab::Ci::Pipeline::Chain::Config::Content::AutoDevops
+ ].freeze
+
+ LEGACY_SOURCES = [
+ Gitlab::Ci::Pipeline::Chain::Config::Content::Runtime,
+ Gitlab::Ci::Pipeline::Chain::Config::Content::LegacyRepository,
+ Gitlab::Ci::Pipeline::Chain::Config::Content::LegacyAutoDevops
+ ].freeze
- unless @command.config_content
- return error("Missing #{ci_config_path} file")
+ def perform!
+ if config = find_config
+ # TODO: we should persist config_content
+ # @pipeline.config_content = config.content
+ @command.config_content = config.content
+ @pipeline.config_source = config.source
+ else
+ error('Missing CI config file')
end
end
@@ -32,24 +39,21 @@ module Gitlab
private
- def content_from_repo
- return unless project
- return unless @pipeline.sha
- return unless ci_config_path
+ def find_config
+ sources.each do |source|
+ config = source.new(@pipeline, @command)
+ return config if config.exists?
+ end
- project.repository.gitlab_ci_yml_for(@pipeline.sha, ci_config_path)
- rescue GRPC::NotFound, GRPC::Internal
nil
end
- def content_from_auto_devops
- return unless project&.auto_devops_enabled?
-
- Gitlab::Template::GitlabCiYmlTemplate.find('Auto-DevOps').content
- end
-
- def ci_config_path
- project.ci_config_path.presence || '.gitlab-ci.yml'
+ def sources
+ if Feature.enabled?(:ci_root_config_content, @command.project, default_enabled: true)
+ SOURCES
+ else
+ LEGACY_SOURCES
+ end
end
end
end
diff --git a/lib/gitlab/ci/pipeline/chain/config/content/auto_devops.rb b/lib/gitlab/ci/pipeline/chain/config/content/auto_devops.rb
new file mode 100644
index 00000000000..e9bcc67de9c
--- /dev/null
+++ b/lib/gitlab/ci/pipeline/chain/config/content/auto_devops.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Ci
+ module Pipeline
+ module Chain
+ module Config
+ class Content
+ class AutoDevops < Source
+ def content
+ strong_memoize(:content) do
+ next unless project&.auto_devops_enabled?
+
+ template = Gitlab::Template::GitlabCiYmlTemplate.find('Auto-DevOps')
+ YAML.dump('include' => [{ 'template' => template.full_name }])
+ end
+ end
+
+ def source
+ :auto_devops_source
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/pipeline/chain/config/content/external_project.rb b/lib/gitlab/ci/pipeline/chain/config/content/external_project.rb
new file mode 100644
index 00000000000..8a19e433483
--- /dev/null
+++ b/lib/gitlab/ci/pipeline/chain/config/content/external_project.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Ci
+ module Pipeline
+ module Chain
+ module Config
+ class Content
+ class ExternalProject < Source
+ def content
+ strong_memoize(:content) do
+ next unless external_project_path?
+
+ path_file, path_project = ci_config_path.split('@', 2)
+ YAML.dump('include' => [{ 'project' => path_project, 'file' => path_file }])
+ end
+ end
+
+ def source
+ :external_project_source
+ end
+
+ private
+
+ # Example: path/to/.gitlab-ci.yml@another-group/another-project
+ def external_project_path?
+ ci_config_path =~ /\A.+(yml|yaml)@.+\z/
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/pipeline/chain/config/content/legacy_auto_devops.rb b/lib/gitlab/ci/pipeline/chain/config/content/legacy_auto_devops.rb
new file mode 100644
index 00000000000..c4cef356628
--- /dev/null
+++ b/lib/gitlab/ci/pipeline/chain/config/content/legacy_auto_devops.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Ci
+ module Pipeline
+ module Chain
+ module Config
+ class Content
+ class LegacyAutoDevops < Source
+ def content
+ strong_memoize(:content) do
+ next unless project&.auto_devops_enabled?
+
+ template = Gitlab::Template::GitlabCiYmlTemplate.find('Auto-DevOps')
+ template.content
+ end
+ end
+
+ def source
+ :auto_devops_source
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/pipeline/chain/config/content/legacy_repository.rb b/lib/gitlab/ci/pipeline/chain/config/content/legacy_repository.rb
new file mode 100644
index 00000000000..fa4a97c6880
--- /dev/null
+++ b/lib/gitlab/ci/pipeline/chain/config/content/legacy_repository.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Ci
+ module Pipeline
+ module Chain
+ module Config
+ class Content
+ class LegacyRepository < Source
+ def content
+ strong_memoize(:content) do
+ next unless project
+ next unless @pipeline.sha
+ next unless ci_config_path
+
+ project.repository.gitlab_ci_yml_for(@pipeline.sha, ci_config_path)
+ rescue GRPC::NotFound, GRPC::Internal
+ nil
+ end
+ end
+
+ def source
+ :repository_source
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/pipeline/chain/config/content/remote.rb b/lib/gitlab/ci/pipeline/chain/config/content/remote.rb
new file mode 100644
index 00000000000..dcc336b8929
--- /dev/null
+++ b/lib/gitlab/ci/pipeline/chain/config/content/remote.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Ci
+ module Pipeline
+ module Chain
+ module Config
+ class Content
+ class Remote < Source
+ def content
+ strong_memoize(:content) do
+ next unless ci_config_path =~ URI.regexp(%w[http https])
+
+ YAML.dump('include' => [{ 'remote' => ci_config_path }])
+ end
+ end
+
+ def source
+ :remote_source
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/pipeline/chain/config/content/repository.rb b/lib/gitlab/ci/pipeline/chain/config/content/repository.rb
new file mode 100644
index 00000000000..0752b099d3d
--- /dev/null
+++ b/lib/gitlab/ci/pipeline/chain/config/content/repository.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Ci
+ module Pipeline
+ module Chain
+ module Config
+ class Content
+ class Repository < Source
+ def content
+ strong_memoize(:content) do
+ next unless file_in_repository?
+
+ YAML.dump('include' => [{ 'local' => ci_config_path }])
+ end
+ end
+
+ def source
+ :repository_source
+ end
+
+ private
+
+ def file_in_repository?
+ return unless project
+ return unless @pipeline.sha
+
+ project.repository.gitlab_ci_yml_for(@pipeline.sha, ci_config_path).present?
+ rescue GRPC::NotFound, GRPC::Internal
+ nil
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/pipeline/chain/config/content/runtime.rb b/lib/gitlab/ci/pipeline/chain/config/content/runtime.rb
new file mode 100644
index 00000000000..4811d3d913d
--- /dev/null
+++ b/lib/gitlab/ci/pipeline/chain/config/content/runtime.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Ci
+ module Pipeline
+ module Chain
+ module Config
+ class Content
+ class Runtime < Source
+ def content
+ @command.config_content
+ end
+
+ def source
+ # The only case when this source is used is when the config content
+ # is passed in as parameter to Ci::CreatePipelineService.
+ # This would only occur with parent/child pipelines which is being
+ # implemented.
+ # TODO: change source to return :runtime_source
+ # https://gitlab.com/gitlab-org/gitlab/merge_requests/21041
+
+ nil
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/pipeline/chain/config/content/source.rb b/lib/gitlab/ci/pipeline/chain/config/content/source.rb
new file mode 100644
index 00000000000..3389187473b
--- /dev/null
+++ b/lib/gitlab/ci/pipeline/chain/config/content/source.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Ci
+ module Pipeline
+ module Chain
+ module Config
+ class Content
+ class Source
+ include Gitlab::Utils::StrongMemoize
+
+ DEFAULT_YAML_FILE = '.gitlab-ci.yml'
+
+ def initialize(pipeline, command)
+ @pipeline = pipeline
+ @command = command
+ end
+
+ def exists?
+ strong_memoize(:exists) do
+ content.present?
+ end
+ end
+
+ def content
+ raise NotImplementedError
+ end
+
+ def source
+ raise NotImplementedError
+ end
+
+ def project
+ @project ||= @pipeline.project
+ end
+
+ def ci_config_path
+ @ci_config_path ||= project.ci_config_path.presence || DEFAULT_YAML_FILE
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end