From 6c704fd99e1fd5a86dd2eccc8b192a009546cc96 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Sat, 6 Aug 2016 16:45:02 +0200 Subject: Inject dependencies into each CI config entry node --- lib/gitlab/ci/config/node/configurable.rb | 2 +- lib/gitlab/ci/config/node/entry.rb | 11 +++++++---- lib/gitlab/ci/config/node/global.rb | 6 +++++- lib/gitlab/ci/config/node/job.rb | 2 +- lib/gitlab/ci/config/node/jobs.rb | 2 +- 5 files changed, 15 insertions(+), 8 deletions(-) (limited to 'lib') diff --git a/lib/gitlab/ci/config/node/configurable.rb b/lib/gitlab/ci/config/node/configurable.rb index 2de82d40c9d..fb3604edac2 100644 --- a/lib/gitlab/ci/config/node/configurable.rb +++ b/lib/gitlab/ci/config/node/configurable.rb @@ -25,7 +25,7 @@ module Gitlab private - def compose! + def compose!(_deps) self.class.nodes.each do |key, factory| factory .value(@config[key]) diff --git a/lib/gitlab/ci/config/node/entry.rb b/lib/gitlab/ci/config/node/entry.rb index 0c782c422b5..40ffa85d6da 100644 --- a/lib/gitlab/ci/config/node/entry.rb +++ b/lib/gitlab/ci/config/node/entry.rb @@ -20,11 +20,14 @@ module Gitlab @validator.validate(:new) end - def process! + def process!(deps = nil) return unless valid? - compose! - descendants.each(&:process!) + compose!(deps) + + descendants.each do |entry| + entry.process!(deps) + end end def leaf? @@ -76,7 +79,7 @@ module Gitlab private - def compose! + def compose!(_deps) end end end diff --git a/lib/gitlab/ci/config/node/global.rb b/lib/gitlab/ci/config/node/global.rb index ccd539fb003..4d65309cf44 100644 --- a/lib/gitlab/ci/config/node/global.rb +++ b/lib/gitlab/ci/config/node/global.rb @@ -36,9 +36,13 @@ module Gitlab helpers :before_script, :image, :services, :after_script, :variables, :stages, :types, :cache, :jobs + def process!(_deps = nil) + super(self) + end + private - def compose! + def compose!(_deps) super compose_jobs! diff --git a/lib/gitlab/ci/config/node/job.rb b/lib/gitlab/ci/config/node/job.rb index e84737acbb9..55f34b446e5 100644 --- a/lib/gitlab/ci/config/node/job.rb +++ b/lib/gitlab/ci/config/node/job.rb @@ -107,7 +107,7 @@ module Gitlab after_script: after_script } end - def compose! + def compose!(_deps) super if type_defined? && !stage_defined? diff --git a/lib/gitlab/ci/config/node/jobs.rb b/lib/gitlab/ci/config/node/jobs.rb index 51683c82ceb..a2a8554ed19 100644 --- a/lib/gitlab/ci/config/node/jobs.rb +++ b/lib/gitlab/ci/config/node/jobs.rb @@ -28,7 +28,7 @@ module Gitlab private - def compose! + def compose!(_deps) @config.each do |name, config| node = hidden?(name) ? Node::HiddenJob : Node::Job -- cgit v1.2.1 From 700078e8e43626a9be4fd752e35cd27ac526b410 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Sat, 6 Aug 2016 17:12:59 +0200 Subject: Rename unspecified and undefined CI config nodes --- lib/gitlab/ci/config/node/factory.rb | 8 ++++---- lib/gitlab/ci/config/node/null.rb | 34 -------------------------------- lib/gitlab/ci/config/node/undefined.rb | 27 +++++++++++++++++++++---- lib/gitlab/ci/config/node/unspecified.rb | 19 ++++++++++++++++++ 4 files changed, 46 insertions(+), 42 deletions(-) delete mode 100644 lib/gitlab/ci/config/node/null.rb create mode 100644 lib/gitlab/ci/config/node/unspecified.rb (limited to 'lib') diff --git a/lib/gitlab/ci/config/node/factory.rb b/lib/gitlab/ci/config/node/factory.rb index 707b052e6a8..5387f29ad59 100644 --- a/lib/gitlab/ci/config/node/factory.rb +++ b/lib/gitlab/ci/config/node/factory.rb @@ -37,8 +37,8 @@ module Gitlab # See issue #18775. # if @value.nil? - Node::Undefined.new( - fabricate_undefined + Node::Unspecified.new( + fabricate_unspecified ) else fabricate(@node, @value) @@ -47,13 +47,13 @@ module Gitlab private - def fabricate_undefined + def fabricate_unspecified ## # If node has a default value we fabricate concrete node # with default value. # if @node.default.nil? - fabricate(Node::Null) + fabricate(Node::Undefined) else fabricate(@node, @node.default) end diff --git a/lib/gitlab/ci/config/node/null.rb b/lib/gitlab/ci/config/node/null.rb deleted file mode 100644 index 88a5f53f13c..00000000000 --- a/lib/gitlab/ci/config/node/null.rb +++ /dev/null @@ -1,34 +0,0 @@ -module Gitlab - module Ci - class Config - module Node - ## - # This class represents an undefined node. - # - # Implements the Null Object pattern. - # - class Null < Entry - def value - nil - end - - def valid? - true - end - - def errors - [] - end - - def specified? - false - end - - def relevant? - false - end - end - end - end - end -end diff --git a/lib/gitlab/ci/config/node/undefined.rb b/lib/gitlab/ci/config/node/undefined.rb index 45fef8c3ae5..33e78023539 100644 --- a/lib/gitlab/ci/config/node/undefined.rb +++ b/lib/gitlab/ci/config/node/undefined.rb @@ -3,15 +3,34 @@ module Gitlab class Config module Node ## - # This class represents an unspecified entry node. + # This class represents an undefined node. # - # It decorates original entry adding method that indicates it is - # unspecified. + # Implements the Null Object pattern. # - class Undefined < SimpleDelegator + class Undefined < Entry + def initialize(*) + super(nil) + end + + def value + nil + end + + def valid? + true + end + + def errors + [] + end + def specified? false end + + def relevant? + false + end end end end diff --git a/lib/gitlab/ci/config/node/unspecified.rb b/lib/gitlab/ci/config/node/unspecified.rb new file mode 100644 index 00000000000..a7d1f6131b8 --- /dev/null +++ b/lib/gitlab/ci/config/node/unspecified.rb @@ -0,0 +1,19 @@ +module Gitlab + module Ci + class Config + module Node + ## + # This class represents an unspecified entry node. + # + # It decorates original entry adding method that indicates it is + # unspecified. + # + class Unspecified < SimpleDelegator + def specified? + false + end + end + end + end + end +end -- cgit v1.2.1 From eaf211c2e393a2eeb5999b9ffec17112cdd52a0c Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Thu, 25 Aug 2016 13:49:15 +0200 Subject: Expose compose method in the ci config entry nodes --- lib/gitlab/ci/config.rb | 2 +- lib/gitlab/ci/config/node/configurable.rb | 10 ++++++++-- lib/gitlab/ci/config/node/entry.rb | 17 +++++++---------- lib/gitlab/ci/config/node/global.rb | 14 +++++--------- lib/gitlab/ci/config/node/job.rb | 20 ++++++++++---------- lib/gitlab/ci/config/node/jobs.rb | 28 ++++++++++++++++------------ 6 files changed, 47 insertions(+), 44 deletions(-) (limited to 'lib') diff --git a/lib/gitlab/ci/config.rb b/lib/gitlab/ci/config.rb index ae82c0db3f1..bbfa6cf7d05 100644 --- a/lib/gitlab/ci/config.rb +++ b/lib/gitlab/ci/config.rb @@ -14,7 +14,7 @@ module Gitlab @config = Loader.new(config).load! @global = Node::Global.new(@config) - @global.process! + @global.compose! end def valid? diff --git a/lib/gitlab/ci/config/node/configurable.rb b/lib/gitlab/ci/config/node/configurable.rb index fb3604edac2..530f95a6251 100644 --- a/lib/gitlab/ci/config/node/configurable.rb +++ b/lib/gitlab/ci/config/node/configurable.rb @@ -23,9 +23,9 @@ module Gitlab end end - private + def compose!(deps) + return unless valid? - def compose!(_deps) self.class.nodes.each do |key, factory| factory .value(@config[key]) @@ -33,6 +33,12 @@ module Gitlab @entries[key] = factory.create! end + + yield if block_given? + + @entries.each_value do |entry| + entry.compose!(deps) + end end class_methods do diff --git a/lib/gitlab/ci/config/node/entry.rb b/lib/gitlab/ci/config/node/entry.rb index 40ffa85d6da..e02f4bf0a05 100644 --- a/lib/gitlab/ci/config/node/entry.rb +++ b/lib/gitlab/ci/config/node/entry.rb @@ -20,14 +20,16 @@ module Gitlab @validator.validate(:new) end + # Temporary method + # def process!(deps = nil) - return unless valid? - compose!(deps) + end - descendants.each do |entry| - entry.process!(deps) - end + def compose!(deps = nil) + return unless valid? + + yield if block_given? end def leaf? @@ -76,11 +78,6 @@ module Gitlab def self.validator Validator end - - private - - def compose!(_deps) - end end end end diff --git a/lib/gitlab/ci/config/node/global.rb b/lib/gitlab/ci/config/node/global.rb index 4d65309cf44..2a2943c9288 100644 --- a/lib/gitlab/ci/config/node/global.rb +++ b/lib/gitlab/ci/config/node/global.rb @@ -36,19 +36,15 @@ module Gitlab helpers :before_script, :image, :services, :after_script, :variables, :stages, :types, :cache, :jobs - def process!(_deps = nil) - super(self) + def compose!(_deps = nil) + super(self) do + compose_jobs! + compose_deprecated_entries! + end end private - def compose!(_deps) - super - - compose_jobs! - compose_deprecated_entries! - end - def compose_jobs! factory = Node::Factory.new(Node::Jobs) .value(@config.except(*self.class.nodes.keys)) diff --git a/lib/gitlab/ci/config/node/job.rb b/lib/gitlab/ci/config/node/job.rb index 55f34b446e5..9317bb40f50 100644 --- a/lib/gitlab/ci/config/node/job.rb +++ b/lib/gitlab/ci/config/node/job.rb @@ -82,6 +82,16 @@ module Gitlab :cache, :image, :services, :only, :except, :variables, :artifacts + def compose!(deps) + super do + if type_defined? && !stage_defined? + @entries[:stage] = @entries[:type] + end + + @entries.delete(:type) + end + end + def name @metadata[:name] end @@ -106,16 +116,6 @@ module Gitlab artifacts: artifacts, after_script: after_script } end - - def compose!(_deps) - super - - if type_defined? && !stage_defined? - @entries[:stage] = @entries[:type] - end - - @entries.delete(:type) - end end end end diff --git a/lib/gitlab/ci/config/node/jobs.rb b/lib/gitlab/ci/config/node/jobs.rb index a2a8554ed19..45865825e46 100644 --- a/lib/gitlab/ci/config/node/jobs.rb +++ b/lib/gitlab/ci/config/node/jobs.rb @@ -26,19 +26,23 @@ module Gitlab name.to_s.start_with?('.') end - private - - def compose!(_deps) - @config.each do |name, config| - node = hidden?(name) ? Node::HiddenJob : Node::Job - - factory = Node::Factory.new(node) - .value(config || {}) - .metadata(name: name) - .with(key: name, parent: self, - description: "#{name} job definition.") + def compose!(deps = nil) + super do + @config.each do |name, config| + node = hidden?(name) ? Node::HiddenJob : Node::Job + + factory = Node::Factory.new(node) + .value(config || {}) + .metadata(name: name) + .with(key: name, parent: self, + description: "#{name} job definition.") + + @entries[name] = factory.create! + end - @entries[name] = factory.create! + @entries.each_value do |entry| + entry.compose!(deps) + end end end end -- cgit v1.2.1 From 4f837f6690970bde315b8c9d76190ed45f15e49e Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Thu, 25 Aug 2016 13:58:46 +0200 Subject: Remove temporary stub method from ci config nodes --- lib/gitlab/ci/config/node/configurable.rb | 2 +- lib/gitlab/ci/config/node/entry.rb | 6 ------ lib/gitlab/ci/config/node/job.rb | 2 +- 3 files changed, 2 insertions(+), 8 deletions(-) (limited to 'lib') diff --git a/lib/gitlab/ci/config/node/configurable.rb b/lib/gitlab/ci/config/node/configurable.rb index 530f95a6251..6b7ab2fdaf2 100644 --- a/lib/gitlab/ci/config/node/configurable.rb +++ b/lib/gitlab/ci/config/node/configurable.rb @@ -23,7 +23,7 @@ module Gitlab end end - def compose!(deps) + def compose!(deps = nil) return unless valid? self.class.nodes.each do |key, factory| diff --git a/lib/gitlab/ci/config/node/entry.rb b/lib/gitlab/ci/config/node/entry.rb index e02f4bf0a05..907d25a8c49 100644 --- a/lib/gitlab/ci/config/node/entry.rb +++ b/lib/gitlab/ci/config/node/entry.rb @@ -20,12 +20,6 @@ module Gitlab @validator.validate(:new) end - # Temporary method - # - def process!(deps = nil) - compose!(deps) - end - def compose!(deps = nil) return unless valid? diff --git a/lib/gitlab/ci/config/node/job.rb b/lib/gitlab/ci/config/node/job.rb index 9317bb40f50..3e6666d751f 100644 --- a/lib/gitlab/ci/config/node/job.rb +++ b/lib/gitlab/ci/config/node/job.rb @@ -82,7 +82,7 @@ module Gitlab :cache, :image, :services, :only, :except, :variables, :artifacts - def compose!(deps) + def compose!(deps = nil) super do if type_defined? && !stage_defined? @entries[:stage] = @entries[:type] -- cgit v1.2.1 From 30f58cf3924610564ca95b0ac17b69d272e74f5f Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Thu, 25 Aug 2016 14:31:06 +0200 Subject: Add [] method for accessing ci entry dependencies --- lib/gitlab/ci/config/node/entry.rb | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'lib') diff --git a/lib/gitlab/ci/config/node/entry.rb b/lib/gitlab/ci/config/node/entry.rb index 907d25a8c49..8717eabf81e 100644 --- a/lib/gitlab/ci/config/node/entry.rb +++ b/lib/gitlab/ci/config/node/entry.rb @@ -20,6 +20,10 @@ module Gitlab @validator.validate(:new) end + def [](key) + @entries[key] || Node::Undefined.new + end + def compose!(deps = nil) return unless valid? -- cgit v1.2.1 From 62f704c5ad421a538257917d75f68b3c698b9be0 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Mon, 29 Aug 2016 12:44:14 +0200 Subject: Make it possible to inherit global ci config nodes --- lib/gitlab/ci/config/node/job.rb | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'lib') diff --git a/lib/gitlab/ci/config/node/job.rb b/lib/gitlab/ci/config/node/job.rb index 3e6666d751f..745f03ae4d5 100644 --- a/lib/gitlab/ci/config/node/job.rb +++ b/lib/gitlab/ci/config/node/job.rb @@ -90,6 +90,8 @@ module Gitlab @entries.delete(:type) end + + inherit!(deps) end def name @@ -102,6 +104,19 @@ module Gitlab private + def inherit!(deps) + return unless deps + + self.class.nodes.each_key do |key| + global_entry = deps[key] + job_entry = @entries[key] + + if global_entry.specified? && !job_entry.specified? + @entries[key] = global_entry + end + end + end + def to_hash { name: name, before_script: before_script, -- cgit v1.2.1 From bd807503d14f2592e2c89c361c6967866580e977 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Mon, 29 Aug 2016 13:10:57 +0200 Subject: Do not override job nodes in legacy ci config code --- lib/ci/gitlab_ci_yaml_processor.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'lib') diff --git a/lib/ci/gitlab_ci_yaml_processor.rb b/lib/ci/gitlab_ci_yaml_processor.rb index 47efd5bd9f2..5f1ba97214e 100644 --- a/lib/ci/gitlab_ci_yaml_processor.rb +++ b/lib/ci/gitlab_ci_yaml_processor.rb @@ -60,7 +60,7 @@ module Ci # - before script behaves differently than after script # - after script returns an array of commands # - before script should be a concatenated command - commands: [job[:before_script] || @before_script, job[:script]].flatten.compact.join("\n"), + commands: [job[:before_script], job[:script]].flatten.compact.join("\n"), tag_list: job[:tags] || [], name: job[:name].to_s, allow_failure: job[:allow_failure] || false, @@ -68,12 +68,12 @@ module Ci environment: job[:environment], yaml_variables: yaml_variables(name), options: { - image: job[:image] || @image, - services: job[:services] || @services, + image: job[:image], + services: job[:services], artifacts: job[:artifacts], - cache: job[:cache] || @cache, + cache: job[:cache], dependencies: job[:dependencies], - after_script: job[:after_script] || @after_script, + after_script: job[:after_script], }.compact } end -- cgit v1.2.1 From 1255205d896d070a6d8bcefa3774116263db84be Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Mon, 29 Aug 2016 13:11:35 +0200 Subject: Add method that returns commands for ci job entry --- lib/ci/gitlab_ci_yaml_processor.rb | 7 +------ lib/gitlab/ci/config/node/job.rb | 7 ++++++- 2 files changed, 7 insertions(+), 7 deletions(-) (limited to 'lib') diff --git a/lib/ci/gitlab_ci_yaml_processor.rb b/lib/ci/gitlab_ci_yaml_processor.rb index 5f1ba97214e..c00c2020b4f 100644 --- a/lib/ci/gitlab_ci_yaml_processor.rb +++ b/lib/ci/gitlab_ci_yaml_processor.rb @@ -55,12 +55,7 @@ module Ci { stage_idx: @stages.index(job[:stage]), stage: job[:stage], - ## - # Refactoring note: - # - before script behaves differently than after script - # - after script returns an array of commands - # - before script should be a concatenated command - commands: [job[:before_script], job[:script]].flatten.compact.join("\n"), + commands: job[:commands], tag_list: job[:tags] || [], name: job[:name].to_s, allow_failure: job[:allow_failure] || false, diff --git a/lib/gitlab/ci/config/node/job.rb b/lib/gitlab/ci/config/node/job.rb index 745f03ae4d5..0cbdf7619c0 100644 --- a/lib/gitlab/ci/config/node/job.rb +++ b/lib/gitlab/ci/config/node/job.rb @@ -80,7 +80,7 @@ module Gitlab helpers :before_script, :script, :stage, :type, :after_script, :cache, :image, :services, :only, :except, :variables, - :artifacts + :artifacts, :commands def compose!(deps = nil) super do @@ -102,6 +102,10 @@ module Gitlab @config.merge(to_hash.compact) end + def commands + (before_script_value.to_a + script_value.to_a).join("\n") + end + private def inherit!(deps) @@ -121,6 +125,7 @@ module Gitlab { name: name, before_script: before_script, script: script, + commands: commands, image: image, services: services, stage: stage, -- cgit v1.2.1