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:
authorGitLab Bot <gitlab-bot@gitlab.com>2024-01-18 15:08:09 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2024-01-18 15:08:09 +0300
commit823d2f9a2c8796e5061c59595f96a1132641b26a (patch)
tree219b13820bd398acc48f3cc719c7a7bfdf77aa26
parent627bd5db4e091d0be312c880cbb9139b7c86818b (diff)
Add latest changes from gitlab-org/gitlab@master
-rw-r--r--app/assets/javascripts/filtered_search/add_extra_tokens_for_merge_requests.js17
-rw-r--r--app/assets/javascripts/filtered_search/available_dropdown_mappings.js6
-rw-r--r--app/assets/javascripts/filtered_search/constants.js2
-rw-r--r--app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js2
-rw-r--r--app/assets/stylesheets/framework/super_sidebar.scss8
-rw-r--r--app/assets/stylesheets/page_bundles/settings.scss1
-rw-r--r--app/assets/stylesheets/utilities.scss6
-rw-r--r--app/controllers/dashboard_controller.rb1
-rw-r--r--app/controllers/groups_controller.rb1
-rw-r--r--app/controllers/projects/merge_requests_controller.rb1
-rw-r--r--app/finders/concerns/merge_user_filter.rb19
-rw-r--r--app/finders/merge_requests_finder.rb4
-rw-r--r--app/finders/merge_requests_finder/params.rb10
-rw-r--r--app/models/merge_request/metrics.rb1
-rw-r--r--app/views/shared/issuable/_merge_user_dropdown.html.haml9
-rw-r--r--app/views/shared/issuable/_search_bar.html.haml2
-rw-r--r--config/feature_flags/development/mr_merge_user_filter.yml8
-rw-r--r--db/post_migrate/20240117132031_routing_table_prepare_constraint_for_pipeline_variables.rb32
-rw-r--r--db/schema_migrations/202401171320311
-rw-r--r--db/structure.sql6
-rw-r--r--doc/administration/geo/index.md2
-rw-r--r--doc/administration/geo/replication/container_registry.md2
-rw-r--r--doc/administration/geo/replication/faq.md26
-rw-r--r--doc/administration/geo/replication/usage.md8
-rw-r--r--doc/administration/geo/setup/external_database.md12
-rw-r--r--doc/administration/instance_limits.md3
-rw-r--r--doc/administration/reference_architectures/10k_users.md32
-rw-r--r--doc/administration/reference_architectures/25k_users.md32
-rw-r--r--doc/administration/reference_architectures/3k_users.md30
-rw-r--r--doc/administration/reference_architectures/50k_users.md32
-rw-r--r--doc/administration/reference_architectures/5k_users.md30
-rw-r--r--doc/administration/reference_architectures/index.md35
-rw-r--r--doc/administration/reply_by_email_postfix_setup.md2
-rw-r--r--doc/api/members.md1
-rw-r--r--doc/api/merge_requests.md6
-rw-r--r--doc/development/fe_guide/view_component.md2
-rw-r--r--doc/development/testing_guide/end_to_end/beginners_guide.md8
-rw-r--r--doc/development/testing_guide/end_to_end/capybara_to_chemlab_migration_guide.md4
-rw-r--r--doc/development/testing_guide/end_to_end/page_objects.md12
-rw-r--r--doc/install/requirements.md10
-rw-r--r--doc/subscriptions/gitlab_com/index.md14
-rw-r--r--doc/user/application_security/sast/index.md4
-rw-r--r--doc/user/project/members/share_project_with_groups.md2
-rw-r--r--doc/user/project/merge_requests/index.md2
-rw-r--r--lib/api/helpers/merge_requests_helpers.rb5
-rw-r--r--lib/gitlab/ci/templates/Jobs/Dependency-Scanning.latest.gitlab-ci.yml24
-rw-r--r--lib/gitlab/database/partitioning/list/convert_table.rb66
-rw-r--r--locale/gitlab.pot16
-rw-r--r--package.json4
-rw-r--r--spec/factories/projects.rb33
-rw-r--r--spec/finders/merge_requests_finder_spec.rb67
-rw-r--r--spec/frontend/fixtures/static/textarea.html2
-rw-r--r--spec/frontend/vue_shared/components/form/input_copy_toggle_visibility_spec.js6
-rw-r--r--spec/helpers/search_helper_spec.rb8
-rw-r--r--spec/lib/gitlab/database/partitioning/list/convert_table_spec.rb33
-rw-r--r--spec/lib/service_ping/build_payload_spec.rb3
-rw-r--r--spec/requests/api/merge_requests_spec.rb81
-rw-r--r--spec/spec_helper.rb8
-rw-r--r--spec/support/helpers/debug_with_puts.rb13
-rw-r--r--spec/support/helpers/stub_requests.rb6
-rw-r--r--yarn.lock16
61 files changed, 556 insertions, 283 deletions
diff --git a/app/assets/javascripts/filtered_search/add_extra_tokens_for_merge_requests.js b/app/assets/javascripts/filtered_search/add_extra_tokens_for_merge_requests.js
index 698302c5209..bda2b05fb8f 100644
--- a/app/assets/javascripts/filtered_search/add_extra_tokens_for_merge_requests.js
+++ b/app/assets/javascripts/filtered_search/add_extra_tokens_for_merge_requests.js
@@ -1,8 +1,10 @@
import { __ } from '~/locale';
import {
TOKEN_TITLE_APPROVED_BY,
+ TOKEN_TITLE_MERGE_USER,
TOKEN_TITLE_REVIEWER,
TOKEN_TYPE_APPROVED_BY,
+ TOKEN_TYPE_MERGE_USER,
TOKEN_TYPE_REVIEWER,
TOKEN_TYPE_TARGET_BRANCH,
TOKEN_TYPE_SOURCE_BRANCH,
@@ -174,6 +176,21 @@ export default (
);
IssuableTokenKeys.conditions.push(...approvedBy.condition);
+ const mergeUserToken = {
+ formattedKey: TOKEN_TITLE_MERGE_USER,
+ key: TOKEN_TYPE_MERGE_USER,
+ type: 'string',
+ param: 'username',
+ symbol: '@',
+ icon: 'merge',
+ tag: '@merge_user',
+ hideNotEqual: true,
+ };
+ if (gon.features.mrMergeUserFilter) {
+ IssuableTokenKeys.tokenKeys.splice(3, 0, mergeUserToken);
+ IssuableTokenKeys.tokenKeysWithAlternative.splice(3, 0, mergeUserToken);
+ }
+
if (!disableEnvironmentFilter) {
const environmentToken = {
formattedKey: __('Environment'),
diff --git a/app/assets/javascripts/filtered_search/available_dropdown_mappings.js b/app/assets/javascripts/filtered_search/available_dropdown_mappings.js
index a1782c549d6..e1a5b269fa7 100644
--- a/app/assets/javascripts/filtered_search/available_dropdown_mappings.js
+++ b/app/assets/javascripts/filtered_search/available_dropdown_mappings.js
@@ -2,6 +2,7 @@ import { sortMilestonesByDueDate } from '~/milestones/utils';
import { mergeUrlParams } from '~/lib/utils/url_utility';
import {
TOKEN_TYPE_APPROVED_BY,
+ TOKEN_TYPE_MERGE_USER,
TOKEN_TYPE_ASSIGNEE,
TOKEN_TYPE_AUTHOR,
TOKEN_TYPE_CONFIDENTIAL,
@@ -86,6 +87,11 @@ export default class AvailableDropdownMappings {
gl: DropdownUser,
element: this.container.querySelector('#js-dropdown-reviewer'),
},
+ [TOKEN_TYPE_MERGE_USER]: {
+ reference: null,
+ gl: DropdownUser,
+ element: this.container.querySelector('#js-dropdown-merge-user'),
+ },
attention: {
reference: null,
gl: DropdownUser,
diff --git a/app/assets/javascripts/filtered_search/constants.js b/app/assets/javascripts/filtered_search/constants.js
index b328ae6a872..39fa936895c 100644
--- a/app/assets/javascripts/filtered_search/constants.js
+++ b/app/assets/javascripts/filtered_search/constants.js
@@ -1,5 +1,6 @@
import {
TOKEN_TYPE_APPROVED_BY,
+ TOKEN_TYPE_MERGE_USER,
TOKEN_TYPE_ASSIGNEE,
TOKEN_TYPE_AUTHOR,
TOKEN_TYPE_REVIEWER,
@@ -9,6 +10,7 @@ export const USER_TOKEN_TYPES = [
TOKEN_TYPE_AUTHOR,
TOKEN_TYPE_ASSIGNEE,
TOKEN_TYPE_APPROVED_BY,
+ TOKEN_TYPE_MERGE_USER,
TOKEN_TYPE_REVIEWER,
'attention',
];
diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js b/app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js
index 6549de96c98..2879dcbdf0b 100644
--- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js
+++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js
@@ -62,6 +62,7 @@ export const TOKEN_EMPTY_SEARCH_TERM = {
};
export const TOKEN_TITLE_APPROVED_BY = __('Approved-By');
+export const TOKEN_TITLE_MERGE_USER = __('Merged-By');
export const TOKEN_TITLE_ASSIGNEE = s__('SearchToken|Assignee');
export const TOKEN_TITLE_AUTHOR = __('Author');
export const TOKEN_TITLE_CONFIDENTIAL = __('Confidential');
@@ -86,6 +87,7 @@ export const TOKEN_TITLE_CREATED = __('Created date');
export const TOKEN_TITLE_CLOSED = __('Closed date');
export const TOKEN_TYPE_APPROVED_BY = 'approved-by';
+export const TOKEN_TYPE_MERGE_USER = 'merge-user';
export const TOKEN_TYPE_ASSIGNEE = 'assignee';
export const TOKEN_TYPE_AUTHOR = 'author';
export const TOKEN_TYPE_CONFIDENTIAL = 'confidential';
diff --git a/app/assets/stylesheets/framework/super_sidebar.scss b/app/assets/stylesheets/framework/super_sidebar.scss
index 5a9a739fb13..23cd8cf259a 100644
--- a/app/assets/stylesheets/framework/super_sidebar.scss
+++ b/app/assets/stylesheets/framework/super_sidebar.scss
@@ -271,6 +271,14 @@ $super-sidebar-transition-hint-duration: $super-sidebar-transition-duration / 4;
}
}
+ /**
+ * Add transition to align with GlButton :hover/:focus transition
+ */
+ .brand-logo,
+ .user-bar-button {
+ @include transition(background-color, border-color, color, box-shadow);
+ }
+
.btn-default-tertiary {
mix-blend-mode: normal;
}
diff --git a/app/assets/stylesheets/page_bundles/settings.scss b/app/assets/stylesheets/page_bundles/settings.scss
index b906a932e70..f8a5f28170a 100644
--- a/app/assets/stylesheets/page_bundles/settings.scss
+++ b/app/assets/stylesheets/page_bundles/settings.scss
@@ -140,7 +140,6 @@
border-radius: $gl-border-radius-base;
}
-
.prometheus-metrics-monitoring {
.gl-card {
.badge.badge-pill {
diff --git a/app/assets/stylesheets/utilities.scss b/app/assets/stylesheets/utilities.scss
index 7ae17f4c191..781ab5629d7 100644
--- a/app/assets/stylesheets/utilities.scss
+++ b/app/assets/stylesheets/utilities.scss
@@ -146,3 +146,9 @@
.gl-pl-12 {
padding-left: $gl-spacing-scale-12;
}
+
+.gl-sm-mr-auto {
+ @media (min-width: $breakpoint-md) {
+ margin-right: auto;
+ }
+}
diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb
index a0997484c58..3cdfba61dad 100644
--- a/app/controllers/dashboard_controller.rb
+++ b/app/controllers/dashboard_controller.rb
@@ -19,6 +19,7 @@ class DashboardController < Dashboard::ApplicationController
before_action only: :merge_requests do
push_frontend_feature_flag(:mr_approved_filter, type: :ops)
+ push_frontend_feature_flag(:mr_merge_user_filter, type: :development)
end
respond_to :html
diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb
index b151793ad8b..6c2d8e42a98 100644
--- a/app/controllers/groups_controller.rb
+++ b/app/controllers/groups_controller.rb
@@ -45,6 +45,7 @@ class GroupsController < Groups::ApplicationController
before_action only: :merge_requests do
push_frontend_feature_flag(:mr_approved_filter, type: :ops)
+ push_frontend_feature_flag(:mr_merge_user_filter, type: :development)
end
helper_method :captcha_required?
diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
index 7aec5345c69..c3faec4c8ec 100644
--- a/app/controllers/projects/merge_requests_controller.rb
+++ b/app/controllers/projects/merge_requests_controller.rb
@@ -34,6 +34,7 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
before_action only: :index do
push_frontend_feature_flag(:mr_approved_filter, type: :ops)
+ push_frontend_feature_flag(:mr_merge_user_filter, type: :development)
end
before_action only: [:show, :diffs] do
diff --git a/app/finders/concerns/merge_user_filter.rb b/app/finders/concerns/merge_user_filter.rb
new file mode 100644
index 00000000000..bd35f12b5c7
--- /dev/null
+++ b/app/finders/concerns/merge_user_filter.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module MergeUserFilter
+ private
+
+ def by_merge_user(items)
+ return items unless params.merge_user_id? || params.merge_user_username?
+ return items if Feature.disabled?(:mr_merge_user_filter, type: :development)
+
+ mr_metrics_scope = MergeRequest::Metrics
+ mr_metrics_scope = mr_metrics_scope.merged_by(params.merge_user)
+
+ if params.merge_user
+ items.join_metrics.merge(mr_metrics_scope)
+ else # merge_user user not found
+ items.none
+ end
+ end
+end
diff --git a/app/finders/merge_requests_finder.rb b/app/finders/merge_requests_finder.rb
index b7de1c08f86..c19d8b68f60 100644
--- a/app/finders/merge_requests_finder.rb
+++ b/app/finders/merge_requests_finder.rb
@@ -33,6 +33,7 @@ class MergeRequestsFinder < IssuableFinder
extend ::Gitlab::Utils::Override
include MergedAtFilter
+ include MergeUserFilter
def self.scalar_params
@scalar_params ||= super + [
@@ -42,6 +43,8 @@ class MergeRequestsFinder < IssuableFinder
:deployed_before,
:draft,
:environment,
+ :merge_user_id,
+ :merge_user_username,
:merged_after,
:merged_before,
:reviewer_id,
@@ -69,6 +72,7 @@ class MergeRequestsFinder < IssuableFinder
items = by_source_branch(items)
items = by_draft(items)
items = by_target_branch(items)
+ items = by_merge_user(items)
items = by_merged_at(items)
items = by_approvals(items)
items = by_deployments(items)
diff --git a/app/finders/merge_requests_finder/params.rb b/app/finders/merge_requests_finder/params.rb
index 2c218898dcf..22ebe73abac 100644
--- a/app/finders/merge_requests_finder/params.rb
+++ b/app/finders/merge_requests_finder/params.rb
@@ -19,5 +19,15 @@ class MergeRequestsFinder
end
end
end
+
+ def merge_user
+ strong_memoize(:merge_user) do
+ if merge_user_id?
+ User.find_by_id(params[:merge_user_id])
+ elsif merge_user_username?
+ User.find_by_username(params[:merge_user_username])
+ end
+ end
+ end
end
end
diff --git a/app/models/merge_request/metrics.rb b/app/models/merge_request/metrics.rb
index 6d6c0ee07af..300152c57e0 100644
--- a/app/models/merge_request/metrics.rb
+++ b/app/models/merge_request/metrics.rb
@@ -11,6 +11,7 @@ class MergeRequest::Metrics < ApplicationRecord
scope :merged_after, ->(date) { where(arel_table[:merged_at].gteq(date)) }
scope :merged_before, ->(date) { where(arel_table[:merged_at].lteq(date.is_a?(Time) ? date.end_of_day : date)) }
+ scope :merged_by, ->(user) { where(merged_by_id: user) }
scope :with_valid_time_to_merge, -> { where(arel_table[:merged_at].gt(arel_table[:created_at])) }
scope :by_target_project, ->(project) { where(target_project_id: project) }
diff --git a/app/views/shared/issuable/_merge_user_dropdown.html.haml b/app/views/shared/issuable/_merge_user_dropdown.html.haml
new file mode 100644
index 00000000000..8577eb821e6
--- /dev/null
+++ b/app/views/shared/issuable/_merge_user_dropdown.html.haml
@@ -0,0 +1,9 @@
+#js-dropdown-merge-user.filtered-search-input-dropdown-menu.dropdown-menu
+ %ul{ data: { dropdown: true } }
+ - if current_user
+ = render 'shared/issuable/user_dropdown_item',
+ user: current_user
+ %ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
+ = render 'shared/issuable/user_dropdown_item',
+ user: User.new(username: '{{username}}', name: '{{name}}'),
+ avatar: { lazy: true, url: '{{avatar_url}}' }
diff --git a/app/views/shared/issuable/_search_bar.html.haml b/app/views/shared/issuable/_search_bar.html.haml
index 8db7f7345f4..33975ebbb42 100644
--- a/app/views/shared/issuable/_search_bar.html.haml
+++ b/app/views/shared/issuable/_search_bar.html.haml
@@ -93,6 +93,8 @@
avatar: { lazy: true, url: '{{avatar_url}}' }
= render_if_exists 'shared/issuable/approver_dropdown'
= render_if_exists 'shared/issuable/approved_by_dropdown'
+ - if ::Feature.enabled?(:mr_merge_user_filter, type: :development)
+ = render_if_exists 'shared/issuable/merge_user_dropdown'
#js-dropdown-milestone.filtered-search-input-dropdown-menu.dropdown-menu
%ul{ data: { dropdown: true } }
%li.filter-dropdown-item{ data: { value: 'None' } }
diff --git a/config/feature_flags/development/mr_merge_user_filter.yml b/config/feature_flags/development/mr_merge_user_filter.yml
new file mode 100644
index 00000000000..147de6b0eaa
--- /dev/null
+++ b/config/feature_flags/development/mr_merge_user_filter.yml
@@ -0,0 +1,8 @@
+---
+name: mr_merge_user_filter
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/140002
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/437871
+milestone: '16.9'
+type: development
+group: group::code review
+default_enabled: false
diff --git a/db/post_migrate/20240117132031_routing_table_prepare_constraint_for_pipeline_variables.rb b/db/post_migrate/20240117132031_routing_table_prepare_constraint_for_pipeline_variables.rb
new file mode 100644
index 00000000000..00591d7adbb
--- /dev/null
+++ b/db/post_migrate/20240117132031_routing_table_prepare_constraint_for_pipeline_variables.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+class RoutingTablePrepareConstraintForPipelineVariables < Gitlab::Database::Migration[2.2]
+ include Gitlab::Database::PartitioningMigrationHelpers::TableManagementHelpers
+
+ milestone '16.9'
+
+ disable_ddl_transaction!
+
+ TABLE_NAME = :ci_pipeline_variables
+ PARENT_TABLE_NAME = :p_ci_pipeline_variables
+ FIRST_PARTITION = [100, 101]
+ PARTITION_COLUMN = :partition_id
+
+ def up
+ prepare_constraint_for_list_partitioning(
+ table_name: TABLE_NAME,
+ partitioning_column: PARTITION_COLUMN,
+ parent_table_name: PARENT_TABLE_NAME,
+ initial_partitioning_value: FIRST_PARTITION
+ )
+ end
+
+ def down
+ revert_preparing_constraint_for_list_partitioning(
+ table_name: TABLE_NAME,
+ partitioning_column: PARTITION_COLUMN,
+ parent_table_name: PARENT_TABLE_NAME,
+ initial_partitioning_value: FIRST_PARTITION
+ )
+ end
+end
diff --git a/db/schema_migrations/20240117132031 b/db/schema_migrations/20240117132031
new file mode 100644
index 00000000000..a0ef1ac2ddc
--- /dev/null
+++ b/db/schema_migrations/20240117132031
@@ -0,0 +1 @@
+415eb5664fd908c7665b8f141e5f2bc8303f70a06b4a9ee3b88789d858f3cf19 \ No newline at end of file
diff --git a/db/structure.sql b/db/structure.sql
index 0abd72fb88c..90bfc512a51 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -14713,7 +14713,8 @@ CREATE TABLE ci_pipeline_variables (
partition_id bigint NOT NULL,
raw boolean DEFAULT false NOT NULL,
id bigint NOT NULL,
- pipeline_id bigint NOT NULL
+ pipeline_id bigint NOT NULL,
+ CONSTRAINT partitioning_constraint CHECK ((partition_id = ANY (ARRAY[(100)::bigint, (101)::bigint])))
);
CREATE SEQUENCE ci_pipeline_variables_id_seq
@@ -30141,9 +30142,6 @@ ALTER TABLE ONLY pages_domain_acme_orders
ALTER TABLE ONLY pages_domains
ADD CONSTRAINT pages_domains_pkey PRIMARY KEY (id);
-ALTER TABLE ci_pipeline_variables
- ADD CONSTRAINT partitioning_constraint CHECK ((partition_id = ANY (ARRAY[(100)::bigint, (101)::bigint]))) NOT VALID;
-
ALTER TABLE ONLY path_locks
ADD CONSTRAINT path_locks_pkey PRIMARY KEY (id);
diff --git a/doc/administration/geo/index.md b/doc/administration/geo/index.md
index 811ac92de27..83a52bb6107 100644
--- a/doc/administration/geo/index.md
+++ b/doc/administration/geo/index.md
@@ -124,7 +124,7 @@ The following are required to run Geo:
across Geo sites to avoid silent corruption of database indexes.
- Git 2.9 or later
- Git-lfs 2.4.2 or later on the user side when using LFS
-- All sites must run the same GitLab version.
+- All sites must run the exact same GitLab version. The [major, minor, and patch versions](../../policy/maintenance.md#versioning) must all match.
- All sites must define the same [repository storages](../repository_storage_paths.md).
Additionally, check the GitLab [minimum requirements](../../install/requirements.md),
diff --git a/doc/administration/geo/replication/container_registry.md b/doc/administration/geo/replication/container_registry.md
index 1eacca32902..107260ce2f4 100644
--- a/doc/administration/geo/replication/container_registry.md
+++ b/doc/administration/geo/replication/container_registry.md
@@ -11,7 +11,7 @@ You can set up a container registry on your **secondary** Geo site that mirrors
NOTE:
The container registry replication is used only for disaster recovery purposes. We do not recommend
pulling the container registry data from the secondary. For a feature proposal to implement it in the
-future, see [Geo: Accelerate container images by serving read request from secondary site](https://gitlab.com/gitlab-org/gitlab/-/issues/365864) for details.
+future, see [Geo: Accelerate container images by serving read request from secondary site](https://gitlab.com/gitlab-org/gitlab/-/issues/365864) for details. You or your GitLab representative are encouraged to upvote this feature to register your interest.
## Supported container registries
diff --git a/doc/administration/geo/replication/faq.md b/doc/administration/geo/replication/faq.md
index f29d7967feb..c5ac25ba152 100644
--- a/doc/administration/geo/replication/faq.md
+++ b/doc/administration/geo/replication/faq.md
@@ -44,12 +44,12 @@ Read the documentation for [Disaster Recovery](../disaster_recovery/index.md).
## What data is replicated to a **secondary** site?
-We currently replicate project repositories, LFS objects, generated
-attachments and avatars, and the whole database. This means information such as user accounts,
+We currently replicate the whole rails database, project repositories, LFS objects, generated
+attachments, avatars and more. This means information such as user accounts,
issues, merge requests, groups, and project data are available for
query.
-For more details, see the [supported Geo data types](datatypes.md).
+For a comprehensive list of data replicated by Geo, see the [supported Geo data types page](datatypes.md).
## Can I `git push` to a **secondary** site?
@@ -65,10 +65,26 @@ connectivity between your sites, and your hardware.
That's totally fine. We use HTTP(s) to fetch repository changes from the **primary** site to all **secondary** sites.
-## Is this possible to set up a container registry for a **secondary** site that mirrors the one on the **primary** site?
+## Is it possible to set up a container registry for a **secondary** site that mirrors the one on the **primary** site?
-Yes. See [container registry for a **secondary** site](container_registry.md).
+Yes, however, we only support this for Disaster Recovery scenarios. See [container registry for a **secondary** site](container_registry.md).
## Can you sign in to a secondary site?
Yes, but secondary sites receive all authentication data (like user accounts and logins) from the primary instance. This means you are re-directed to the primary for authentication and then routed back.
+
+## Do all Geo sites need to be the same as the primary?
+
+No, Geo sites can be based on different reference architectures. For example, you can have the primary site based on a 3K reference architecture, one secondary site based 3K reference architecture, and another one based on a 1K reference architecture.
+
+## Does Geo replicate archived projects?
+
+Yes, provided they are not excluded through [selective sync](../replication/configuration.md#selective-synchronization).
+
+## Does Geo replicate personal projects?
+
+Yes, provided they are not excluded through [selective sync](../replication/configuration.md#selective-synchronization).
+
+## Are delayed deletion projects replicated to secondary sites?
+
+Yes, projects scheduled for deletion by [delayed deletion](../../settings/visibility_and_access_controls.md#delayed-project-deletion), but are yet to be permanently deleted, are replicated to secondary sites.
diff --git a/doc/administration/geo/replication/usage.md b/doc/administration/geo/replication/usage.md
index 0594709b23d..d05fb75af11 100644
--- a/doc/administration/geo/replication/usage.md
+++ b/doc/administration/geo/replication/usage.md
@@ -10,6 +10,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
After you set up the [database replication and configure the Geo nodes](../index.md#setup-instructions), use your closest GitLab site as you would do with the primary one.
+## Git operations
+
You can push directly to a **secondary** site (for both HTTP, SSH including
Git LFS), and the request is proxied to the primary site instead.
@@ -34,6 +36,12 @@ for Unix-like operating systems or `_netrc` for Windows. In that case, the crede
are stored as a plain text. If you're looking for a more secure way to store credentials,
you can use [Git Credential Storage](https://git-scm.com/book/en/v2/Git-Tools-Credential-Storage).
+## Web user interface
+
+The web user interface on the **secondary** site is read/write. As a user, all actions permitted on the **primary** site can be performed on the **secondary** site without limitations.
+
+Web interface access requests on the **secondary** sites are automatically and transparently proxied to the **primary** site.
+
## Fetch Go modules from Geo secondary sites
Go modules can be pulled from secondary sites, with a number of limitations:
diff --git a/doc/administration/geo/setup/external_database.md b/doc/administration/geo/setup/external_database.md
index 2d0e9e45197..a17c09c85e8 100644
--- a/doc/administration/geo/setup/external_database.md
+++ b/doc/administration/geo/setup/external_database.md
@@ -17,9 +17,10 @@ to [avoid version mismatches](../index.md#requirements-for-running-geo)
in case a Geo site has to be rebuilt.
NOTE:
-We strongly recommend running instances installed using the Linux package as they are actively
-developed and tested. We aim to be compatible with most external
-(not managed by Omnibus) databases but we do not guarantee compatibility.
+If you’re using GitLab Geo, we strongly recommend running instances installed by using the Linux package or using
+[validated cloud-managed instances](../../reference_architectures/index.md#recommended-cloud-providers-and-services),
+as we actively develop and test based on those.
+We cannot guarantee compatibility with other external databases.
## **Primary** site
@@ -81,6 +82,11 @@ cloud providers:
When your read-only replica is set up, you can skip to [configure your secondary site](#configure-secondary-site-to-use-the-external-read-replica)
+WARNING:
+The use of logical replication methods such as [AWS Database Migration Service](https://aws.amazon.com/dms/)
+or [Google Cloud Database Migration Service](https://cloud.google.com/database-migration) to, for instance,
+replicate from an on-premise primary database to an RDS secondary are not supported.
+
#### Manually configure the primary database for replication
The [`geo_primary_role`](https://docs.gitlab.com/omnibus/roles/#gitlab-geo-roles)
diff --git a/doc/administration/instance_limits.md b/doc/administration/instance_limits.md
index 259a0c961d2..5638b2d76ac 100644
--- a/doc/administration/instance_limits.md
+++ b/doc/administration/instance_limits.md
@@ -1069,7 +1069,8 @@ The default maximum file size for a package that's uploaded to the [GitLab packa
The [maximum file sizes on GitLab.com](../user/gitlab_com/index.md#package-registry-limits)
might be different.
-To set these limits for a self-managed installation, run the following in the
+To set these limits for a self-managed installation, you can do it [through the Admin Area](settings/continuous_integration.md#package-file-size-limits)
+or run the following in the
[GitLab Rails console](operations/rails_console.md#starting-a-rails-console-session):
```ruby
diff --git a/doc/administration/reference_architectures/10k_users.md b/doc/administration/reference_architectures/10k_users.md
index 41897a999ec..e31dc4f2130 100644
--- a/doc/administration/reference_architectures/10k_users.md
+++ b/doc/administration/reference_architectures/10k_users.md
@@ -22,22 +22,22 @@ specifically the [Before you start](index.md#before-you-start) and [Deciding whi
> - **Cloud Native Hybrid Alternative:** [Yes](#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative)
> - **Unsure which Reference Architecture to use?** [Go to this guide for more info](index.md#deciding-which-architecture-to-use)
-| Service | Nodes | Configuration | GCP | AWS |
-|------------------------------------------|-------|-------------------------|------------------|----------------|
-| External load balancing node<sup>3</sup> | 1 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
-| Consul<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
-| PostgreSQL<sup>1</sup> | 3 | 8 vCPU, 30 GB memory | `n1-standard-8` | `m5.2xlarge` |
-| PgBouncer<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
-| Internal load balancing node<sup>3</sup> | 1 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
-| Redis/Sentinel - Cache<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` |
-| Redis/Sentinel - Persistent<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` |
-| Gitaly<sup>5</sup> | 3 | 16 vCPU, 60 GB memory<sup>6</sup> | `n1-standard-16` | `m5.4xlarge` |
-| Praefect<sup>5</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
-| Praefect PostgreSQL<sup>1</sup> | 1+ | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
-| Sidekiq<sup>7</sup> | 4 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` |
-| GitLab Rails<sup>7</sup> | 3 | 32 vCPU, 28.8 GB memory | `n1-highcpu-32` | `c5.9xlarge` |
-| Monitoring node | 1 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` | `c5.xlarge` |
-| Object storage<sup>4</sup> | - | - | - | - |
+| Service | Nodes | Configuration | GCP | AWS | Azure |
+|------------------------------------------|-------|-------------------------|------------------|----------------|-----------|
+| External load balancing node<sup>3</sup> | 1 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
+| Consul<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
+| PostgreSQL<sup>1</sup> | 3 | 8 vCPU, 30 GB memory | `n1-standard-8` | `m5.2xlarge` | `D8s v3` |
+| PgBouncer<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
+| Internal load balancing node<sup>3</sup> | 1 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
+| Redis/Sentinel - Cache<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | `D4s v3` |
+| Redis/Sentinel - Persistent<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | `D4s v3` |
+| Gitaly<sup>5</sup> | 3 | 16 vCPU, 60 GB memory<sup>6</sup> | `n1-standard-16` | `m5.4xlarge` | `D16s v3` |
+| Praefect<sup>5</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
+| Praefect PostgreSQL<sup>1</sup> | 1+ | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
+| Sidekiq<sup>7</sup> | 4 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | `D4s v3` |
+| GitLab Rails<sup>7</sup> | 3 | 32 vCPU, 28.8 GB memory | `n1-highcpu-32` | `c5.9xlarge` | `F32s v2` |
+| Monitoring node | 1 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` | `c5.xlarge` | `F4s v2` |
+| Object storage<sup>4</sup> | - | - | - | - | - |
<!-- Disable ordered list rule https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md029---ordered-list-item-prefix -->
<!-- markdownlint-disable MD029 -->
diff --git a/doc/administration/reference_architectures/25k_users.md b/doc/administration/reference_architectures/25k_users.md
index 2f0b51e6662..d4f4fca9efa 100644
--- a/doc/administration/reference_architectures/25k_users.md
+++ b/doc/administration/reference_architectures/25k_users.md
@@ -22,22 +22,22 @@ specifically the [Before you start](index.md#before-you-start) and [Deciding whi
> - **Cloud Native Hybrid Alternative:** [Yes](#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative)
> - **Unsure which Reference Architecture to use?** [Go to this guide for more info](index.md#deciding-which-architecture-to-use)
-| Service | Nodes | Configuration | GCP | AWS |
-|------------------------------------------|-------|-------------------------|------------------|--------------|
-| External load balancing node<sup>3</sup> | 1 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` | `c5.xlarge` |
-| Consul<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
-| PostgreSQL<sup>1</sup> | 3 | 16 vCPU, 60 GB memory | `n1-standard-16` | `m5.4xlarge` |
-| PgBouncer<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
-| Internal load balancing node<sup>3</sup> | 1 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` | `c5.xlarge` |
-| Redis/Sentinel - Cache<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` |
-| Redis/Sentinel - Persistent<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` |
-| Gitaly<sup>5</sup> | 3 | 32 vCPU, 120 GB memory<sup>6</sup> | `n1-standard-32` | `m5.8xlarge` |
-| Praefect<sup>5</sup> | 3 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` | `c5.xlarge` |
-| Praefect PostgreSQL<sup>1</sup> | 1+ | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
-| Sidekiq<sup>7</sup> | 4 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` |
-| GitLab Rails<sup>7</sup> | 5 | 32 vCPU, 28.8 GB memory | `n1-highcpu-32` | `c5.9xlarge` |
-| Monitoring node | 1 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` | `c5.xlarge` |
-| Object storage<sup>4</sup> | - | - | - | - |
+| Service | Nodes | Configuration | GCP | AWS | Azure |
+|------------------------------------------|-------|-------------------------|------------------|--------------|-----------|
+| External load balancing node<sup>3</sup> | 1 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` | `c5.xlarge` | `F4s v2` |
+| Consul<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
+| PostgreSQL<sup>1</sup> | 3 | 16 vCPU, 60 GB memory | `n1-standard-16` | `m5.4xlarge` | `D16s v3` |
+| PgBouncer<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
+| Internal load balancing node<sup>3</sup> | 1 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` | `c5.xlarge` | `F4s v2` |
+| Redis/Sentinel - Cache<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | `D4s v3` |
+| Redis/Sentinel - Persistent<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | `D4s v3` |
+| Gitaly<sup>5</sup> | 3 | 32 vCPU, 120 GB memory<sup>6</sup> | `n1-standard-32` | `m5.8xlarge` | `D32s v3` |
+| Praefect<sup>5</sup> | 3 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` | `c5.xlarge` | `F4s v2` |
+| Praefect PostgreSQL<sup>1</sup> | 1+ | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
+| Sidekiq<sup>7</sup> | 4 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | `D4s v3` |
+| GitLab Rails<sup>7</sup> | 5 | 32 vCPU, 28.8 GB memory | `n1-highcpu-32` | `c5.9xlarge` | `F32s v2` |
+| Monitoring node | 1 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` | `c5.xlarge` | `F4s v2` |
+| Object storage<sup>4</sup> | - | - | - | - | - |
<!-- Disable ordered list rule https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md029---ordered-list-item-prefix -->
<!-- markdownlint-disable MD029 -->
diff --git a/doc/administration/reference_architectures/3k_users.md b/doc/administration/reference_architectures/3k_users.md
index 5d0ab62d4a2..6d39ab36f5c 100644
--- a/doc/administration/reference_architectures/3k_users.md
+++ b/doc/administration/reference_architectures/3k_users.md
@@ -22,21 +22,21 @@ For a full list of reference architectures, see
> - **Cloud Native Hybrid Alternative:** [Yes](#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative)
> - **Unsure which Reference Architecture to use?** [Go to this guide for more info](index.md#deciding-which-architecture-to-use).
-| Service | Nodes | Configuration | GCP | AWS |
-|-------------------------------------------|-------|-----------------------|-----------------|--------------|
-| External load balancing node<sup>3</sup> | 1 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
-| Redis<sup>2</sup> | 3 | 2 vCPU, 7.5 GB memory | `n1-standard-2` | `m5.large` |
-| Consul<sup>1</sup> + Sentinel<sup>2</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
-| PostgreSQL<sup>1</sup> | 3 | 2 vCPU, 7.5 GB memory | `n1-standard-2` | `m5.large` |
-| PgBouncer<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
-| Internal load balancing node<sup>3</sup> | 1 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
-| Gitaly<sup>5</sup> | 3 | 4 vCPU, 15 GB memory<sup>6</sup> | `n1-standard-4` | `m5.xlarge` |
-| Praefect<sup>5</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
-| Praefect PostgreSQL<sup>1</sup> | 1+ | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
-| Sidekiq<sup>7</sup> | 2 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` |
-| GitLab Rails<sup>7</sup> | 3 | 8 vCPU, 7.2 GB memory | `n1-highcpu-8` | `c5.2xlarge` |
-| Monitoring node | 1 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
-| Object storage<sup>4</sup> | - | - | - | - |
+| Service | Nodes | Configuration | GCP | AWS | Azure |
+|-------------------------------------------|-------|-----------------------|-----------------|--------------|----------|
+| External load balancing node<sup>3</sup> | 1 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
+| Redis<sup>2</sup> | 3 | 2 vCPU, 7.5 GB memory | `n1-standard-2` | `m5.large` | `D2s v3` |
+| Consul<sup>1</sup> + Sentinel<sup>2</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
+| PostgreSQL<sup>1</sup> | 3 | 2 vCPU, 7.5 GB memory | `n1-standard-2` | `m5.large` | `D2s v3` |
+| PgBouncer<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
+| Internal load balancing node<sup>3</sup> | 1 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
+| Gitaly<sup>5</sup> | 3 | 4 vCPU, 15 GB memory<sup>6</sup> | `n1-standard-4` | `m5.xlarge` | `D4s v3` |
+| Praefect<sup>5</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
+| Praefect PostgreSQL<sup>1</sup> | 1+ | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
+| Sidekiq<sup>7</sup> | 2 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | `D2s v3` |
+| GitLab Rails<sup>7</sup> | 3 | 8 vCPU, 7.2 GB memory | `n1-highcpu-8` | `c5.2xlarge` | `F8s v2` |
+| Monitoring node | 1 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
+| Object storage<sup>4</sup> | - | - | - | - | - |
<!-- Disable ordered list rule https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md029---ordered-list-item-prefix -->
<!-- markdownlint-disable MD029 -->
diff --git a/doc/administration/reference_architectures/50k_users.md b/doc/administration/reference_architectures/50k_users.md
index ed66620119e..f68cc8e578f 100644
--- a/doc/administration/reference_architectures/50k_users.md
+++ b/doc/administration/reference_architectures/50k_users.md
@@ -22,22 +22,22 @@ specifically the [Before you start](index.md#before-you-start) and [Deciding whi
> - **Cloud Native Hybrid Alternative:** [Yes](#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative)
> - **Unsure which Reference Architecture to use?** [Go to this guide for more info](index.md#deciding-which-architecture-to-use)
-| Service | Nodes | Configuration | GCP | AWS |
-|------------------------------------------|-------|-------------------------|------------------|---------------|
-| External load balancing node<sup>3</sup> | 1 | 8 vCPU, 7.2 GB memory | `n1-highcpu-8` | `c5.2xlarge` |
-| Consul<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
-| PostgreSQL<sup>1</sup> | 3 | 32 vCPU, 120 GB memory | `n1-standard-32` | `m5.8xlarge` |
-| PgBouncer<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
-| Internal load balancing node<sup>3</sup> | 1 | 8 vCPU, 7.2 GB memory | `n1-highcpu-8` | `c5.2xlarge` |
-| Redis/Sentinel - Cache<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` |
-| Redis/Sentinel - Persistent<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` |
-| Gitaly<sup>5</sup> | 3 | 64 vCPU, 240 GB memory<sup>6</sup> | `n1-standard-64` | `m5.16xlarge` |
-| Praefect<sup>5</sup> | 3 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` | `c5.xlarge` |
-| Praefect PostgreSQL<sup>1</sup> | 1+ | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
-| Sidekiq<sup>7</sup> | 4 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` |
-| GitLab Rails<sup>7</sup> | 12 | 32 vCPU, 28.8 GB memory | `n1-highcpu-32` | `c5.9xlarge` |
-| Monitoring node | 1 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` | `c5.xlarge` |
-| Object storage<sup>4</sup> | - | - | - | - |
+| Service | Nodes | Configuration | GCP | AWS | Azure |
+|------------------------------------------|-------|-------------------------|------------------|---------------|-----------|
+| External load balancing node<sup>3</sup> | 1 | 8 vCPU, 7.2 GB memory | `n1-highcpu-8` | `c5.2xlarge` | `F8s v2` |
+| Consul<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
+| PostgreSQL<sup>1</sup> | 3 | 32 vCPU, 120 GB memory | `n1-standard-32` | `m5.8xlarge` | `D32s v3` |
+| PgBouncer<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
+| Internal load balancing node<sup>3</sup> | 1 | 8 vCPU, 7.2 GB memory | `n1-highcpu-8` | `c5.2xlarge` | `F8s v2` |
+| Redis/Sentinel - Cache<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | `D4s v3` |
+| Redis/Sentinel - Persistent<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | `D4s v3` |
+| Gitaly<sup>5</sup> | 3 | 64 vCPU, 240 GB memory<sup>6</sup> | `n1-standard-64` | `m5.16xlarge` | `D64s v3` |
+| Praefect<sup>5</sup> | 3 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` | `c5.xlarge` | `F4s v2` |
+| Praefect PostgreSQL<sup>1</sup> | 1+ | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
+| Sidekiq<sup>7</sup> | 4 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | `D4s v3` |
+| GitLab Rails<sup>7</sup> | 12 | 32 vCPU, 28.8 GB memory | `n1-highcpu-32` | `c5.9xlarge` | `F32s v2` |
+| Monitoring node | 1 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` | `c5.xlarge` | `F4s v2` |
+| Object storage<sup>4</sup> | - | - | - | - | - |
<!-- Disable ordered list rule https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md029---ordered-list-item-prefix -->
<!-- markdownlint-disable MD029 -->
diff --git a/doc/administration/reference_architectures/5k_users.md b/doc/administration/reference_architectures/5k_users.md
index 65b46474f7a..0e867f54c0a 100644
--- a/doc/administration/reference_architectures/5k_users.md
+++ b/doc/administration/reference_architectures/5k_users.md
@@ -22,21 +22,21 @@ specifically the [Before you start](index.md#before-you-start) and [Deciding whi
> - **Cloud Native Hybrid Alternative:** [Yes](#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative)
> - **Unsure which Reference Architecture to use?** [Go to this guide for more info](index.md#deciding-which-architecture-to-use)
-| Service | Nodes | Configuration | GCP | AWS |
-|-------------------------------------------|-------|-------------------------|-----------------|--------------|
-| External load balancing node<sup>3</sup> | 1 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
-| Redis<sup>2</sup> | 3 | 2 vCPU, 7.5 GB memory | `n1-standard-2` | `m5.large` |
-| Consul<sup>1</sup> + Sentinel<sup>2</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
-| PostgreSQL<sup>1</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` |
-| PgBouncer<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
-| Internal load balancing node<sup>3</sup> | 1 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
-| Gitaly<sup>5</sup> | 3 | 8 vCPU, 30 GB memory<sup>6</sup> | `n1-standard-8` | `m5.2xlarge` |
-| Praefect<sup>5</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
-| Praefect PostgreSQL<sup>1</sup> | 1+ | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
-| Sidekiq<sup>7</sup> | 2 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` |
-| GitLab Rails<sup>7</sup> | 3 | 16 vCPU, 14.4 GB memory | `n1-highcpu-16` | `c5.4xlarge` |
-| Monitoring node | 1 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` |
-| Object storage<sup>4</sup> | - | - | - | - |
+| Service | Nodes | Configuration | GCP | AWS | Azure |
+|-------------------------------------------|-------|-------------------------|-----------------|--------------|----------|
+| External load balancing node<sup>3</sup> | 1 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
+| Redis<sup>2</sup> | 3 | 2 vCPU, 7.5 GB memory | `n1-standard-2` | `m5.large` | `D2s v3` |
+| Consul<sup>1</sup> + Sentinel<sup>2</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
+| PostgreSQL<sup>1</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | `D4s v3` |
+| PgBouncer<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
+| Internal load balancing node<sup>3</sup> | 1 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
+| Gitaly<sup>5</sup> | 3 | 8 vCPU, 30 GB memory<sup>6</sup> | `n1-standard-8` | `m5.2xlarge` | `D8s v3` |
+| Praefect<sup>5</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
+| Praefect PostgreSQL<sup>1</sup> | 1+ | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
+| Sidekiq<sup>7</sup> | 2 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | `D2s v3` |
+| GitLab Rails<sup>7</sup> | 3 | 16 vCPU, 14.4 GB memory | `n1-highcpu-16` | `c5.4xlarge` | `F16s v2`|
+| Monitoring node | 1 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
+| Object storage<sup>4</sup> | - | - | - | - | - |
<!-- Disable ordered list rule https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md029---ordered-list-item-prefix -->
<!-- markdownlint-disable MD029 -->
diff --git a/doc/administration/reference_architectures/index.md b/doc/administration/reference_architectures/index.md
index 7e4e929f80d..2abcc045dab 100644
--- a/doc/administration/reference_architectures/index.md
+++ b/doc/administration/reference_architectures/index.md
@@ -298,7 +298,7 @@ Additionally, when it comes to other cloud provider services not listed here,
it's advised to be cautious as each implementation can be notably different
and should be tested thoroughly before production use.
-Through testing and real life usage, the Reference Architectures are validated and supported on the following cloud providers:
+Through testing and real life usage, the Reference Architectures are recommended on the following cloud providers:
<table>
<thead>
@@ -315,7 +315,7 @@ Through testing and real life usage, the Reference Architectures are validated a
<td>Linux package</td>
<td>🟢</td>
<td>🟢</td>
- <td>🟡<sup>1</sup></td>
+ <td>🟢<sup>1</sup></td>
<td>🟢</td>
</tr>
<tr>
@@ -328,9 +328,7 @@ Through testing and real life usage, the Reference Architectures are validated a
</tbody>
</table>
-1. We only recommend smaller setups (up to 2k) at this time on Azure due to performance issues at larger scales. See the [Recommendation Notes for Azure](#recommendation-notes-for-azure) section for more info.
-
-Additionally, the following cloud provider services are validated and supported for use as part of the Reference Architectures:
+Additionally, the following cloud provider services are recommended for use as part of the Reference Architectures:
<table>
<thead>
@@ -338,6 +336,7 @@ Additionally, the following cloud provider services are validated and supported
<th>Cloud Service</th>
<th>GCP</th>
<th>AWS</th>
+ <th>Azure</th>
<th>Bare Metal</th>
</tr>
</thead>
@@ -346,18 +345,21 @@ Additionally, the following cloud provider services are validated and supported
<td>Object Storage</td>
<td>🟢 &nbsp; <a href="https://cloud.google.com/storage" target="_blank">Cloud Storage</a></td>
<td>🟢 &nbsp; <a href="https://aws.amazon.com/s3/" target="_blank">S3</a></td>
+ <td>🟢 &nbsp; <a href="https://azure.microsoft.com/en-gb/products/storage/blobs" target="_blank">Azure Blob Storage</a></td>
<td>🟢 &nbsp; <a href="https://min.io/" target="_blank">MinIO</a></td>
</tr>
<tr>
<td>Database</td>
<td>🟢 &nbsp; <a href="https://cloud.google.com/sql" target="_blank" rel="noopener noreferrer">Cloud SQL</a></td>
<td>🟢 &nbsp; <a href="https://aws.amazon.com/rds/" target="_blank" rel="noopener noreferrer">RDS</a></td>
+ <td>🟢 &nbsp; <a href="https://azure.microsoft.com/en-gb/products/postgresql/" target="_blank" rel="noopener noreferrer">Azure Database for PostgreSQL Flexible Server</a></td>
<td></td>
</tr>
<tr>
<td>Redis</td>
<td>🟢 &nbsp; <a href="https://cloud.google.com/memorystore" target="_blank" rel="noopener noreferrer">Memorystore</a></td>
<td>🟢 &nbsp; <a href="https://aws.amazon.com/elasticache/" target="_blank" rel="noopener noreferrer">ElastiCache</a></td>
+ <td>🟢 &nbsp; <a href="https://azure.microsoft.com/en-gb/products/cache" target="_blank" rel="noopener noreferrer">Azure Cache for Redis (Premium)</a></td>
<td></td>
</tr>
</tbody>
@@ -372,11 +374,13 @@ If you choose to use a third party external service:
1. Note that the HA Linux package PostgreSQL setup encompasses PostgreSQL, PgBouncer and Consul. All of these components would no longer be required when using a third party external service.
1. The number of nodes required to achieve HA may differ depending on the service compared to the Linux package and doesn't need to match accordingly.
1. However, if [Database Load Balancing](../postgresql/database_load_balancing.md) via Read Replicas is desired for further improved performance it's recommended to follow the node count for the Reference Architecture.
-1. If [GitLab Geo](../geo/index.md) is to be used the service will need to support Cross Region replication
+1. Ensure that if a pooler is offered as part of the service that it can handle the total load without bottlenecking.
+ For example, Azure Database for PostgreSQL Flexible Server can optionally deploy a PgBouncer pooler in front of the Database, but PgBouncer is single threaded, so this in turn may cause bottlenecking. However, if using Database Load Balancing, this could be enabled on each node in distributed fashion to compensate.
+1. If [GitLab Geo](../geo/index.md) is to be used the service will need to support Cross Region replication.
### Recommendation notes for the Redis services
-[When selecting to use an external Redis service](../redis/replication_and_failover_external.md#redis-as-a-managed-service-in-a-cloud-provider), it should run a standard, performant, and supported version.
+[When selecting to use an external Redis service](../redis/replication_and_failover_external.md#redis-as-a-managed-service-in-a-cloud-provider), it should run a standard, performant, and supported version. Note that this specifically must not be run in [Cluster mode](../../install/requirements.md#redis) as this is unsupported by GitLab.
Redis is primarily single threaded. For the 10,000 user and above Reference Architectures, separate out the instances as specified into Cache and Persistent data to achieve optimum performance at this scale.
@@ -391,21 +395,10 @@ As a general guidance, it's recommended to use a reputable solution that has ful
Several database cloud provider services are known not to support the above or have been found to have other issues and aren't recommended:
- [Amazon Aurora](https://aws.amazon.com/rds/aurora/) is incompatible and not supported. See [14.4.0](../../update/versions/gitlab_14_changes.md#1440) for more details.
-- [Azure Database for PostgreSQL Single Server](https://azure.microsoft.com/en-gb/products/postgresql/#overview) is not supported for use due to notable performance / stability issues or missing functionality. See [Recommendation Notes for Azure](#recommendation-notes-for-azure) for more details.
+- [Azure Database for PostgreSQL Single Server](https://azure.microsoft.com/en-gb/products/postgresql/#overview) is not supported as the service is now deprecated and runs on an unsupported version of PostgreSQL. It was also found to have notable performance and stability issues.
- [Google AlloyDB](https://cloud.google.com/alloydb) and [Amazon RDS Multi-AZ DB cluster](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/multi-az-db-clusters-concepts.html) have not been tested and are not recommended. Both solutions are specifically not expected to work with GitLab Geo.
- [Amazon RDS Multi-AZ DB instance](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.MultiAZSingleStandby.html) is a separate product and is supported.
-### Recommendation notes for Azure
-
-Due to performance issues that we found with several key Azure services, we only recommend smaller architectures (up to 2k) to be deployed to Azure. For larger architectures, we recommend using another cloud provider.
-
-In addition to the above, you should be aware of the additional specific guidance for Azure:
-
-- [Azure Database for PostgreSQL Single Server](https://azure.microsoft.com/en-gb/products/postgresql/#overview) is not supported for use due to notable performance / stability issues or missing functionality.
-- A new service, [Azure Database for PostgreSQL Flexible Server](https://learn.microsoft.com/en-us/azure/postgresql/flexible-server/) has been released. [Internal testing](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/91) has shown that it does look to perform as expected, but this hasn't been validated in production, so generally isn't recommended at this time. Additionally, as it's a new service, you may find that it's missing some functionality depending on your requirements.
- - Only standard Postgres authentication is supported at this time with this service. Microsoft Azure Active Directory (Azure AD) is not compatible.
-- [Azure Blob Storage](https://azure.microsoft.com/en-gb/products/storage/blobs/) has been found to have [performance limits that can impact production use at certain times](https://gitlab.com/gitlab-org/gitlab/-/issues/344861). However, this has only been seen in our largest architectures (25k+) so far.
-
## Deviating from the suggested reference architectures
As a general guideline, the further away you move from the reference architectures,
@@ -730,6 +723,10 @@ Below is a history of notable updates for the Reference Architectures (2021-01-0
You can find a full history of changes [on the GitLab project](https://gitlab.com/gitlab-org/gitlab/-/merge_requests?scope=all&state=merged&label_name%5B%5D=Reference%20Architecture&label_name%5B%5D=documentation).
+**2024:**
+
+- [2024-01](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/140465): Updated recommendations for Azure for all Reference Architecture sizes and latest cloud services.
+
**2023:**
- [2023-12-12](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/133457): Updated notes on Load Balancers to be more reflective that any reputable offering is expected to work.
diff --git a/doc/administration/reply_by_email_postfix_setup.md b/doc/administration/reply_by_email_postfix_setup.md
index 99cfbd59c49..90d1bf30182 100644
--- a/doc/administration/reply_by_email_postfix_setup.md
+++ b/doc/administration/reply_by_email_postfix_setup.md
@@ -97,7 +97,7 @@ The instructions make the assumption that you are using the email address `incom
If you receive an error after entering `rcpt to: incoming@localhost`
then your Postfix `my_network` configuration is not correct. The error will
say 'Temporary lookup failure'. See
- [Configure Postfix to receive email from the Internet](#configure-postfix-to-receive-email-from-the-internet)._
+ [Configure Postfix to receive email from the Internet](#configure-postfix-to-receive-email-from-the-internet).
1. Check if the `incoming` user received the email:
diff --git a/doc/api/members.md b/doc/api/members.md
index 3e832ca60c9..e1732716fac 100644
--- a/doc/api/members.md
+++ b/doc/api/members.md
@@ -523,6 +523,7 @@ POST /projects/:id/members
| `access_level` | integer | yes | [A valid access level](access_requests.md#valid-access-levels) |
| `expires_at` | string | no | A date string in the format `YEAR-MONTH-DAY` |
| `invite_source` | string | no | The source of the invitation that starts the member creation process. GitLab team members can view more information in this confidential issue: `https://gitlab.com/gitlab-org/gitlab/-/issues/327120>`. |
+| `member_role_id` | integer | no | The ID of a member role **(ULTIMATE ALL)** |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
diff --git a/doc/api/merge_requests.md b/doc/api/merge_requests.md
index 1e26a23272d..40b1521852d 100644
--- a/doc/api/merge_requests.md
+++ b/doc/api/merge_requests.md
@@ -64,6 +64,8 @@ Supported attributes:
| `environment` | string | No | Returns merge requests deployed to the given environment. |
| `in` | string | No | Modify the scope of the `search` attribute. `title`, `description`, or a string joining them with comma. Default is `title,description`. |
| `labels` | string | No | Returns merge requests matching a comma-separated list of labels. `None` lists all merge requests with no labels. `Any` lists all merge requests with at least one label. Predefined names are case-insensitive. |
+| `merge_user_id` | integer | No | Returns merge requests which have been merged by the user with the given user `id`. Mutually exclusive with `merge_user_username`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/140002) in GitLab 16.9. Available only when the feature flag `mr_merge_user_filter` is enabled. |
+| `merge_user_username` | string | No | Returns merge requests which have been merged by the user with the given `username`. Mutually exclusive with `merge_user_id`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/140002) in GitLab 16.9. Available only when the feature flag `mr_merge_user_filter` is enabled. |
| `milestone` | string | No | Returns merge requests for a specific milestone. `None` returns merge requests with no milestone. `Any` returns merge requests that have an assigned milestone. |
| `my_reaction_emoji` | string | No | Returns merge requests reacted by the authenticated user by the given `emoji`. `None` returns issues not given a reaction. `Any` returns issues given at least one reaction. |
| `not` | Hash | No | Returns merge requests that do not match the parameters supplied. Accepts: `labels`, `milestone`, `author_id`, `author_username`, `assignee_id`, `assignee_username`, `reviewer_id`, `reviewer_username`, `my_reaction_emoji`. |
@@ -244,6 +246,8 @@ Supported attributes:
| `environment` | string | No | Returns merge requests deployed to the given environment. |
| `iids[]` | integer array | No | Returns the request having the given `iid`. |
| `labels` | string | No | Returns merge requests matching a comma-separated list of labels. `None` lists all merge requests with no labels. `Any` lists all merge requests with at least one label. Predefined names are case-insensitive. |
+| `merge_user_id` | integer | No | Returns merge requests which have been merged by the user with the given user `id`. Mutually exclusive with `merge_user_username`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/140002) in GitLab 16.9. Available only when the feature flag `mr_merge_user_filter` is enabled. |
+| `merge_user_username` | string | No | Returns merge requests which have been merged by the user with the given `username`. Mutually exclusive with `merge_user_id`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/140002) in GitLab 16.9. Available only when the feature flag `mr_merge_user_filter` is enabled. |
| `milestone` | string | No | Returns merge requests for a specific milestone. `None` returns merge requests with no milestone. `Any` returns merge requests that have an assigned milestone. |
| `my_reaction_emoji` | string | No | Returns merge requests reacted by the authenticated user by the given `emoji`. `None` returns issues not given a reaction. `Any` returns issues given at least one reaction. |
| `not` | Hash | No | Returns merge requests that do not match the parameters supplied. Accepts: `labels`, `milestone`, `author_id`, `author_username`, `assignee_id`, `assignee_username`, `reviewer_id`, `reviewer_username`, `my_reaction_emoji`. |
@@ -428,6 +432,8 @@ Supported attributes:
| `created_after` | datetime | No | Returns merge requests created on or after the given time. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`). |
| `created_before` | datetime | No | Returns merge requests created on or before the given time. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`). |
| `labels` | string | No | Returns merge requests matching a comma-separated list of labels. `None` lists all merge requests with no labels. `Any` lists all merge requests with at least one label. Predefined names are case-insensitive. |
+| `merge_user_id` | integer | No | Returns merge requests which have been merged by the user with the given user `id`. Mutually exclusive with `merge_user_username`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/140002) in GitLab 16.9. Available only when the feature flag `mr_merge_user_filter` is enabled. |
+| `merge_user_username` | string | No | Returns merge requests which have been merged by the user with the given `username`. Mutually exclusive with `merge_user_id`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/140002) in GitLab 16.9. Available only when the feature flag `mr_merge_user_filter` is enabled. |
| `milestone` | string | No | Returns merge requests for a specific milestone. `None` returns merge requests with no milestone. `Any` returns merge requests that have an assigned milestone. |
| `my_reaction_emoji` | string | No | Returns merge requests reacted by the authenticated user by the given `emoji`. `None` returns issues not given a reaction. `Any` returns issues given at least one reaction. |
| `non_archived` | boolean | No | Returns merge requests from non archived projects only. Default is `true`. |
diff --git a/doc/development/fe_guide/view_component.md b/doc/development/fe_guide/view_component.md
index a616a3d7c48..a0c626dfb6d 100644
--- a/doc/development/fe_guide/view_component.md
+++ b/doc/development/fe_guide/view_component.md
@@ -163,7 +163,7 @@ For example:
```haml
= render Pajamas::CheckboxTagComponent.new(name: 'project[initialize_with_sast]',
- checkbox_options: { data: { qa_selector: 'initialize_with_sast_checkbox', track_label: track_label, track_action: 'activate_form_input', track_property: 'init_with_sast' } }) do |c|
+ checkbox_options: { data: { testid: 'initialize-with-sast-checkbox', track_label: track_label, track_action: 'activate_form_input', track_property: 'init_with_sast' } }) do |c|
- c.with_label do
= s_('ProjectsNew|Enable Static Application Security Testing (SAST)')
- c.with_help_text do
diff --git a/doc/development/testing_guide/end_to_end/beginners_guide.md b/doc/development/testing_guide/end_to_end/beginners_guide.md
index b57757c5aac..5fc18d7aeae 100644
--- a/doc/development/testing_guide/end_to_end/beginners_guide.md
+++ b/doc/development/testing_guide/end_to_end/beginners_guide.md
@@ -321,22 +321,22 @@ the **Issue Show** page already exists, add the `closed?` method.
module Page::Project::Issue
class Show
view 'app/views/projects/issues/show.html.haml' do
- element :closed_status_box
+ element 'closed-status-box'
end
def closed?
- has_element?(:closed_status_box)
+ has_element?('closed-status-box')
end
end
end
```
-Next, define the element `closed_status_box` within your view, so your Page Object
+Next, define the element `closed-status-box` within your view, so your Page Object
can see it.
```haml
-#=> app/views/projects/issues/show.html.haml
-.issuable-status-box.status-box.status-box-issue-closed{ ..., data: { qa_selector: 'closed_status_box' } }
+.issuable-status-box.status-box.status-box-issue-closed{ ..., data: { testid: 'closed-status-box' } }
```
## Run the spec
diff --git a/doc/development/testing_guide/end_to_end/capybara_to_chemlab_migration_guide.md b/doc/development/testing_guide/end_to_end/capybara_to_chemlab_migration_guide.md
index 64bb5df5db1..98484b7f2d6 100644
--- a/doc/development/testing_guide/end_to_end/capybara_to_chemlab_migration_guide.md
+++ b/doc/development/testing_guide/end_to_end/capybara_to_chemlab_migration_guide.md
@@ -95,12 +95,12 @@ end
### Element Naming Convention
-Since the element type is preserved within the Page Library, there is no need to specify a `_field` or `_button` suffix to the data-qa-selector.
+Since the element type is preserved within the Page Library, there is no need to specify a `_field` or `_button` suffix to the data-testid.
```html
<!-- Before -->
<input type="text" name="first-name" data-testid="first_name_field" />
-<input type="submit" name="continue" value="Continue" data-testid="continue_button" />
+<input type="submit" name="continue" value="Continue" data-testid="continue-button" />
<!-- After -->
<input type="text" name="first-name" data-testid="first_name" />
diff --git a/doc/development/testing_guide/end_to_end/page_objects.md b/doc/development/testing_guide/end_to_end/page_objects.md
index 812d2724b72..33f70c73c91 100644
--- a/doc/development/testing_guide/end_to_end/page_objects.md
+++ b/doc/development/testing_guide/end_to_end/page_objects.md
@@ -158,20 +158,16 @@ Things to note:
- The name of the element and the `data-testid` must match and be either snake cased or kebab cased
- If the element appears on the page unconditionally, add `required: true` to the element. See
[Dynamic element validation](dynamic_element_validation.md)
-- You may see `data-qa-selector` classes in existing Page Objects. We should prefer the [`data-testid`](#data-testid-vs-data-qa-selector)
- method of definition over the `data-qa-selector` CSS class
+- You should not see `data-qa-selector` classes in Page Objects.
+ We should use the [`data-testid`](#data-testid-vs-data-qa-selector)
+ method of definition
### `data-testid` vs `data-qa-selector`
> Introduced in GitLab 16.1
-There are two supported methods of defining elements within a view.
-
-1. `data-testid`
-1. `data-qa-selector` attribute
-
Any existing `data-qa-selector` class should be considered deprecated
-and we should prefer the `data-testid` method of definition.
+and we should use the `data-testid` method of definition.
### Dynamic element selection
diff --git a/doc/install/requirements.md b/doc/install/requirements.md
index 982c00d264e..3fe0d005c38 100644
--- a/doc/install/requirements.md
+++ b/doc/install/requirements.md
@@ -116,10 +116,12 @@ Support for [PostgreSQL 9.6 and 10 was removed in GitLab 13.0](https://about.git
#### Additional requirements for GitLab Geo
-If you're using [GitLab Geo](../administration/geo/index.md), we strongly
-recommend running instances installed by using the Linux package, as we actively develop and
-test based on those. We try to be compatible with most external (not managed by a Linux package installation) databases
-(for example, [AWS Relational Database Service (RDS)](https://aws.amazon.com/rds/)), but we can't guarantee compatibility.
+If you're using [GitLab Geo](../administration/geo/index.md), we strongly recommend running instances installed by using the Linux package or using
+[validated cloud-managed instances](../administration/reference_architectures/index.md#recommended-cloud-providers-and-services),
+as we actively develop and test based on those.
+We cannot guarantee compatibility with other external databases.
+
+It is recommended to review the [full requirements for running Geo](../administration/geo/index.md#requirements-for-running-geo).
#### Operating system locale compatibility and silent index corruption
diff --git a/doc/subscriptions/gitlab_com/index.md b/doc/subscriptions/gitlab_com/index.md
index 74ecf1701a4..ff9d103461e 100644
--- a/doc/subscriptions/gitlab_com/index.md
+++ b/doc/subscriptions/gitlab_com/index.md
@@ -232,13 +232,13 @@ After you dismiss the alert, it doesn't display until another seat is used.
The alert displays based on the following seat usage. You cannot configure the
amounts at which the alert displays.
-| Seats in subscription | Seat usage |
-|-----------------------|------------|
-| 0-15 | One seat remaining in the subscription. |
-| 16-25 | Two seats remaining in the subscription. |
-| 26-99 | 10% of seats have been used. |
-| 100-999 | 8% of seats have been used. |
-| 1000+ | 5% of seats have been used |
+| Seats in subscription | Seat usage |
+|-----------------------|----------------------|
+| 0-15 | One seat remains. |
+| 16-25 | Two seats remain. |
+| 26-99 | 10% of seats remain. |
+| 100-999 | 8% of seats remain. |
+| 1000+ | 5% of seats remain. |
## Change the linked namespace
diff --git a/doc/user/application_security/sast/index.md b/doc/user/application_security/sast/index.md
index cddd6a1f14d..da275c283f6 100644
--- a/doc/user/application_security/sast/index.md
+++ b/doc/user/application_security/sast/index.md
@@ -266,10 +266,6 @@ were introduced by the changes made in the merge request.
> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/10959) in GitLab 16.6 with a [flag](../../../administration/feature_flags.md) named `sast_reports_in_inline_diff`. Disabled by default.
> - Enabled by default in GitLab 16.8.
-FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available, an administrator can [enable the feature flag](../../../administration/feature_flags.md) named `sast_reports_in_inline_diff`.
-On GitLab.com, this feature is available.
-
SAST results display in the merge request **Changes** view. Lines containing SAST
issues are marked by a symbol beside the gutter. Select the symbol to see the list of issues, then select an issue to see its details.
diff --git a/doc/user/project/members/share_project_with_groups.md b/doc/user/project/members/share_project_with_groups.md
index 38cf2403841..71b960b15f8 100644
--- a/doc/user/project/members/share_project_with_groups.md
+++ b/doc/user/project/members/share_project_with_groups.md
@@ -39,7 +39,7 @@ In addition:
- An _internal_ group to a _public_ project.
- A _public_ group to a _public_ project.
-- If a group in the project's hierarchy [does not allow sub-projects to be shared with groups](../../group/access_and_permissions.md#prevent-a-project-from-being-shared-with-groups), the option to **Invite a group** is not available.
+- If a group in the project's hierarchy [does not allow projects to be shared with groups](../../group/access_and_permissions.md#prevent-a-project-from-being-shared-with-groups), the option to **Invite a group** is not available.
- If the project's root ancestor group [does not allow the project to be shared outside the hierarchy](../../group/access_and_permissions.md#prevent-group-sharing-outside-the-group-hierarchy), the invited group or subgroup must be in the project's [namespace](../../namespace/index.md).
For example, a project in the namespace `group/subgroup01/project`:
- Can be shared with `group/subgroup02` or `group/subgroup01/subgroup03`.
diff --git a/doc/user/project/merge_requests/index.md b/doc/user/project/merge_requests/index.md
index 3555d9ffa01..dece5600b0d 100644
--- a/doc/user/project/merge_requests/index.md
+++ b/doc/user/project/merge_requests/index.md
@@ -82,6 +82,7 @@ or:
> - Filtering by potential approvers was moved to GitLab Premium in 13.9.
> - Filtering by `approved-by` moved to GitLab Premium in 13.9.
> - Filtering by `source-branch` [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/134555) in GitLab 16.6.
+> - Filtering by `merged-by` [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/140002) in GitLab 16.9. Available only when the feature flag `mr_merge_user_filter` is enabled.
To filter the list of merge requests:
@@ -95,6 +96,7 @@ To filter the list of merge requests:
- **Approved-By**, for merge requests already approved by a user. **(PREMIUM ALL)**.
- **Approver**, for merge requests that this user is eligible to approve.
(For more information, read about [Code owners](../codeowners/index.md)). **(PREMIUM ALL)**
+ - **Merged-By**, for merge requests merged by this user.
- **Reviewer**, for merge requests reviewed by this user.
1. Select or type the operator to use for filtering the attribute. The following operators are
available:
diff --git a/lib/api/helpers/merge_requests_helpers.rb b/lib/api/helpers/merge_requests_helpers.rb
index 0a0d70520ef..fbb52e22434 100644
--- a/lib/api/helpers/merge_requests_helpers.rb
+++ b/lib/api/helpers/merge_requests_helpers.rb
@@ -108,6 +108,11 @@ module API
optional :approved, type: String,
values: %w[yes no],
desc: 'Filters merge requests by their `approved` status. `yes` returns only approved merge requests. `no` returns only non-approved merge requests.'
+ optional :merge_user_id, type: Integer,
+ desc: "Returns merge requests which have been merged by the user with the given user `id`. Mutually exclusive with `merge_user_username`."
+ optional :merge_user_username, type: String,
+ desc: "Returns merge requests which have been merged by the user with the given `username`. Mutually exclusive with `merge_user_id`."
+ mutually_exclusive :merge_user_id, :merge_user_username
end
params :optional_scope_param do
diff --git a/lib/gitlab/ci/templates/Jobs/Dependency-Scanning.latest.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/Dependency-Scanning.latest.gitlab-ci.yml
index 4d7c3930741..f0d38855c8c 100644
--- a/lib/gitlab/ci/templates/Jobs/Dependency-Scanning.latest.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/Dependency-Scanning.latest.gitlab-ci.yml
@@ -223,27 +223,3 @@ gemnasium-python-dependency_scanning:
- if: $CI_COMMIT_BRANCH &&
$GITLAB_FEATURES =~ /\bdependency_scanning\b/ &&
$PIP_REQUIREMENTS_FILE
-
-bundler-audit-dependency_scanning:
- extends: .ds-analyzer
- variables:
- DS_ANALYZER_NAME: "bundler-audit"
- DS_MAJOR_VERSION: 2
- script:
- - echo "This job was deprecated in GitLab 14.8 and removed in GitLab 15.0"
- - echo "For more information see https://gitlab.com/gitlab-org/gitlab/-/issues/347491"
- - exit 1
- rules:
- - when: never
-
-retire-js-dependency_scanning:
- extends: .ds-analyzer
- variables:
- DS_ANALYZER_NAME: "retire.js"
- DS_MAJOR_VERSION: 2
- script:
- - echo "This job was deprecated in GitLab 14.8 and removed in GitLab 15.0"
- - echo "For more information see https://gitlab.com/gitlab-org/gitlab/-/issues/289830"
- - exit 1
- rules:
- - when: never
diff --git a/lib/gitlab/database/partitioning/list/convert_table.rb b/lib/gitlab/database/partitioning/list/convert_table.rb
index 542a7d0a78d..8d58bee939a 100644
--- a/lib/gitlab/database/partitioning/list/convert_table.rb
+++ b/lib/gitlab/database/partitioning/list/convert_table.rb
@@ -32,6 +32,14 @@ module Gitlab
end
def revert_preparation_for_partitioning
+ unless partitioning_constraint.present?
+ return Gitlab::AppLogger.warn <<~MSG
+ The partitioning constraint does not exist for: table: `#{table_name}`,
+ partitioning_column: #{partitioning_column}, parent_table_name: #{parent_table_name},
+ initial_partitioning_value: #{zero_partition_value}
+ MSG
+ end
+
migration_context.remove_check_constraint(table_name, partitioning_constraint.name)
end
@@ -59,8 +67,8 @@ module Gitlab
def revert_partitioning
migration_context.with_lock_retries(raise_on_exhaustion: true) do
migration_context.execute(<<~SQL)
- ALTER TABLE #{connection.quote_table_name(parent_table_name)}
- DETACH PARTITION #{connection.quote_table_name(table_name)};
+ ALTER TABLE #{connection.quote_table_name(parent_table_name)}
+ DETACH PARTITION #{connection.quote_table_name(table_name)};
SQL
alter_sequences_sql = alter_sequence_statements(old_table: parent_table_name, new_table: table_name)
@@ -112,11 +120,11 @@ module Gitlab
violation_messages = violating_constraints.map { |c| "#{c.name} on (#{c.column_names.join(', ')})" }
raise UnableToPartition, <<~MSG
- Constraints on #{table_name} are incompatible with partitioning on #{partitioning_column}
+ Constraints on #{table_name} are incompatible with partitioning on #{partitioning_column}
- All primary key and unique constraints must include the partitioning column.
- Violations:
- #{violation_messages.join("\n")}
+ All primary key and unique constraints must include the partitioning column.
+ Violations:
+ #{violation_messages.join("\n")}
MSG
end
@@ -138,8 +146,8 @@ module Gitlab
return if partitioning_constraint&.constraint_valid?
raise UnableToPartition, <<~MSG
- Table #{table_name} is not ready for partitioning.
- Before partitioning, a check constraint must enforce that (#{partitioning_column} IN (#{zero_partition_value.join(',')}))
+ Table #{table_name} is not ready for partitioning.
+ Before partitioning, a check constraint must enforce that (#{partitioning_column} IN (#{zero_partition_value.join(',')}))
MSG
end
@@ -162,14 +170,14 @@ module Gitlab
return if partitioning_constraint.present?
raise UnableToPartition, <<~MSG
- Error adding partitioning constraint `#{PARTITIONING_CONSTRAINT_NAME}` for `#{table_name}`
+ Error adding partitioning constraint `#{PARTITIONING_CONSTRAINT_NAME}` for `#{table_name}`
MSG
end
def validate_partitioning_constraint_synchronously
if partitioning_constraint.constraint_valid?
return Gitlab::AppLogger.info <<~MSG
- Nothing to do, the partitioning constraint exists and is valid for `#{table_name}`
+ Nothing to do, the partitioning constraint exists and is valid for `#{table_name}`
MSG
end
@@ -178,15 +186,15 @@ module Gitlab
return if partitioning_constraint.constraint_valid?
raise UnableToPartition, <<~MSG
- Error validating partitioning constraint `#{partitioning_constraint.name}` for `#{table_name}`
+ Error validating partitioning constraint `#{partitioning_constraint.name}` for `#{table_name}`
MSG
end
def create_parent_table
migration_context.execute(<<~SQL)
- CREATE TABLE IF NOT EXISTS #{quote_table_name(parent_table_name)} (
- LIKE #{quote_table_name(table_name)} INCLUDING ALL
- ) PARTITION BY LIST(#{quote_column_name(partitioning_column)})
+ CREATE TABLE IF NOT EXISTS #{quote_table_name(parent_table_name)} (
+ LIKE #{quote_table_name(table_name)} INCLUDING ALL
+ ) PARTITION BY LIST(#{quote_column_name(partitioning_column)})
SQL
end
@@ -233,7 +241,7 @@ module Gitlab
end
statement_parts << <<~SQL.chomp
- ALTER SEQUENCE #{quote_table_name(seq_name)} OWNED BY #{quote_table_name(new_table)}.#{quote_column_name(column_name)}
+ ALTER SEQUENCE #{quote_table_name(seq_name)} OWNED BY #{quote_table_name(new_table)}.#{quote_column_name(column_name)}
SQL
statement_parts.join(SQL_STATEMENT_SEPARATOR)
@@ -242,24 +250,24 @@ module Gitlab
def remove_constraint_statement
<<~SQL
- ALTER TABLE #{quote_table_name(parent_table_name)}
- DROP CONSTRAINT #{quote_table_name(partitioning_constraint.name)}
+ ALTER TABLE #{quote_table_name(parent_table_name)}
+ DROP CONSTRAINT #{quote_table_name(partitioning_constraint.name)}
SQL
end
# TODO: https://gitlab.com/gitlab-org/gitlab/-/issues/373887
def sequences_owned_by(table_name)
sequence_data = connection.exec_query(<<~SQL, nil, [table_name])
- SELECT seq_pg_class.relname AS seq_name,
- dep_pg_class.relname AS table_name,
- pg_attribute.attname AS col_name
- FROM pg_class seq_pg_class
- INNER JOIN pg_depend ON seq_pg_class.oid = pg_depend.objid
- INNER JOIN pg_class dep_pg_class ON pg_depend.refobjid = dep_pg_class.oid
- INNER JOIN pg_attribute ON dep_pg_class.oid = pg_attribute.attrelid
- AND pg_depend.refobjsubid = pg_attribute.attnum
- WHERE seq_pg_class.relkind = 'S'
- AND dep_pg_class.relname = $1
+ SELECT seq_pg_class.relname AS seq_name,
+ dep_pg_class.relname AS table_name,
+ pg_attribute.attname AS col_name
+ FROM pg_class seq_pg_class
+ INNER JOIN pg_depend ON seq_pg_class.oid = pg_depend.objid
+ INNER JOIN pg_class dep_pg_class ON pg_depend.refobjid = dep_pg_class.oid
+ INNER JOIN pg_attribute ON dep_pg_class.oid = pg_attribute.attrelid
+ AND pg_depend.refobjsubid = pg_attribute.attnum
+ WHERE seq_pg_class.relkind = 'S'
+ AND dep_pg_class.relname = $1
SQL
sequence_data.map do |seq_info|
@@ -270,7 +278,7 @@ module Gitlab
def table_owner(table_name)
connection.select_value(<<~SQL, nil, [table_name])
- SELECT tableowner FROM pg_tables WHERE tablename = $1
+ SELECT tableowner FROM pg_tables WHERE tablename = $1
SQL
end
@@ -281,7 +289,7 @@ module Gitlab
def set_current_user_owns_table_statement(table_name)
<<~SQL.chomp
- ALTER TABLE #{connection.quote_table_name(table_name)} OWNER TO CURRENT_USER
+ ALTER TABLE #{connection.quote_table_name(table_name)} OWNER TO CURRENT_USER
SQL
end
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index fd802b0c5d0..0491073644b 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -18370,6 +18370,9 @@ msgstr ""
msgid "Edit %{profileType} profile"
msgstr ""
+msgid "Edit %{ruleName}"
+msgstr ""
+
msgid "Edit Comment"
msgstr ""
@@ -30716,6 +30719,9 @@ msgstr ""
msgid "Merged this merge request."
msgstr ""
+msgid "Merged-By"
+msgstr ""
+
msgid "Merged: %{merged}"
msgstr ""
@@ -33420,6 +33426,9 @@ msgstr ""
msgid "ObservabilityMetrics|Failed to load metrics."
msgstr ""
+msgid "ObservabilityMetrics|Last ingested"
+msgstr ""
+
msgid "ObservabilityMetrics|Metric Details"
msgstr ""
@@ -40575,6 +40584,9 @@ msgstr ""
msgid "Remove %{displayReference}"
msgstr ""
+msgid "Remove %{ruleName}"
+msgstr ""
+
msgid "Remove Zoom meeting"
msgstr ""
@@ -51081,10 +51093,10 @@ msgstr ""
msgid "Time|s"
msgstr ""
-msgid "Tip: Hover over a job to see the jobs it depends on to run."
+msgid "Tip: Add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
msgstr ""
-msgid "Tip: add a %{linkStart}CODEOWNERS%{linkEnd} to automatically add approvers based on file paths and file types."
+msgid "Tip: Hover over a job to see the jobs it depends on to run."
msgstr ""
msgid "Title"
diff --git a/package.json b/package.json
index a1dec1ec305..39fe351f299 100644
--- a/package.json
+++ b/package.json
@@ -55,13 +55,13 @@
"@cubejs-client/core": "^0.34.37",
"@cubejs-client/vue": "^0.34.37",
"@floating-ui/dom": "^1.2.9",
- "@gitlab/application-sdk-browser": "^0.2.11",
+ "@gitlab/application-sdk-browser": "^0.3.0",
"@gitlab/at.js": "1.5.7",
"@gitlab/cluster-client": "^2.1.0",
"@gitlab/favicon-overlay": "2.0.0",
"@gitlab/fonts": "^1.3.0",
"@gitlab/svgs": "3.75.0",
- "@gitlab/ui": "^72.8.0",
+ "@gitlab/ui": "^72.8.1",
"@gitlab/visual-review-tools": "1.7.3",
"@gitlab/web-ide": "^0.0.1-dev-20231211152737",
"@mattiasbuelens/web-streams-adapter": "^0.1.0",
diff --git a/spec/factories/projects.rb b/spec/factories/projects.rb
index 83107e6cc4a..a2848bd0256 100644
--- a/spec/factories/projects.rb
+++ b/spec/factories/projects.rb
@@ -2,10 +2,6 @@
require_relative '../support/helpers/test_env'
-# TODO: Remove the debug_with_puts statements below! Used for debugging purposes.
-# TODO: https://gitlab.com/gitlab-org/quality/engineering-productivity/team/-/issues/323#note_1688925316
-require_relative '../support/helpers/debug_with_puts'
-
FactoryBot.define do
# Project without repository
#
@@ -70,8 +66,6 @@ FactoryBot.define do
end
after(:build) do |project, evaluator|
- DebugWithPuts.debug_with_puts "Beginning of after :build of projects factory in spec/factories/projects.rb"
-
# Builds and MRs can't have higher visibility level than repository access level.
builds_access_level = [evaluator.builds_access_level, evaluator.repository_access_level].min
merge_requests_access_level = [evaluator.merge_requests_access_level, evaluator.repository_access_level].min
@@ -93,8 +87,6 @@ FactoryBot.define do
security_and_compliance_access_level: evaluator.security_and_compliance_access_level
}
- DebugWithPuts.debug_with_puts "During after :build of projects factory in spec/factories/projects.rb:#{__LINE__}"
-
project_namespace_hash = {
name: evaluator.name,
path: evaluator.path,
@@ -105,16 +97,10 @@ FactoryBot.define do
project_namespace_hash[:id] = evaluator.project_namespace_id.presence
- DebugWithPuts.debug_with_puts "During after :build of projects factory in spec/factories/projects.rb:#{__LINE__}"
-
project.build_project_namespace(project_namespace_hash)
project.build_project_feature(project_feature_hash)
- DebugWithPuts.debug_with_puts "During after :build of projects factory in spec/factories/projects.rb:#{__LINE__}"
-
project.set_runners_token(evaluator.runners_token) if evaluator.runners_token.present?
-
- DebugWithPuts.debug_with_puts "End of after :build of projects factory in spec/factories/projects.rb"
end
to_create do |project|
@@ -122,7 +108,6 @@ FactoryBot.define do
end
after(:create) do |project, evaluator|
- DebugWithPuts.debug_with_puts "Beginning of after :create of projects factory in spec/factories/projects.rb"
# Normally the class Projects::CreateService is used for creating
# projects, and this class takes care of making sure the owner and current
# user have access to the project. Our specs don't use said service class,
@@ -131,16 +116,12 @@ FactoryBot.define do
project.add_owner(project.first_owner)
end
- DebugWithPuts.debug_with_puts "During after :create of projects factory in spec/factories/projects.rb:#{__LINE__}"
-
if project.group
project.run_after_commit_or_now do
AuthorizedProjectUpdate::ProjectRecalculateService.new(project).execute
end
end
- DebugWithPuts.debug_with_puts "During after :create of projects factory in spec/factories/projects.rb:#{__LINE__}"
-
# assign the delegated `#ci_cd_settings` attributes after create
project.group_runners_enabled = evaluator.group_runners_enabled unless evaluator.group_runners_enabled.nil?
project.merge_pipelines_enabled = evaluator.merge_pipelines_enabled unless evaluator.merge_pipelines_enabled.nil?
@@ -152,8 +133,6 @@ FactoryBot.define do
project.runner_token_expiration_interval = evaluator.runner_token_expiration_interval unless evaluator.runner_token_expiration_interval.nil?
project.runner_token_expiration_interval_human_readable = evaluator.runner_token_expiration_interval_human_readable unless evaluator.runner_token_expiration_interval_human_readable.nil?
- DebugWithPuts.debug_with_puts "During after :create of projects factory in spec/factories/projects.rb:#{__LINE__}"
-
if evaluator.import_status
import_state = project.import_state || project.build_import_state
import_state.status = evaluator.import_status
@@ -163,12 +142,8 @@ FactoryBot.define do
import_state.save!
end
- DebugWithPuts.debug_with_puts "During after :create of projects factory in spec/factories/projects.rb:#{__LINE__}"
-
# simulating ::Projects::ProcessSyncEventsWorker because most tests don't run Sidekiq inline
project.create_ci_project_mirror!(namespace_id: project.namespace_id) unless project.ci_project_mirror
-
- DebugWithPuts.debug_with_puts "End of after :create of projects factory in spec/factories/projects.rb"
end
trait :public do
@@ -351,7 +326,6 @@ FactoryBot.define do
end
after :create do |project, evaluator|
- DebugWithPuts.debug_with_puts "Beginning of after :create of trait :repository do in spec/factories/projects.rb"
# Specify `lfs: true` to create the LfsObject for the LFS file in the test repo:
# https://gitlab.com/gitlab-org/gitlab-test/-/blob/master/files/lfs/lfs_object.iso
if evaluator.lfs
@@ -377,8 +351,6 @@ FactoryBot.define do
end
end
- DebugWithPuts.debug_with_puts "During after :create of trait :repository do in spec/factories/projects.rb:#{__LINE__}"
-
if evaluator.create_templates
templates_path = "#{evaluator.create_templates}_templates"
@@ -408,8 +380,6 @@ FactoryBot.define do
branch_name: 'master')
end
- DebugWithPuts.debug_with_puts "During after :create of trait :repository do in spec/factories/projects.rb:#{__LINE__}"
-
if evaluator.create_branch
project.repository.create_file(
project.creator,
@@ -419,8 +389,6 @@ FactoryBot.define do
branch_name: evaluator.create_branch)
end
- DebugWithPuts.debug_with_puts "During after :create of trait :repository do in spec/factories/projects.rb:#{__LINE__}"
-
if evaluator.create_tag
project.repository.add_tag(
project.creator,
@@ -429,7 +397,6 @@ FactoryBot.define do
end
project.track_project_repository
- DebugWithPuts.debug_with_puts "End of after :create of trait :repository do in spec/factories/projects.rb"
end
end
diff --git a/spec/finders/merge_requests_finder_spec.rb b/spec/finders/merge_requests_finder_spec.rb
index 3f9c1baec82..d85ae92f954 100644
--- a/spec/finders/merge_requests_finder_spec.rb
+++ b/spec/finders/merge_requests_finder_spec.rb
@@ -170,6 +170,73 @@ RSpec.describe MergeRequestsFinder, feature_category: :code_review_workflow do
end
end
+ context 'merge_user filtering' do
+ before do
+ merge_request1.update!(state_id: MergeRequest.available_states[:merged])
+ merge_request1.metrics.update!(merged_by_id: user.id)
+ merge_request2.update!(state_id: MergeRequest.available_states[:merged])
+ merge_request2.metrics.update!(merged_by_id: user.id)
+ merge_request3.update!(state_id: MergeRequest.available_states[:merged])
+ merge_request3.metrics.update!(merged_by_id: user2.id)
+ merge_request4.update!(state_id: MergeRequest.available_states[:merged])
+ merge_request4.metrics.update!(merged_by_id: user2.id)
+ end
+
+ subject { described_class.new(user, params).execute }
+
+ context 'when flag `mr_merge_user_filter` is disabled' do
+ before do
+ stub_feature_flags(mr_merge_user_filter: false)
+ end
+
+ describe 'by merge_user_id' do
+ let(:params) { { merge_user_id: user.id } }
+ let(:expected_mr) { [merge_request1, merge_request2, merge_request3, merge_request4, merge_request5] }
+
+ it { is_expected.to contain_exactly(*expected_mr) }
+ end
+
+ describe 'by merge_user_username' do
+ let(:params) { { merge_user_username: user.username } }
+ let(:expected_mr) { [merge_request1, merge_request2, merge_request3, merge_request4, merge_request5] }
+
+ it { is_expected.to contain_exactly(*expected_mr) }
+ end
+ end
+
+ context 'when flag `mr_merge_user_filter` is enabled' do
+ before do
+ stub_feature_flags(mr_merge_user_filter: true)
+ end
+
+ describe 'by merge_user_id' do
+ let(:params) { { merge_user_id: user.id } }
+ let(:expected_mr) { [merge_request1, merge_request2] }
+
+ it { is_expected.to contain_exactly(*expected_mr) }
+ end
+
+ describe 'by merge_user_username' do
+ let(:params) { { merge_user_username: user.username } }
+ let(:expected_mr) { [merge_request1, merge_request2] }
+
+ it { is_expected.to contain_exactly(*expected_mr) }
+ end
+
+ describe 'by merge_user_id with unknown user id' do
+ let(:params) { { merge_user_id: 99999 } }
+
+ it { is_expected.to be_empty }
+ end
+
+ describe 'by merge_user_username with unknown user name' do
+ let(:params) { { merge_user_username: 'does-not-exist' } }
+
+ it { is_expected.to be_empty }
+ end
+ end
+ end
+
context 'filtering by group' do
it 'includes all merge requests when user has access excluding merge requests from projects the user does not have access to' do
private_project = allow_gitaly_n_plus_1 { create(:project, :private, group: group) }
diff --git a/spec/frontend/fixtures/static/textarea.html b/spec/frontend/fixtures/static/textarea.html
index 68d5a0f2d4d..6bebd5df11b 100644
--- a/spec/frontend/fixtures/static/textarea.html
+++ b/spec/frontend/fixtures/static/textarea.html
@@ -10,7 +10,7 @@
<textarea class="note-textarea js-gfm-input js-autosize markdown-area"
placeholder="Write milestone description..." dir="auto"
data-supports-quick-actions="false" data-supports-autocomplete="true"
- data-qa-selector="milestone_description_field" data-autofocus="false"
+ data-testid="milestone-description-field" data-autofocus="false"
name="milestone[description]"
id="milestone_description"></textarea>
<a class="zen-control zen-control-leave js-zen-leave gl-text-gray-500"
diff --git a/spec/frontend/vue_shared/components/form/input_copy_toggle_visibility_spec.js b/spec/frontend/vue_shared/components/form/input_copy_toggle_visibility_spec.js
index b57643a1359..27227ac69dd 100644
--- a/spec/frontend/vue_shared/components/form/input_copy_toggle_visibility_spec.js
+++ b/spec/frontend/vue_shared/components/form/input_copy_toggle_visibility_spec.js
@@ -378,7 +378,7 @@ describe('InputCopyToggleVisibility', () => {
props: {
formInputGroupProps: {
name: 'Foo bar',
- 'data-qa-selector': 'Foo bar',
+ 'data-testid': 'Foo bar',
class: 'Foo bar',
id: 'Foo bar',
},
@@ -387,14 +387,14 @@ describe('InputCopyToggleVisibility', () => {
expect(findFormInput().attributes()).toMatchObject({
name: 'Foo bar',
- 'data-qa-selector': 'Foo bar',
+ 'data-testid': 'Foo bar',
class: expect.stringContaining('Foo bar'),
id: 'Foo bar',
});
const attributesInputGroup = findFormInputGroup().attributes();
expect(attributesInputGroup.name).toBeUndefined();
- expect(attributesInputGroup['data-qa-selector']).toBeUndefined();
+ expect(attributesInputGroup['data-testid']).toBeUndefined();
expect(attributesInputGroup.class).not.toContain('Foo bar');
expect(attributesInputGroup.id).toBeUndefined();
});
diff --git a/spec/helpers/search_helper_spec.rb b/spec/helpers/search_helper_spec.rb
index bad30b5033d..e8c412cc892 100644
--- a/spec/helpers/search_helper_spec.rb
+++ b/spec/helpers/search_helper_spec.rb
@@ -1108,10 +1108,10 @@ RSpec.describe SearchHelper, feature_category: :global_search do
context 'data' do
where(:scope, :label, :data, :search, :active_scope) do
- "projects" | "Projects" | { qa_selector: 'projects_tab' } | nil | "projects"
- "snippet_titles" | "Snippets" | nil | { snippets: "test" } | "code"
- "projects" | "Projects" | { qa_selector: 'projects_tab' } | nil | "issue"
- "snippet_titles" | "Snippets" | nil | { snippets: "test" } | "snippet_titles"
+ "projects" | "Projects" | { testid: 'projects-tab' } | nil | "projects"
+ "snippet_titles" | "Snippets" | nil | { snippets: "test" } | "code"
+ "projects" | "Projects" | { testid: 'projects-tab' } | nil | "issue"
+ "snippet_titles" | "Snippets" | nil | { snippets: "test" } | "snippet_titles"
end
with_them do
diff --git a/spec/lib/gitlab/database/partitioning/list/convert_table_spec.rb b/spec/lib/gitlab/database/partitioning/list/convert_table_spec.rb
index e0b090f7ff9..45bedbda22b 100644
--- a/spec/lib/gitlab/database/partitioning/list/convert_table_spec.rb
+++ b/spec/lib/gitlab/database/partitioning/list/convert_table_spec.rb
@@ -142,18 +142,29 @@ RSpec.describe Gitlab::Database::Partitioning::List::ConvertTable, feature_categ
end
describe '#revert_preparation_for_partitioning' do
- before do
- converter.prepare_for_partitioning
- end
-
shared_examples 'runs #revert_preparation_for_partitioning' do
- it 'removes a check constraint' do
- expect { revert_prepare }.to change {
- Gitlab::Database::PostgresConstraint
- .check_constraints
- .by_table_identifier("#{connection.current_schema}.#{table_name}")
- .count
- }.from(1).to(0)
+ context 'when check constraint exists' do
+ before do
+ converter.prepare_for_partitioning
+ end
+
+ it 'removes a check constraint' do
+ expect { revert_prepare }.to change {
+ Gitlab::Database::PostgresConstraint
+ .check_constraints
+ .by_table_identifier("#{connection.current_schema}.#{table_name}")
+ .count
+ }.from(1).to(0)
+ end
+ end
+
+ context 'when check constraint does not exist' do
+ it 'returns a message' do
+ expect(Gitlab::AppLogger)
+ .to receive(:warn)
+ .with(starting_with('The partitioning constraint'))
+ revert_prepare
+ end
end
end
diff --git a/spec/lib/service_ping/build_payload_spec.rb b/spec/lib/service_ping/build_payload_spec.rb
index 6699310681a..8d2b5311be3 100644
--- a/spec/lib/service_ping/build_payload_spec.rb
+++ b/spec/lib/service_ping/build_payload_spec.rb
@@ -3,7 +3,8 @@
require 'spec_helper'
RSpec.describe ServicePing::BuildPayload, feature_category: :service_ping do
- describe '#execute', :without_license do
+ describe '#execute', :without_license,
+ quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/438582' do
subject(:service_ping_payload) { described_class.new.execute }
include_context 'stubbed service ping metrics definitions'
diff --git a/spec/requests/api/merge_requests_spec.rb b/spec/requests/api/merge_requests_spec.rb
index 6ba51080bf0..ef249f82072 100644
--- a/spec/requests/api/merge_requests_spec.rb
+++ b/spec/requests/api/merge_requests_spec.rb
@@ -27,7 +27,7 @@ RSpec.describe API::MergeRequests, :aggregate_failures, feature_category: :sourc
shared_context 'with merge requests' do
let_it_be(:milestone1) { create(:milestone, title: '0.9', project: project) }
- let_it_be(:merge_request_merged) { create(:merge_request, state: "merged", author: user, assignees: [user], source_project: project, target_project: project, title: "Merged test", created_at: base_time + 2.seconds, updated_at: base_time + 1.hour, merge_commit_sha: '9999999999999999999999999999999999999999') }
+ let_it_be(:merge_request_merged) { create(:merge_request, :with_merged_metrics, state: "merged", author: user, assignees: [user], source_project: project, target_project: project, title: "Merged test", created_at: base_time + 2.seconds, updated_at: base_time + 1.hour, merge_commit_sha: '9999999999999999999999999999999999999999', merged_by: user) }
let_it_be(:merge_request) { create(:merge_request, :simple, milestone: milestone1, author: user, assignees: [user], source_project: project, target_project: project, source_branch: 'markdown', title: "Test", created_at: base_time, updated_at: base_time + 3.hours) }
let_it_be(:merge_request_closed) { create(:merge_request, state: "closed", milestone: milestone1, author: user, assignees: [user], source_project: project, target_project: project, title: "Closed test", created_at: base_time + 1.second, updated_at: base_time) }
let_it_be(:merge_request_locked) { create(:merge_request, state: "locked", milestone: milestone1, author: user, assignees: [user], source_project: project, target_project: project, title: "Locked test", created_at: base_time + 1.second, updated_at: base_time + 2.hours) }
@@ -931,6 +931,85 @@ RSpec.describe API::MergeRequests, :aggregate_failures, feature_category: :sourc
end
end
+ context 'filter by merge_user' do
+ let(:params) { { scope: :all } }
+
+ context 'when flag `mr_merge_user_filter` is disabled' do
+ before do
+ stub_feature_flags(mr_merge_user_filter: false)
+ end
+
+ context 'with merge_user_id' do
+ let(:params) { super().merge(merge_user_id: user.id) }
+
+ it 'returns merged merge requests for the given user' do
+ get api('/merge_requests', user), params: params
+
+ expect_response_contain_exactly(
+ merge_request.id,
+ merge_request_closed.id,
+ merge_request_merged.id,
+ merge_request_locked.id,
+ merge_request2.id
+ )
+ end
+ end
+
+ context 'with merge_user_username' do
+ let(:params) { super().merge(merge_user_username: user.username) }
+
+ it 'returns merged merge requests for the given user' do
+ get api('/merge_requests', user), params: params
+
+ expect_response_contain_exactly(
+ merge_request.id,
+ merge_request_closed.id,
+ merge_request_merged.id,
+ merge_request_locked.id,
+ merge_request2.id
+ )
+ end
+ end
+ end
+
+ context 'when flag `mr_merge_user_filter` is enabled' do
+ before do
+ stub_feature_flags(mr_merge_user_filter: true)
+ end
+
+ context 'with merge_user_id' do
+ let(:params) { super().merge(merge_user_id: user.id) }
+
+ it 'returns merged merge requests for the given user' do
+ get api('/merge_requests', user), params: params
+
+ expect_response_contain_exactly(merge_request_merged.id)
+ end
+ end
+
+ context 'with merge_user_username' do
+ let(:params) { super().merge(merge_user_username: user.username) }
+
+ it 'returns merged merge requests for the given user' do
+ get api('/merge_requests', user), params: params
+
+ expect_response_contain_exactly(merge_request_merged.id)
+ end
+ end
+
+ context 'with both merge_user_id and merge_user_username' do
+ let(:params) { super().merge(merge_user_id: user.id, merge_user_username: user.username) }
+
+ it 'returns a 400' do
+ get api('/merge_requests', user), params: params
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['error']).to eq('merge_user_id, merge_user_username are mutually exclusive')
+ end
+ end
+ end
+ end
+
it 'returns an array of merge requests assigned to the given user' do
merge_request3 = create(:merge_request, :simple, author: user, assignees: [user2], source_project: project2, target_project: project2, source_branch: 'other-branch')
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 3dfc27b8511..d08f6ef9d0d 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -223,6 +223,14 @@ RSpec.configure do |config|
example.metadata[:retry] = 1
end
+ # Gradually stop using rspec-retry
+ # See https://gitlab.com/gitlab-org/gitlab/-/issues/438388
+ %i[lib migrations models requests services].each do |type|
+ config.prepend_before(:each, type: type) do |example|
+ example.metadata[:retry] = 1
+ end
+ end
+
config.exceptions_to_hard_fail = [DeprecationToolkitEnv::DeprecationBehaviors::SelectiveRaise::RaiseDisallowedDeprecation]
end
diff --git a/spec/support/helpers/debug_with_puts.rb b/spec/support/helpers/debug_with_puts.rb
deleted file mode 100644
index b8599cc7d40..00000000000
--- a/spec/support/helpers/debug_with_puts.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-# TODO: Remove the debug_with_puts statements below! Used for debugging purposes.
-# TODO: https://gitlab.com/gitlab-org/quality/engineering-productivity/team/-/issues/323#note_1688925316
-module DebugWithPuts
- def debug_with_puts(message)
- return unless ENV['CI'] # rubocop:disable RSpec/AvoidConditionalStatements -- Debug information only in the CI
-
- warn "[#{Time.current}] #{message}"
- end
-
- module_function :debug_with_puts
-end
diff --git a/spec/support/helpers/stub_requests.rb b/spec/support/helpers/stub_requests.rb
index b77b366e037..a3810323fee 100644
--- a/spec/support/helpers/stub_requests.rb
+++ b/spec/support/helpers/stub_requests.rb
@@ -18,15 +18,9 @@ module StubRequests
end
def stub_dns(url, ip_address:, port: 80)
- DebugWithPuts.debug_with_puts "beginning of stub_dns"
url = parse_url(url)
- DebugWithPuts.debug_with_puts "before socket = Socket.sockaddr_in"
socket = Socket.sockaddr_in(port, ip_address)
- DebugWithPuts.debug_with_puts "after socket = Socket.sockaddr_in"
-
- DebugWithPuts.debug_with_puts "before addr = Addrinfo.new(socket)"
addr = Addrinfo.new(socket)
- DebugWithPuts.debug_with_puts "after addr = Addrinfo.new(socket)"
# See Gitlab::UrlBlocker
allow(Addrinfo).to receive(:getaddrinfo)
diff --git a/yarn.lock b/yarn.lock
index 0dffdd18009..df6bad30f7f 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1258,10 +1258,10 @@
resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.1.tgz#16308cea045f0fc777b6ff20a9f25474dd8293d2"
integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==
-"@gitlab/application-sdk-browser@^0.2.11":
- version "0.2.11"
- resolved "https://registry.yarnpkg.com/@gitlab/application-sdk-browser/-/application-sdk-browser-0.2.11.tgz#f061f6aed5b75927b2150b5021a77e7c602675b6"
- integrity sha512-ThPgw7waDoF7tqlkYlTmPwLCe1h5qa3QuXwsNEVma4abdeuxxW3vwOPlRdZaUgZ0tmoSMefYgeUdjZQ/huqZ+w==
+"@gitlab/application-sdk-browser@^0.3.0":
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/@gitlab/application-sdk-browser/-/application-sdk-browser-0.3.0.tgz#6f1a2e6480bbc830e33bde35406ad45b12215b7a"
+ integrity sha512-nhJs/4Ccqb/v3gONKb4hExyFrzaA1YB1JHXf63n5TOG3Q6piUOaWWR6nUwQM6j/gmc+OqHinw0sX38twtYycXg==
dependencies:
"@snowplow/browser-plugin-client-hints" "^3.9.0"
"@snowplow/browser-plugin-error-tracking" "^3.9.0"
@@ -1321,10 +1321,10 @@
resolved "https://registry.yarnpkg.com/@gitlab/svgs/-/svgs-3.75.0.tgz#31e4a3ab66cab3e405c4cff1f065ee3924fe7a98"
integrity sha512-TAmlxByyZcZvr/hxipfI53XLNlzpVZCf5izRdoIhR4QFHjZ56HIwQfoVCGYRNLDV8eTnO4ljNBFLZCfyipdPoQ==
-"@gitlab/ui@^72.8.0":
- version "72.8.0"
- resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-72.8.0.tgz#66e50de09077eeeec7b8e893155ec32f1a19232d"
- integrity sha512-ZszjCxOfdJffrfu21/BwIqk5t450deBx+IxF2jwLqFdKTP3g89+VtHXew3xO9BAyxGlQQ8h3AxDXRhWprodayQ==
+"@gitlab/ui@^72.8.1":
+ version "72.8.1"
+ resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-72.8.1.tgz#7c330b6c29bf528a4f0c8c4eadbeb8b0f7a6a863"
+ integrity sha512-hx/tXyOsVxs49ZnBPKDcn16PXRCut1ilIus6nwpjvraw3oe23ZdXBrDiFPndjsyRfjGK4czytRgmu7hokJ+rnQ==
dependencies:
"@floating-ui/dom" "1.4.3"
bootstrap-vue "2.23.1"