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