diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb
index f2f6453b3b90b865246ecbc9872e9bc0a20ef64f..abbbddaa4f67bcd0e9e1c7670e21758801984ba6 100644
--- a/app/models/ci/pipeline.rb
+++ b/app/models/ci/pipeline.rb
@@ -93,11 +93,8 @@ class Pipeline < ActiveRecord::Base
         .select("max(#{quoted_table_name}.id)")
         .group(:ref, :sha)
 
-      if ref
-        where(id: max_id, ref: ref)
-      else
-        where(id: max_id)
-      end
+      relation = ref ? where(ref: ref) : self
+      relation.where(id: max_id)
     end
 
     def self.latest_status(ref = nil)
@@ -105,7 +102,7 @@ def self.latest_status(ref = nil)
     end
 
     def self.latest_successful_for(ref)
-      success.latest(ref).first
+      success.latest(ref).order(id: :desc).first
     end
 
     def self.truncate_sha(sha)
diff --git a/changelogs/unreleased/fix-latest-pipeine-ordering.yml b/changelogs/unreleased/fix-latest-pipeine-ordering.yml
new file mode 100644
index 0000000000000000000000000000000000000000..b155d51741b0dacd15572ccb8bb1656b4d043236
--- /dev/null
+++ b/changelogs/unreleased/fix-latest-pipeine-ordering.yml
@@ -0,0 +1,4 @@
+---
+title: Fix finding the latest pipeline
+merge_request: 8301
+author:
diff --git a/spec/models/ci/pipeline_spec.rb b/spec/models/ci/pipeline_spec.rb
index dc377d15f1593d791246f986ade2c49c45d460d2..cebaa157ef33bfb69a7732a9b0fa0a8d83d12fc9 100644
--- a/spec/models/ci/pipeline_spec.rb
+++ b/spec/models/ci/pipeline_spec.rb
@@ -464,6 +464,19 @@ def create_pipeline(status, ref, sha)
     end
   end
 
+  describe '.latest_successful_for' do
+    include_context 'with some outdated pipelines'
+
+    let!(:latest_successful_pipeline) do
+      create_pipeline(:success, 'ref', 'D')
+    end
+
+    it 'returns the latest successful pipeline' do
+      expect(described_class.latest_successful_for('ref')).
+        to eq(latest_successful_pipeline)
+    end
+  end
+
   describe '#status' do
     let!(:build) { create(:ci_build, :created, pipeline: pipeline, name: 'test') }