diff --git a/lib/gitlab/ci/config/node/entry.rb b/lib/gitlab/ci/config/node/entry.rb
index 0767fadcb9ad4f6bb2bb55632975aec23c98cc0e..302cded664f376287ac73798a37597f473b214fc 100644
--- a/lib/gitlab/ci/config/node/entry.rb
+++ b/lib/gitlab/ci/config/node/entry.rb
@@ -12,22 +12,16 @@ module Gitlab
             @nodes = {}
             @errors = []
 
-            unless leaf? || value.is_a?(Hash)
+            unless leaf? || has_config?
               @errors << 'should be a configuration entry with hash value'
             end
           end
 
           def process!
-            return if leaf? || !valid?
+            return if leaf? || invalid?
 
             keys.each do |key, entry_class|
-              if @value.has_key?(key)
-                entry = entry_class.new(@value[key], @root, self)
-              else
-                entry = Node::Null.new(nil, @root, self)
-              end
-
-              @nodes[key] = entry
+              add_node(key, entry_class)
             end
 
             nodes.each(&:process!)
@@ -38,22 +32,30 @@ module Gitlab
             @nodes.values
           end
 
-          def errors
-            @errors + nodes.map(&:errors).flatten
-          end
-
           def valid?
             errors.none?
           end
 
+          def invalid?
+            !valid?
+          end
+
           def leaf?
             keys.none?
           end
 
+          def has_config?
+            @value.is_a?(Hash)
+          end
+
           def keys
             self.class.nodes || {}
           end
 
+          def errors
+            @errors + nodes.map(&:errors).flatten
+          end
+
           def method_missing(name, *args)
             super unless keys.has_key?(name)
             raise InvalidError unless valid?
@@ -73,6 +75,18 @@ module Gitlab
             raise NotImplementedError
           end
 
+          private
+
+          def add_node(key, entry_class)
+            if @value.has_key?(key)
+              entry = entry_class.new(@value[key], @root, self)
+            else
+              entry = Node::Null.new(nil, @root, self)
+            end
+
+            @nodes[key] = entry
+          end
+
           class << self
             attr_reader :nodes
 
diff --git a/lib/gitlab/ci/config/node/null.rb b/lib/gitlab/ci/config/node/null.rb
index db3fa05c328ff322804097ce55c4e4415d9bfba3..bf8bc62dc918498bff98735477c46a4c1afdefa3 100644
--- a/lib/gitlab/ci/config/node/null.rb
+++ b/lib/gitlab/ci/config/node/null.rb
@@ -8,6 +8,7 @@ module Gitlab
           end
 
           def validate!
+            nil
           end
 
           def method_missing(*)
diff --git a/spec/lib/gitlab/ci/config/node/before_script_spec.rb b/spec/lib/gitlab/ci/config/node/before_script_spec.rb
index bc34b9c9b562c7b48d9b1ac960003cf5aaa2c8c8..b506b9743c6efb277909a8cf97dfc66021fd448f 100644
--- a/spec/lib/gitlab/ci/config/node/before_script_spec.rb
+++ b/spec/lib/gitlab/ci/config/node/before_script_spec.rb
@@ -18,6 +18,12 @@ describe Gitlab::Ci::Config::Node::BeforeScript do
         expect(entry.errors).to be_empty
       end
     end
+
+    describe '#has_config?' do
+      it 'does not have config' do
+        expect(entry).not_to have_config
+      end
+    end
   end
 
   context 'when entry value is not correct' do
@@ -29,5 +35,11 @@ describe Gitlab::Ci::Config::Node::BeforeScript do
           .to include /should be an array of strings/
       end
     end
+
+    describe '#invalid?' do
+      it 'is not valid' do
+        expect(entry).to be_invalid
+      end
+    end
   end
 end
diff --git a/spec/lib/gitlab/ci/config/node/global_spec.rb b/spec/lib/gitlab/ci/config/node/global_spec.rb
index 66d40be6e6eeb4e55632a8c051b0e5cb73951aed..74a64c6df98438b6e96fe201a26911f1c72a8685 100644
--- a/spec/lib/gitlab/ci/config/node/global_spec.rb
+++ b/spec/lib/gitlab/ci/config/node/global_spec.rb
@@ -35,6 +35,12 @@ describe Gitlab::Ci::Config::Node::Global do
       end
     end
 
+    describe '#has_config?' do
+      it 'has config' do
+        expect(global).to have_config
+      end
+    end
+
     describe '#leaf?' do
       it 'is not leaf' do
         expect(global).not_to be_leaf
@@ -59,6 +65,12 @@ describe Gitlab::Ci::Config::Node::Global do
       end
     end
 
+    describe '#invalid?' do
+      it 'is not valid' do
+        expect(global).to be_invalid
+      end
+    end
+
     describe '#errors' do
       it 'reports errors from child nodes' do
         expect(global.errors)