Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/ci/queue/build_queue_service.rb')
-rw-r--r--app/services/ci/queue/build_queue_service.rb90
1 files changed, 90 insertions, 0 deletions
diff --git a/app/services/ci/queue/build_queue_service.rb b/app/services/ci/queue/build_queue_service.rb
new file mode 100644
index 00000000000..99408d529b2
--- /dev/null
+++ b/app/services/ci/queue/build_queue_service.rb
@@ -0,0 +1,90 @@
+# frozen_string_literal: true
+
+module Ci
+ module Queue
+ class BuildQueueService
+ include ::Gitlab::Utils::StrongMemoize
+
+ attr_reader :runner
+
+ def initialize(runner)
+ @runner = runner
+ end
+
+ def new_builds
+ strategy.new_builds
+ end
+
+ ##
+ # This is overridden in EE
+ #
+ def builds_for_shared_runner
+ strategy.builds_for_shared_runner
+ end
+
+ # rubocop:disable CodeReuse/ActiveRecord
+ def builds_for_group_runner
+ # Workaround for weird Rails bug, that makes `runner.groups.to_sql` to return `runner_id = NULL`
+ groups = ::Group.joins(:runner_namespaces).merge(runner.runner_namespaces)
+
+ hierarchy_groups = Gitlab::ObjectHierarchy
+ .new(groups)
+ .base_and_descendants
+
+ projects = Project.where(namespace_id: hierarchy_groups)
+ .with_group_runners_enabled
+ .with_builds_enabled
+ .without_deleted
+
+ relation = new_builds.where(project: projects)
+
+ order(relation)
+ end
+
+ def builds_for_project_runner
+ relation = new_builds
+ .where(project: runner.projects.without_deleted.with_builds_enabled)
+
+ order(relation)
+ end
+
+ def builds_queued_before(relation, time)
+ relation.queued_before(time)
+ end
+
+ def builds_for_protected_runner(relation)
+ relation.ref_protected
+ end
+
+ def builds_matching_tag_ids(relation, ids)
+ strategy.builds_matching_tag_ids(relation, ids)
+ end
+
+ def builds_with_any_tags(relation)
+ strategy.builds_with_any_tags(relation)
+ end
+
+ def order(relation)
+ strategy.order(relation)
+ end
+
+ def execute(relation)
+ strategy.build_ids(relation)
+ end
+
+ private
+
+ def strategy
+ strong_memoize(:strategy) do
+ if ::Feature.enabled?(:ci_pending_builds_queue_source, runner, default_enabled: :yaml)
+ Queue::PendingBuildsStrategy.new(runner)
+ else
+ Queue::BuildsTableStrategy.new(runner)
+ end
+ end
+ end
+ end
+ end
+end
+
+Ci::Queue::BuildQueueService.prepend_mod_with('Ci::Queue::BuildQueueService')