From 06c30825126291df9e91e5426f6127f77ab7eaaa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20W=C3=A4lter?= <jonas.waelter@noser.com>
Date: Thu, 1 Sep 2022 14:10:16 +0000
Subject: [PATCH] Use FIFO as pending builds strategy for group runners

Changelog: fixed
---
 .../ci/queue/pending_builds_strategy.rb       |  6 ++++-
 .../order_builds_for_group_runner.yml         |  8 +++++++
 .../ci/queue/pending_builds_strategy_spec.rb  | 24 +++++++++++++++++++
 3 files changed, 37 insertions(+), 1 deletion(-)
 create mode 100644 config/feature_flags/development/order_builds_for_group_runner.yml
 create mode 100644 spec/services/ci/queue/pending_builds_strategy_spec.rb

diff --git a/app/services/ci/queue/pending_builds_strategy.rb b/app/services/ci/queue/pending_builds_strategy.rb
index c8bdbba5e65d8..cfafe66d10b81 100644
--- a/app/services/ci/queue/pending_builds_strategy.rb
+++ b/app/services/ci/queue/pending_builds_strategy.rb
@@ -19,7 +19,11 @@ def builds_for_shared_runner
       def builds_for_group_runner
         return new_builds.none if runner.namespace_ids.empty?
 
-        new_builds.where('ci_pending_builds.namespace_traversal_ids && ARRAY[?]::int[]', runner.namespace_ids)
+        new_builds_relation = new_builds.where('ci_pending_builds.namespace_traversal_ids && ARRAY[?]::int[]', runner.namespace_ids)
+
+        return order(new_builds_relation) if ::Feature.enabled?(:order_builds_for_group_runner)
+
+        new_builds_relation
       end
 
       def builds_matching_tag_ids(relation, ids)
diff --git a/config/feature_flags/development/order_builds_for_group_runner.yml b/config/feature_flags/development/order_builds_for_group_runner.yml
new file mode 100644
index 0000000000000..50f9a301ad65c
--- /dev/null
+++ b/config/feature_flags/development/order_builds_for_group_runner.yml
@@ -0,0 +1,8 @@
+---
+name: order_builds_for_group_runner
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/94815
+rollout_issue_url: 
+milestone: '15.4'
+type: development
+group: group::pipeline execution
+default_enabled: true
diff --git a/spec/services/ci/queue/pending_builds_strategy_spec.rb b/spec/services/ci/queue/pending_builds_strategy_spec.rb
new file mode 100644
index 0000000000000..6f22c256c17b1
--- /dev/null
+++ b/spec/services/ci/queue/pending_builds_strategy_spec.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Ci::Queue::PendingBuildsStrategy do
+  let_it_be(:group) { create(:group) }
+  let_it_be(:group_runner) { create(:ci_runner, :group, groups: [group]) }
+  let_it_be(:project) { create(:project, group: group) }
+  let_it_be(:pipeline) { create(:ci_pipeline, project: project) }
+
+  let!(:build_1) { create(:ci_build, :created, pipeline: pipeline) }
+  let!(:build_2) { create(:ci_build, :created, pipeline: pipeline) }
+  let!(:build_3) { create(:ci_build, :created, pipeline: pipeline) }
+  let!(:pending_build_1) { create(:ci_pending_build, build: build_2, project: project) }
+  let!(:pending_build_2) { create(:ci_pending_build, build: build_3, project: project) }
+  let!(:pending_build_3) { create(:ci_pending_build, build: build_1, project: project) }
+
+  describe 'builds_for_group_runner' do
+    it 'returns builds ordered by build ID' do
+      strategy = described_class.new(group_runner)
+      expect(strategy.builds_for_group_runner).to eq([pending_build_3, pending_build_1, pending_build_2])
+    end
+  end
+end
-- 
GitLab