diff --git a/app/models/commit_status.rb b/app/models/commit_status.rb
index 09aec6b40d091a48f6b4d3c84239bcf271307d49..9c4f86144d8489e1997a39ee6e505ee0a3d0809a 100644
--- a/app/models/commit_status.rb
+++ b/app/models/commit_status.rb
@@ -69,27 +69,28 @@ class CommitStatus < ActiveRecord::Base
       commit_status.update_attributes finished_at: Time.now
     end
 
-    after_transition [:created, :pending, :running] => :success do |commit_status|
-      MergeRequests::MergeWhenBuildSucceedsService.new(commit_status.pipeline.project, nil).trigger(commit_status)
-    end
-
-    after_transition any => :failed do |commit_status|
-      MergeRequests::AddTodoWhenBuildFailsService.new(commit_status.pipeline.project, nil).execute(commit_status)
-    end
-
     after_transition do |commit_status, transition|
-      return if transition.loopback?
+      commit_status.pipeline.tap do |pipeline|
+        return if transition.loopback?
+        return unless pipeline
 
-      commit_status.pipeline.try(:id).try do |pipeline_id|
         if commit_status.complete?
-          ProcessPipelineWorker.perform_async(pipeline_id)
+          ProcessPipelineWorker.perform_async(pipeline.id)
         end
 
-        UpdatePipelineWorker.perform_async(pipeline_id)
+        UpdatePipelineWorker.perform_async(pipeline.id)
       end
 
       true
     end
+
+    after_transition [:created, :pending, :running] => :success do |commit_status|
+      MergeRequests::MergeWhenBuildSucceedsService.new(commit_status.pipeline.project, nil).trigger(commit_status)
+    end
+
+    after_transition any => :failed do |commit_status|
+      MergeRequests::AddTodoWhenBuildFailsService.new(commit_status.pipeline.project, nil).execute(commit_status)
+    end
   end
 
   delegate :sha, :short_sha, to: :pipeline
diff --git a/app/services/merge_requests/merge_when_build_succeeds_service.rb b/app/services/merge_requests/merge_when_build_succeeds_service.rb
index 60d6085f9eb6472229414cf667006d6d1d57b2c8..4ad5fb083114400d4b4bd8aef1a573e9cd71227f 100644
--- a/app/services/merge_requests/merge_when_build_succeeds_service.rb
+++ b/app/services/merge_requests/merge_when_build_succeeds_service.rb
@@ -19,12 +19,11 @@ module MergeRequests
     end
 
     # Triggers the automatic merge of merge_request once the build succeeds
-    def trigger(pipeline)
-      return unless pipeline.success?
-
-      each_merge_request(pipeline) do |merge_request|
+    def trigger(commit_status)
+      each_merge_request(commit_status) do |merge_request, pipeline|
         next unless merge_request.merge_when_build_succeeds?
         next unless merge_request.mergeable?
+        next unless pipeline.success?
 
         MergeWorker.perform_async(merge_request.id, merge_request.merge_user_id, merge_request.merge_params)
       end
diff --git a/app/workers/process_pipeline_worker.rb b/app/workers/process_pipeline_worker.rb
index 9aad8cf818f81da84d2ad0f4d707c9dbcf73b7d0..189cfa207ffdb490234be71dfd767165169911d1 100644
--- a/app/workers/process_pipeline_worker.rb
+++ b/app/workers/process_pipeline_worker.rb
@@ -4,9 +4,8 @@ class ProcessPipelineWorker
   sidekiq_options queue: :default
 
   def perform(pipeline_id)
-    pipeline = Ci::Pipeline.find_by(id: pipeline_id)
-    return unless pipeline
-
-    pipeline.process!
+    Ci::Pipeline.find_by(id: pipeline_id).try do |pipeline|
+      pipeline.process!
+    end
   end
 end
diff --git a/app/workers/update_pipeline_worker.rb b/app/workers/update_pipeline_worker.rb
index 31d29d0ab1c10440b416e7b2ec9d10987b3e0569..9fd622a0970b1200755971738807ae7e701b1215 100644
--- a/app/workers/update_pipeline_worker.rb
+++ b/app/workers/update_pipeline_worker.rb
@@ -4,9 +4,8 @@ class UpdatePipelineWorker
   sidekiq_options queue: :default
 
   def perform(pipeline_id)
-    pipeline = Ci::Pipeline.find_by(id: pipeline_id)
-    return unless pipeline
-
-    pipeline.update_status
+    Ci::Pipeline.find_by(id: pipeline_id).try do |pipeline|
+      pipeline.update_status
+    end
   end
 end