From 3726dc4bb73647123ebef5c97f401f5537d3ae16 Mon Sep 17 00:00:00 2001
From: Grzegorz Bizon <grzesiek.bizon@gmail.com>
Date: Fri, 14 Oct 2016 10:19:16 +0200
Subject: [PATCH] Check if project exists before creating deployment

---
 app/services/create_deployment_service.rb       |  6 ++++++
 app/workers/build_success_worker.rb             |  2 --
 spec/services/create_deployment_service_spec.rb | 17 ++++++++++++++---
 3 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/app/services/create_deployment_service.rb b/app/services/create_deployment_service.rb
index c6dc2148c11..ff9a8310a8c 100644
--- a/app/services/create_deployment_service.rb
+++ b/app/services/create_deployment_service.rb
@@ -2,6 +2,8 @@ require_relative 'base_service'
 
 class CreateDeploymentService < BaseService
   def execute(deployable = nil)
+    return unless executable?
+
     ActiveRecord::Base.transaction do
       @deployable = deployable
       @environment = prepare_environment
@@ -14,6 +16,10 @@ class CreateDeploymentService < BaseService
 
   private
 
+  def executable?
+    project && name.present?
+  end
+
   def deploy
     project.deployments.create(
       environment: @environment,
diff --git a/app/workers/build_success_worker.rb b/app/workers/build_success_worker.rb
index a9dc34166a1..500d357ce31 100644
--- a/app/workers/build_success_worker.rb
+++ b/app/workers/build_success_worker.rb
@@ -4,8 +4,6 @@ class BuildSuccessWorker
 
   def perform(build_id)
     Ci::Build.find_by(id: build_id).try do |build|
-      return unless build.project
-
       create_deployment(build)
     end
   end
diff --git a/spec/services/create_deployment_service_spec.rb b/spec/services/create_deployment_service_spec.rb
index 343b4385bf2..5fe56e7725f 100644
--- a/spec/services/create_deployment_service_spec.rb
+++ b/spec/services/create_deployment_service_spec.rb
@@ -84,11 +84,22 @@ describe CreateDeploymentService, services: true do
         expect(subject).to be_persisted
       end
     end
+
+    context 'when project was removed' do
+      let(:project) { nil }
+
+      it 'does not create deployment or environment' do
+        expect { subject }.not_to raise_error
+
+        expect(Environment.count).to be_zero
+        expect(Deployment.count).to be_zero
+      end
+    end
   end
 
   describe 'processing of builds' do
     let(:environment) { nil }
-    
+
     shared_examples 'does not create environment and deployment' do
       it 'does not create a new environment' do
         expect { subject }.not_to change { Environment.count }
@@ -133,12 +144,12 @@ describe CreateDeploymentService, services: true do
 
     context 'without environment specified' do
       let(:build) { create(:ci_build, project: project) }
-      
+
       it_behaves_like 'does not create environment and deployment' do
         subject { build.success }
       end
     end
-    
+
     context 'when environment is specified' do
       let(:pipeline) { create(:ci_pipeline, project: project) }
       let(:build) { create(:ci_build, pipeline: pipeline, environment: 'production', options: options) }
-- 
GitLab