diff --git a/lib/gitlab/ci/config/node/entry.rb b/lib/gitlab/ci/config/node/entry.rb
index c45744efdf52d820584be7669e4081014fbd5233..bdef2af9ae1d0feb826a820cca45d9dd6fd41155 100644
--- a/lib/gitlab/ci/config/node/entry.rb
+++ b/lib/gitlab/ci/config/node/entry.rb
@@ -20,14 +20,18 @@ module Gitlab
           def process!
             return if leaf? || invalid?
 
-            keys.each do |key, entry|
-              add_node(key, entry)
-            end
+            compose!
 
             nodes.each(&:process!)
             nodes.each(&:validate!)
           end
 
+          def compose!
+            keys.each do |key, entry|
+              add_node(key, entry)
+            end
+          end
+
           def nodes
             @nodes.values
           end
diff --git a/spec/lib/gitlab/ci/config/node/global_spec.rb b/spec/lib/gitlab/ci/config/node/global_spec.rb
index ecfd60b2736d230b536e58287021801d2dd3f421..606750648d4768dadfa36e4e49896d32c25a15d5 100644
--- a/spec/lib/gitlab/ci/config/node/global_spec.rb
+++ b/spec/lib/gitlab/ci/config/node/global_spec.rb
@@ -3,8 +3,6 @@ require 'spec_helper'
 describe Gitlab::Ci::Config::Node::Global do
   let(:global) { described_class.new(hash) }
 
-  before { global.process! }
-
   describe '#keys' do
     it 'can contain global config keys' do
       expect(global.keys).to include :before_script
@@ -20,7 +18,18 @@ describe Gitlab::Ci::Config::Node::Global do
       { before_script: ['ls', 'pwd'] }
     end
 
+    describe '#compose!' do
+      before { global.compose! }
+
+      it 'instantiates entry nodes' do
+        expect(global.nodes.first)
+          .to be_an_instance_of Gitlab::Ci::Config::Node::Script
+      end
+    end
+
     describe '#process!' do
+      before { global.process! }
+
       it 'creates nodes hash' do
         expect(global.nodes).to be_an Array
       end
@@ -48,13 +57,25 @@ describe Gitlab::Ci::Config::Node::Global do
     end
 
     describe '#before_script' do
-      it 'returns correct script' do
-        expect(global.before_script).to eq "ls\npwd"
+      context 'when processed' do
+        before { global.process! }
+
+        it 'returns correct script' do
+          expect(global.before_script).to eq "ls\npwd"
+        end
+      end
+
+      context 'when not processed' do
+        it 'returns nil' do
+          expect(global.before_script).to be nil
+        end
       end
     end
   end
 
   context 'when hash is not valid' do
+    before { global.process! }
+
     let(:hash) do
       { before_script: 'ls' }
     end