diff options
author | Kamil Trzcinski <ayufan@ayufan.eu> | 2015-06-30 11:59:44 +0200 |
---|---|---|
committer | Kamil Trzcinski <ayufan@ayufan.eu> | 2015-06-30 12:48:48 +0200 |
commit | 1a733c84e76a1fdfc919c9ea779300eded1d1551 (patch) | |
tree | 71e231642cd0809953528f0460bc39e0c1562177 | |
parent | a7cbd3ad4245642c1aa4ae07e0b23aa39f59a8b8 (diff) | |
download | gitlab-ci-1a733c84e76a1fdfc919c9ea779300eded1d1551.tar.gz |
Enhance YAML validation
-rw-r--r-- | lib/gitlab_ci_yaml_processor.rb | 62 | ||||
-rw-r--r-- | spec/lib/gitlab_ci_yaml_processor_spec.rb | 11 |
2 files changed, 36 insertions, 37 deletions
diff --git a/lib/gitlab_ci_yaml_processor.rb b/lib/gitlab_ci_yaml_processor.rb index 46093d6..20cfef0 100644 --- a/lib/gitlab_ci_yaml_processor.rb +++ b/lib/gitlab_ci_yaml_processor.rb @@ -28,7 +28,7 @@ class GitlabCiYamlProcessor def builds @jobs.map do |name, job| { - script: "#{@before_script.join("\n")}\n#{normilize_script(job[:script])}", + script: "#{@before_script.join("\n")}\n#{normalize_script(job[:script])}", tags: job[:tags] || [], name: name, only: job[:only], @@ -40,7 +40,7 @@ class GitlabCiYamlProcessor def deploy_builds @deploy_jobs.map do |name, job| { - script: "#{@before_script.join("\n")}\n#{normilize_script(job[:script])}", + script: "#{@before_script.join("\n")}\n#{normalize_script(job[:script])}", tags: job[:tags] || [], name: name, only: job[:only], @@ -55,7 +55,11 @@ class GitlabCiYamlProcessor @before_script = @config[:before_script] || [] @config.delete(:before_script) - unless @config.is_a?(Hash) && !@config.values.any?{|job| !job.is_a?(Hash)} + @config.each do |name, param| + raise ValidationError, "Unknown parameter: #{name}" unless param.is_a?(Hash) + end + + unless @config.values.any?{|job| job.is_a?(Hash)} raise ValidationError, "Please define at least one job" end @@ -91,7 +95,7 @@ class GitlabCiYamlProcessor end end - def normilize_script(script) + def normalize_script(script) if script.is_a? Array script.join("\n") else @@ -105,45 +109,33 @@ class GitlabCiYamlProcessor end @jobs.each do |name, job| - job.keys.each do |key| - unless [:tags, :script, :only, :except, :type].include? key - raise ValidationError, "#{name} job: unknow parameter #{key}" - end - end + validate_job!("#{name} job", job) + end - if job[:tags] && !job[:tags].is_a?(Array) - raise ValidationError, "#{name} job: tags parameter should be an array" - end + @deploy_jobs.each do |name, job| + validate_job!("#{name} deploy job", job) + end - if job[:only] && !job[:only].is_a?(Array) - raise ValidationError, "#{name} job: only parameter should be an array" - end + true + end - if job[:except] && !job[:except].is_a?(Array) - raise ValidationError, "#{name} job: except parameter should be an array" + def validate_job!(name, job) + job.keys.each do |key| + unless [:tags, :script, :only, :except, :type].include? key + raise ValidationError, "#{name}: unknown parameter #{key}" end end - @deploy_jobs.each do |name, job| - job.keys.each do |key| - unless [:tags, :script, :only, :except, :type].include? key - raise ValidationError, "#{name} job: unknow parameter #{key}" - end - end - - if job[:tags] && !job[:tags].is_a?(Array) - raise ValidationError, "#{name} deploy job: tags parameter should be an array" - end - - if job[:only] && !job[:only].is_a?(Array) - raise ValidationError, "#{name} deploy job: only parameter should be an array" - end + if job[:tags] && !job[:tags].is_a?(Array) + raise ValidationError, "#{name}: tags parameter should be an array" + end - if job[:except] && !job[:except].is_a?(Array) - raise ValidationError, "#{name} deploy job: except parameter should be an array" - end + if job[:only] && !job[:only].is_a?(Array) + raise ValidationError, "#{name}: only parameter should be an array" end - true + if job[:except] && !job[:except].is_a?(Array) + raise ValidationError, "#{name}: except parameter should be an array" + end end end diff --git a/spec/lib/gitlab_ci_yaml_processor_spec.rb b/spec/lib/gitlab_ci_yaml_processor_spec.rb index 34a71f9..465ee9e 100644 --- a/spec/lib/gitlab_ci_yaml_processor_spec.rb +++ b/spec/lib/gitlab_ci_yaml_processor_spec.rb @@ -143,14 +143,21 @@ describe GitlabCiYamlProcessor do end it "returns errors if before_script parameter is invalid" do - config = YAML.dump({before_script: "bundle update"}) + config = YAML.dump({before_script: "bundle update", rspec: {script: "test"}}) expect do GitlabCiYamlProcessor.new(config) end.to raise_error(GitlabCiYamlProcessor::ValidationError, "before_script should be an array") end + it "returns errors if there are unknown parameters" do + config = YAML.dump({extra: "bundle update"}) + expect do + GitlabCiYamlProcessor.new(config) + end.to raise_error(GitlabCiYamlProcessor::ValidationError, "Unknown parameter: extra") + end + it "returns errors if there is no any jobs defined" do - config = YAML.dump({test: "bundle update"}) + config = YAML.dump({before_script: ["bundle update"]}) expect do GitlabCiYamlProcessor.new(config) end.to raise_error(GitlabCiYamlProcessor::ValidationError, "Please define at least one job") |