diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-09-20 13:18:24 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-09-20 13:18:24 +0000 |
commit | 0653e08efd039a5905f3fa4f6e9cef9f5d2f799c (patch) | |
tree | 4dcc884cf6d81db44adae4aa99f8ec1233a41f55 /app/models/ci/pending_build.rb | |
parent | 744144d28e3e7fddc117924fef88de5d9674fe4c (diff) | |
download | gitlab-ce-0653e08efd039a5905f3fa4f6e9cef9f5d2f799c.tar.gz |
Add latest changes from gitlab-org/gitlab@14-3-stable-eev14.3.0-rc42
Diffstat (limited to 'app/models/ci/pending_build.rb')
-rw-r--r-- | app/models/ci/pending_build.rb | 82 |
1 files changed, 47 insertions, 35 deletions
diff --git a/app/models/ci/pending_build.rb b/app/models/ci/pending_build.rb index 7cf3a387516..ccad6290fac 100644 --- a/app/models/ci/pending_build.rb +++ b/app/models/ci/pending_build.rb @@ -2,6 +2,8 @@ module Ci class PendingBuild < Ci::ApplicationRecord + include EachBatch + belongs_to :project belongs_to :build, class_name: 'Ci::Build' belongs_to :namespace, inverse_of: :pending_builds, class_name: 'Namespace' @@ -11,52 +13,62 @@ module Ci scope :ref_protected, -> { where(protected: true) } scope :queued_before, ->(time) { where(arel_table[:created_at].lt(time)) } 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 - def self.upsert_from_build!(build) - entry = self.new(args_from_build(build)) + class << self + def upsert_from_build!(build) + entry = self.new(args_from_build(build)) - entry.validate! + entry.validate! - self.upsert(entry.attributes.compact, returning: %w[build_id], unique_by: :build_id) - end + self.upsert(entry.attributes.compact, returning: %w[build_id], unique_by: :build_id) + end - def self.args_from_build(build) - args = { - build: build, - project: build.project, - protected: build.protected?, - namespace: build.project.namespace - } + private + + def args_from_build(build) + project = build.project + + args = { + build: build, + project: project, + protected: build.protected?, + namespace: project.namespace + } + + if Feature.enabled?(:ci_pending_builds_maintain_tags_data, type: :development, default_enabled: :yaml) + args.store(:tag_ids, build.tags_ids) + end + + if Feature.enabled?(:ci_pending_builds_maintain_shared_runners_data, type: :development, default_enabled: :yaml) + args.store(:instance_runners_enabled, shared_runners_enabled?(project)) + end + + if Feature.enabled?(:ci_pending_builds_maintain_namespace_traversal_ids, type: :development, default_enabled: :yaml) + args.store(:namespace_traversal_ids, project.namespace.traversal_ids) if group_runners_enabled?(project) + end - if Feature.enabled?(:ci_pending_builds_maintain_shared_runners_data, type: :development, default_enabled: :yaml) - args.merge(instance_runners_enabled: shareable?(build)) - else args end - end - private_class_method :args_from_build - - def self.shareable?(build) - shared_runner_enabled?(build) && - builds_access_level?(build) && - project_not_removed?(build) - end - private_class_method :shareable? - def self.shared_runner_enabled?(build) - build.project.shared_runners.exists? - end - private_class_method :shared_runner_enabled? + def shared_runners_enabled?(project) + builds_enabled?(project) && project.shared_runners_enabled? + end - def self.project_not_removed?(build) - !build.project.pending_delete? - end - private_class_method :project_not_removed? + def group_runners_enabled?(project) + builds_enabled?(project) && project.group_runners_enabled? + end - def self.builds_access_level?(build) - build.project.project_feature.builds_access_level.nil? || build.project.project_feature.builds_access_level > 0 + def builds_enabled?(project) + project.builds_enabled? && !project.pending_delete? + end end - private_class_method :builds_access_level? end end |