summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/api/entities.rb2
-rw-r--r--lib/gitlab_ci_yaml_processor.rb56
2 files changed, 40 insertions, 18 deletions
diff --git a/lib/api/entities.rb b/lib/api/entities.rb
index 2f6565a..2f7ca0f 100644
--- a/lib/api/entities.rb
+++ b/lib/api/entities.rb
@@ -13,7 +13,7 @@ module API
class Build < Grape::Entity
expose :id, :commands, :path, :ref, :sha, :project_id, :repo_url,
- :before_sha, :timeout, :allow_git_fetch, :project_name
+ :before_sha, :timeout, :allow_git_fetch, :project_name, :options
expose :variables, using: Variable
end
diff --git a/lib/gitlab_ci_yaml_processor.rb b/lib/gitlab_ci_yaml_processor.rb
index 20cfef0..00fceda 100644
--- a/lib/gitlab_ci_yaml_processor.rb
+++ b/lib/gitlab_ci_yaml_processor.rb
@@ -1,7 +1,7 @@
class GitlabCiYamlProcessor
class ValidationError < StandardError;end
- attr_reader :before_script
+ attr_reader :before_script, :image, :services
def initialize(config)
@config = YAML.load(config)
@@ -27,25 +27,13 @@ class GitlabCiYamlProcessor
def builds
@jobs.map do |name, job|
- {
- script: "#{@before_script.join("\n")}\n#{normalize_script(job[:script])}",
- tags: job[:tags] || [],
- name: name,
- only: job[:only],
- except: job[:except]
- }
+ build_job(name, job)
end
end
def deploy_builds
@deploy_jobs.map do |name, job|
- {
- script: "#{@before_script.join("\n")}\n#{normalize_script(job[:script])}",
- tags: job[:tags] || [],
- name: name,
- only: job[:only],
- except: job[:except]
- }
+ build_job(name, job)
end
end
@@ -53,7 +41,9 @@ class GitlabCiYamlProcessor
def initial_parsing
@before_script = @config[:before_script] || []
- @config.delete(:before_script)
+ @image = @config[:image]
+ @services = @config[:services]
+ @config.except!(:before_script, :image, :services)
@config.each do |name, param|
raise ValidationError, "Unknown parameter: #{name}" unless param.is_a?(Hash)
@@ -87,6 +77,20 @@ class GitlabCiYamlProcessor
end
end
+ def build_job(name, job)
+ {
+ script: "#{@before_script.join("\n")}\n#{normalize_script(job[:script])}",
+ tags: job[:tags] || [],
+ name: name,
+ only: job[:only],
+ except: job[:except],
+ options: {
+ image: job[:image] || @image,
+ services: job[:services] || @services
+ }.compact
+ }
+ end
+
def match_ref?(pattern, ref)
if pattern.first == "/" && pattern.last == "/"
Regexp.new(pattern[1...-1]) =~ ref
@@ -108,6 +112,14 @@ class GitlabCiYamlProcessor
raise ValidationError, "before_script should be an array"
end
+ unless @image.nil? || @image.is_a?(String)
+ raise ValidationError, "image should be a string"
+ end
+
+ unless @services.nil? || @services.is_a?(Array) && @services.all? {|service| service.is_a?(String)}
+ raise ValidationError, "services should be an array of strings"
+ end
+
@jobs.each do |name, job|
validate_job!("#{name} job", job)
end
@@ -121,11 +133,21 @@ class GitlabCiYamlProcessor
def validate_job!(name, job)
job.keys.each do |key|
- unless [:tags, :script, :only, :except, :type].include? key
+ unless [:tags, :script, :only, :except, :type, :image, :services].include? key
raise ValidationError, "#{name}: unknown parameter #{key}"
end
end
+ if job[:image] && !job[:image].is_a?(String)
+ raise ValidationError, "#{name}: image should be a string"
+ end
+
+ if job[:services]
+ unless job[:services].is_a?(Array) && job[:services].all? {|service| service.is_a?(String)}
+ raise ValidationError, "#{name}: services should be an array of strings"
+ end
+ end
+
if job[:tags] && !job[:tags].is_a?(Array)
raise ValidationError, "#{name}: tags parameter should be an array"
end