Commit 7112bd9a authored by Maxime Orefice's avatar Maxime Orefice Committed by Grzegorz Bizon

Add scopes for pending builds tags

parent 203b5077
...@@ -13,6 +13,13 @@ module Ci ...@@ -13,6 +13,13 @@ module Ci
scope :ref_protected, -> { where(protected: true) } scope :ref_protected, -> { where(protected: true) }
scope :queued_before, ->(time) { where(arel_table[:created_at].lt(time)) } scope :queued_before, ->(time) { where(arel_table[:created_at].lt(time)) }
scope :with_instance_runners, -> { where(instance_runners_enabled: true) } scope :with_instance_runners, -> { where(instance_runners_enabled: true) }
scope :for_tags, ->(tag_ids) do
if tag_ids.present?
where('ci_pending_builds.tag_ids <@ ARRAY[?]::int[]', Array.wrap(tag_ids))
else
where("ci_pending_builds.tag_ids = '{}'")
end
end
class << self class << self
def upsert_from_build!(build) def upsert_from_build!(build)
......
...@@ -24,7 +24,7 @@ module Ci ...@@ -24,7 +24,7 @@ module Ci
def builds_matching_tag_ids(relation, ids) def builds_matching_tag_ids(relation, ids)
if ::Feature.enabled?(:ci_queueing_denormalize_tags_information, runner, default_enabled: :yaml) if ::Feature.enabled?(:ci_queueing_denormalize_tags_information, runner, default_enabled: :yaml)
relation.where('tag_ids <@ ARRAY[?]::int[]', runner.tags_ids) relation.for_tags(runner.tags_ids)
else else
relation.merge(CommitStatus.matches_tag_ids(ids, table: 'ci_pending_builds', column: 'build_id')) relation.merge(CommitStatus.matches_tag_ids(ids, table: 'ci_pending_builds', column: 'build_id'))
end end
......
...@@ -8,5 +8,6 @@ FactoryBot.define do ...@@ -8,5 +8,6 @@ FactoryBot.define do
instance_runners_enabled { true } instance_runners_enabled { true }
namespace { project.namespace } namespace { project.namespace }
minutes_exceeded { false } minutes_exceeded { false }
tag_ids { build.tags_ids }
end end
end end
...@@ -34,6 +34,47 @@ RSpec.describe Ci::PendingBuild do ...@@ -34,6 +34,47 @@ RSpec.describe Ci::PendingBuild do
end end
end end
end end
describe '.for_tags' do
subject(:pending_builds) { described_class.for_tags(tag_ids) }
let_it_be(:pending_build_with_tags) { create(:ci_pending_build, tag_ids: [1, 2]) }
let_it_be(:pending_build_without_tags) { create(:ci_pending_build) }
context 'when tag_ids match pending builds' do
let(:tag_ids) { [1, 2] }
it 'returns matching pending builds' do
expect(pending_builds).to contain_exactly(pending_build_with_tags, pending_build_without_tags)
end
end
context 'when tag_ids does not match pending builds' do
let(:tag_ids) { [non_existing_record_id] }
it 'returns matching pending builds without tags' do
expect(pending_builds).to contain_exactly(pending_build_without_tags)
end
end
context 'when tag_ids is not provided' do
context 'with a nil value' do
let(:tag_ids) { nil }
it 'returns matching pending builds without tags' do
expect(pending_builds).to contain_exactly(pending_build_without_tags)
end
end
context 'with an empty array' do
let(:tag_ids) { [] }
it 'returns matching pending builds without tags' do
expect(pending_builds).to contain_exactly(pending_build_without_tags)
end
end
end
end
end end
describe '.upsert_from_build!' do describe '.upsert_from_build!' do
......
...@@ -40,12 +40,16 @@ module Ci ...@@ -40,12 +40,16 @@ module Ci
context 'runner follow tag list' do context 'runner follow tag list' do
it "picks build with the same tag" do it "picks build with the same tag" do
pending_job.update!(tag_list: ["linux"]) pending_job.update!(tag_list: ["linux"])
pending_job.reload
pending_job.create_queuing_entry!
specific_runner.update!(tag_list: ["linux"]) specific_runner.update!(tag_list: ["linux"])
expect(execute(specific_runner)).to eq(pending_job) expect(execute(specific_runner)).to eq(pending_job)
end end
it "does not pick build with different tag" do it "does not pick build with different tag" do
pending_job.update!(tag_list: ["linux"]) pending_job.update!(tag_list: ["linux"])
pending_job.reload
pending_job.create_queuing_entry!
specific_runner.update!(tag_list: ["win32"]) specific_runner.update!(tag_list: ["win32"])
expect(execute(specific_runner)).to be_falsey expect(execute(specific_runner)).to be_falsey
end end
...@@ -56,6 +60,8 @@ module Ci ...@@ -56,6 +60,8 @@ module Ci
it "does not pick build with tag" do it "does not pick build with tag" do
pending_job.update!(tag_list: ["linux"]) pending_job.update!(tag_list: ["linux"])
pending_job.reload
pending_job.create_queuing_entry!
expect(execute(specific_runner)).to be_falsey expect(execute(specific_runner)).to be_falsey
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment