+
diff --git a/app/controllers/concerns/one_trust_csp.rb b/app/controllers/concerns/one_trust_csp.rb
index cd35eeb587c..38477862ef6 100644
--- a/app/controllers/concerns/one_trust_csp.rb
+++ b/app/controllers/concerns/one_trust_csp.rb
@@ -5,7 +5,8 @@ module OneTrustCSP
included do
content_security_policy do |policy|
- next unless helpers.one_trust_enabled? || policy.directives.present?
+ next unless helpers.one_trust_enabled?
+ next unless policy.directives.present?
default_script_src = policy.directives['script-src'] || policy.directives['default-src']
script_src_values = Array.wrap(default_script_src) | ["'unsafe-eval'", 'https://cdn.cookielaw.org', 'https://*.onetrust.com']
diff --git a/app/controllers/projects/incidents_controller.rb b/app/controllers/projects/incidents_controller.rb
index 1b6b952e3f5..b779fa366e3 100644
--- a/app/controllers/projects/incidents_controller.rb
+++ b/app/controllers/projects/incidents_controller.rb
@@ -12,6 +12,7 @@ class Projects::IncidentsController < Projects::ApplicationController
push_force_frontend_feature_flag(:work_items_alpha, !!@project&.work_items_alpha_feature_flag_enabled?)
push_frontend_feature_flag(:notifications_todos_buttons, current_user)
end
+ before_action :check_incidents_feature_flag, only: [:index]
feature_category :incident_management
urgency :low
@@ -48,6 +49,12 @@ class Projects::IncidentsController < Projects::ApplicationController
def serializer
IssueSerializer.new(current_user: current_user, project: incident.project)
end
+
+ def check_incidents_feature_flag
+ return unless Feature.enabled?(:hide_incident_management_features, @project)
+
+ render_404
+ end
end
Projects::IncidentsController.prepend_mod
diff --git a/app/workers/import_export_project_cleanup_worker.rb b/app/workers/import_export_project_cleanup_worker.rb
index 4cb59c424d1..09a01142616 100644
--- a/app/workers/import_export_project_cleanup_worker.rb
+++ b/app/workers/import_export_project_cleanup_worker.rb
@@ -8,6 +8,7 @@ class ImportExportProjectCleanupWorker # rubocop:disable Scalability/IdempotentW
# rubocop:disable Scalability/CronWorkerContext
# This worker does not perform work scoped to a context
include CronjobQueue
+
# rubocop:enable Scalability/CronWorkerContext
feature_category :importers
diff --git a/app/workers/members/expiring_email_notification_worker.rb b/app/workers/members/expiring_email_notification_worker.rb
index d47417c6c3e..0385076f6b9 100644
--- a/app/workers/members/expiring_email_notification_worker.rb
+++ b/app/workers/members/expiring_email_notification_worker.rb
@@ -10,13 +10,12 @@ module Members
urgency :low
idempotent!
- def perform(member_id)
- notification_service = NotificationService.new
- member = ::Member.find_by_id(member_id)
+ attr_reader :member
- return unless member
- return unless Feature.enabled?(:member_expiring_email_notification, member.source.root_ancestor)
- return if member.expiry_notified_at.present?
+ def perform(member_id)
+ member = ::Member.including_user.including_source.find_by_id(member_id)
+
+ return unless valid_for_notification?(member)
with_context(user: member.user) do
notification_service.member_about_to_expire(member)
@@ -25,5 +24,19 @@ module Members
member.update(expiry_notified_at: Time.current)
end
end
+
+ def valid_for_notification?(member)
+ member.expiry_notified_at.blank? &&
+ member&.user.present? &&
+ member.user.active? &&
+ member.user.human? &&
+ Feature.enabled?(:member_expiring_email_notification, member.source&.root_ancestor)
+ end
+
+ private
+
+ def notification_service
+ @notification_service ||= NotificationService.new
+ end
end
end
diff --git a/app/workers/members/expiring_worker.rb b/app/workers/members/expiring_worker.rb
index 0d631af3a7c..8750db75154 100644
--- a/app/workers/members/expiring_worker.rb
+++ b/app/workers/members/expiring_worker.rb
@@ -20,7 +20,7 @@ module Members
limit_date = Member::DAYS_TO_EXPIRE.days.from_now.to_date
- expiring_members = Member.active.where(users: { user_type: :human }).expiring_and_not_notified(limit_date) # rubocop: disable CodeReuse/ActiveRecord
+ expiring_members = Member.non_invite.non_request.non_minimal_access.expiring_and_not_notified(limit_date)
expiring_members.each_batch(of: BATCH_LIMIT) do |members|
members.pluck_primary_key.each do |member_id|
diff --git a/config/events/click_permalink_button_in_overflow_menu.yml b/config/events/click_permalink_button_in_overflow_menu.yml
new file mode 100644
index 00000000000..2f84a314699
--- /dev/null
+++ b/config/events/click_permalink_button_in_overflow_menu.yml
@@ -0,0 +1,22 @@
+---
+description: Users access the permalink button from either blob or repository overflow menu through a click or keyboard shortcut
+internal_events: true
+action: click_permalink_button_in_overflow_menu
+identifiers:
+- project
+- namespace
+- user
+additional_properties:
+ label:
+ description: method (click/shortcut)
+ property:
+ description: source location (blob/repository)
+product_group: source_code
+product_categories:
+- source_code_management
+milestone: '18.1'
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/190730
+tiers:
+- free
+- premium
+- ultimate
diff --git a/config/feature_flags/wip/directory_code_dropdown_updates.yml b/config/feature_flags/gitlab_com_derisk/directory_code_dropdown_updates.yml
similarity index 93%
rename from config/feature_flags/wip/directory_code_dropdown_updates.yml
rename to config/feature_flags/gitlab_com_derisk/directory_code_dropdown_updates.yml
index 1a94eba9ebc..f1389a4022d 100644
--- a/config/feature_flags/wip/directory_code_dropdown_updates.yml
+++ b/config/feature_flags/gitlab_com_derisk/directory_code_dropdown_updates.yml
@@ -5,5 +5,5 @@ introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/178890
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/514750
milestone: '17.9'
group: group::source code
-type: wip
+type: gitlab_com_derisk
default_enabled: false
diff --git a/config/feature_flags/wip/hide_incident_management_features.yml b/config/feature_flags/wip/hide_incident_management_features.yml
new file mode 100644
index 00000000000..bbc327160c6
--- /dev/null
+++ b/config/feature_flags/wip/hide_incident_management_features.yml
@@ -0,0 +1,10 @@
+---
+name: hide_incident_management_features
+description: Hides incident management features
+feature_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/537180
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/190278
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/539351
+milestone: '18.1'
+group: group::platform insights
+type: wip
+default_enabled: false
diff --git a/db/click_house/migrate/main/20250507075653_update_code_suggestion_events_daily_data.rb b/db/click_house/migrate/main/20250507075653_update_code_suggestion_events_daily_data.rb
new file mode 100644
index 00000000000..7a5eb1b1a0e
--- /dev/null
+++ b/db/click_house/migrate/main/20250507075653_update_code_suggestion_events_daily_data.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+class UpdateCodeSuggestionEventsDailyData < ClickHouse::Migration
+ def up
+ execute("CREATE TABLE IF NOT EXISTS code_suggestion_events_daily_temp AS code_suggestion_events_daily")
+
+ execute("TRUNCATE TABLE code_suggestion_events_daily_temp")
+
+ execute(<<~SQL
+ INSERT INTO code_suggestion_events_daily_temp
+ SELECT * FROM (
+ SELECT
+ namespace_path,
+ user_id,
+ toDate(timestamp) as date,
+ event,
+ language,
+ SUM(suggestion_size) as suggestions_size_sum,
+ COUNT(*) as occurrences
+ FROM code_suggestion_events
+ GROUP BY namespace_path, user_id, date, event, language
+ ) fresh_data WHERE occurrences <> 0 OR suggestions_size_sum <> 0;
+ SQL
+ )
+ execute("EXCHANGE TABLES code_suggestion_events_daily AND code_suggestion_events_daily_temp")
+ execute("DROP TABLE code_suggestion_events_daily_temp")
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/docs/ai_namespace_feature_settings.yml b/db/docs/ai_namespace_feature_settings.yml
new file mode 100644
index 00000000000..389c947a72e
--- /dev/null
+++ b/db/docs/ai_namespace_feature_settings.yml
@@ -0,0 +1,12 @@
+---
+table_name: ai_namespace_feature_settings
+classes:
+- Ai::ModelSelection::NamespaceFeatureSetting
+feature_categories:
+- self-hosted_models
+description: This table associates namespaces with AI features for model selection and Duo Self-Hosted configuration
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/190194
+milestone: '18.1'
+gitlab_schema: gitlab_main_cell
+sharding_key:
+ namespace_id: namespaces
diff --git a/db/docs/batched_background_migrations/backfill_dependency_proxy_manifest_states_group_id.yml b/db/docs/batched_background_migrations/backfill_dependency_proxy_manifest_states_group_id.yml
index 3736b87c810..10a9d142ab0 100644
--- a/db/docs/batched_background_migrations/backfill_dependency_proxy_manifest_states_group_id.yml
+++ b/db/docs/batched_background_migrations/backfill_dependency_proxy_manifest_states_group_id.yml
@@ -1,8 +1,9 @@
---
migration_job_name: BackfillDependencyProxyManifestStatesGroupId
-description: Backfills sharding key `dependency_proxy_manifest_states.group_id` from `dependency_proxy_manifests`.
+description: Backfills sharding key `dependency_proxy_manifest_states.group_id` from
+ `dependency_proxy_manifests`.
feature_category: geo_replication
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/169239
milestone: '17.6'
queued_migration_version: 20241015080747
-finalized_by: # version of the migration that finalized this BBM
+finalized_by: '20250327231630'
diff --git a/db/docs/ci_stages.yml b/db/docs/deleted_tables/ci_stages.yml
similarity index 75%
rename from db/docs/ci_stages.yml
rename to db/docs/deleted_tables/ci_stages.yml
index ffe988ba7ae..e68efa9fb42 100644
--- a/db/docs/ci_stages.yml
+++ b/db/docs/deleted_tables/ci_stages.yml
@@ -11,3 +11,5 @@ gitlab_schema: gitlab_ci
sharding_key:
project_id: projects
table_size: over_limit
+removed_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/191031
+removed_in_milestone: '18.1'
diff --git a/db/migrate/20250505153629_create_ai_namespace_feature_settings.rb b/db/migrate/20250505153629_create_ai_namespace_feature_settings.rb
new file mode 100644
index 00000000000..f00a6d17034
--- /dev/null
+++ b/db/migrate/20250505153629_create_ai_namespace_feature_settings.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+# See https://docs.gitlab.com/ee/development/migration_style_guide.html
+# for more information on how to write migrations for GitLab.
+
+class CreateAiNamespaceFeatureSettings < Gitlab::Database::Migration[2.3]
+ milestone '18.1'
+
+ def change
+ create_table :ai_namespace_feature_settings do |t| # rubocop:disable Migration/EnsureFactoryForTable -- factory is in ee/spec/factories/ai/model_selection/namespace_feature_settings.rb
+ t.timestamps_with_timezone null: false
+ t.references :namespace, foreign_key: { on_delete: :cascade }, index: false, null: false
+ t.integer :feature, null: false, limit: 2
+ t.text :offered_model_ref, limit: 255, null: true
+ t.text :offered_model_name, limit: 255, null: true
+
+ t.index [:namespace_id, :feature],
+ unique: true,
+ name: 'idx_namespace_feature_settings_on_namespace_id_and_feature'
+ end
+ end
+end
diff --git a/db/post_migrate/20250327231630_finalize_hk_backfill_dependency_proxy_manifest_states_group_id.rb b/db/post_migrate/20250327231630_finalize_hk_backfill_dependency_proxy_manifest_states_group_id.rb
new file mode 100644
index 00000000000..8ec0ed5e44b
--- /dev/null
+++ b/db/post_migrate/20250327231630_finalize_hk_backfill_dependency_proxy_manifest_states_group_id.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+class FinalizeHkBackfillDependencyProxyManifestStatesGroupId < Gitlab::Database::Migration[2.2]
+ milestone '18.1'
+
+ disable_ddl_transaction!
+
+ restrict_gitlab_migration gitlab_schema: :gitlab_main_cell
+
+ def up
+ ensure_batched_background_migration_is_finished(
+ job_class_name: 'BackfillDependencyProxyManifestStatesGroupId',
+ table_name: :dependency_proxy_manifest_states,
+ column_name: :dependency_proxy_manifest_id,
+ job_arguments: [:group_id, :dependency_proxy_manifests, :group_id, :dependency_proxy_manifest_id],
+ finalize: true
+ )
+ end
+
+ def down; end
+end
diff --git a/db/post_migrate/20250512121028_move_ci_stages_to_dynamic_schema.rb b/db/post_migrate/20250512121028_move_ci_stages_to_dynamic_schema.rb
new file mode 100644
index 00000000000..20aeb0707a7
--- /dev/null
+++ b/db/post_migrate/20250512121028_move_ci_stages_to_dynamic_schema.rb
@@ -0,0 +1,54 @@
+# frozen_string_literal: true
+
+class MoveCiStagesToDynamicSchema < Gitlab::Database::Migration[2.3]
+ include Gitlab::Database::MigrationHelpers::WraparoundAutovacuum
+
+ milestone '18.1'
+ skip_require_disable_ddl_transactions!
+
+ DYNAMIC_SCHEMA = Gitlab::Database::DYNAMIC_PARTITIONS_SCHEMA
+ TABLE_NAME = :ci_stages
+
+ def up
+ return unless can_execute_on?(TABLE_NAME)
+
+ connection.execute(<<~SQL)
+ ALTER TABLE IF EXISTS #{TABLE_NAME} SET SCHEMA #{DYNAMIC_SCHEMA};
+ SQL
+ end
+
+ def down
+ return unless can_execute_on?(TABLE_NAME)
+
+ table_identifier = "#{DYNAMIC_SCHEMA}.#{TABLE_NAME}"
+
+ if table_exists?(table_identifier)
+ connection.execute(<<~SQL)
+ ALTER TABLE IF EXISTS #{table_identifier} SET SCHEMA #{connection.current_schema};
+ SQL
+ else # In tests we set the database from structure.sql, so the table doesn't exist
+ remove_dynamic_partitions
+ connection.execute(<<~SQL)
+ CREATE TABLE IF NOT EXISTS #{TABLE_NAME} PARTITION OF p_#{TABLE_NAME} FOR VALUES IN (100, 101);
+ SQL
+ end
+ end
+
+ private
+
+ def remove_dynamic_partitions
+ drop_partition(100)
+ drop_partition(101)
+ end
+
+ def drop_partition(number)
+ identifier = "#{DYNAMIC_SCHEMA}.#{TABLE_NAME}_#{number}"
+ return unless table_exists?(identifier)
+
+ connection.execute(<<~SQL)
+ ALTER TABLE p_#{TABLE_NAME} DETACH PARTITION #{identifier};
+
+ DROP TABLE IF EXISTS #{identifier};
+ SQL
+ end
+end
diff --git a/db/post_migrate/20250513131324_schedule_index_removal_ci_pipelines_on_project_id_and_sha_and_id.rb b/db/post_migrate/20250513131324_schedule_index_removal_ci_pipelines_on_project_id_and_sha_and_id.rb
new file mode 100644
index 00000000000..d6af87f6386
--- /dev/null
+++ b/db/post_migrate/20250513131324_schedule_index_removal_ci_pipelines_on_project_id_and_sha_and_id.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class ScheduleIndexRemovalCiPipelinesOnProjectIdAndShaAndId < Gitlab::Database::Migration[2.3]
+ include Gitlab::Database::PartitioningMigrationHelpers
+
+ milestone '18.1'
+ disable_ddl_transaction!
+
+ TABLE_NAME = :ci_pipelines
+ INDEX_NAME = :ci_pipelines_on_project_id_and_sha_and_id
+ COLUMN_NAMES = [:project_id, :sha, :id]
+
+ def up
+ prepare_async_index_removal(TABLE_NAME, COLUMN_NAMES, name: INDEX_NAME)
+ end
+
+ def down
+ unprepare_async_index(TABLE_NAME, COLUMN_NAMES, name: INDEX_NAME)
+ end
+end
diff --git a/db/schema_migrations/20250327231630 b/db/schema_migrations/20250327231630
new file mode 100644
index 00000000000..aa5d09db08e
--- /dev/null
+++ b/db/schema_migrations/20250327231630
@@ -0,0 +1 @@
+31fcc2a8a4af44f8166cf18d5948cffb482435c9fabb95c0dedd3908ba8740ae
\ No newline at end of file
diff --git a/db/schema_migrations/20250505153629 b/db/schema_migrations/20250505153629
new file mode 100644
index 00000000000..c2c991037dc
--- /dev/null
+++ b/db/schema_migrations/20250505153629
@@ -0,0 +1 @@
+10a1b7f780eec47e3450f4b9b96dec6cc074c4320ed96605296d7ac954800331
\ No newline at end of file
diff --git a/db/schema_migrations/20250512121028 b/db/schema_migrations/20250512121028
new file mode 100644
index 00000000000..49ee676a415
--- /dev/null
+++ b/db/schema_migrations/20250512121028
@@ -0,0 +1 @@
+f9dc70efdf5c716cc34a301bb965456f905e2e820c9a08a4a7d46222884ad022
\ No newline at end of file
diff --git a/db/schema_migrations/20250513131324 b/db/schema_migrations/20250513131324
new file mode 100644
index 00000000000..52bede89663
--- /dev/null
+++ b/db/schema_migrations/20250513131324
@@ -0,0 +1 @@
+794da9191e80babde7c30b1f217aad688247d8b29e8d0197ec3310f343700479
\ No newline at end of file
diff --git a/db/structure.sql b/db/structure.sql
index 7535820f9c2..c916b13e732 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -7835,6 +7835,27 @@ CREATE SEQUENCE ai_feature_settings_id_seq
ALTER SEQUENCE ai_feature_settings_id_seq OWNED BY ai_feature_settings.id;
+CREATE TABLE ai_namespace_feature_settings (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ namespace_id bigint NOT NULL,
+ feature smallint NOT NULL,
+ offered_model_ref text,
+ offered_model_name text,
+ CONSTRAINT check_14e81e87bc CHECK ((char_length(offered_model_ref) <= 255)),
+ CONSTRAINT check_c850e74656 CHECK ((char_length(offered_model_name) <= 255))
+);
+
+CREATE SEQUENCE ai_namespace_feature_settings_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ai_namespace_feature_settings_id_seq OWNED BY ai_namespace_feature_settings.id;
+
CREATE TABLE ai_self_hosted_models (
id bigint NOT NULL,
created_at timestamp with time zone NOT NULL,
@@ -11908,21 +11929,6 @@ CREATE SEQUENCE ci_sources_projects_id_seq
ALTER SEQUENCE ci_sources_projects_id_seq OWNED BY ci_sources_projects.id;
-CREATE TABLE ci_stages (
- project_id bigint,
- created_at timestamp without time zone,
- updated_at timestamp without time zone,
- name character varying,
- status integer,
- lock_version integer DEFAULT 0,
- "position" integer,
- id bigint NOT NULL,
- partition_id bigint NOT NULL,
- pipeline_id bigint,
- CONSTRAINT check_74835fc631 CHECK ((project_id IS NOT NULL)),
- CONSTRAINT check_81b431e49b CHECK ((lock_version IS NOT NULL))
-);
-
CREATE SEQUENCE ci_stages_id_seq
START WITH 1
INCREMENT BY 1
@@ -26592,8 +26598,6 @@ ALTER TABLE ONLY ci_runner_taggings ATTACH PARTITION ci_runner_taggings_instance
ALTER TABLE ONLY ci_runner_taggings ATTACH PARTITION ci_runner_taggings_project_type FOR VALUES IN ('3');
-ALTER TABLE ONLY p_ci_stages ATTACH PARTITION ci_stages FOR VALUES IN ('100', '101');
-
ALTER TABLE ONLY uploads_9ba88c4165 ATTACH PARTITION dependency_list_export_part_uploads FOR VALUES IN ('Dependencies::DependencyListExport::Part');
ALTER TABLE ONLY uploads_9ba88c4165 ATTACH PARTITION dependency_list_export_uploads FOR VALUES IN ('Dependencies::DependencyListExport');
@@ -26700,6 +26704,8 @@ ALTER TABLE ONLY ai_duo_chat_events ALTER COLUMN id SET DEFAULT nextval('ai_duo_
ALTER TABLE ONLY ai_feature_settings ALTER COLUMN id SET DEFAULT nextval('ai_feature_settings_id_seq'::regclass);
+ALTER TABLE ONLY ai_namespace_feature_settings ALTER COLUMN id SET DEFAULT nextval('ai_namespace_feature_settings_id_seq'::regclass);
+
ALTER TABLE ONLY ai_self_hosted_models ALTER COLUMN id SET DEFAULT nextval('ai_self_hosted_models_id_seq'::regclass);
ALTER TABLE ONLY ai_settings ALTER COLUMN id SET DEFAULT nextval('ai_settings_id_seq'::regclass);
@@ -28717,6 +28723,9 @@ ALTER TABLE ONLY ai_duo_chat_events
ALTER TABLE ONLY ai_feature_settings
ADD CONSTRAINT ai_feature_settings_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY ai_namespace_feature_settings
+ ADD CONSTRAINT ai_namespace_feature_settings_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY ai_self_hosted_models
ADD CONSTRAINT ai_self_hosted_models_pkey PRIMARY KEY (id);
@@ -29251,12 +29260,6 @@ ALTER TABLE ONLY ci_sources_pipelines
ALTER TABLE ONLY ci_sources_projects
ADD CONSTRAINT ci_sources_projects_pkey PRIMARY KEY (id);
-ALTER TABLE ONLY p_ci_stages
- ADD CONSTRAINT p_ci_stages_pkey PRIMARY KEY (id, partition_id);
-
-ALTER TABLE ONLY ci_stages
- ADD CONSTRAINT ci_stages_pkey PRIMARY KEY (id, partition_id);
-
ALTER TABLE ONLY ci_subscriptions_projects
ADD CONSTRAINT ci_subscriptions_projects_pkey PRIMARY KEY (id);
@@ -30277,6 +30280,9 @@ ALTER TABLE ONLY p_ci_pipelines_config
ALTER TABLE ONLY p_ci_runner_machine_builds
ADD CONSTRAINT p_ci_runner_machine_builds_pkey PRIMARY KEY (build_id, partition_id);
+ALTER TABLE ONLY p_ci_stages
+ ADD CONSTRAINT p_ci_stages_pkey PRIMARY KEY (id, partition_id);
+
ALTER TABLE ONLY p_ci_workloads
ADD CONSTRAINT p_ci_workloads_pkey PRIMARY KEY (id, partition_id);
@@ -33207,6 +33213,8 @@ CREATE INDEX idx_mr_cc_diff_files_on_mr_cc_id_and_sha ON merge_request_context_c
CREATE INDEX idx_mrs_on_target_id_and_created_at_and_state_id ON merge_requests USING btree (target_project_id, state_id, created_at, id);
+CREATE UNIQUE INDEX idx_namespace_feature_settings_on_namespace_id_and_feature ON ai_namespace_feature_settings USING btree (namespace_id, feature);
+
CREATE INDEX idx_namespace_hostname_import_type_id_source_name_and_username ON import_source_users USING btree (namespace_id, source_hostname, import_type, id) WHERE ((source_name IS NULL) OR (source_username IS NULL));
CREATE UNIQUE INDEX idx_namespace_settings_on_default_compliance_framework_id ON namespace_settings USING btree (default_compliance_framework_id);
@@ -34475,22 +34483,6 @@ CREATE INDEX index_ci_sources_projects_on_pipeline_id ON ci_sources_projects USI
CREATE UNIQUE INDEX index_ci_sources_projects_on_source_project_id_and_pipeline_id ON ci_sources_projects USING btree (source_project_id, pipeline_id);
-CREATE INDEX p_ci_stages_pipeline_id_id_idx ON ONLY p_ci_stages USING btree (pipeline_id, id) WHERE (status = ANY (ARRAY[0, 1, 2, 8, 9, 10]));
-
-CREATE INDEX index_ci_stages_on_pipeline_id_and_id ON ci_stages USING btree (pipeline_id, id) WHERE (status = ANY (ARRAY[0, 1, 2, 8, 9, 10]));
-
-CREATE INDEX p_ci_stages_pipeline_id_position_idx ON ONLY p_ci_stages USING btree (pipeline_id, "position");
-
-CREATE INDEX index_ci_stages_on_pipeline_id_and_position ON ci_stages USING btree (pipeline_id, "position");
-
-CREATE UNIQUE INDEX p_ci_stages_pipeline_id_name_partition_id_idx ON ONLY p_ci_stages USING btree (pipeline_id, name, partition_id);
-
-CREATE UNIQUE INDEX index_ci_stages_on_pipeline_id_name_partition_id_unique ON ci_stages USING btree (pipeline_id, name, partition_id);
-
-CREATE INDEX p_ci_stages_project_id_idx ON ONLY p_ci_stages USING btree (project_id);
-
-CREATE INDEX index_ci_stages_on_project_id ON ci_stages USING btree (project_id);
-
CREATE INDEX index_ci_subscriptions_projects_author_id ON ci_subscriptions_projects USING btree (author_id);
CREATE INDEX index_ci_subscriptions_projects_on_upstream_project_id ON ci_subscriptions_projects USING btree (upstream_project_id);
@@ -38277,6 +38269,14 @@ CREATE INDEX p_ci_job_artifacts_expire_at_job_id_idx1 ON ONLY p_ci_job_artifacts
CREATE UNIQUE INDEX p_ci_pipeline_variables_pipeline_id_key_partition_id_idx ON ONLY p_ci_pipeline_variables USING btree (pipeline_id, key, partition_id);
+CREATE INDEX p_ci_stages_pipeline_id_id_idx ON ONLY p_ci_stages USING btree (pipeline_id, id) WHERE (status = ANY (ARRAY[0, 1, 2, 8, 9, 10]));
+
+CREATE UNIQUE INDEX p_ci_stages_pipeline_id_name_partition_id_idx ON ONLY p_ci_stages USING btree (pipeline_id, name, partition_id);
+
+CREATE INDEX p_ci_stages_pipeline_id_position_idx ON ONLY p_ci_stages USING btree (pipeline_id, "position");
+
+CREATE INDEX p_ci_stages_project_id_idx ON ONLY p_ci_stages USING btree (project_id);
+
CREATE UNIQUE INDEX p_ci_workloads_pipeline_id_idx ON ONLY p_ci_workloads USING btree (pipeline_id, partition_id);
CREATE INDEX package_name_index ON packages_packages USING btree (name);
@@ -40497,8 +40497,6 @@ ALTER INDEX index_ci_runner_taggings_on_runner_id_and_runner_type ATTACH PARTITI
ALTER INDEX index_ci_runner_taggings_on_sharding_key_id ATTACH PARTITION ci_runner_taggings_project_type_sharding_key_id_idx;
-ALTER INDEX p_ci_stages_pkey ATTACH PARTITION ci_stages_pkey;
-
ALTER INDEX index_uploads_9ba88c4165_on_model_uploader_created_at ATTACH PARTITION dependency_list_export_part_u_model_id_model_type_uploader__idx;
ALTER INDEX index_uploads_9ba88c4165_on_checksum ATTACH PARTITION dependency_list_export_part_uploads_checksum_idx;
@@ -40729,14 +40727,6 @@ ALTER INDEX p_ci_pipelines_user_id_id_idx ATTACH PARTITION index_ci_pipelines_on
ALTER INDEX p_ci_pipelines_user_id_id_idx1 ATTACH PARTITION index_ci_pipelines_on_user_id_and_id_desc_and_user_not_verified;
-ALTER INDEX p_ci_stages_pipeline_id_id_idx ATTACH PARTITION index_ci_stages_on_pipeline_id_and_id;
-
-ALTER INDEX p_ci_stages_pipeline_id_position_idx ATTACH PARTITION index_ci_stages_on_pipeline_id_and_position;
-
-ALTER INDEX p_ci_stages_pipeline_id_name_partition_id_idx ATTACH PARTITION index_ci_stages_on_pipeline_id_name_partition_id_unique;
-
-ALTER INDEX p_ci_stages_project_id_idx ATTACH PARTITION index_ci_stages_on_project_id;
-
ALTER INDEX index_ci_runner_machines_on_executor_type ATTACH PARTITION index_d58435d85e;
ALTER INDEX p_ci_pipelines_trigger_id_id_desc_idx ATTACH PARTITION index_d8ae6ea3f3;
@@ -44356,6 +44346,9 @@ ALTER TABLE ONLY issue_user_mentions
ALTER TABLE ONLY namespace_settings
ADD CONSTRAINT fk_rails_3896d4fae5 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+ALTER TABLE ONLY ai_namespace_feature_settings
+ ADD CONSTRAINT fk_rails_3910c64ae1 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY packages_cleanup_policies
ADD CONSTRAINT fk_rails_393ba98591 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
diff --git a/doc/development/identity_verification.md b/doc/development/identity_verification.md
index 10fee0c26b2..b667b727048 100644
--- a/doc/development/identity_verification.md
+++ b/doc/development/identity_verification.md
@@ -92,7 +92,10 @@ For a walkthrough and high level explanation of the code, see [Identity Verifica
## QA Integration
-For end-to-end production and staging tests to function properly, GitLab [allows QA users to bypass identity verification](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/117633).
+For end-to-end production and staging tests to function properly, GitLab allows QA users to bypass [Account email Verification](../security/email_verification.md) when:
+
+- The `User-Agent` for the request matches the configured `GITLAB_QA_USER_AGENT`.
+- Disable [email verification](testing_guide/end_to_end/best_practices/users.md#disable-email-verification)
## Additional resources
diff --git a/doc/integration/exact_code_search/zoekt.md b/doc/integration/exact_code_search/zoekt.md
index 3ec80b404a9..508090cd0c4 100644
--- a/doc/integration/exact_code_search/zoekt.md
+++ b/doc/integration/exact_code_search/zoekt.md
@@ -245,6 +245,32 @@ To set the number of concurrent indexing tasks:
1. Select **Save changes**.
+## Set the number of parallel processes per indexing task
+
+{{< history >}}
+
+- [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/539526) in GitLab 18.1.
+
+{{< /history >}}
+
+Prerequisites:
+
+- You must have administrator access to the instance.
+
+You can set the number of parallel processes per indexing task.
+
+A higher number would improve indexing time at the cost of increased CPU and memory usage.
+The default value is `1` (one process per indexing task).
+
+You can adjust this value based on the node's performance and workload.
+To set the number of parallel processes per indexing task:
+
+1. On the left sidebar, at the bottom, select **Admin**.
+1. Select **Settings > Search**.
+1. Expand **Exact code search configuration**.
+1. In the **Number of parallel processes per indexing task** text box, enter a value.
+1. Select **Save changes**.
+
## Set the number of namespaces per indexing rollout
{{< history >}}
diff --git a/doc/integration/gitpod.md b/doc/integration/gitpod.md
index a361969d350..033bbab0f9c 100644
--- a/doc/integration/gitpod.md
+++ b/doc/integration/gitpod.md
@@ -70,7 +70,7 @@ you can launch it from GitLab in one of these ways:
- From a project repository:
1. On the left sidebar, select **Search or go to** and find your project.
- 1. In the upper right, select **Edit > Gitpod**.
+ 1. In the upper right, select **Code > Gitpod**.
- From a merge request:
1. Go to your merge request.
diff --git a/doc/subscriptions/subscription-add-ons.md b/doc/subscriptions/subscription-add-ons.md
index e3f8abf4ebc..2a3383a956e 100644
--- a/doc/subscriptions/subscription-add-ons.md
+++ b/doc/subscriptions/subscription-add-ons.md
@@ -163,10 +163,8 @@ Prerequisites:
The user is sent a confirmation email.
-#### Configure network and proxy settings
-
-For GitLab Self-Managed instances, to enable GitLab Duo features,
-you must [enable network connectivity](../user/ai_features_enable.md).
+After you assign seats,
+[ensure GitLab Duo is set up for your GitLab Self-Managed instance](../user/gitlab_duo/setup.md).
## Assign and remove GitLab Duo seats in bulk
diff --git a/doc/tutorials/dependency_scanning.md b/doc/tutorials/dependency_scanning.md
index bd420e3765d..5f8f416d116 100644
--- a/doc/tutorials/dependency_scanning.md
+++ b/doc/tutorials/dependency_scanning.md
@@ -146,7 +146,7 @@ need to upgrade the `fastify` package.
To fix the vulnerability:
1. On the left sidebar, select **Search or go to** and find your project.
-1. In the upper right, select **Edit > Gitpod** and open
+1. In the upper right, select **Code > Gitpod** and open
Gitpod in a new tab.
1. If you are prompted to, select **Continue with GitLab**, then select **Authorize**.
1. On the **New Workspace** page, select **Continue**.
diff --git a/doc/tutorials/product_analytics_onboarding_website_project/_index.md b/doc/tutorials/product_analytics_onboarding_website_project/_index.md
index d9071324056..39d8838a81a 100644
--- a/doc/tutorials/product_analytics_onboarding_website_project/_index.md
+++ b/doc/tutorials/product_analytics_onboarding_website_project/_index.md
@@ -83,7 +83,7 @@ For this example website, we use the Browser SDK.
To instrument your new website:
1. In the project, select **Code > Repository**.
-1. Select the **Edit > Web IDE**.
+1. Select **Code > Web IDE**.
1. In the left Web IDE toolbar, select **File Explorer** and open the `public/index.html` file.
1. In the `public/index.html` file, before the closing `