Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
ae27cd3c88
commit
6e2dde590e
|
|
@ -24,47 +24,12 @@ build-qa-image:
|
|||
- .base-image-build
|
||||
- .build-images:rules:build-qa-image
|
||||
stage: build-images
|
||||
tags:
|
||||
- high-cpu
|
||||
needs: []
|
||||
script:
|
||||
- !reference [.base-image-build, script]
|
||||
- echo $QA_IMAGE
|
||||
- /kaniko/executor --context=${CI_PROJECT_DIR} --dockerfile=${CI_PROJECT_DIR}/qa/Dockerfile --destination=${QA_IMAGE} --cache=true
|
||||
|
||||
# This image is used by:
|
||||
# - The `review-qa-*` jobs
|
||||
# - The downstream `omnibus-gitlab-mirror` pipeline triggered by `package-and-qa` so that it doesn't have to rebuild it again.
|
||||
# The downstream `omnibus-gitlab-mirror` pipeline itself passes the image name to the `gitlab-qa-mirror` pipeline so that
|
||||
# it can use it instead of inferring an end-to-end image from the GitLab image built by the downstream `omnibus-gitlab-mirror` pipeline.
|
||||
# See https://docs.gitlab.com/ee/development/testing_guide/end_to_end/index.html#testing-code-in-merge-requests for more details.
|
||||
build-qa-image-buildkit:
|
||||
extends:
|
||||
- .base-image-build
|
||||
- .use-buildkit
|
||||
- .build-images:rules:build-qa-image
|
||||
stage: build-images
|
||||
tags:
|
||||
- docker
|
||||
- high-cpu
|
||||
needs: []
|
||||
variables:
|
||||
QA_IMAGE_BASE: ${CI_REGISTRY}/${CI_PROJECT_PATH}/gitlab-ee-qa
|
||||
allow_failure: true
|
||||
script:
|
||||
- !reference [.base-image-build, script]
|
||||
# Build image and push current sha tag and latest branch tag
|
||||
# Fetch cache from latest branch image or latest main branch image
|
||||
- |
|
||||
buildctl-daemonless.sh build \
|
||||
--frontend=dockerfile.v0 \
|
||||
--local context="." \
|
||||
--local dockerfile="qa" \
|
||||
--export-cache type=inline \
|
||||
--import-cache type=registry,ref="${QA_IMAGE_BASE}:${CI_COMMIT_REF_SLUG}-buildkit" \
|
||||
--import-cache type=registry,ref="${QA_IMAGE_BASE}:${CI_DEFAULT_BRANCH}" \
|
||||
--output type=image,\"name="${QA_IMAGE}-buildkit","${QA_IMAGE_BASE}:${CI_COMMIT_REF_SLUG}-buildkit"\",push=true
|
||||
|
||||
# This image is used by:
|
||||
# - The `CNG` pipelines (via the `review-build-cng` job): https://gitlab.com/gitlab-org/build/CNG/-/blob/cfc67136d711e1c8c409bf8e57427a644393da2f/.gitlab-ci.yml#L335
|
||||
# - The `omnibus-gitlab` pipelines (via the `package-and-qa` job): https://gitlab.com/gitlab-org/omnibus-gitlab/-/blob/dfd1ad475868fc84e91ab7b5706aa03e46dc3a86/.gitlab-ci.yml#L130
|
||||
|
|
|
|||
|
|
@ -268,24 +268,6 @@
|
|||
- mkdir -p /kaniko/.docker
|
||||
- echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
|
||||
|
||||
.use-buildkit:
|
||||
image:
|
||||
name: ${GITLAB_DEPENDENCY_PROXY}moby/buildkit:v0.9.0
|
||||
entrypoint: [""]
|
||||
before_script:
|
||||
- source scripts/utils.sh
|
||||
- mkdir -p $HOME/.docker
|
||||
- |
|
||||
cat <<- EOF > $HOME/.docker/config.json
|
||||
{
|
||||
"auths": {
|
||||
"$CI_REGISTRY": {
|
||||
"auth": "$(echo -n $CI_REGISTRY_USER:$CI_REGISTRY_PASSWORD | base64)"
|
||||
}
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
.as-if-foss:
|
||||
variables:
|
||||
FOSS_ONLY: '1'
|
||||
|
|
|
|||
|
|
@ -141,9 +141,7 @@ export default {
|
|||
return Math.floor(Math.random() * 28);
|
||||
},
|
||||
showDailyLimitMessage({ value }) {
|
||||
return (
|
||||
value === KEY_CUSTOM && this.glFeatures.ciDailyLimitForPipelineSchedules && this.dailyLimit
|
||||
);
|
||||
return value === KEY_CUSTOM && this.dailyLimit;
|
||||
},
|
||||
},
|
||||
};
|
||||
|
|
|
|||
|
|
@ -227,7 +227,7 @@ class Projects::IssuesController < Projects::ApplicationController
|
|||
IssuableExportCsvWorker.perform_async(:issue, current_user.id, project.id, finder_options.to_h) # rubocop:disable CodeReuse/Worker
|
||||
|
||||
index_path = project_issues_path(project)
|
||||
message = _('Your CSV export has started. It will be emailed to %{email} when complete.') % { email: current_user.notification_email }
|
||||
message = _('Your CSV export has started. It will be emailed to %{email} when complete.') % { email: current_user.notification_email_or_default }
|
||||
redirect_to(index_path, notice: message)
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -378,7 +378,7 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
|
|||
IssuableExportCsvWorker.perform_async(:merge_request, current_user.id, project.id, finder_options.to_h) # rubocop:disable CodeReuse/Worker
|
||||
|
||||
index_path = project_merge_requests_path(project)
|
||||
message = _('Your CSV export has started. It will be emailed to %{email} when complete.') % { email: current_user.notification_email }
|
||||
message = _('Your CSV export has started. It will be emailed to %{email} when complete.') % { email: current_user.notification_email_or_default }
|
||||
redirect_to(index_path, notice: message)
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -10,10 +10,6 @@ class Projects::PipelineSchedulesController < Projects::ApplicationController
|
|||
before_action :authorize_update_pipeline_schedule!, except: [:index, :new, :create, :play]
|
||||
before_action :authorize_admin_pipeline_schedule!, only: [:destroy]
|
||||
|
||||
before_action do
|
||||
push_frontend_feature_flag(:ci_daily_limit_for_pipeline_schedules, @project, default_enabled: :yaml)
|
||||
end
|
||||
|
||||
feature_category :continuous_integration
|
||||
|
||||
# rubocop: disable CodeReuse/ActiveRecord
|
||||
|
|
|
|||
|
|
@ -221,7 +221,7 @@ module IssuesHelper
|
|||
can_bulk_update: can?(current_user, :admin_issue, project).to_s,
|
||||
can_edit: can?(current_user, :admin_project, project).to_s,
|
||||
can_import_issues: can?(current_user, :import_issues, @project).to_s,
|
||||
email: current_user&.notification_email,
|
||||
email: current_user&.notification_email_or_default,
|
||||
emails_help_page_path: help_page_path('development/emails', anchor: 'email-namespace'),
|
||||
export_csv_path: export_csv_project_issues_path(project),
|
||||
has_any_issues: project_issues(project).exists?.to_s,
|
||||
|
|
|
|||
|
|
@ -435,7 +435,7 @@ module ProjectsHelper
|
|||
|
||||
def git_user_email
|
||||
if current_user
|
||||
current_user.commit_email
|
||||
current_user.commit_email_or_default
|
||||
else
|
||||
"your@email.com"
|
||||
end
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ module Emails
|
|||
module AdminNotification
|
||||
def send_admin_notification(user_id, subject, body)
|
||||
user = User.find(user_id)
|
||||
email = user.notification_email
|
||||
email = user.notification_email_or_default
|
||||
@unsubscribe_url = unsubscribe_url(email: Base64.urlsafe_encode64(email))
|
||||
@body = body
|
||||
mail to: email, subject: subject
|
||||
|
|
@ -12,7 +12,7 @@ module Emails
|
|||
|
||||
def send_unsubscribed_notification(user_id)
|
||||
user = User.find(user_id)
|
||||
email = user.notification_email
|
||||
email = user.notification_email_or_default
|
||||
mail to: email, subject: "Unsubscribed from GitLab administrator notifications"
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ module Emails
|
|||
@current_user = @user = User.find(user_id)
|
||||
@target_url = user_url(@user)
|
||||
@token = token
|
||||
mail(to: @user.notification_email, subject: subject("Account was created for you"))
|
||||
mail(to: @user.notification_email_or_default, subject: subject("Account was created for you"))
|
||||
end
|
||||
|
||||
def instance_access_request_email(user, recipient)
|
||||
|
|
@ -14,7 +14,7 @@ module Emails
|
|||
@recipient = recipient
|
||||
|
||||
profile_email_with_layout(
|
||||
to: recipient.notification_email,
|
||||
to: recipient.notification_email_or_default,
|
||||
subject: subject(_("GitLab Account Request")))
|
||||
end
|
||||
|
||||
|
|
@ -42,7 +42,7 @@ module Emails
|
|||
|
||||
@current_user = @user = @key.user
|
||||
@target_url = user_url(@user)
|
||||
mail(to: @user.notification_email, subject: subject("SSH key was added to your account"))
|
||||
mail(to: @user.notification_email_or_default, subject: subject("SSH key was added to your account"))
|
||||
end
|
||||
# rubocop: enable CodeReuse/ActiveRecord
|
||||
|
||||
|
|
@ -54,7 +54,7 @@ module Emails
|
|||
|
||||
@current_user = @user = @gpg_key.user
|
||||
@target_url = user_url(@user)
|
||||
mail(to: @user.notification_email, subject: subject("GPG key was added to your account"))
|
||||
mail(to: @user.notification_email_or_default, subject: subject("GPG key was added to your account"))
|
||||
end
|
||||
# rubocop: enable CodeReuse/ActiveRecord
|
||||
|
||||
|
|
@ -67,7 +67,7 @@ module Emails
|
|||
@days_to_expire = PersonalAccessToken::DAYS_TO_EXPIRE
|
||||
|
||||
Gitlab::I18n.with_locale(@user.preferred_language) do
|
||||
mail(to: @user.notification_email, subject: subject(_("Your personal access tokens will expire in %{days_to_expire} days or less") % { days_to_expire: @days_to_expire }))
|
||||
mail(to: @user.notification_email_or_default, subject: subject(_("Your personal access tokens will expire in %{days_to_expire} days or less") % { days_to_expire: @days_to_expire }))
|
||||
end
|
||||
end
|
||||
|
||||
|
|
@ -78,7 +78,7 @@ module Emails
|
|||
@target_url = profile_personal_access_tokens_url
|
||||
|
||||
Gitlab::I18n.with_locale(@user.preferred_language) do
|
||||
mail(to: @user.notification_email, subject: subject(_("Your personal access token has expired")))
|
||||
mail(to: @user.notification_email_or_default, subject: subject(_("Your personal access token has expired")))
|
||||
end
|
||||
end
|
||||
|
||||
|
|
@ -90,7 +90,7 @@ module Emails
|
|||
@target_url = profile_keys_url
|
||||
|
||||
Gitlab::I18n.with_locale(@user.preferred_language) do
|
||||
mail(to: @user.notification_email, subject: subject(_("Your SSH key has expired")))
|
||||
mail(to: @user.notification_email_or_default, subject: subject(_("Your SSH key has expired")))
|
||||
end
|
||||
end
|
||||
|
||||
|
|
@ -102,7 +102,7 @@ module Emails
|
|||
@target_url = profile_keys_url
|
||||
|
||||
Gitlab::I18n.with_locale(@user.preferred_language) do
|
||||
mail(to: @user.notification_email, subject: subject(_("Your SSH key is expiring soon.")))
|
||||
mail(to: @user.notification_email_or_default, subject: subject(_("Your SSH key is expiring soon.")))
|
||||
end
|
||||
end
|
||||
|
||||
|
|
@ -114,7 +114,7 @@ module Emails
|
|||
|
||||
Gitlab::I18n.with_locale(@user.preferred_language) do
|
||||
profile_email_with_layout(
|
||||
to: @user.notification_email,
|
||||
to: @user.notification_email_or_default,
|
||||
subject: subject(_("%{host} sign-in from new location") % { host: Gitlab.config.gitlab.host }))
|
||||
end
|
||||
end
|
||||
|
|
@ -125,7 +125,7 @@ module Emails
|
|||
@user = user
|
||||
|
||||
Gitlab::I18n.with_locale(@user.preferred_language) do
|
||||
mail(to: @user.notification_email, subject: subject(_("Two-factor authentication disabled")))
|
||||
mail(to: @user.notification_email_or_default, subject: subject(_("Two-factor authentication disabled")))
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -26,11 +26,13 @@ module Ci
|
|||
private
|
||||
|
||||
def args_from_build(build)
|
||||
project = build.project
|
||||
|
||||
args = {
|
||||
build: build,
|
||||
project: build.project,
|
||||
project: project,
|
||||
protected: build.protected?,
|
||||
namespace: build.project.namespace
|
||||
namespace: project.namespace
|
||||
}
|
||||
|
||||
if Feature.enabled?(:ci_pending_builds_maintain_tags_data, type: :development, default_enabled: :yaml)
|
||||
|
|
@ -38,29 +40,26 @@ module Ci
|
|||
end
|
||||
|
||||
if Feature.enabled?(:ci_pending_builds_maintain_shared_runners_data, type: :development, default_enabled: :yaml)
|
||||
args.store(:instance_runners_enabled, shareable?(build))
|
||||
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
|
||||
|
||||
args
|
||||
end
|
||||
|
||||
def shareable?(build)
|
||||
shared_runner_enabled?(build) &&
|
||||
builds_access_level?(build) &&
|
||||
project_not_removed?(build)
|
||||
def shared_runners_enabled?(project)
|
||||
builds_enabled?(project) && project.shared_runners_enabled?
|
||||
end
|
||||
|
||||
def shared_runner_enabled?(build)
|
||||
build.project.shared_runners.exists?
|
||||
def group_runners_enabled?(project)
|
||||
builds_enabled?(project) && project.group_runners_enabled?
|
||||
end
|
||||
|
||||
def project_not_removed?(build)
|
||||
!build.project.pending_delete?
|
||||
end
|
||||
|
||||
def 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
|
||||
end
|
||||
|
|
|
|||
|
|
@ -387,6 +387,12 @@ module Ci
|
|||
read_attribute(:contacted_at)
|
||||
end
|
||||
|
||||
def namespace_ids
|
||||
strong_memoize(:namespace_ids) do
|
||||
runner_namespaces.pluck(:namespace_id).compact
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def cleanup_runner_queue
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ class Namespace < ApplicationRecord
|
|||
has_one :admin_note, inverse_of: :namespace
|
||||
accepts_nested_attributes_for :admin_note, update_only: true
|
||||
|
||||
validates :owner, presence: true, unless: ->(n) { n.type == "Group" }
|
||||
validates :owner, presence: true, if: ->(n) { n.type.nil? }
|
||||
validates :name,
|
||||
presence: true,
|
||||
length: { maximum: 255 }
|
||||
|
|
|
|||
|
|
@ -161,6 +161,8 @@ class Project < ApplicationRecord
|
|||
belongs_to :creator, class_name: 'User'
|
||||
belongs_to :group, -> { where(type: 'Group') }, foreign_key: 'namespace_id'
|
||||
belongs_to :namespace
|
||||
# Sync deletion via DB Trigger to ensure we do not have
|
||||
# a project without a project_namespace (or vice-versa)
|
||||
belongs_to :project_namespace, class_name: 'Namespaces::ProjectNamespace', foreign_key: 'project_namespace_id', inverse_of: :project
|
||||
alias_method :parent, :namespace
|
||||
alias_attribute :parent_id, :namespace_id
|
||||
|
|
|
|||
|
|
@ -229,10 +229,9 @@ class User < ApplicationRecord
|
|||
validates :first_name, length: { maximum: 127 }
|
||||
validates :last_name, length: { maximum: 127 }
|
||||
validates :email, confirmation: true
|
||||
validates :notification_email, presence: true
|
||||
validates :notification_email, devise_email: true, if: ->(user) { user.notification_email != user.email }
|
||||
validates :notification_email, devise_email: true, allow_blank: true, if: ->(user) { user.notification_email != user.email }
|
||||
validates :public_email, uniqueness: true, devise_email: true, allow_blank: true
|
||||
validates :commit_email, devise_email: true, allow_nil: true, if: ->(user) { user.commit_email != user.email }
|
||||
validates :commit_email, devise_email: true, allow_blank: true, if: ->(user) { user.commit_email != user.email }
|
||||
validates :projects_limit,
|
||||
presence: true,
|
||||
numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: Gitlab::Database::MAX_INT_VALUE }
|
||||
|
|
@ -384,7 +383,7 @@ class User < ApplicationRecord
|
|||
after_transition any => :deactivated do |user|
|
||||
next unless Gitlab::CurrentSettings.user_deactivation_emails_enabled
|
||||
|
||||
NotificationService.new.user_deactivated(user.name, user.notification_email)
|
||||
NotificationService.new.user_deactivated(user.name, user.notification_email_or_default)
|
||||
end
|
||||
# rubocop: enable CodeReuse/ServiceClass
|
||||
|
||||
|
|
@ -932,33 +931,18 @@ class User < ApplicationRecord
|
|||
end
|
||||
end
|
||||
|
||||
# Define commit_email-related attribute methods explicitly instead of relying
|
||||
# on ActiveRecord to provide them. Some of the specs use the current state of
|
||||
# the model code but an older database schema, so we need to guard against the
|
||||
# possibility of the commit_email column not existing.
|
||||
|
||||
def commit_email
|
||||
return self.email unless has_attribute?(:commit_email)
|
||||
|
||||
if super == Gitlab::PrivateCommitEmail::TOKEN
|
||||
def commit_email_or_default
|
||||
if self.commit_email == Gitlab::PrivateCommitEmail::TOKEN
|
||||
return private_commit_email
|
||||
end
|
||||
|
||||
# The commit email is the same as the primary email if undefined
|
||||
super.presence || self.email
|
||||
self.commit_email.presence || self.email
|
||||
end
|
||||
|
||||
def commit_email=(email)
|
||||
super if has_attribute?(:commit_email)
|
||||
end
|
||||
|
||||
def commit_email_changed?
|
||||
has_attribute?(:commit_email) && super
|
||||
end
|
||||
|
||||
def notification_email
|
||||
def notification_email_or_default
|
||||
# The notification email is the same as the primary email if undefined
|
||||
super.presence || self.email
|
||||
self.notification_email.presence || self.email
|
||||
end
|
||||
|
||||
def private_commit_email
|
||||
|
|
@ -1640,7 +1624,7 @@ class User < ApplicationRecord
|
|||
|
||||
def notification_email_for(notification_group)
|
||||
# Return group-specific email address if present, otherwise return global notification email address
|
||||
notification_group&.notification_email_for(self) || notification_email
|
||||
notification_group&.notification_email_for(self) || notification_email_or_default
|
||||
end
|
||||
|
||||
def notification_settings_for(source, inherit: false)
|
||||
|
|
@ -2019,7 +2003,7 @@ class User < ApplicationRecord
|
|||
private
|
||||
|
||||
def notification_email_verified
|
||||
return if read_attribute(:notification_email).blank? || temp_oauth_email?
|
||||
return if notification_email.blank? || temp_oauth_email?
|
||||
|
||||
errors.add(:notification_email, _("must be an email you have verified")) unless verified_emails.include?(notification_email)
|
||||
end
|
||||
|
|
@ -2031,7 +2015,7 @@ class User < ApplicationRecord
|
|||
end
|
||||
|
||||
def commit_email_verified
|
||||
return if read_attribute(:commit_email).blank?
|
||||
return if commit_email.blank?
|
||||
|
||||
errors.add(:commit_email, _("must be an email you have verified")) unless verified_emails.include?(commit_email)
|
||||
end
|
||||
|
|
@ -2112,7 +2096,7 @@ class User < ApplicationRecord
|
|||
def check_username_format
|
||||
return if username.blank? || Mime::EXTENSION_LOOKUP.keys.none? { |type| username.end_with?(".#{type}") }
|
||||
|
||||
errors.add(:username, _('ending with MIME type format is not allowed.'))
|
||||
errors.add(:username, _('ending with a file extension is not allowed.'))
|
||||
end
|
||||
|
||||
def groups_with_developer_maintainer_project_access
|
||||
|
|
|
|||
|
|
@ -8,7 +8,6 @@ module Ci
|
|||
def execute(schedule, fallback_method:)
|
||||
@schedule = schedule
|
||||
|
||||
return fallback_method.call unless ::Feature.enabled?(:ci_daily_limit_for_pipeline_schedules, project, default_enabled: :yaml)
|
||||
return fallback_method.call unless plan_cron&.cron_valid?
|
||||
|
||||
now = Time.zone.now
|
||||
|
|
|
|||
|
|
@ -24,21 +24,25 @@ module Ci
|
|||
|
||||
# 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)
|
||||
if strategy.use_denormalized_namespace_traversal_ids?
|
||||
strategy.builds_for_group_runner
|
||||
else
|
||||
# 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
|
||||
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
|
||||
projects = Project.where(namespace_id: hierarchy_groups)
|
||||
.with_group_runners_enabled
|
||||
.with_builds_enabled
|
||||
.without_deleted
|
||||
|
||||
relation = new_builds.where(project: projects)
|
||||
relation = new_builds.where(project: projects)
|
||||
|
||||
order(relation)
|
||||
order(relation)
|
||||
end
|
||||
end
|
||||
|
||||
def builds_for_project_runner
|
||||
|
|
|
|||
|
|
@ -31,6 +31,10 @@ module Ci
|
|||
end
|
||||
end
|
||||
|
||||
def builds_for_group_runner
|
||||
raise NotImplementedError
|
||||
end
|
||||
|
||||
def builds_matching_tag_ids(relation, ids)
|
||||
# pick builds that does not have other tags than runner's one
|
||||
relation.matches_tag_ids(ids)
|
||||
|
|
@ -61,6 +65,10 @@ module Ci
|
|||
false
|
||||
end
|
||||
|
||||
def use_denormalized_namespace_traversal_ids?
|
||||
false
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def running_builds_for_shared_runners
|
||||
|
|
|
|||
|
|
@ -16,6 +16,12 @@ module Ci
|
|||
builds_ordered_for_shared_runners(shared_builds)
|
||||
end
|
||||
|
||||
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)
|
||||
end
|
||||
|
||||
def builds_matching_tag_ids(relation, ids)
|
||||
if ::Feature.enabled?(:ci_queueing_denormalize_tags_information, runner, default_enabled: :yaml)
|
||||
relation.where('tag_ids <@ ARRAY[?]::int[]', runner.tags_ids)
|
||||
|
|
@ -52,6 +58,10 @@ module Ci
|
|||
::Feature.enabled?(:ci_queueing_denormalize_ci_minutes_information, runner, type: :development, default_enabled: :yaml)
|
||||
end
|
||||
|
||||
def use_denormalized_namespace_traversal_ids?
|
||||
::Feature.enabled?(:ci_queueing_denormalize_namespace_traversal_ids, runner, type: :development, default_enabled: :yaml)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def builds_available_for_shared_runners
|
||||
|
|
|
|||
|
|
@ -2,36 +2,31 @@
|
|||
= form_errors(@application_setting)
|
||||
|
||||
%fieldset
|
||||
%h5
|
||||
= _('Unauthenticated API request rate limit')
|
||||
= _("The package registry rate limits can help reduce request volume (like from crawlers or abusive bots).")
|
||||
|
||||
%fieldset
|
||||
.form-group
|
||||
.form-check
|
||||
= f.check_box :throttle_unauthenticated_packages_api_enabled, class: 'form-check-input', data: { qa_selector: 'throttle_unauthenticated_packages_api_checkbox' }
|
||||
= f.label :throttle_unauthenticated_packages_api_enabled, class: 'form-check-label label-bold' do
|
||||
= _('Enable unauthenticated API request rate limit')
|
||||
%span.form-text.text-muted
|
||||
= _('Helps reduce request volume (e.g. from crawlers or abusive bots)')
|
||||
.form-group
|
||||
= f.label :throttle_unauthenticated_packages_api_requests_per_period, 'Max unauthenticated API requests per period per IP', class: 'label-bold'
|
||||
= f.label :throttle_unauthenticated_packages_api_requests_per_period, _('Maximum unauthenticated API requests per rate limit period per IP'), class: 'label-bold'
|
||||
= f.number_field :throttle_unauthenticated_packages_api_requests_per_period, class: 'form-control gl-form-input'
|
||||
.form-group
|
||||
= f.label :throttle_unauthenticated_packages_api_period_in_seconds, 'Unauthenticated API rate limit period in seconds', class: 'label-bold'
|
||||
= f.label :throttle_unauthenticated_packages_api_period_in_seconds, _('Unauthenticated API rate limit period in seconds'), class: 'label-bold'
|
||||
= f.number_field :throttle_unauthenticated_packages_api_period_in_seconds, class: 'form-control gl-form-input'
|
||||
%hr
|
||||
%h5
|
||||
= _('Authenticated API request rate limit')
|
||||
.form-group
|
||||
.form-check
|
||||
= f.check_box :throttle_authenticated_packages_api_enabled, class: 'form-check-input', data: { qa_selector: 'throttle_authenticated_packages_api_checkbox' }
|
||||
= f.label :throttle_authenticated_packages_api_enabled, class: 'form-check-label label-bold' do
|
||||
= _('Enable authenticated API request rate limit')
|
||||
%span.form-text.text-muted
|
||||
= _('Helps reduce request volume (e.g. from crawlers or abusive bots)')
|
||||
.form-group
|
||||
= f.label :throttle_authenticated_packages_api_requests_per_period, 'Max authenticated API requests per period per user', class: 'label-bold'
|
||||
= f.label :throttle_authenticated_packages_api_requests_per_period, _('Maximum authenticated API requests per rate limit period per user'), class: 'label-bold'
|
||||
= f.number_field :throttle_authenticated_packages_api_requests_per_period, class: 'form-control gl-form-input'
|
||||
.form-group
|
||||
= f.label :throttle_authenticated_packages_api_period_in_seconds, 'Authenticated API rate limit period in seconds', class: 'label-bold'
|
||||
= f.label :throttle_authenticated_packages_api_period_in_seconds, _('Authenticated API rate limit period in seconds'), class: 'label-bold'
|
||||
= f.number_field :throttle_authenticated_packages_api_period_in_seconds, class: 'form-control gl-form-input'
|
||||
|
||||
= f.submit _('Save changes'), class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' }
|
||||
|
|
|
|||
|
|
@ -27,11 +27,12 @@
|
|||
%section.settings.as-packages-limits.no-animate#js-packages-limits-settings{ class: ('expanded' if expanded_by_default?), data: { qa_selector: 'packages_limits_content' } }
|
||||
.settings-header
|
||||
%h4
|
||||
= _('Package Registry Rate Limits')
|
||||
= _('Package registry rate limits')
|
||||
%button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
|
||||
= expanded_by_default? ? _('Collapse') : _('Expand')
|
||||
%p
|
||||
= _('Configure specific limits for Packages API requests that supersede the general user and IP rate limits.')
|
||||
= _('Set rate limits for package registry API requests that supersede the general user and IP rate limits.')
|
||||
= link_to _('Learn more.'), help_page_path('user/admin_area/settings/package_registry_rate_limits.md'), target: '_blank', rel: 'noopener noreferrer'
|
||||
.settings-content
|
||||
= render 'package_registry_limits'
|
||||
- if Feature.enabled?(:files_api_throttling, default_enabled: :yaml)
|
||||
|
|
|
|||
|
|
@ -11,6 +11,6 @@
|
|||
- commit_email_link_url = help_page_path('user/profile/index', anchor: 'change-the-email-displayed-on-your-commits', target: '_blank')
|
||||
- commit_email_link_start = '<a href="%{url}">'.html_safe % { url: commit_email_link_url }
|
||||
- commit_email_docs_link = s_('Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}').html_safe % { commit_email_link_start: commit_email_link_start, commit_email_link_end: '</a>'.html_safe }
|
||||
= form.select :commit_email, options_for_select(commit_email_select_options(@user), selected: @user.read_attribute(:commit_email)),
|
||||
= form.select :commit_email, options_for_select(commit_email_select_options(@user), selected: @user.commit_email),
|
||||
{ help: commit_email_docs_link },
|
||||
control_class: 'select2 input-lg', disabled: email_change_disabled
|
||||
|
|
|
|||
|
|
@ -38,21 +38,21 @@
|
|||
= render partial: 'shared/email_with_badge', locals: { email: @primary_email, verified: current_user.confirmed? }
|
||||
%span.float-right
|
||||
%span.badge.badge-muted.badge-pill.gl-badge.badge-success= s_('Profiles|Primary email')
|
||||
- if @primary_email === current_user.commit_email
|
||||
- if @primary_email === current_user.commit_email_or_default
|
||||
%span.badge.badge-muted.badge-pill.gl-badge.badge-info= s_('Profiles|Commit email')
|
||||
- if @primary_email === current_user.public_email
|
||||
%span.badge.badge-muted.badge-pill.gl-badge.badge-info= s_('Profiles|Public email')
|
||||
- if @primary_email === current_user.notification_email
|
||||
- if @primary_email === current_user.notification_email_or_default
|
||||
%span.badge.badge-muted.badge-pill.gl-badge.badge-info= s_('Profiles|Default notification email')
|
||||
- @emails.each do |email|
|
||||
%li{ data: { qa_selector: 'email_row_content' } }
|
||||
= render partial: 'shared/email_with_badge', locals: { email: email.email, verified: email.confirmed? }
|
||||
%span.float-right
|
||||
- if email.email === current_user.commit_email
|
||||
- if email.email === current_user.commit_email_or_default
|
||||
%span.badge.badge-muted.badge-pill.gl-badge.badge-info= s_('Profiles|Commit email')
|
||||
- if email.email === current_user.public_email
|
||||
%span.badge.badge-muted.badge-pill.gl-badge.badge-info= s_('Profiles|Public email')
|
||||
- if email.email === current_user.notification_email
|
||||
- if email.email === current_user.notification_email_or_default
|
||||
%span.badge.badge-muted.badge-pill.gl-badge.badge-info= s_('Profiles|Notification email')
|
||||
- unless email.confirmed?
|
||||
- confirm_title = "#{email.confirmation_sent_at ? _('Resend confirmation email') : _('Send confirmation email')}"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
- form = local_assigns.fetch(:form)
|
||||
.form-group
|
||||
= form.label :notification_email, class: "label-bold"
|
||||
= form.select :notification_email, @user.public_verified_emails, { include_blank: _('Use primary email (%{email})') % { email: @user.email }, selected: @user.read_attribute(:notification_email) }, class: "select2", disabled: local_assigns.fetch(:email_change_disabled, nil)
|
||||
= form.select :notification_email, @user.public_verified_emails, { include_blank: _('Use primary email (%{email})') % { email: @user.email }, selected: @user.notification_email }, class: "select2", disabled: local_assigns.fetch(:email_change_disabled, nil)
|
||||
.help-block
|
||||
= local_assigns.fetch(:help_text, nil)
|
||||
.form-group
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
- show_export_button = local_assigns.fetch(:show_export_button, true)
|
||||
- issuable_type = 'issues'
|
||||
- can_edit = can?(current_user, :admin_project, @project)
|
||||
- notification_email = @current_user.present? ? @current_user.notification_email : nil
|
||||
- notification_email = @current_user.present? ? @current_user.notification_email_or_default : nil
|
||||
|
||||
.nav-controls.issues-nav-controls
|
||||
- if show_feed_buttons
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
- issuable_type = 'merge-requests'
|
||||
- notification_email = @current_user.present? ? @current_user.notification_email : nil
|
||||
- notification_email = @current_user.present? ? @current_user.notification_email_or_default : nil
|
||||
|
||||
= render 'shared/issuable/feed_buttons', show_calendar_button: false
|
||||
.js-csv-import-export-buttons{ data: { show_export_button: "true", issuable_type: issuable_type, issuable_count: issuables_count_for_state(issuable_type.to_sym, params[:state]), email: notification_email, export_csv_path: export_csv_project_merge_requests_path(@project, request.query_parameters), container_class: 'gl-mr-3' } }
|
||||
|
|
|
|||
|
|
@ -1,8 +0,0 @@
|
|||
---
|
||||
name: ci_daily_limit_for_pipeline_schedules
|
||||
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/62826
|
||||
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/332333
|
||||
milestone: '14.0'
|
||||
type: development
|
||||
group: group::pipeline authoring
|
||||
default_enabled: true
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
---
|
||||
name: ci_pending_builds_maintain_namespace_traversal_ids
|
||||
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70162
|
||||
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/340930
|
||||
milestone: '14.3'
|
||||
type: development
|
||||
group: group::pipeline execution
|
||||
default_enabled: false
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
---
|
||||
name: ci_queueing_denormalize_namespace_traversal_ids
|
||||
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70162
|
||||
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/340930
|
||||
milestone: '14.3'
|
||||
type: development
|
||||
group: group::pipeline execution
|
||||
default_enabled: false
|
||||
|
|
@ -7,7 +7,7 @@ product_stage: release
|
|||
product_group: group::ops release
|
||||
product_category:
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
milestone: "13.2"
|
||||
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/35493
|
||||
time_frame: 28d
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: manage
|
|||
product_group: group::optimize
|
||||
product_category:
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: manage
|
|||
product_group: group::optimize
|
||||
product_category:
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
instrumentation_class: RedisHLLMetric
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: manage
|
|||
product_group: group::optimize
|
||||
product_category:
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
instrumentation_class: RedisHLLMetric
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: fulfillment
|
|||
product_group: group::utilization
|
||||
product_category:
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
instrumentation_class: RedisHLLMetric
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: manage
|
|||
product_group: group::optimize
|
||||
product_category:
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
instrumentation_class: RedisHLLMetric
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: manage
|
|||
product_group: group::optimize
|
||||
product_category:
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
instrumentation_class: RedisHLLMetric
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: manage
|
|||
product_group: group::optimize
|
||||
product_category:
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
instrumentation_class: RedisHLLMetric
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: create
|
|||
product_group: group::code review
|
||||
product_category: code_review
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: database
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ product_stage: create
|
|||
product_group: group::source code
|
||||
product_category: source_code_management
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: database
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ product_stage: create
|
|||
product_group: group::source code
|
||||
product_category: source_code_management
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: database
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: create
|
|||
product_group: group::code review
|
||||
product_category: code_review
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ product_stage: create
|
|||
product_group: group::code review
|
||||
product_category: code_review
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: database
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: create
|
|||
product_group: group::code review
|
||||
product_category: code_review
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
instrumentation_class: RedisHLLMetric
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: create
|
|||
product_group: group::source code
|
||||
product_category: source_code_management
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
instrumentation_class: RedisHLLMetric
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: create
|
|||
product_group: group::code review
|
||||
product_category: code_review
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
instrumentation_class: RedisHLLMetric
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: create
|
|||
product_group: group::code review
|
||||
product_category: code_review
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
instrumentation_class: RedisHLLMetric
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: create
|
|||
product_group: group::code review
|
||||
product_category: code_review
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
instrumentation_class: RedisHLLMetric
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: create
|
|||
product_group: group::code review
|
||||
product_category: code_review
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
instrumentation_class: RedisHLLMetric
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: create
|
|||
product_group: group::code review
|
||||
product_category: code_review
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
instrumentation_class: RedisHLLMetric
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: create
|
|||
product_group: group::code review
|
||||
product_category: code_review
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
instrumentation_class: RedisHLLMetric
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: create
|
|||
product_group: group::code review
|
||||
product_category: code_review
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
instrumentation_class: RedisHLLMetric
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: create
|
|||
product_group: group::code review
|
||||
product_category: code_review
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
instrumentation_class: RedisHLLMetric
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: create
|
|||
product_group: group::code review
|
||||
product_category: code_review
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
instrumentation_class: RedisHLLMetric
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: create
|
|||
product_group: group::code review
|
||||
product_category: code_review
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
instrumentation_class: RedisHLLMetric
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: create
|
|||
product_group: group::code review
|
||||
product_category: code_review
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
instrumentation_class: RedisHLLMetric
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: create
|
|||
product_group: group::code review
|
||||
product_category: code_review
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
instrumentation_class: RedisHLLMetric
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: configure
|
|||
product_group: group::configure
|
||||
product_category: kubernetes_management
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: database
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: configure
|
|||
product_group: group::configure
|
||||
product_category: kubernetes_management
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: database
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: configure
|
|||
product_group: group::configure
|
||||
product_category: kubernetes_management
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: database
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: configure
|
|||
product_group: group::configure
|
||||
product_category: kubernetes_management
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: database
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ product_stage: configure
|
|||
product_group: group::configure
|
||||
product_category: kubernetes_management
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: database
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: configure
|
|||
product_group: group::configure
|
||||
product_category: kubernetes_management
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: database
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: configure
|
|||
product_group: group::configure
|
||||
product_category: kubernetes_management
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: database
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: configure
|
|||
product_group: group::configure
|
||||
product_category: kubernetes_management
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: database
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: configure
|
|||
product_group: group::configure
|
||||
product_category: kubernetes_management
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: database
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: configure
|
|||
product_group: group::configure
|
||||
product_category: kubernetes_management
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: database
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: configure
|
|||
product_group: group::configure
|
||||
product_category: kubernetes_management
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: database
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: configure
|
|||
product_group: group::configure
|
||||
product_category: kubernetes_management
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: database
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: configure
|
|||
product_group: group::configure
|
||||
product_category: kubernetes_management
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: database
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: configure
|
|||
product_group: group::configure
|
||||
product_category: kubernetes_management
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: database
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: configure
|
|||
product_group: group::configure
|
||||
product_category: kubernetes_management
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: database
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: configure
|
|||
product_group: group::configure
|
||||
product_category: kubernetes_management
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: database
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: verify
|
|||
product_group: group::pipeline execution
|
||||
product_category: continuous_integration
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: database
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: verify
|
|||
product_group: group::pipeline execution
|
||||
product_category: continuous_integration
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: database
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: verify
|
|||
product_group: group::pipeline execution
|
||||
product_category: continuous_integration
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: database
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: configure
|
|||
product_group: group::configure
|
||||
product_category: auto_devops
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: database
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: verify
|
|||
product_group: group::pipeline execution
|
||||
product_category: continuous_integration
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: database
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: verify
|
|||
product_group: group::pipeline execution
|
||||
product_category: continuous_integration
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: database
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: verify
|
|||
product_group: group::pipeline execution
|
||||
product_category: continuous_integration
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: database
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: verify
|
|||
product_group: group::pipeline execution
|
||||
product_category: continuous_integration
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: database
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: create
|
|||
product_group: group::editor
|
||||
product_category: snippets
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: database
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: create
|
|||
product_group: group::editor
|
||||
product_category: snippets
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: database
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: create
|
|||
product_group: group::editor
|
||||
product_category: snippets
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: database
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ product_stage: create
|
|||
product_group: group::editor
|
||||
product_category: snippets
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: database
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: create
|
|||
product_group: group::editor
|
||||
product_category: web_ide
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: create
|
|||
product_group: group::editor
|
||||
product_category: web_ide
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: create
|
|||
product_group: group::editor
|
||||
product_category: snippets
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: create
|
|||
product_group: group::editor
|
||||
product_category: static_site_editor
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: create
|
|||
product_group: group::editor
|
||||
product_category: web_ide
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: create
|
|||
product_group: group::editor
|
||||
product_category: web_ide
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
instrumentation_class: RedisHLLMetric
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: create
|
|||
product_group: group::editor
|
||||
product_category: web_ide
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
instrumentation_class: RedisHLLMetric
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: create
|
|||
product_group: group::editor
|
||||
product_category: snippets
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
instrumentation_class: RedisHLLMetric
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: create
|
|||
product_group: group::editor
|
||||
product_category: web_ide
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
instrumentation_class: RedisHLLMetric
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: enablement
|
|||
product_group: group::global search
|
||||
product_category: global_search
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
instrumentation_class: RedisHLLMetric
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ product_stage: enablement
|
|||
product_group: group::global search
|
||||
product_category: global_search
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
instrumentation_class: RedisHLLMetric
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: monitor
|
|||
product_group: group::monitor
|
||||
product_category: incident_management
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: monitor
|
|||
product_group: group::monitor
|
||||
product_category: incident_management
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: monitor
|
|||
product_group: group::monitor
|
||||
product_category: incident_management
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: database
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ product_stage: monitor
|
|||
product_group: group::monitor
|
||||
product_category: incident_management
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: database
|
||||
distribution:
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ product_stage: monitor
|
|||
product_group: group::monitor
|
||||
product_category:
|
||||
value_type: number
|
||||
status: data_available
|
||||
status: active
|
||||
time_frame: 28d
|
||||
data_source: redis_hll
|
||||
instrumentation_class: RedisHLLMetric
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue