Commit 05ce8a11 authored by Grzegorz Bizon's avatar Grzegorz Bizon

Handle CI environment variables in a new CI config

parent 04ecfca3
...@@ -67,9 +67,9 @@ module Ci ...@@ -67,9 +67,9 @@ module Ci
@image = @ci_config.image @image = @ci_config.image
@after_script = @ci_config.after_script @after_script = @ci_config.after_script
@services = @ci_config.services @services = @ci_config.services
@variables = @ci_config.variables
@stages = @config[:stages] || @config[:types] @stages = @config[:stages] || @config[:types]
@variables = @config[:variables] || {}
@cache = @config[:cache] @cache = @config[:cache]
@jobs = {} @jobs = {}
...@@ -126,10 +126,6 @@ module Ci ...@@ -126,10 +126,6 @@ module Ci
raise ValidationError, "stages should be an array of strings" raise ValidationError, "stages should be an array of strings"
end end
unless @variables.nil? || validate_variables(@variables)
raise ValidationError, "variables should be a map of key-value strings"
end
validate_global_cache! if @cache validate_global_cache! if @cache
end end
......
...@@ -7,7 +7,8 @@ module Gitlab ...@@ -7,7 +7,8 @@ module Gitlab
## ##
# Temporary delegations that should be removed after refactoring # Temporary delegations that should be removed after refactoring
# #
delegate :before_script, :image, :services, :after_script, to: :@global delegate :before_script, :image, :services, :after_script, :variables,
to: :@global
def initialize(config) def initialize(config)
@config = Loader.new(config).load! @config = Loader.new(config).load!
......
...@@ -20,6 +20,9 @@ module Gitlab ...@@ -20,6 +20,9 @@ module Gitlab
allow_node :after_script, Script, allow_node :after_script, Script,
description: 'Script that will be executed after each job.' description: 'Script that will be executed after each job.'
allow_node :variables, Variables,
description: 'Environment variables that will be used.'
end end
end end
end end
......
...@@ -23,6 +23,16 @@ module Gitlab ...@@ -23,6 +23,16 @@ module Gitlab
end end
end end
end end
class VariablesValidator < ActiveModel::EachValidator
include LegacyValidationHelpers
def validate_each(record, attribute, value)
unless validate_variables(value)
record.errors.add(attribute, 'should be a hash of key value pairs')
end
end
end
end end
end end
end end
......
module Gitlab
module Ci
class Config
module Node
##
# Entry that represents environment variables.
#
class Variables < Entry
include Validatable
validations do
validates :value, variables: true
end
def value
@config || {}
end
end
end
end
end
end
...@@ -1098,14 +1098,14 @@ EOT ...@@ -1098,14 +1098,14 @@ EOT
config = YAML.dump({ variables: "test", rspec: { script: "test" } }) config = YAML.dump({ variables: "test", rspec: { script: "test" } })
expect do expect do
GitlabCiYamlProcessor.new(config, path) GitlabCiYamlProcessor.new(config, path)
end.to raise_error(GitlabCiYamlProcessor::ValidationError, "variables should be a map of key-value strings") end.to raise_error(GitlabCiYamlProcessor::ValidationError, "Variables value should be a hash of key value pairs")
end end
it "returns errors if variables is not a map of key-value strings" do it "returns errors if variables is not a map of key-value strings" do
config = YAML.dump({ variables: { test: false }, rspec: { script: "test" } }) config = YAML.dump({ variables: { test: false }, rspec: { script: "test" } })
expect do expect do
GitlabCiYamlProcessor.new(config, path) GitlabCiYamlProcessor.new(config, path)
end.to raise_error(GitlabCiYamlProcessor::ValidationError, "variables should be a map of key-value strings") end.to raise_error(GitlabCiYamlProcessor::ValidationError, "Variables value should be a hash of key value pairs")
end end
it "returns errors if job when is not on_success, on_failure or always" do it "returns errors if job when is not on_success, on_failure or always" do
......
...@@ -24,6 +24,7 @@ describe Gitlab::Ci::Config::Node::Global do ...@@ -24,6 +24,7 @@ describe Gitlab::Ci::Config::Node::Global do
{ before_script: ['ls', 'pwd'], { before_script: ['ls', 'pwd'],
image: 'ruby:2.2', image: 'ruby:2.2',
services: ['postgres:9.1', 'mysql:5.5'], services: ['postgres:9.1', 'mysql:5.5'],
variables: { VAR: 'value' },
after_script: ['make clean'] } after_script: ['make clean'] }
end end
...@@ -35,7 +36,7 @@ describe Gitlab::Ci::Config::Node::Global do ...@@ -35,7 +36,7 @@ describe Gitlab::Ci::Config::Node::Global do
end end
it 'creates node object for each entry' do it 'creates node object for each entry' do
expect(global.nodes.count).to eq 4 expect(global.nodes.count).to eq 5
end end
it 'creates node object using valid class' do it 'creates node object using valid class' do
...@@ -93,6 +94,12 @@ describe Gitlab::Ci::Config::Node::Global do ...@@ -93,6 +94,12 @@ describe Gitlab::Ci::Config::Node::Global do
expect(global.after_script).to eq ['make clean'] expect(global.after_script).to eq ['make clean']
end end
end end
describe '#variables' do
it 'returns variables' do
expect(global.variables).to eq(VAR: 'value')
end
end
end end
end end
......
require 'spec_helper'
describe Gitlab::Ci::Config::Node::Variables do
let(:entry) { described_class.new(config) }
describe 'validations' do
context 'when entry config value is correct' do
let(:config) do
{ 'VARIABLE_1' => 'value 1', 'VARIABLE_2' => 'value 2' }
end
describe '#value' do
it 'returns hash with key value strings' do
expect(entry.value).to eq config
end
end
describe '#errors' do
it 'does not append errors' do
expect(entry.errors).to be_empty
end
end
describe '#valid?' do
it 'is valid' do
expect(entry).to be_valid
end
end
end
context 'when entry value is not correct' do
let(:config) { [ :VAR, 'test' ] }
describe '#errors' do
it 'saves errors' do
expect(entry.errors)
.to include /should be a hash of key value pairs/
end
end
describe '#valid?' do
it 'is not valid' do
expect(entry).not_to be_valid
end
end
end
##
# See #18775
#
context 'when entry value is not defined' do
let(:config) { nil }
describe '#valid?' do
it 'is valid' do
expect(entry).to be_valid
end
end
describe '#values' do
it 'returns an empty hash' do
expect(entry.value).to eq({})
end
end
end
end
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment