diff options
Diffstat (limited to 'lib/gitlab/ci/config/entry/jobs.rb')
-rw-r--r-- | lib/gitlab/ci/config/entry/jobs.rb | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/lib/gitlab/ci/config/entry/jobs.rb b/lib/gitlab/ci/config/entry/jobs.rb new file mode 100644 index 00000000000..5671a09480b --- /dev/null +++ b/lib/gitlab/ci/config/entry/jobs.rb @@ -0,0 +1,52 @@ +module Gitlab + module Ci + class Config + module Entry + ## + # Entry that represents a set of jobs. + # + class Jobs < Node + include Validatable + + validations do + validates :config, type: Hash + + validate do + unless has_visible_job? + errors.add(:config, 'should contain at least one visible job') + end + end + + def has_visible_job? + config.any? { |name, _| !hidden?(name) } + end + end + + def hidden?(name) + name.to_s.start_with?('.') + end + + def compose!(deps = nil) + super do + @config.each do |name, config| + node = hidden?(name) ? Entry::Hidden : Entry::Job + + factory = Entry::Factory.new(node) + .value(config || {}) + .metadata(name: name) + .with(key: name, parent: self, + description: "#{name} job definition.") + + @entries[name] = factory.create! + end + + @entries.each_value do |entry| + entry.compose!(deps) + end + end + end + end + end + end + end +end |