Build `deployments` associations in `before_create` hook

Problem

As per, https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/22993#note_116620866

We should not create deployments relation after_create hook, instead we should build deployments associations in before_create hook in order to avoid redandant reloading.

diff --git a/app/models/concerns/deployable.rb b/app/models/concerns/deployable.rb
index a1bec950665..9f1e2713b84 100644
--- a/app/models/concerns/deployable.rb
+++ b/app/models/concerns/deployable.rb
@@ -4,7 +4,7 @@ module Deployable
   extend ActiveSupport::Concern
 
   included do
-    after_create :create_deployment
+    before_create :create_deployment
 
     def create_deployment
       return unless starts_environment? && !has_deployment?
@@ -13,14 +13,12 @@ module Deployable
         name: expanded_environment_name
       )
 
-      environment.deployments.create!(
+      self.deployment = environment.deployments.build(
         project_id: environment.project_id,
-        environment: environment,
         ref: ref,
         tag: tag,
         sha: sha,
         user: user,
-        deployable: self,
         on_stop: on_stop)
     end
   end
diff --git a/spec/services/ci/create_pipeline_service_spec.rb b/spec/services/ci/create_pipeline_service_spec.rb
index d2322fa4cab..193148d403a 100644
--- a/spec/services/ci/create_pipeline_service_spec.rb
+++ b/spec/services/ci/create_pipeline_service_spec.rb
@@ -403,6 +403,8 @@ describe Ci::CreatePipelineService do
         expect(result).to be_persisted
         expect(Environment.find_by(name: "review/master")).to be_present
         expect(result.builds.first.tag_list).to contain_exactly('hello')
+        expect(result.builds.first.deployment).to be_persisted
+        expect(result.builds.first.deployment.deployable).to be_a(Ci::Build)
       end
     end

/cc @ayufan