diff --git a/app/services/ci/retry_pipeline_service.rb b/app/services/ci/retry_pipeline_service.rb
index 574561adc4ce7959169bc0504586438a8abc5185..f72ddbf690ca6a21fc2db99617ff53698044b379 100644
--- a/app/services/ci/retry_pipeline_service.rb
+++ b/app/services/ci/retry_pipeline_service.rb
@@ -7,14 +7,14 @@ module Ci
         raise Gitlab::Access::AccessDeniedError
       end
 
-      pipeline.builds.failed_or_canceled.find_each do |build|
+      pipeline.builds.latest.failed_or_canceled.find_each do |build|
         next unless build.retryable?
 
         Ci::RetryBuildService.new(project, current_user)
           .reprocess(build)
       end
 
-      pipeline.builds.skipped.find_each do |skipped|
+      pipeline.builds.latest.skipped.find_each do |skipped|
         retry_optimistic_lock(skipped) { |build| build.process }
       end
 
diff --git a/changelogs/unreleased/fix-gb-pipeline-retry-only-latest-jobs.yml b/changelogs/unreleased/fix-gb-pipeline-retry-only-latest-jobs.yml
new file mode 100644
index 0000000000000000000000000000000000000000..c14679be70f688604296cd81a68db00d6b4ac8c6
--- /dev/null
+++ b/changelogs/unreleased/fix-gb-pipeline-retry-only-latest-jobs.yml
@@ -0,0 +1,5 @@
+---
+title: Fix bug that caused jobs that already had been retried to be retried again
+  when retrying a pipeline
+merge_request: 10249
+author:
diff --git a/spec/services/ci/retry_pipeline_service_spec.rb b/spec/services/ci/retry_pipeline_service_spec.rb
index 5445b65f4e8b2d95a6fafbdc7ea53e51f29e274e..f1b2d3a47985ad90ba568a3c0e5940bba9bd445a 100644
--- a/spec/services/ci/retry_pipeline_service_spec.rb
+++ b/spec/services/ci/retry_pipeline_service_spec.rb
@@ -9,6 +9,19 @@ describe Ci::RetryPipelineService, '#execute', :services do
   context 'when user has ability to modify pipeline' do
     let(:user) { create(:admin) }
 
+    context 'when there are already retried jobs present' do
+      before do
+        create_build('rspec', :canceled, 0)
+        create_build('rspec', :failed, 0)
+      end
+
+      it 'does not retry jobs that has already been retried' do
+        expect(statuses.first).to be_retried
+        expect { service.execute(pipeline) }
+          .to change { CommitStatus.count }.by(1)
+      end
+    end
+
     context 'when there are failed builds in the last stage' do
       before do
         create_build('rspec 1', :success, 0)