summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2023-03-02 21:12:31 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2023-03-02 21:12:31 +0000
commita88ffaad9f9f321a71657ac0aca4d947f5bc6a5b (patch)
treec4baeb79c24082ea806b8ce4f27fcc94903b742e
parent3c4d101de003ea292be5ac5baf5d73c6c2747367 (diff)
downloadgitlab-ce-a88ffaad9f9f321a71657ac0aca4d947f5bc6a5b.tar.gz
Add latest changes from gitlab-org/gitlab@master
-rw-r--r--.rubocop_todo/rspec/missing_feature_category.yml140
-rw-r--r--app/assets/javascripts/lib/utils/text_markdown.js23
-rw-r--r--app/assets/javascripts/projects/settings/branch_rules/components/view/constants.js16
-rw-r--r--app/assets/javascripts/projects/settings/branch_rules/components/view/index.vue36
-rw-r--r--app/assets/javascripts/projects/settings/branch_rules/components/view/protection_row.vue7
-rw-r--r--app/assets/javascripts/projects/settings/branch_rules/mount_branch_rules.js2
-rw-r--r--app/assets/javascripts/sidebar/components/participants/participants.vue7
-rw-r--r--app/helpers/projects/settings/branch_rules_helper.rb23
-rw-r--r--app/views/profiles/two_factor_auths/show.html.haml36
-rw-r--r--app/views/projects/settings/branch_rules/index.html.haml4
-rw-r--r--data/deprecations/15-9-env-search-char-limit.yml9
-rw-r--r--doc/api/deploy_keys.md4
-rw-r--r--doc/api/deploy_tokens.md4
-rw-r--r--doc/api/deployments.md4
-rw-r--r--doc/api/environments.md4
-rw-r--r--doc/api/feature_flag_user_lists.md4
-rw-r--r--doc/api/feature_flags.md4
-rw-r--r--doc/api/features.md4
-rw-r--r--doc/api/freeze_periods.md4
-rw-r--r--doc/api/group_protected_environments.md4
-rw-r--r--doc/api/group_releases.md4
-rw-r--r--doc/api/protected_environments.md4
-rw-r--r--doc/api/releases/index.md4
-rw-r--r--doc/api/releases/links.md4
-rw-r--r--doc/api/resource_groups.md4
-rw-r--r--doc/ci/cloud_deployment/ecs/deploy_to_aws_ecs.md4
-rw-r--r--doc/ci/cloud_deployment/heroku.md4
-rw-r--r--doc/ci/cloud_deployment/index.md4
-rw-r--r--doc/ci/environments/deployment_approvals.md4
-rw-r--r--doc/ci/environments/deployment_safety.md4
-rw-r--r--doc/ci/environments/environments_dashboard.md4
-rw-r--r--doc/ci/environments/external_deployment_tools.md4
-rw-r--r--doc/ci/environments/incremental_rollouts.md4
-rw-r--r--doc/ci/environments/index.md4
-rw-r--r--doc/ci/environments/protected_environments.md4
-rw-r--r--doc/ci/examples/deployment/composer-npm-deploy.md4
-rw-r--r--doc/ci/examples/deployment/index.md4
-rw-r--r--doc/ci/resource_groups/index.md4
-rw-r--r--doc/cloud_seed/index.md2
-rw-r--r--doc/development/code_review.md4
-rw-r--r--doc/development/contributing/design.md2
-rw-r--r--doc/development/contributing/index.md6
-rw-r--r--doc/development/contributing/issue_workflow.md322
-rw-r--r--doc/development/contributing/merge_request_workflow.md3
-rw-r--r--doc/development/database/clickhouse/merge_request_analytics.md355
-rw-r--r--doc/development/database/clickhouse/tiered_storage.md138
-rw-r--r--doc/development/database/index.md2
-rw-r--r--doc/development/documentation/index.md20
-rw-r--r--doc/development/documentation/workflow.md8
-rw-r--r--doc/development/labels/index.md325
-rw-r--r--doc/operations/feature_flags.md4
-rw-r--r--doc/policy/maintenance.md6
-rw-r--r--doc/update/deprecations.md14
-rw-r--r--doc/user/analytics/ci_cd_analytics.md4
-rw-r--r--doc/user/application_security/api_fuzzing/index.md2
-rw-r--r--doc/user/application_security/api_security/api_discovery/index.md2
-rw-r--r--doc/user/application_security/dast_api/index.md2
-rw-r--r--doc/user/operations_dashboard/index.md4
-rw-r--r--doc/user/project/deploy_boards.md4
-rw-r--r--doc/user/project/deploy_keys/index.md4
-rw-r--r--doc/user/project/deploy_tokens/index.md4
-rw-r--r--doc/user/project/releases/index.md4
-rw-r--r--doc/user/project/releases/release_cicd_examples.md4
-rw-r--r--doc/user/project/releases/release_cli.md4
-rw-r--r--doc/user/project/releases/release_fields.md4
-rw-r--r--doc/user/shortcuts.md15
-rw-r--r--lib/gitlab/metrics/subscribers/rack_attack.rb5
-rw-r--r--lib/gitlab/rack_attack.rb10
-rw-r--r--lib/gitlab/rack_attack/instrumented_cache_store.rb33
-rw-r--r--locale/gitlab.pot18
-rw-r--r--spec/frontend/artifacts/components/artifact_row_spec.js4
-rw-r--r--spec/frontend/artifacts/components/artifacts_table_row_details_spec.js4
-rw-r--r--spec/frontend/artifacts/components/feedback_banner_spec.js4
-rw-r--r--spec/frontend/artifacts/components/job_artifacts_table_spec.js62
-rw-r--r--spec/frontend/lib/utils/text_markdown_spec.js50
-rw-r--r--spec/frontend/notes/components/discussion_actions_spec.js7
-rw-r--r--spec/helpers/projects/settings/branch_rules_helper_spec.rb25
-rw-r--r--spec/lib/gitlab/metrics/subscribers/rack_attack_spec.rb27
-rw-r--r--spec/lib/gitlab/rack_attack/instrumented_cache_store_spec.rb89
-rw-r--r--spec/lib/gitlab/rack_attack_spec.rb14
-rw-r--r--spec/services/ci/abort_pipelines_service_spec.rb2
-rw-r--r--spec/services/ci/append_build_trace_service_spec.rb2
-rw-r--r--spec/services/ci/build_cancel_service_spec.rb2
-rw-r--r--spec/services/ci/build_erase_service_spec.rb2
-rw-r--r--spec/services/ci/build_report_result_service_spec.rb2
-rw-r--r--spec/services/ci/build_unschedule_service_spec.rb2
-rw-r--r--spec/services/ci/change_variable_service_spec.rb2
-rw-r--r--spec/services/ci/change_variables_service_spec.rb2
-rw-r--r--spec/services/ci/compare_accessibility_reports_service_spec.rb2
-rw-r--r--spec/services/ci/compare_codequality_reports_service_spec.rb2
-rw-r--r--spec/services/ci/compare_reports_base_service_spec.rb2
-rw-r--r--spec/services/ci/compare_test_reports_service_spec.rb2
-rw-r--r--spec/services/ci/copy_cross_database_associations_service_spec.rb2
-rw-r--r--spec/services/ci/create_pipeline_service/artifacts_spec.rb2
-rw-r--r--spec/services/ci/create_pipeline_service/cache_spec.rb3
-rw-r--r--spec/services/ci/create_pipeline_service/creation_errors_and_warnings_spec.rb2
-rw-r--r--spec/services/ci/create_pipeline_service/cross_project_pipeline_spec.rb3
-rw-r--r--spec/services/ci/create_pipeline_service/custom_config_content_spec.rb2
-rw-r--r--spec/services/ci/create_pipeline_service/custom_yaml_tags_spec.rb3
-rw-r--r--spec/services/ci/create_pipeline_service/dry_run_spec.rb3
-rw-r--r--spec/services/ci/create_pipeline_service/environment_spec.rb3
-rw-r--r--spec/services/ci/create_pipeline_service/evaluate_runner_tags_spec.rb3
-rw-r--r--spec/services/ci/create_pipeline_service/limit_active_jobs_spec.rb3
-rw-r--r--spec/services/ci/create_pipeline_service/merge_requests_spec.rb3
-rw-r--r--spec/services/ci/create_pipeline_service/needs_spec.rb3
-rw-r--r--spec/services/ci/create_pipeline_service/parallel_spec.rb3
-rw-r--r--spec/services/ci/create_pipeline_service/parameter_content_spec.rb3
-rw-r--r--spec/services/ci/create_pipeline_service/parent_child_pipeline_spec.rb3
-rw-r--r--spec/services/ci/create_pipeline_service/pre_post_stages_spec.rb3
-rw-r--r--spec/services/ci/create_pipeline_service/rate_limit_spec.rb3
-rw-r--r--spec/services/ci/create_pipeline_service/scripts_spec.rb3
-rw-r--r--spec/services/ci/create_pipeline_service/tags_spec.rb2
-rw-r--r--spec/services/ci/create_pipeline_service/variables_spec.rb3
-rw-r--r--spec/services/ci/create_web_ide_terminal_service_spec.rb2
-rw-r--r--spec/services/ci/daily_build_group_report_result_service_spec.rb2
-rw-r--r--spec/services/ci/delete_objects_service_spec.rb2
-rw-r--r--spec/services/ci/delete_unit_tests_service_spec.rb2
-rw-r--r--spec/services/ci/deployments/destroy_service_spec.rb2
-rw-r--r--spec/services/ci/destroy_pipeline_service_spec.rb2
-rw-r--r--spec/services/ci/destroy_secure_file_service_spec.rb2
-rw-r--r--spec/services/ci/disable_user_pipeline_schedules_service_spec.rb2
-rw-r--r--spec/services/ci/drop_pipeline_service_spec.rb2
-rw-r--r--spec/services/ci/ensure_stage_service_spec.rb2
-rw-r--r--spec/services/ci/expire_pipeline_cache_service_spec.rb2
-rw-r--r--spec/services/ci/external_pull_requests/create_pipeline_service_spec.rb2
-rw-r--r--spec/services/ci/find_exposed_artifacts_service_spec.rb2
-rw-r--r--spec/services/ci/generate_codequality_mr_diff_report_service_spec.rb2
-rw-r--r--spec/services/ci/generate_coverage_reports_service_spec.rb2
-rw-r--r--spec/services/ci/generate_kubeconfig_service_spec.rb2
-rw-r--r--spec/services/ci/generate_terraform_reports_service_spec.rb2
-rw-r--r--spec/services/ci/job_artifacts/create_service_spec.rb2
-rw-r--r--spec/services/ci/job_artifacts/delete_project_artifacts_service_spec.rb2
-rw-r--r--spec/services/ci/job_artifacts/delete_service_spec.rb2
-rw-r--r--spec/services/ci/job_artifacts/destroy_associations_service_spec.rb2
-rw-r--r--spec/services/ci/job_artifacts/destroy_batch_service_spec.rb2
-rw-r--r--spec/services/ci/job_artifacts/expire_project_build_artifacts_service_spec.rb2
-rw-r--r--spec/services/ci/job_artifacts/track_artifact_report_service_spec.rb2
-rw-r--r--spec/services/ci/job_artifacts/update_unknown_locked_status_service_spec.rb3
-rw-r--r--spec/services/ci/pipeline_artifacts/coverage_report_service_spec.rb2
-rw-r--r--spec/services/ci/pipeline_artifacts/create_code_quality_mr_diff_report_service_spec.rb2
-rw-r--r--spec/services/ci/pipeline_artifacts/destroy_all_expired_service_spec.rb3
-rw-r--r--spec/services/ci/pipeline_bridge_status_service_spec.rb2
-rw-r--r--spec/services/ci/pipeline_creation/start_pipeline_service_spec.rb2
-rw-r--r--spec/services/ci/pipeline_processing/atomic_processing_service/status_collection_spec.rb3
-rw-r--r--spec/services/ci/pipeline_schedules/take_ownership_service_spec.rb2
-rw-r--r--spec/services/ci/pipeline_trigger_service_spec.rb2
-rw-r--r--spec/services/ci/pipelines/add_job_service_spec.rb2
-rw-r--r--spec/services/ci/pipelines/hook_service_spec.rb2
-rw-r--r--spec/services/ci/play_bridge_service_spec.rb2
-rw-r--r--spec/services/ci/play_build_service_spec.rb2
-rw-r--r--spec/services/ci/play_manual_stage_service_spec.rb2
-rw-r--r--spec/services/ci/prepare_build_service_spec.rb2
-rw-r--r--spec/services/ci/process_build_service_spec.rb2
-rw-r--r--spec/services/ci/process_pipeline_service_spec.rb2
-rw-r--r--spec/services/ci/process_sync_events_service_spec.rb2
-rw-r--r--spec/services/ci/prometheus_metrics/observe_histograms_service_spec.rb2
-rw-r--r--spec/services/ci/queue/pending_builds_strategy_spec.rb2
-rw-r--r--spec/services/ci/resource_groups/assign_resource_from_resource_group_service_spec.rb2
-rw-r--r--spec/services/ci/retry_pipeline_service_spec.rb2
-rw-r--r--spec/services/ci/run_scheduled_build_service_spec.rb2
-rw-r--r--spec/services/ci/stuck_builds/drop_pending_service_spec.rb2
-rw-r--r--spec/services/ci/stuck_builds/drop_running_service_spec.rb2
-rw-r--r--spec/services/ci/stuck_builds/drop_scheduled_service_spec.rb2
-rw-r--r--spec/services/ci/test_failure_history_service_spec.rb2
-rw-r--r--spec/services/ci/track_failed_build_service_spec.rb2
-rw-r--r--spec/services/ci/unlock_artifacts_service_spec.rb2
-rw-r--r--spec/services/ci/update_build_queue_service_spec.rb2
-rw-r--r--spec/services/ci/update_instance_variables_service_spec.rb2
-rw-r--r--spec/services/ci/update_pending_build_service_spec.rb2
169 files changed, 1255 insertions, 973 deletions
diff --git a/.rubocop_todo/rspec/missing_feature_category.yml b/.rubocop_todo/rspec/missing_feature_category.yml
index 8817e8039d4..fea8dd31223 100644
--- a/.rubocop_todo/rspec/missing_feature_category.yml
+++ b/.rubocop_todo/rspec/missing_feature_category.yml
@@ -118,7 +118,6 @@ RSpec/MissingFeatureCategory:
- 'ee/spec/finders/incident_management/oncall_users_finder_spec.rb'
- 'ee/spec/finders/issues_finder_spec.rb'
- 'ee/spec/finders/iterations/cadences_finder_spec.rb'
- - 'ee/spec/finders/iterations_finder_spec.rb'
- 'ee/spec/finders/license_template_finder_spec.rb'
- 'ee/spec/finders/licenses_finder_spec.rb'
- 'ee/spec/finders/merge_requests_finder_spec.rb'
@@ -625,7 +624,6 @@ RSpec/MissingFeatureCategory:
- 'ee/spec/initializers/session_store_spec.rb'
- 'ee/spec/lib/analytics/devops_adoption/snapshot_calculator_spec.rb'
- 'ee/spec/lib/analytics/group_activity_calculator_spec.rb'
- - 'ee/spec/lib/analytics/merge_request_metrics_refresh_spec.rb'
- 'ee/spec/lib/analytics/productivity_analytics_request_params_spec.rb'
- 'ee/spec/lib/analytics/refresh_approvals_data_spec.rb'
- 'ee/spec/lib/analytics/refresh_comments_data_spec.rb'
@@ -1742,39 +1740,6 @@ RSpec/MissingFeatureCategory:
- 'ee/spec/services/boards/update_service_spec.rb'
- 'ee/spec/services/boards/user_preferences/update_service_spec.rb'
- 'ee/spec/services/branches/delete_service_spec.rb'
- - 'ee/spec/services/ci/audit_variable_change_service_spec.rb'
- - 'ee/spec/services/ci/compare_metrics_reports_service_spec.rb'
- - 'ee/spec/services/ci/compare_security_reports_service_spec.rb'
- - 'ee/spec/services/ci/copy_cross_database_associations_service_spec.rb'
- - 'ee/spec/services/ci/create_pipeline_service/compliance_spec.rb'
- - 'ee/spec/services/ci/create_pipeline_service/cross_needs_artifacts_spec.rb'
- - 'ee/spec/services/ci/create_pipeline_service/dast_configuration_spec.rb'
- - 'ee/spec/services/ci/create_pipeline_service/needs_spec.rb'
- - 'ee/spec/services/ci/create_pipeline_service/runnable_builds_spec.rb'
- - 'ee/spec/services/ci/create_pipeline_service_spec.rb'
- - 'ee/spec/services/ci/destroy_pipeline_service_spec.rb'
- - 'ee/spec/services/ci/external_pull_requests/process_github_event_service_spec.rb'
- - 'ee/spec/services/ci/minutes/additional_packs/change_namespace_service_spec.rb'
- - 'ee/spec/services/ci/minutes/additional_packs/create_service_spec.rb'
- - 'ee/spec/services/ci/minutes/batch_reset_service_spec.rb'
- - 'ee/spec/services/ci/minutes/email_notification_service_spec.rb'
- - 'ee/spec/services/ci/minutes/refresh_cached_data_service_spec.rb'
- - 'ee/spec/services/ci/minutes/reset_usage_service_spec.rb'
- - 'ee/spec/services/ci/pipeline_bridge_status_service_spec.rb'
- - 'ee/spec/services/ci/pipeline_creation/drop_not_runnable_builds_service_spec.rb'
- - 'ee/spec/services/ci/pipeline_creation/start_pipeline_service_spec.rb'
- - 'ee/spec/services/ci/pipeline_trigger_service_spec.rb'
- - 'ee/spec/services/ci/play_bridge_service_spec.rb'
- - 'ee/spec/services/ci/play_build_service_spec.rb'
- - 'ee/spec/services/ci/process_build_service_spec.rb'
- - 'ee/spec/services/ci/process_pipeline_service_spec.rb'
- - 'ee/spec/services/ci/retry_job_service_spec.rb'
- - 'ee/spec/services/ci/retry_pipeline_service_spec.rb'
- - 'ee/spec/services/ci/subscribe_bridge_service_spec.rb'
- - 'ee/spec/services/ci/trigger_downstream_subscription_service_spec.rb'
- - 'ee/spec/services/ci_cd/github_integration_setup_service_spec.rb'
- - 'ee/spec/services/ci_cd/github_setup_service_spec.rb'
- - 'ee/spec/services/ci_cd/setup_project_spec.rb'
- 'ee/spec/services/dashboard/environments/list_service_spec.rb'
- 'ee/spec/services/dashboard/operations/list_service_spec.rb'
- 'ee/spec/services/dashboard/projects/create_service_spec.rb'
@@ -1782,12 +1747,6 @@ RSpec/MissingFeatureCategory:
- 'ee/spec/services/deploy_keys/create_service_spec.rb'
- 'ee/spec/services/deployments/auto_rollback_service_spec.rb'
- 'ee/spec/services/ee/auto_merge_service_spec.rb'
- - 'ee/spec/services/ee/ci/change_variable_service_spec.rb'
- - 'ee/spec/services/ee/ci/change_variables_service_spec.rb'
- - 'ee/spec/services/ee/ci/job_artifacts/create_service_spec.rb'
- - 'ee/spec/services/ee/ci/job_artifacts/destroy_all_expired_service_spec.rb'
- - 'ee/spec/services/ee/ci/job_artifacts/destroy_batch_service_spec.rb'
- - 'ee/spec/services/ee/ci/pipeline_processing/atomic_processing_service_spec.rb'
- 'ee/spec/services/ee/deployments/update_environment_service_spec.rb'
- 'ee/spec/services/ee/design_management/delete_designs_service_spec.rb'
- 'ee/spec/services/ee/design_management/save_designs_service_spec.rb'
@@ -2309,7 +2268,6 @@ RSpec/MissingFeatureCategory:
- 'ee/spec/workers/concerns/elastic/indexing_control_spec.rb'
- 'ee/spec/workers/concerns/elastic/migration_obsolete_spec.rb'
- 'ee/spec/workers/concerns/elastic/migration_options_spec.rb'
- - 'ee/spec/workers/concerns/geo_queue_spec.rb'
- 'ee/spec/workers/concerns/update_orchestration_policy_configuration_spec.rb'
- 'ee/spec/workers/create_github_webhook_worker_spec.rb'
- 'ee/spec/workers/deployments/auto_rollback_worker_spec.rb'
@@ -2322,7 +2280,6 @@ RSpec/MissingFeatureCategory:
- 'ee/spec/workers/ee/projects/inactive_projects_deletion_cron_worker_spec.rb'
- 'ee/spec/workers/ee/repository_check/batch_worker_spec.rb'
- 'ee/spec/workers/ee/repository_check/single_repository_worker_spec.rb'
- - 'ee/spec/workers/elastic/migration_worker_spec.rb'
- 'ee/spec/workers/elastic/project_transfer_worker_spec.rb'
- 'ee/spec/workers/elastic_association_indexer_worker_spec.rb'
- 'ee/spec/workers/elastic_cluster_reindexing_cron_worker_spec.rb'
@@ -4203,7 +4160,6 @@ RSpec/MissingFeatureCategory:
- 'spec/lib/gitlab/ci/reports/security/scan_spec.rb'
- 'spec/lib/gitlab/ci/reports/security/scanned_resource_spec.rb'
- 'spec/lib/gitlab/ci/reports/security/scanner_spec.rb'
- - 'spec/lib/gitlab/ci/reports/security/vulnerability_reports_comparer_spec.rb'
- 'spec/lib/gitlab/ci/reports/terraform_reports_spec.rb'
- 'spec/lib/gitlab/ci/reports/test_case_spec.rb'
- 'spec/lib/gitlab/ci/reports/test_failure_history_spec.rb'
@@ -5621,7 +5577,6 @@ RSpec/MissingFeatureCategory:
- 'spec/mailers/emails/groups_spec.rb'
- 'spec/mailers/emails/identity_verification_spec.rb'
- 'spec/mailers/emails/in_product_marketing_spec.rb'
- - 'spec/mailers/emails/issues_spec.rb'
- 'spec/mailers/emails/merge_requests_spec.rb'
- 'spec/mailers/emails/pages_domains_spec.rb'
- 'spec/mailers/emails/pipelines_spec.rb'
@@ -5728,7 +5683,6 @@ RSpec/MissingFeatureCategory:
- 'spec/models/clusters/agents/group_authorization_spec.rb'
- 'spec/models/clusters/agents/implicit_authorization_spec.rb'
- 'spec/models/clusters/agents/project_authorization_spec.rb'
- - 'spec/models/clusters/applications/crossplane_spec.rb'
- 'spec/models/clusters/applications/helm_spec.rb'
- 'spec/models/clusters/applications/ingress_spec.rb'
- 'spec/models/clusters/applications/jupyter_spec.rb'
@@ -5940,7 +5894,6 @@ RSpec/MissingFeatureCategory:
- 'spec/models/integrations/base_third_party_wiki_spec.rb'
- 'spec/models/integrations/bugzilla_spec.rb'
- 'spec/models/integrations/buildkite_spec.rb'
- - 'spec/models/integrations/campfire_spec.rb'
- 'spec/models/integrations/chat_message/alert_message_spec.rb'
- 'spec/models/integrations/chat_message/base_message_spec.rb'
- 'spec/models/integrations/chat_message/deployment_message_spec.rb'
@@ -6730,95 +6683,6 @@ RSpec/MissingFeatureCategory:
- 'spec/services/bulk_create_integration_service_spec.rb'
- 'spec/services/bulk_push_event_payload_service_spec.rb'
- 'spec/services/bulk_update_integration_service_spec.rb'
- - 'spec/services/ci/abort_pipelines_service_spec.rb'
- - 'spec/services/ci/append_build_trace_service_spec.rb'
- - 'spec/services/ci/build_cancel_service_spec.rb'
- - 'spec/services/ci/build_erase_service_spec.rb'
- - 'spec/services/ci/build_report_result_service_spec.rb'
- - 'spec/services/ci/build_unschedule_service_spec.rb'
- - 'spec/services/ci/change_variable_service_spec.rb'
- - 'spec/services/ci/change_variables_service_spec.rb'
- - 'spec/services/ci/compare_accessibility_reports_service_spec.rb'
- - 'spec/services/ci/compare_codequality_reports_service_spec.rb'
- - 'spec/services/ci/compare_reports_base_service_spec.rb'
- - 'spec/services/ci/compare_test_reports_service_spec.rb'
- - 'spec/services/ci/copy_cross_database_associations_service_spec.rb'
- - 'spec/services/ci/create_pipeline_service/artifacts_spec.rb'
- - 'spec/services/ci/create_pipeline_service/cache_spec.rb'
- - 'spec/services/ci/create_pipeline_service/creation_errors_and_warnings_spec.rb'
- - 'spec/services/ci/create_pipeline_service/cross_project_pipeline_spec.rb'
- - 'spec/services/ci/create_pipeline_service/custom_config_content_spec.rb'
- - 'spec/services/ci/create_pipeline_service/custom_yaml_tags_spec.rb'
- - 'spec/services/ci/create_pipeline_service/dry_run_spec.rb'
- - 'spec/services/ci/create_pipeline_service/environment_spec.rb'
- - 'spec/services/ci/create_pipeline_service/evaluate_runner_tags_spec.rb'
- - 'spec/services/ci/create_pipeline_service/limit_active_jobs_spec.rb'
- - 'spec/services/ci/create_pipeline_service/merge_requests_spec.rb'
- - 'spec/services/ci/create_pipeline_service/needs_spec.rb'
- - 'spec/services/ci/create_pipeline_service/parallel_spec.rb'
- - 'spec/services/ci/create_pipeline_service/parameter_content_spec.rb'
- - 'spec/services/ci/create_pipeline_service/parent_child_pipeline_spec.rb'
- - 'spec/services/ci/create_pipeline_service/pre_post_stages_spec.rb'
- - 'spec/services/ci/create_pipeline_service/rate_limit_spec.rb'
- - 'spec/services/ci/create_pipeline_service/scripts_spec.rb'
- - 'spec/services/ci/create_pipeline_service/tags_spec.rb'
- - 'spec/services/ci/create_pipeline_service/variables_spec.rb'
- - 'spec/services/ci/create_web_ide_terminal_service_spec.rb'
- - 'spec/services/ci/daily_build_group_report_result_service_spec.rb'
- - 'spec/services/ci/delete_objects_service_spec.rb'
- - 'spec/services/ci/delete_unit_tests_service_spec.rb'
- - 'spec/services/ci/deployments/destroy_service_spec.rb'
- - 'spec/services/ci/destroy_pipeline_service_spec.rb'
- - 'spec/services/ci/destroy_secure_file_service_spec.rb'
- - 'spec/services/ci/disable_user_pipeline_schedules_service_spec.rb'
- - 'spec/services/ci/drop_pipeline_service_spec.rb'
- - 'spec/services/ci/ensure_stage_service_spec.rb'
- - 'spec/services/ci/expire_pipeline_cache_service_spec.rb'
- - 'spec/services/ci/external_pull_requests/create_pipeline_service_spec.rb'
- - 'spec/services/ci/find_exposed_artifacts_service_spec.rb'
- - 'spec/services/ci/generate_codequality_mr_diff_report_service_spec.rb'
- - 'spec/services/ci/generate_coverage_reports_service_spec.rb'
- - 'spec/services/ci/generate_kubeconfig_service_spec.rb'
- - 'spec/services/ci/generate_terraform_reports_service_spec.rb'
- - 'spec/services/ci/job_artifacts/create_service_spec.rb'
- - 'spec/services/ci/job_artifacts/delete_project_artifacts_service_spec.rb'
- - 'spec/services/ci/job_artifacts/delete_service_spec.rb'
- - 'spec/services/ci/job_artifacts/destroy_associations_service_spec.rb'
- - 'spec/services/ci/job_artifacts/destroy_batch_service_spec.rb'
- - 'spec/services/ci/job_artifacts/expire_project_build_artifacts_service_spec.rb'
- - 'spec/services/ci/job_artifacts/track_artifact_report_service_spec.rb'
- - 'spec/services/ci/job_artifacts/update_unknown_locked_status_service_spec.rb'
- - 'spec/services/ci/pipeline_artifacts/coverage_report_service_spec.rb'
- - 'spec/services/ci/pipeline_artifacts/create_code_quality_mr_diff_report_service_spec.rb'
- - 'spec/services/ci/pipeline_artifacts/destroy_all_expired_service_spec.rb'
- - 'spec/services/ci/pipeline_bridge_status_service_spec.rb'
- - 'spec/services/ci/pipeline_creation/start_pipeline_service_spec.rb'
- - 'spec/services/ci/pipeline_processing/atomic_processing_service/status_collection_spec.rb'
- - 'spec/services/ci/pipeline_schedules/take_ownership_service_spec.rb'
- - 'spec/services/ci/pipeline_trigger_service_spec.rb'
- - 'spec/services/ci/pipelines/add_job_service_spec.rb'
- - 'spec/services/ci/pipelines/hook_service_spec.rb'
- - 'spec/services/ci/play_bridge_service_spec.rb'
- - 'spec/services/ci/play_build_service_spec.rb'
- - 'spec/services/ci/play_manual_stage_service_spec.rb'
- - 'spec/services/ci/prepare_build_service_spec.rb'
- - 'spec/services/ci/process_build_service_spec.rb'
- - 'spec/services/ci/process_pipeline_service_spec.rb'
- - 'spec/services/ci/process_sync_events_service_spec.rb'
- - 'spec/services/ci/prometheus_metrics/observe_histograms_service_spec.rb'
- - 'spec/services/ci/queue/pending_builds_strategy_spec.rb'
- - 'spec/services/ci/resource_groups/assign_resource_from_resource_group_service_spec.rb'
- - 'spec/services/ci/retry_pipeline_service_spec.rb'
- - 'spec/services/ci/run_scheduled_build_service_spec.rb'
- - 'spec/services/ci/stuck_builds/drop_pending_service_spec.rb'
- - 'spec/services/ci/stuck_builds/drop_running_service_spec.rb'
- - 'spec/services/ci/stuck_builds/drop_scheduled_service_spec.rb'
- - 'spec/services/ci/test_failure_history_service_spec.rb'
- - 'spec/services/ci/track_failed_build_service_spec.rb'
- - 'spec/services/ci/unlock_artifacts_service_spec.rb'
- - 'spec/services/ci/update_build_queue_service_spec.rb'
- - 'spec/services/ci/update_instance_variables_service_spec.rb'
- - 'spec/services/ci/update_pending_build_service_spec.rb'
- 'spec/services/cohorts_service_spec.rb'
- 'spec/services/compare_service_spec.rb'
- 'spec/services/container_expiration_policies/cleanup_service_spec.rb'
@@ -7724,18 +7588,14 @@ RSpec/MissingFeatureCategory:
- 'spec/workers/clusters/integrations/check_prometheus_health_worker_spec.rb'
- 'spec/workers/concerns/application_worker_spec.rb'
- 'spec/workers/concerns/cluster_agent_queue_spec.rb'
- - 'spec/workers/concerns/cluster_queue_spec.rb'
- 'spec/workers/concerns/cronjob_queue_spec.rb'
- 'spec/workers/concerns/gitlab/github_import/object_importer_spec.rb'
- - 'spec/workers/concerns/gitlab/github_import/queue_spec.rb'
- 'spec/workers/concerns/gitlab/github_import/rescheduling_methods_spec.rb'
- 'spec/workers/concerns/gitlab/github_import/stage_methods_spec.rb'
- 'spec/workers/concerns/gitlab/notify_upon_death_spec.rb'
- 'spec/workers/concerns/limited_capacity/job_tracker_spec.rb'
- 'spec/workers/concerns/limited_capacity/worker_spec.rb'
- 'spec/workers/concerns/packages/cleanup_artifact_worker_spec.rb'
- - 'spec/workers/concerns/pipeline_background_queue_spec.rb'
- - 'spec/workers/concerns/pipeline_queue_spec.rb'
- 'spec/workers/concerns/project_import_options_spec.rb'
- 'spec/workers/concerns/reenqueuer_spec.rb'
- 'spec/workers/concerns/repository_check_queue_spec.rb'
diff --git a/app/assets/javascripts/lib/utils/text_markdown.js b/app/assets/javascripts/lib/utils/text_markdown.js
index 83ae7142cf2..ebc118c0d87 100644
--- a/app/assets/javascripts/lib/utils/text_markdown.js
+++ b/app/assets/javascripts/lib/utils/text_markdown.js
@@ -2,7 +2,6 @@
import $ from 'jquery';
import Shortcuts from '~/behaviors/shortcuts/shortcuts';
import { insertText } from '~/lib/utils/common_utils';
-import { ENTER_KEY } from '~/lib/utils/keys';
import axios from '~/lib/utils/axios_utils';
const LINK_TAG_PATTERN = '[{text}](url)';
@@ -521,7 +520,7 @@ function continueOlText(listLineMatch, nextLineMatch) {
function handleContinueList(e, textArea) {
if (!gon.markdown_automatic_lists) return;
- if (!(e.key === ENTER_KEY)) return;
+ if (!(e.key === 'Enter')) return;
if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) return;
if (textArea.selectionStart !== textArea.selectionEnd) return;
@@ -578,25 +577,6 @@ function handleContinueList(e, textArea) {
}
}
-/**
- * Adds a Markdown hard break when `Shift+Enter` is pressed
- *
- * @param {Object} e - the event
- * @param {Object} textArea - the targeted text area
- */
-function handleHardBreak(e, textArea) {
- if (!(e.key === ENTER_KEY)) return;
- if (!e.shiftKey) return;
- if (e.altKey || e.ctrlKey || e.metaKey) return;
-
- // prevent unintended line breaks inserted using Japanese IME on MacOS
- if (compositioningNoteText) return;
-
- e.preventDefault();
-
- insertText(textArea, '\\\n');
-}
-
export function keypressNoteText(e) {
const textArea = this;
@@ -604,7 +584,6 @@ export function keypressNoteText(e) {
handleContinueList(e, textArea);
handleSurroundSelectedText(e, textArea);
- handleHardBreak(e, textArea);
}
export function compositionStartNoteText() {
diff --git a/app/assets/javascripts/projects/settings/branch_rules/components/view/constants.js b/app/assets/javascripts/projects/settings/branch_rules/components/view/constants.js
index a98c2439cde..0b383537e12 100644
--- a/app/assets/javascripts/projects/settings/branch_rules/components/view/constants.js
+++ b/app/assets/javascripts/projects/settings/branch_rules/components/view/constants.js
@@ -33,6 +33,16 @@ export const I18N = {
allowedToPushHeader: s__('BranchRules|Allowed to push and merge (%{total})'),
allowedToMergeHeader: s__('BranchRules|Allowed to merge (%{total})'),
approvalsHeader: s__('BranchRules|Required approvals (%{total})'),
+ requiresCodeOwnerApprovalTitle: s__('BranchRules|Requires approval from code owners'),
+ doesNotRequireCodeOwnerApprovalTitle: s__(
+ 'BranchRules|Does not require approval from code owners',
+ ),
+ requiresCodeOwnerApprovalDescription: s__(
+ 'BranchRules|Also rejects code pushes that change files listed in CODEOWNERS file.',
+ ),
+ doesNotRequireCodeOwnerApprovalDescription: s__(
+ 'BranchRules|Also accepts code pushes that change files listed in CODEOWNERS file.',
+ ),
noData: s__('BranchRules|No data to display'),
};
@@ -48,3 +58,9 @@ export const PROTECTED_BRANCHES_HELP_PATH = 'user/project/protected_branches';
export const APPROVALS_HELP_PATH = 'user/project/merge_requests/approvals/index.md';
export const STATUS_CHECKS_HELP_PATH = 'user/project/merge_requests/status_checks.md';
+
+export const REQUIRED_ICON = 'check-circle-filled';
+export const NOT_REQUIRED_ICON = 'status-failed';
+
+export const REQUIRED_ICON_CLASS = 'gl-fill-green-500';
+export const NOT_REQUIRED_ICON_CLASS = 'gl-text-red-500';
diff --git a/app/assets/javascripts/projects/settings/branch_rules/components/view/index.vue b/app/assets/javascripts/projects/settings/branch_rules/components/view/index.vue
index fc433355ad7..ff510361745 100644
--- a/app/assets/javascripts/projects/settings/branch_rules/components/view/index.vue
+++ b/app/assets/javascripts/projects/settings/branch_rules/components/view/index.vue
@@ -1,5 +1,5 @@
<script>
-import { GlSprintf, GlLink, GlLoadingIcon } from '@gitlab/ui';
+import { GlSprintf, GlLink, GlLoadingIcon, GlIcon } from '@gitlab/ui';
import { sprintf, n__ } from '~/locale';
import { getParameterByName, mergeUrlParams } from '~/lib/utils/url_utility';
import { helpPagePath } from '~/helpers/help_page_helper';
@@ -12,6 +12,10 @@ import {
BRANCH_PARAM_NAME,
WILDCARDS_HELP_PATH,
PROTECTED_BRANCHES_HELP_PATH,
+ REQUIRED_ICON,
+ NOT_REQUIRED_ICON,
+ REQUIRED_ICON_CLASS,
+ NOT_REQUIRED_ICON_CLASS,
} from './constants';
const wildcardsHelpDocLink = helpPagePath(WILDCARDS_HELP_PATH);
@@ -22,7 +26,7 @@ export default {
i18n: I18N,
wildcardsHelpDocLink,
protectedBranchesHelpDocLink,
- components: { Protection, GlSprintf, GlLink, GlLoadingIcon },
+ components: { Protection, GlSprintf, GlLink, GlLoadingIcon, GlIcon },
inject: {
projectPath: {
default: '',
@@ -35,6 +39,7 @@ export default {
},
showStatusChecks: { default: false },
showApprovers: { default: false },
+ showCodeOwners: { default: false },
},
apollo: {
project: {
@@ -70,6 +75,19 @@ export default {
? this.$options.i18n.allowForcePushDescription
: this.$options.i18n.disallowForcePushDescription;
},
+ codeOwnersApprovalAttributes() {
+ const { codeOwnerApprovalRequired } = this.branchProtection;
+ const icon = codeOwnerApprovalRequired ? REQUIRED_ICON : NOT_REQUIRED_ICON;
+ const iconClass = codeOwnerApprovalRequired ? REQUIRED_ICON_CLASS : NOT_REQUIRED_ICON_CLASS;
+ const title = codeOwnerApprovalRequired
+ ? this.$options.i18n.requiresCodeOwnerApprovalTitle
+ : this.$options.i18n.doesNotRequireCodeOwnerApprovalTitle;
+ const description = codeOwnerApprovalRequired
+ ? this.$options.i18n.requiresCodeOwnerApprovalDescription
+ : this.$options.i18n.doesNotRequireCodeOwnerApprovalDescription;
+
+ return { icon, iconClass, title, description };
+ },
mergeAccessLevels() {
const { mergeAccessLevels } = this.branchProtection || {};
return this.getAccessLevels(mergeAccessLevels);
@@ -181,6 +199,20 @@ export default {
/>
<!-- EE start -->
+ <!-- Code Owners -->
+ <div v-if="showCodeOwners">
+ <div class="gl-display-flex gl-align-items-center">
+ <gl-icon
+ :size="14"
+ :name="codeOwnersApprovalAttributes.icon"
+ :class="codeOwnersApprovalAttributes.iconClass"
+ />
+ <strong class="gl-ml-2">{{ codeOwnersApprovalAttributes.title }}</strong>
+ </div>
+
+ <div class="gl-text-gray-400">{{ codeOwnersApprovalAttributes.description }}</div>
+ </div>
+
<!-- Approvals -->
<template v-if="showApprovers">
<h4 class="gl-mb-1 gl-mt-5">{{ $options.i18n.approvalsTitle }}</h4>
diff --git a/app/assets/javascripts/projects/settings/branch_rules/components/view/protection_row.vue b/app/assets/javascripts/projects/settings/branch_rules/components/view/protection_row.vue
index 9bff2f5506c..721248e53e3 100644
--- a/app/assets/javascripts/projects/settings/branch_rules/components/view/protection_row.vue
+++ b/app/assets/javascripts/projects/settings/branch_rules/components/view/protection_row.vue
@@ -101,12 +101,7 @@ export default {
<div v-if="statusCheckUrl" class="gl-ml-7 gl-flex-grow-1">{{ statusCheckUrl }}</div>
- <div
- v-for="(item, index) in accessLevels"
- :key="index"
- data-testid="access-level"
- class="gl-w-quarter"
- >
+ <div v-for="(item, index) in accessLevels" :key="index" data-testid="access-level">
<span v-if="commaSeparateList && index > 0" data-testid="comma-separator">,</span>
{{ item.accessLevelDescription }}
</div>
diff --git a/app/assets/javascripts/projects/settings/branch_rules/mount_branch_rules.js b/app/assets/javascripts/projects/settings/branch_rules/mount_branch_rules.js
index 5e037efee06..c429c352bfa 100644
--- a/app/assets/javascripts/projects/settings/branch_rules/mount_branch_rules.js
+++ b/app/assets/javascripts/projects/settings/branch_rules/mount_branch_rules.js
@@ -23,6 +23,7 @@ export default function mountBranchRules(el) {
branchesPath,
showStatusChecks,
showApprovers,
+ showCodeOwners,
} = el.dataset;
return new Vue({
@@ -36,6 +37,7 @@ export default function mountBranchRules(el) {
branchesPath,
showStatusChecks: parseBoolean(showStatusChecks),
showApprovers: parseBoolean(showApprovers),
+ showCodeOwners: parseBoolean(showCodeOwners),
},
render(h) {
return h(View);
diff --git a/app/assets/javascripts/sidebar/components/participants/participants.vue b/app/assets/javascripts/sidebar/components/participants/participants.vue
index b8f659ac56f..a9d102eb303 100644
--- a/app/assets/javascripts/sidebar/components/participants/participants.vue
+++ b/app/assets/javascripts/sidebar/components/participants/participants.vue
@@ -114,9 +114,12 @@ export default {
<div
v-for="participant in visibleParticipants"
:key="participant.id"
- class="participants-author gl-display-inline-block gl-pr-3 gl-pb-3"
+ class="participants-author gl-display-inline-block gl-mr-3 gl-mb-3"
>
- <a :href="participant.web_url || participant.webUrl" class="author-link">
+ <a
+ :href="participant.web_url || participant.webUrl"
+ class="author-link gl-display-inline-block gl-rounded-full"
+ >
<user-avatar-image
:lazy="lazy"
:img-src="participant.avatar_url || participant.avatarUrl"
diff --git a/app/helpers/projects/settings/branch_rules_helper.rb b/app/helpers/projects/settings/branch_rules_helper.rb
new file mode 100644
index 00000000000..e53275d8183
--- /dev/null
+++ b/app/helpers/projects/settings/branch_rules_helper.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+module Projects
+ module Settings
+ module BranchRulesHelper
+ def branch_rules_data(project)
+ {
+ project_path: project.full_path,
+ protected_branches_path: project_settings_repository_path(project, anchor: 'js-protected-branches-settings'),
+ approval_rules_path: project_settings_merge_requests_path(project,
+ anchor: 'js-merge-request-approval-settings'),
+ status_checks_path: project_settings_merge_requests_path(project, anchor: 'js-merge-request-settings'),
+ branches_path: project_branches_path(project),
+ show_status_checks: 'false',
+ show_approvers: 'false',
+ show_code_owners: 'false'
+ }
+ end
+ end
+ end
+end
+
+Projects::Settings::BranchRulesHelper.prepend_mod
diff --git a/app/views/profiles/two_factor_auths/show.html.haml b/app/views/profiles/two_factor_auths/show.html.haml
index 87e8bd69994..c489b274f13 100644
--- a/app/views/profiles/two_factor_auths/show.html.haml
+++ b/app/views/profiles/two_factor_auths/show.html.haml
@@ -15,17 +15,6 @@
- if current_user.two_factor_otp_enabled?
%p
= _("You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication.")
- %p
- = _('If you lose your recovery codes you can generate new ones, invalidating all previous codes.')
- - if @error
- = render Pajamas::AlertComponent.new(title: @error[:message],
- variant: :danger,
- alert_options: { class: 'gl-mb-3' },
- dismissible: false) do |c|
- = c.body do
- = link_to _('Try the troubleshooting steps here.'), help_page_path('user/profile/account/two_factor_authentication.md', anchor: 'troubleshooting'), target: '_blank', rel: 'noopener noreferrer'
- .js-manage-two-factor-form{ data: { webauthn_enabled: webauthn_enabled, current_password_required: current_password_required?.to_s, profile_two_factor_auth_path: profile_two_factor_auth_path, profile_two_factor_auth_method: 'delete', codes_profile_two_factor_auth_path: codes_profile_two_factor_auth_path, codes_profile_two_factor_auth_method: 'post' } }
-
- else
%p
- register_2fa_token = _('We recommend using cloud-based authenticator applications that can restore access if you lose your hardware device.')
@@ -140,3 +129,28 @@
= _("You don't have any WebAuthn devices registered yet.")
- else
= _("You don't have any U2F devices registered yet.")
+
+
+ %hr
+
+ .row.gl-mt-3
+ .col-lg-4
+ %h4.gl-mt-0
+ = _('Disable two-factor authentication')
+ %p
+ = _('Use this section to disable your one-time password authenticator and WebAuthn devices. You can also generate new recovery codes.')
+ .col-lg-8
+ - if current_user.two_factor_enabled?
+ %p
+ = _('If you lose your recovery codes you can generate new ones, invalidating all previous codes.')
+ - if @error
+ = render Pajamas::AlertComponent.new(title: @error[:message],
+ variant: :danger,
+ alert_options: { class: 'gl-mb-3' },
+ dismissible: false) do |c|
+ = c.body do
+ = link_to _('Try the troubleshooting steps here.'), help_page_path('user/profile/account/two_factor_authentication.md', anchor: 'troubleshooting'), target: '_blank', rel: 'noopener noreferrer'
+ .js-manage-two-factor-form{ data: { webauthn_enabled: webauthn_enabled, current_password_required: current_password_required?.to_s, profile_two_factor_auth_path: profile_two_factor_auth_path, profile_two_factor_auth_method: 'delete', codes_profile_two_factor_auth_path: codes_profile_two_factor_auth_path, codes_profile_two_factor_auth_method: 'post' } }
+ - else
+ %p
+ = _("Register a one-time password authenticator or a WebAuthn device first.")
diff --git a/app/views/projects/settings/branch_rules/index.html.haml b/app/views/projects/settings/branch_rules/index.html.haml
index 59b801a89c3..f05a528745c 100644
--- a/app/views/projects/settings/branch_rules/index.html.haml
+++ b/app/views/projects/settings/branch_rules/index.html.haml
@@ -1,8 +1,6 @@
- add_to_breadcrumbs _('Repository Settings'), project_settings_repository_path(@project)
- page_title s_('BranchRules|Branch rules details')
-- show_status_checks = @project.licensed_feature_available?(:external_status_checks)
-- show_approvers = @project.licensed_feature_available?(:merge_request_approvers)
%h3.gl-mb-5= s_('BranchRules|Branch rules details')
-#js-branch-rules{ data: { project_path: @project.full_path, protected_branches_path: project_settings_repository_path(@project, anchor: 'js-protected-branches-settings'), approval_rules_path: project_settings_merge_requests_path(@project, anchor: 'js-merge-request-approval-settings'), status_checks_path: project_settings_merge_requests_path(@project, anchor: 'js-merge-request-settings'), branches_path: project_branches_path(@project), show_status_checks: show_status_checks.to_s, show_approvers: show_approvers.to_s } }
+#js-branch-rules{ data: branch_rules_data(@project) }
diff --git a/data/deprecations/15-9-env-search-char-limit.yml b/data/deprecations/15-9-env-search-char-limit.yml
new file mode 100644
index 00000000000..5dbba6ec5e1
--- /dev/null
+++ b/data/deprecations/15-9-env-search-char-limit.yml
@@ -0,0 +1,9 @@
+- title: "Environment search query requires at least three characters" # (required) Clearly explain the change, or planned change. For example, "The `confidential` field for a `Note` is deprecated" or "CI/CD job names will be limited to 250 characters."
+ announcement_milestone: "15.10" # (required) The milestone when this feature was first announced as deprecated.
+ removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed
+ breaking_change: true # (required) Change to false if this is not a breaking change.
+ reporter: cbalane # (required) GitLab username of the person reporting the change
+ stage: release # (required) String value of the stage that the feature was created in. e.g., Growth
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/382532 # (required) Link to the deprecation issue in GitLab
+ body: | # (required) Do not modify this line, instead modify the lines below.
+ From GitLab 16.0, when you search for environments with the API, you must use at least three characters. This change helps us ensure the scalability of the search operation.
diff --git a/doc/api/deploy_keys.md b/doc/api/deploy_keys.md
index 684df9fdfdc..9b02f30b7ee 100644
--- a/doc/api/deploy_keys.md
+++ b/doc/api/deploy_keys.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/api/deploy_tokens.md b/doc/api/deploy_tokens.md
index 2cfb58c25e1..0b7ea13c341 100644
--- a/doc/api/deploy_tokens.md
+++ b/doc/api/deploy_tokens.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/api/deployments.md b/doc/api/deployments.md
index c6537493eab..eb718d80b78 100644
--- a/doc/api/deployments.md
+++ b/doc/api/deployments.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
type: concepts, howto
---
diff --git a/doc/api/environments.md b/doc/api/environments.md
index bbf6c5fee99..2bd7b28d0d0 100644
--- a/doc/api/environments.md
+++ b/doc/api/environments.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
type: concepts, howto
---
diff --git a/doc/api/feature_flag_user_lists.md b/doc/api/feature_flag_user_lists.md
index 27e2e925506..0d48f8daf40 100644
--- a/doc/api/feature_flag_user_lists.md
+++ b/doc/api/feature_flag_user_lists.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/api/feature_flags.md b/doc/api/feature_flags.md
index cd9907c8032..f62d51ea427 100644
--- a/doc/api/feature_flags.md
+++ b/doc/api/feature_flags.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/api/features.md b/doc/api/features.md
index c3db1e53f68..2b0bf656664 100644
--- a/doc/api/features.md
+++ b/doc/api/features.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/api/freeze_periods.md b/doc/api/freeze_periods.md
index ce7377e1e35..cb9bf81e961 100644
--- a/doc/api/freeze_periods.md
+++ b/doc/api/freeze_periods.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
type: concepts, howto
---
diff --git a/doc/api/group_protected_environments.md b/doc/api/group_protected_environments.md
index 3003b6b840f..bddfd774d43 100644
--- a/doc/api/group_protected_environments.md
+++ b/doc/api/group_protected_environments.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
type: concepts, howto
---
diff --git a/doc/api/group_releases.md b/doc/api/group_releases.md
index 9c395adbe04..978218041f2 100644
--- a/doc/api/group_releases.md
+++ b/doc/api/group_releases.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/api/protected_environments.md b/doc/api/protected_environments.md
index 1ea3fc5adda..877add32fed 100644
--- a/doc/api/protected_environments.md
+++ b/doc/api/protected_environments.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
type: concepts, howto
---
diff --git a/doc/api/releases/index.md b/doc/api/releases/index.md
index f23f2b36ed0..0d8e335b620 100644
--- a/doc/api/releases/index.md
+++ b/doc/api/releases/index.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/api/releases/links.md b/doc/api/releases/links.md
index 74f6b1c9efa..2294f161759 100644
--- a/doc/api/releases/links.md
+++ b/doc/api/releases/links.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/api/resource_groups.md b/doc/api/resource_groups.md
index cdba0c01f4f..552c2a3ecfb 100644
--- a/doc/api/resource_groups.md
+++ b/doc/api/resource_groups.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/ci/cloud_deployment/ecs/deploy_to_aws_ecs.md b/doc/ci/cloud_deployment/ecs/deploy_to_aws_ecs.md
index 920e7cca2cb..71210467018 100644
--- a/doc/ci/cloud_deployment/ecs/deploy_to_aws_ecs.md
+++ b/doc/ci/cloud_deployment/ecs/deploy_to_aws_ecs.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/ci/cloud_deployment/heroku.md b/doc/ci/cloud_deployment/heroku.md
index 541ba89dca8..7c15bf5b8cd 100644
--- a/doc/ci/cloud_deployment/heroku.md
+++ b/doc/ci/cloud_deployment/heroku.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/ci/cloud_deployment/index.md b/doc/ci/cloud_deployment/index.md
index a8826a6fdb5..79684d9d627 100644
--- a/doc/ci/cloud_deployment/index.md
+++ b/doc/ci/cloud_deployment/index.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
type: howto
---
diff --git a/doc/ci/environments/deployment_approvals.md b/doc/ci/environments/deployment_approvals.md
index 089ecefb373..c4f685b18ec 100644
--- a/doc/ci/environments/deployment_approvals.md
+++ b/doc/ci/environments/deployment_approvals.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
description: Require approvals prior to deploying to a Protected Environment
---
diff --git a/doc/ci/environments/deployment_safety.md b/doc/ci/environments/deployment_safety.md
index cf82238564e..327118c8a86 100644
--- a/doc/ci/environments/deployment_safety.md
+++ b/doc/ci/environments/deployment_safety.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/ci/environments/environments_dashboard.md b/doc/ci/environments/environments_dashboard.md
index 479b783202d..2ee0dc2ee11 100644
--- a/doc/ci/environments/environments_dashboard.md
+++ b/doc/ci/environments/environments_dashboard.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
type: reference
---
diff --git a/doc/ci/environments/external_deployment_tools.md b/doc/ci/environments/external_deployment_tools.md
index ff3172f0e02..1c547c8e4ea 100644
--- a/doc/ci/environments/external_deployment_tools.md
+++ b/doc/ci/environments/external_deployment_tools.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
type: reference
---
diff --git a/doc/ci/environments/incremental_rollouts.md b/doc/ci/environments/incremental_rollouts.md
index 10cda68c4b5..8df2d8ead6c 100644
--- a/doc/ci/environments/incremental_rollouts.md
+++ b/doc/ci/environments/incremental_rollouts.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
type: concepts, howto
---
diff --git a/doc/ci/environments/index.md b/doc/ci/environments/index.md
index 4b86fdf87e8..f15c4a0a535 100644
--- a/doc/ci/environments/index.md
+++ b/doc/ci/environments/index.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
type: reference
disqus_identifier: 'https://docs.gitlab.com/ee/ci/environments.html'
diff --git a/doc/ci/environments/protected_environments.md b/doc/ci/environments/protected_environments.md
index fc49be798ec..c81a5ab1378 100644
--- a/doc/ci/environments/protected_environments.md
+++ b/doc/ci/environments/protected_environments.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/ci/examples/deployment/composer-npm-deploy.md b/doc/ci/examples/deployment/composer-npm-deploy.md
index 533b6519d9a..81e70e5cf82 100644
--- a/doc/ci/examples/deployment/composer-npm-deploy.md
+++ b/doc/ci/examples/deployment/composer-npm-deploy.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
type: tutorial
---
diff --git a/doc/ci/examples/deployment/index.md b/doc/ci/examples/deployment/index.md
index 67b4ec6b279..74b4581af99 100644
--- a/doc/ci/examples/deployment/index.md
+++ b/doc/ci/examples/deployment/index.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
type: tutorial
---
diff --git a/doc/ci/resource_groups/index.md b/doc/ci/resource_groups/index.md
index 7cf71f2a3ea..3835b5f2df2 100644
--- a/doc/ci/resource_groups/index.md
+++ b/doc/ci/resource_groups/index.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
description: Control the job concurrency in GitLab CI/CD
---
diff --git a/doc/cloud_seed/index.md b/doc/cloud_seed/index.md
index 1021c7f7700..9ce18950506 100644
--- a/doc/cloud_seed/index.md
+++ b/doc/cloud_seed/index.md
@@ -1,5 +1,5 @@
---
-stage: Release
+stage: Configure
group: Incubation
info: Cloud Seed (formerly 5mp) is a GitLab Incubation Engineering program. No technical writer assigned to this group.
---
diff --git a/doc/development/code_review.md b/doc/development/code_review.md
index c7811e16551..0f169447ade 100644
--- a/doc/development/code_review.md
+++ b/doc/development/code_review.md
@@ -237,7 +237,7 @@ See the [test engineering process](https://about.gitlab.com/handbook/engineering
##### Compliance
-1. You have confirmed that the correct [MR type label](contributing/issue_workflow.md#type-labels) has been applied.
+1. You have confirmed that the correct [MR type label](labels/index.md) has been applied.
### The responsibility of the merge request author
@@ -532,7 +532,7 @@ WARNING:
Before taking the decision to merge:
- Set the milestone.
-- Confirm that the correct [MR type label](contributing/issue_workflow.md#type-labels) is applied.
+- Confirm that the correct [MR type label](labels/index.md#type-labels) is applied.
- Consider warnings and errors from danger bot, code quality, and other reports.
Unless a strong case can be made for the violation, these should be resolved
before merging. A comment must be posted if the MR is merged with any failed job.
diff --git a/doc/development/contributing/design.md b/doc/development/contributing/design.md
index cff184380d0..210370f9816 100644
--- a/doc/development/contributing/design.md
+++ b/doc/development/contributing/design.md
@@ -127,7 +127,7 @@ At any moment, but usually _during_ or _after_ the design's implementation:
- Contribute [issues to Pajamas](https://design.gitlab.com/get-started/contributing#contribute-an-issue)
for additions or enhancements to the design system.
-- Create issues with the [`~UX debt`](issue_workflow.md#technical-and-ux-debt)
+- Create issues with the [`~UX debt`](../labels/index.md#technical-and-ux-debt)
label for intentional deviations from the agreed-upon UX requirements due to
time or feasibility challenges, linking back to the corresponding issues or
merge requests.
diff --git a/doc/development/contributing/index.md b/doc/development/contributing/index.md
index 1a169b05eed..cf10a106119 100644
--- a/doc/development/contributing/index.md
+++ b/doc/development/contributing/index.md
@@ -36,7 +36,7 @@ for audiences of all ages.
If you would like to contribute to GitLab:
- Issues with the
- [`~Seeking community contributions` label](issue_workflow.md#label-for-community-contributors)
+ [`~Seeking community contributions` label](../labels/index.md#label-for-community-contributors)
are a great place to start.
- Optimizing our tests is another great opportunity to contribute. You can use
[RSpec profiling statistics](https://gitlab-org.gitlab.io/rspec_profiling_stats/) to identify
@@ -112,11 +112,11 @@ working days of its initial submission, you can ask for help with `@gitlab-bot h
This [documentation](issue_workflow.md) outlines the current issue workflow:
- [Issue triaging](issue_workflow.md#issue-triaging)
-- [Labels](issue_workflow.md#labels)
+- [Labels](../labels/index.md)
- [Feature proposals](issue_workflow.md#feature-proposals)
- [Issue weight](issue_workflow.md#issue-weight)
- [Regression issues](issue_workflow.md#regression-issues)
-- [Technical and UX debt](issue_workflow.md#technical-and-ux-debt)
+- [Technical and UX debt](../labels/index.md#technical-and-ux-debt)
- [Technical debt in follow-up issues](issue_workflow.md#technical-debt-in-follow-up-issues)
#### Merge requests workflow
diff --git a/doc/development/contributing/issue_workflow.md b/doc/development/contributing/issue_workflow.md
index b55fef25302..583b39ebe56 100644
--- a/doc/development/contributing/issue_workflow.md
+++ b/doc/development/contributing/issue_workflow.md
@@ -37,300 +37,7 @@ the affected files to find someone.
We also have triage automation in place, described [in our handbook](https://about.gitlab.com/handbook/engineering/quality/triage-operations/).
-## Labels
-
-To allow for asynchronous issue handling, we use [milestones](https://gitlab.com/groups/gitlab-org/-/milestones)
-and [labels](https://gitlab.com/gitlab-org/gitlab/-/labels). Leads and product managers handle most of the
-scheduling into milestones. Labeling is a task for everyone. (For some projects, labels can be set only by GitLab team members and not by community contributors).
-
-Most issues will have labels for at least one of the following:
-
-- Type. For example: `~"type::feature"`, `~"type::bug"`, or `~"type::maintenance"`.
-- Stage. For example: `~"devops::plan"` or `~"devops::create"`.
-- Group. For example: `~"group::source code"`, `~"group::knowledge"`, or `~"group::editor"`.
-- Category. For example: `~"Category:Code Analytics"`, `~"Category:DevOps Reports"`, or `~"Category:Templates"`.
-- Feature. For example: `~wiki`, `~ldap`, `~api`, `~issues`, or `~"merge requests"`.
-- Department: `~UX`, `~Quality`
-- Team: `~"Technical Writing"`, `~Delivery`
-- Specialization: `~frontend`, `~backend`, `~documentation`
-- Release Scoping: `~Deliverable`, `~Stretch`, `~"Next Patch Release"`
-- Priority: `~"priority::1"`, `~"priority::2"`, `~"priority::3"`, `~"priority::4"`
-- Severity: `~"severity::1"`, `~"severity::2"`, `~"severity::3"`, `~"severity::4"`
-
-Please add `~"breaking change"` label if the issue can be considered as a [breaking change](../deprecation_guidelines/index.md).
-
-Please add `~security` label if the issue is related to application security.
-
-All labels, their meaning and priority are defined on the
-[labels page](https://gitlab.com/gitlab-org/gitlab/-/labels).
-
-If you come across an issue that has none of these, and you're allowed to set
-labels, you can _always_ add the type, stage, group, and often the category/feature labels.
-
-### Type labels
-
-Type labels are very important. They define what kind of issue this is. Every
-issue should have one and only one.
-
-The SSOT for type and subtype labels is [available in the handbook](https://about.gitlab.com/handbook/engineering/metrics/#work-type-classification).
-
-A number of type labels have a priority assigned to them, which automatically
-makes them float to the top, depending on their importance.
-
-Type labels are always lowercase, and can have any color, besides blue (which is
-already reserved for category labels).
-
-The descriptions on the [labels page](https://gitlab.com/groups/gitlab-org/-/labels)
-explain what falls under each type label.
-
-The GitLab handbook documents [when something is a bug](https://about.gitlab.com/handbook/product/product-processes/#bug-issues) and [when it is a feature request](https://about.gitlab.com/handbook/product/product-processes/#feature-issues).
-
-### Stage labels
-
-Stage labels specify which [stage](https://about.gitlab.com/handbook/product/categories/#hierarchy) the issue belongs to.
-
-#### Naming and color convention
-
-Stage labels respects the `devops::<stage_key>` naming convention.
-`<stage_key>` is the stage key as it is in the single source of truth for stages at
-<https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/data/stages.yml>
-with `_` replaced with a space.
-
-For instance, the "Manage" stage is represented by the `~"devops::manage"` label in
-the `gitlab-org` group since its key under `stages` is `manage`.
-
-The current stage labels can be found by [searching the labels list for `devops::`](https://gitlab.com/groups/gitlab-org/-/labels?search=devops::).
-
-These labels are [scoped labels](../../user/project/labels.md#scoped-labels)
-and thus are mutually exclusive.
-
-The Stage labels are used to generate the [direction pages](https://about.gitlab.com/direction/) automatically.
-
-### Group labels
-
-Group labels specify which [groups](https://about.gitlab.com/company/team/structure/#product-groups) the issue belongs to.
-
-It's highly recommended to add a group label, as it's used by our triage
-automation to
-[infer the correct stage label](https://about.gitlab.com/handbook/engineering/quality/triage-operations/#auto-labelling-of-issues-and-merge-requests).
-
-#### Naming and color convention
-
-Group labels respects the `group::<group_key>` naming convention and
-their color is `#A8D695`.
-`<group_key>` is the group key as it is in the single source of truth for groups at
-<https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/data/stages.yml>,
-with `_` replaced with a space.
-
-For instance, the "Pipeline Execution" group is represented by the
-~"group::pipeline execution" label in the `gitlab-org` group since its key
-under `stages.manage.groups` is `pipeline_execution`.
-
-The current group labels can be found by [searching the labels list for `group::`](https://gitlab.com/groups/gitlab-org/-/labels?search=group::).
-
-These labels are [scoped labels](../../user/project/labels.md#scoped-labels)
-and thus are mutually exclusive.
-
-You can find the groups listed in the [Product Stages, Groups, and Categories](https://about.gitlab.com/handbook/product/categories/) page.
-
-We use the term group to map down product requirements from our product stages.
-As a team needs some way to collect the work their members are planning to be assigned to, we use the `~group::` labels to do so.
-
-### Category labels
-
-From the handbook's
-[Product stages, groups, and categories](https://about.gitlab.com/handbook/product/categories/#hierarchy)
-page:
-
-> Categories are high-level capabilities that may be a standalone product at
-another company, such as Portfolio Management, for example.
-
-It's highly recommended to add a category label, as it's used by our triage
-automation to
-[infer the correct group and stage labels](https://about.gitlab.com/handbook/engineering/quality/triage-operations/#auto-labelling-of-issues).
-
-If you are an expert in a particular area, it makes it easier to find issues to
-work on. You can also subscribe to those labels to receive an email each time an
-issue is labeled with a category label corresponding to your expertise.
-
-#### Naming and color convention
-
-Category labels respects the `Category:<Category Name>` naming convention and
-their color is `#428BCA`.
-`<Category Name>` is the category name as it is in the single source of truth for categories at
-<https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/data/categories.yml>.
-
-For instance, the "DevOps Reports" category is represented by the
-~"Category:DevOps Reports" label in the `gitlab-org` group since its
-`devops_reports.name` value is "DevOps Reports".
-
-If a category's label doesn't respect this naming convention, it should be specified
-with [the `label` attribute](https://about.gitlab.com/handbook/marketing/digital-experience/website/#category-attributes)
-in <https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/data/categories.yml>.
-
-### Feature labels
-
-From the handbook's
-[Product stages, groups, and categories](https://about.gitlab.com/handbook/product/categories/#hierarchy)
-page:
-
-> Features: Small, discrete functionalities, for example Issue weights. Some common
-features are listed within parentheses to facilitate finding responsible PMs by keyword.
-
-It's highly recommended to add a feature label if no category label applies, as
-it's used by our triage automation to
-[infer the correct group and stage labels](https://about.gitlab.com/handbook/engineering/quality/triage-operations/#auto-labelling-of-issues).
-
-If you are an expert in a particular area, it makes it easier to find issues to
-work on. You can also subscribe to those labels to receive an email each time an
-issue is labeled with a feature label corresponding to your expertise.
-
-Examples of feature labels are `~wiki`, `~ldap`, `~api`, `~issues`, and `~"merge requests"`.
-
-#### Naming and color convention
-
-Feature labels are all-lowercase.
-
-### Facet labels
-
-To track additional information or context about created issues, developers may
-add _facet labels_. Facet labels are also sometimes used for issue prioritization
-or for measurements (such as time to close). An example of a facet label is the
-~customer label, which indicates customer interest.
-
-### Department labels
-
-The current department labels are:
-
-- ~UX
-- ~Quality
-
-### Team labels
-
-**Important**: Most of the historical team labels (like Manage or Plan) are
-now deprecated in favor of [Group labels](#group-labels) and [Stage labels](#stage-labels).
-
-Team labels specify what team is responsible for this issue.
-Assigning a team label makes sure issues get the attention of the appropriate
-people.
-
-The current team labels are:
-
-- ~Delivery
-- ~"Technical Writing"
-
-#### Naming and color convention
-
-Team labels are always capitalized so that they show up as the first label for
-any issue.
-
-### Specialization labels
-
-These labels narrow the [specialization](https://about.gitlab.com/company/team/structure/#specialist) on a unit of work.
-
-- ~frontend
-- ~backend
-- ~documentation
-
-### Release scoping labels
-
-Release Scoping labels help us clearly communicate expectations of the work for the
-release. There are three levels of Release Scoping labels:
-
-- ~Deliverable: Issues that are expected to be delivered in the current
- milestone.
-- ~Stretch: Issues that are a stretch goal for delivering in the current
- milestone. If these issues are not done in the current release, they will
- strongly be considered for the next release.
-- ~"Next Patch Release": Issues to put in the next patch release. Work on these
- first, and add the `~"Pick into X.Y"` label to the merge request, along with the
- appropriate milestone.
-
-Each issue scheduled for the current milestone should be labeled ~Deliverable
-or ~"Stretch". Any open issue for a previous milestone should be labeled
-~"Next Patch Release", or otherwise rescheduled to a different milestone.
-
-### Priority labels
-
-We have the following priority labels:
-
-- ~"priority::1"
-- ~"priority::2"
-- ~"priority::3"
-- ~"priority::4"
-
-Please refer to the issue triage [priority label](https://about.gitlab.com/handbook/engineering/quality/issue-triage/#priority) section in our handbook to see how it's used.
-
-### Severity labels
-
-We have the following severity labels:
-
-- ~"severity::1"
-- ~"severity::2"
-- ~"severity::3"
-- ~"severity::4"
-
-Please refer to the issue triage [severity label](https://about.gitlab.com/handbook/engineering/quality/issue-triage/#severity) section in our handbook to see how it's used.
-
-### Label for community contributors
-
-There are many issues that have a clear solution with uncontroversial benefit to GitLab users.
-However, GitLab might not have the capacity for all these proposals in the current roadmap.
-These issues are labeled ~"Seeking community contributions" because we welcome merge requests to resolve them.
-
-Community contributors can submit merge requests for any issue they want, but
-the ~"Seeking community contributions" label has a special meaning. It points to
-changes that:
-
-1. We already agreed on,
-1. Are well-defined,
-1. Are likely to get accepted by a maintainer.
-
-We want to avoid a situation when a contributor picks an
-~"Seeking community contributions" issue and then their merge request gets closed,
-because we realize that it does not fit our vision, or we want to solve it in a
-different way.
-
-We manually add the ~"Seeking community contributions" label to issues
-that fit the criteria described above.
-We do not automatically add this label, because it requires human evaluation.
-
-We recommend people that have never contributed to any open source project to
-look for issues labeled `~"Seeking community contributions"` with a
-[weight of 1](https://gitlab.com/groups/gitlab-org/-/issues?sort=created_date&state=opened&label_name[]=Seeking+community+contributions&assignee_id=None&weight=1) or the `~"good for new contributors"`
-[label](https://gitlab.com/gitlab-org/gitlab/-/issues?scope=all&state=opened&label_name[]=good%20for%20new%20contributors&assignee_id=None)
-attached to it.
-More experienced contributors are very welcome to tackle
-[any of them](https://gitlab.com/groups/gitlab-org/-/issues?sort=created_date&state=opened&label_name[]=Seeking+community+contributions&assignee_id=None).
-
-For more complex features that have a weight of 2 or more and clear scope, we recommend looking at issues
-with the [label `~"Community Challenge"`](https://gitlab.com/gitlab-org/gitlab/-/issues?sort=created_date&state=opened&label_name[]=Seeking+community+contributions&label_name[]=Community+challenge).
-If your MR for the `~"Community Challenge"` issue gets merged, you will also have a chance to win a custom
-GitLab merchandise.
-
-If you've decided that you would like to work on an issue, please @-mention
-the [appropriate product manager](https://about.gitlab.com/handbook/product/#who-to-talk-to-for-what)
-as soon as possible. The product manager will then pull in appropriate GitLab team
-members to further discuss scope, design, and technical considerations. This will
-ensure that your contribution is aligned with the GitLab product and minimize
-any rework and delay in getting it merged into main.
-
-GitLab team members who apply the ~"Seeking community contributions" label to an issue
-should update the issue description with a responsible product manager, inviting
-any potential community contributor to @-mention per above.
-
-### Stewardship label
-
-For issues related to the open source stewardship of GitLab,
-there is the ~"stewardship" label.
-
-This label is to be used for issues in which the stewardship of GitLab
-is a topic of discussion. For instance if GitLab Inc. is planning to add
-features from GitLab EE to GitLab CE, related issues would be labeled with
-~"stewardship".
-
-A recent example of this was the issue for
-[bringing the time tracking API to GitLab CE](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/25517#note_20019084).
+For information about which labels to apply to issues, see [Labels](../labels/index.md).
## Feature proposals
@@ -399,31 +106,6 @@ The release manager will
[update the notes](https://gitlab.com/gitlab-org/release-tools/blob/master/doc/pro-tips.md#update-the-regression-issue)
in the regression issue as fixes are addressed.
-## Technical and UX debt
-
-In order to track things that can be improved in the GitLab codebase,
-we use the ~"technical debt" label in the [GitLab issue tracker](https://gitlab.com/gitlab-org/gitlab/-/issues).
-We use the ~"UX debt" label when we choose to deviate from the MVC, in a way that harms the user experience.
-
-These labels should be added to issues that describe things that can be improved,
-shortcuts that have been taken, features that need additional attention, and all
-other things that have been left behind due to high velocity of development.
-For example, code that needs refactoring should use the ~"technical debt" label,
-something that didn't ship according to our Design System guidelines should
-use the ~"UX debt" label.
-
-Everyone can create an issue, though you may need to ask for adding a specific
-label, if you do not have permissions to do it by yourself. Additional labels
-can be combined with these labels, to make it easier to schedule
-the improvements for a release.
-
-Issues tagged with these labels have the same priority like issues
-that describe a new feature to be introduced in GitLab, and should be scheduled
-for a release by the appropriate person.
-
-Make sure to mention the merge request that the ~"technical debt" issue or
-~"UX debt" issue is associated with in the description of the issue.
-
## Technical debt in follow-up issues
It's common to discover technical debt during development of a new feature. In
@@ -459,6 +141,6 @@ and assignee.
The maintainer must always agree before an outstanding discussion is resolved in
this manner, and will be the one to create the issue. The title and description
should be of the same quality as those created
-[in the usual manner](#technical-and-ux-debt) - in particular, the issue title
+[in the usual manner](../labels/index.md#technical-and-ux-debt) - in particular, the issue title
**must not** begin with `Follow-up`! The creating maintainer should also expect
to be involved in some capacity when work begins on the follow-up issue.
diff --git a/doc/development/contributing/merge_request_workflow.md b/doc/development/contributing/merge_request_workflow.md
index 16a7244162c..c9866131cc7 100644
--- a/doc/development/contributing/merge_request_workflow.md
+++ b/doc/development/contributing/merge_request_workflow.md
@@ -9,7 +9,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
We welcome merge requests from everyone, with fixes and improvements
to GitLab code, tests, and documentation. The issues that are specifically suitable
-for community contributions have the [`Seeking community contributions`](issue_workflow.md#label-for-community-contributors)
+for community contributions have the
+[`Seeking community contributions`](../labels/index.md#label-for-community-contributors)
label, but you are free to contribute to any issue you want.
## Working from issues
diff --git a/doc/development/database/clickhouse/merge_request_analytics.md b/doc/development/database/clickhouse/merge_request_analytics.md
new file mode 100644
index 00000000000..34da71d6c4c
--- /dev/null
+++ b/doc/development/database/clickhouse/merge_request_analytics.md
@@ -0,0 +1,355 @@
+---
+stage: Data Stores
+group: Database
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Merge request analytics with ClickHouse
+
+The [merge request analytics feature](../../../user/analytics/merge_request_analytics.md)
+shows statistics about the merged merge requests in the project and also exposes record-level metadata.
+Aggregations include:
+
+- **Average time to merge**: The duration between the creation time and the merge time.
+- **Monthly aggregations**: A chart of 12 months of the merged merge requests.
+
+Under the chart, the user can see the paginated list of merge requests, 12 months per page.
+
+You can filter by:
+
+- Author
+- Assignee
+- Labels
+- Milestone
+- Source branch
+- Target branch
+
+## Current performance problems
+
+- The aggregation queries require specialized indexes, which cost additional
+ disk space (index-only scans).
+- Querying the whole 12 months is slow (statement timeout). Instead, the frontend
+ requests data per month (12 database queries).
+- Even with specialized indexes, making the feature available on the group level
+ would not be feasible due to the large volume of merge requests.
+
+## Example queries
+
+Get the number of merge requests merged in a given month:
+
+```sql
+SELECT COUNT(*)
+FROM "merge_requests"
+INNER JOIN "merge_request_metrics" ON "merge_request_metrics"."merge_request_id" = "merge_requests"."id"
+WHERE (NOT EXISTS
+ (SELECT 1
+ FROM "banned_users"
+ WHERE (merge_requests.author_id = banned_users.user_id)))
+ AND "merge_request_metrics"."target_project_id" = 278964
+ AND "merge_request_metrics"."merged_at" >= '2022-12-01 00:00:00'
+ AND "merge_request_metrics"."merged_at" <= '2023-01-01 00:00:00'
+```
+
+The `merge_request_metrics` table was de-normalized (by adding `target_project_id`)
+to improve the first-page load time. The query itself works well for smaller date ranges,
+however, it can time out as the date range increases.
+
+After an extra filter is added, the query becomes more complex because it must also
+filter the `merge_requests` table:
+
+```sql
+SELECT COUNT(*)
+FROM "merge_requests"
+INNER JOIN "merge_request_metrics" ON "merge_request_metrics"."merge_request_id" = "merge_requests"."id"
+WHERE (NOT EXISTS
+ (SELECT 1
+ FROM "banned_users"
+ WHERE (merge_requests.author_id = banned_users.user_id)))
+ AND "merge_requests"."author_id" IN
+ (SELECT "users"."id"
+ FROM "users"
+ WHERE (LOWER("users"."username") IN (LOWER('ahegyi'))))
+ AND "merge_request_metrics"."target_project_id" = 278964
+ AND "merge_request_metrics"."merged_at" >= '2022-12-01 00:00:00'
+ AND "merge_request_metrics"."merged_at" <= '2023-01-01 00:00:00'
+```
+
+To calculate mean time to merge, we also query the total time between the
+merge request creation time and merge time.
+
+```sql
+SELECT EXTRACT(epoch
+ FROM SUM(AGE(merge_request_metrics.merged_at, merge_request_metrics.created_at)))
+FROM "merge_requests"
+INNER JOIN "merge_request_metrics" ON "merge_request_metrics"."merge_request_id" = "merge_requests"."id"
+WHERE (NOT EXISTS
+ (SELECT 1
+ FROM "banned_users"
+ WHERE (merge_requests.author_id = banned_users.user_id)))
+ AND "merge_requests"."author_id" IN
+ (SELECT "users"."id"
+ FROM "users"
+ WHERE (LOWER("users"."username") IN (LOWER('ahegyi'))))
+ AND "merge_request_metrics"."target_project_id" = 278964
+ AND "merge_request_metrics"."merged_at" >= '2022-08-01 00:00:00'
+ AND "merge_request_metrics"."merged_at" <= '2022-09-01 00:00:00'
+ AND "merge_request_metrics"."merged_at" > "merge_request_metrics"."created_at"
+LIMIT 1
+```
+
+## Store merge request data in ClickHouse
+
+Several other use cases exist for storing and querying merge request data in
+ClickHouse. In this document, we focus on this particular feature.
+
+The core data exists in the `merge_request_metrics` and in the `merge_requests`
+database tables. Some filters require extra tables to be joined:
+
+- `banned_users`: Filter out merge requests created by banned users.
+- `labels`: A merge request can have one or more assigned labels.
+- `assignees`: A merge request can have one or more assignees.
+- `merged_at`: The `merged_at` column is located in the `merge_request_metrics` table.
+
+The `merge_requests` table contains data that can be filtered directly:
+
+- **Author**: via the `author_id` column.
+- **Milestone**: via the `milestone_id` column.
+- **Source branch**.
+- **Target branch**.
+- **Project**: via the `project_id` column.
+
+### Keep ClickHouse data up to date
+
+Replicating or syncing the `merge_requests` table is unfortunately not enough.
+Separate queries to associated tables are required to insert one de-normalized
+`merge_requests` row into the ClickHouse database.
+
+Change detection is non-trivial to implement. A few corners we could cut:
+
+- The feature is available for GitLab Premium and GitLab Ultimate customers.
+ We don't have to sync all the data, but instead sync only the `merge_requests` records
+ which are part of licensed groups.
+- Data changes (often) happen via the `MergeRequest` services, where bumping the
+ `updated_at` timestamp column is mostly consistent. Some sort of incremental
+ synchronization process could be implemented.
+- We only need to query the merged merge requests. After the merge, the record rarely changes.
+
+### Database table structure
+
+The database table structure uses de-normalization to make all required columns
+available in one database table. This eliminates the need for `JOINs`.
+
+```sql
+CREATE TABLE merge_requests
+(
+ `id` UInt64,
+ `project_id` UInt64 DEFAULT 0 NOT NULL,
+ `author_id` UInt64 DEFAULT 0 NOT NULL,
+ `milestone_id` UInt64 DEFAULT 0 NOT NULL,
+ `label_ids` Array(UInt64) DEFAULT [] NOT NULL,
+ `assignee_ids` Array(UInt64) DEFAULT [] NOT NULL,
+ `source_branch` String DEFAULT '' NOT NULL,
+ `target_branch` String DEFAULT '' NOT NULL,
+ `merged_at` DateTime64(6, 'UTC') NOT NULL,
+ `created_at` DateTime64(6, 'UTC') DEFAULT now() NOT NULL,
+ `updated_at` DateTime64(6, 'UTC') DEFAULT now() NOT NULL
+)
+ENGINE = ReplacingMergeTree(updated_at)
+ORDER BY (project_id, merged_at, id);
+```
+
+Similarly to the [activity data example](gitlab_activity_data.md), we use the
+`ReplacingMergeTree` engine. Several columns of the merge request record may change,
+so keeping the table up-to-date is important.
+
+The database table is ordered by the `project_id, merged_at, id` columns. This ordering
+optimizes the table data for our use case: querying the `merged_at` column in a project.
+
+## Rewrite the count query
+
+First, let's generate some data for the table.
+
+```sql
+INSERT INTO merge_requests (id, project_id, author_id, milestone_id, label_ids, merged_at, created_at)
+SELECT id, project_id, author_id, milestone_id, label_ids, merged_at, created_at
+FROM generateRandom('id UInt64, project_id UInt8, author_id UInt8, milestone_id UInt8, label_ids Array(UInt8), merged_at DateTime64(6, \'UTC\'), created_at DateTime64(6, \'UTC\')')
+LIMIT 1000000;
+```
+
+NOTE:
+Some integer data types were cast as `UInt8` so it is highly probable that they
+have same values across different rows.
+
+The original count query only aggregated data for one month. With ClickHouse, we can
+attempt aggregating the data for the whole year.
+
+PostgreSQL-based count query:
+
+```sql
+SELECT COUNT(*)
+FROM "merge_requests"
+INNER JOIN "merge_request_metrics" ON "merge_request_metrics"."merge_request_id" = "merge_requests"."id"
+WHERE (NOT EXISTS
+ (SELECT 1
+ FROM "banned_users"
+ WHERE (merge_requests.author_id = banned_users.user_id)))
+ AND "merge_request_metrics"."target_project_id" = 278964
+ AND "merge_request_metrics"."merged_at" >= '2022-12-01 00:00:00'
+ AND "merge_request_metrics"."merged_at" <= '2023-01-01 00:00:00'
+```
+
+ClickHouse query:
+
+```sql
+SELECT
+ toYear(merged_at) AS year,
+ toMonth(merged_at) AS month,
+ COUNT(*)
+FROM merge_requests
+WHERE
+ project_id = 200
+ AND merged_at BETWEEN '2022-01-01 00:00:00'
+ AND '2023-01-01 00:00:00'
+GROUP BY year, month
+```
+
+The query processed a significantly lower number of rows compared to the generated data.
+The `ORDER BY` clause (primary key) is helping the query execution:
+
+```plaintext
+11 rows in set. Elapsed: 0.010 sec.
+Processed 8.19 thousand rows, 131.07 KB (783.45 thousand rows/s., 12.54 MB/s.)
+```
+
+## Rewrite the Mean time to merge query
+
+The query calculates the mean time to merge as:
+`duration(created_at, merged_at) / merge_request_count`. The calculation is done in
+two separate steps:
+
+1. Request the monthly counts and the monthly duration values.
+1. Sum the counts to get the yearly count.
+1. Sum the durations to get the yearly duration.
+1. Divide the durations by the count.
+
+In ClickHouse, we can calculate the mean time to merge with one query:
+
+```sql
+SELECT
+ SUM(
+ dateDiff('second', merged_at, created_at) / 3600 / 24
+ ) / COUNT(*) AS mean_time_to_merge -- mean_time_to_merge is in days
+FROM merge_requests
+WHERE
+ project_id = 200
+ AND merged_at BETWEEN '2022-01-01 00:00:00'
+ AND '2023-01-01 00:00:00'
+```
+
+## Filtering
+
+The database queries above can be used as base queries. You can add more filters.
+For example, filtering for a label and a milestone:
+
+```sql
+SELECT
+ toYear(merged_at) AS year,
+ toMonth(merged_at) AS month,
+ COUNT(*)
+FROM merge_requests
+WHERE
+ project_id = 200
+ AND milestone_id = 15
+ AND has(label_ids, 118)
+ AND -- array includes 118
+ merged_at BETWEEN '2022-01-01 00:00:00'
+ AND '2023-01-01 00:00:00'
+GROUP BY year, month
+```
+
+Optimizing a particular filter is usually done with a database index. This particular
+query reads 8000 rows:
+
+```plaintext
+1 row in set. Elapsed: 0.016 sec.
+Processed 8.19 thousand rows, 589.99 KB (505.38 thousand rows/s., 36.40 MB/s.)
+```
+
+Adding an index on `milestone_id`:
+
+```sql
+ALTER TABLE merge_requests
+ADD
+ INDEX milestone_id_index milestone_id TYPE minmax GRANULARITY 10;
+ALTER TABLE
+ merge_requests MATERIALIZE INDEX milestone_id_index;
+```
+
+On the generated data, adding the index didn't improve the performance.
+
+### Banned users filter
+
+A recently added feature in GitLab filters out merge requests where the author is
+banned by the admins. The banned users are tracked on the instance level in the
+`banned_users` database table.
+
+#### Idea 1: Enumerate the banned user IDs
+
+This would require no structural changes to the ClickHouse database schema.
+We could query the banned users in the project and filter the values out in query time.
+
+Get the banned users (in PostgreSQL):
+
+```sql
+SELECT user_id FROM banned_users
+```
+
+In ClickHouse
+
+```sql
+SELECT
+ toYear(merged_at) AS year,
+ toMonth(merged_at) AS month,
+ COUNT(*)
+FROM merge_requests
+WHERE
+ author_id NOT IN (1, 2, 3, 4) AND -- banned users
+ project_id = 200
+ AND milestone_id = 15
+ AND has(label_ids, 118) AND -- array includes 118
+ merged_at BETWEEN '2022-01-01 00:00:00'
+ AND '2023-01-01 00:00:00'
+GROUP BY year, month
+```
+
+The problem with this approach is that the number of banned users could increase significantly which would make the query bigger and slower.
+
+#### Idea 2: replicate the `banned_users` table
+
+Assuming that the `banned_users table` doesn't grow to millions of rows, we could
+attempt to periodically sync the whole table to ClickHouse. With this approach,
+a mostly consistent `banned_users` table could be used in the ClickHouse database query:
+
+```sql
+SELECT
+ toYear(merged_at) AS year,
+ toMonth(merged_at) AS month,
+ COUNT(*)
+FROM merge_requests
+WHERE
+ author_id NOT IN (SELECT user_id FROM banned_users) AND
+ project_id = 200 AND
+ milestone_id = 15 AND
+ has(label_ids, 118) AND -- array includes 118
+ merged_at BETWEEN '2022-01-01 00:00:00' AND '2023-01-01 00:00:00'
+GROUP BY year, month
+```
+
+Alternatively, the `banned_users` table could be stored as a
+[dictionary](https://clickhouse.com/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts)
+to further improve the query performance.
+
+#### Idea 3: Alter the feature
+
+For analytical calculations, it might be acceptable to drop this particular filter.
+This approach assumes that including the merge requests of banned users doesn't skew the statistics significantly.
diff --git a/doc/development/database/clickhouse/tiered_storage.md b/doc/development/database/clickhouse/tiered_storage.md
new file mode 100644
index 00000000000..d9026f47e28
--- /dev/null
+++ b/doc/development/database/clickhouse/tiered_storage.md
@@ -0,0 +1,138 @@
+---
+stage: Data Stores
+group: Database
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Tiered Storages in ClickHouse
+
+NOTE:
+The MergeTree table engine in ClickHouse supports tiered storage.
+See the documentation for [Using Multiple Block Devices for Data Storage](https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/mergetree#table_engine-mergetree-multiple-volumes)
+for details on setup and further explanation.
+
+Quoting from the [MergeTree documentation](https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/mergetree#table_engine-mergetree-multiple-volumes):
+
+<!-- vale gitlab.Simplicity = NO -->
+
+> MergeTree family table engines can store data on multiple block devices. For example,
+> it can be useful when the data of a certain table are implicitly split into "hot" and "cold".
+> The most recent data is regularly requested but requires only a small amount of space.
+> On the contrary, the fat-tailed historical data is requested rarely.
+
+<!-- vale gitlab.Simplicity = YES -->
+
+When used with remote storage backends such as
+[Amazon S3](https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/mergetree#table_engine-mergetree-s3),
+this makes a very efficient storage scheme. It allows for storage policies, which
+allows data to be on local disks for a period of time and then move it to object storage.
+
+An [example configuration](https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/mergetree#table_engine-mergetree-multiple-volumes_configure) can look like this:
+
+```xml
+<storage_configuration>
+ <disks>
+ <fast_ssd>
+ <path>/mnt/fast_ssd/clickhouse/</path>
+ </fast_ssd>
+ <gcs>
+ <support_batch_delete>false</support_batch_delete>
+ <type>s3</type>
+ <endpoint>https://storage.googleapis.com/${BUCKET_NAME}/${ROOT_FOLDER}/</endpoint>
+ <access_key_id>${SERVICE_ACCOUNT_HMAC_KEY}</access_key_id>
+ <secret_access_key>${SERVICE_ACCOUNT_HMAC_SECRET}</secret_access_key>
+ <metadata_path>/var/lib/clickhouse/disks/gcs/</metadata_path>
+ </gcs>
+ ...
+ </disks>
+ ...
+ <policies>
+
+ <move_from_local_disks_to_gcs> <!-- policy name -->
+ <volumes>
+ <hot> <!-- volume name -->
+ <disk>fast_ssd</disk> <!-- disk name -->
+ </hot>
+ <cold>
+ <disk>gcs</disk>
+ </cold>
+ </volumes>
+ <move_factor>0.2</move_factor>
+ <!-- The move factor determines when to move data from hot volume to cold.
+ See ClickHouse docs for more details. -->
+ </moving_from_ssd_to_hdd>
+ ....
+</storage_configuration>
+```
+
+In this storage policy, two volumes are defined `hot` and `cold`. After the `hot` volume is filled with occupancy of `disk_size * move_factor`, the data is being moved to Google Cloud Storage (GCS).
+
+If this storage policy is not the default, create tables by attaching the storage policies. For example:
+
+```sql
+CREATE TABLE key_value_table (
+ event_date Date,
+ key String,
+ value String,
+) ENGINE = MergeTree
+ORDER BY (key)
+PARTITION BY toYYYYMM(event_date)
+SETTINGS storage_policy = 'move_from_local_disks_to_gcs'
+```
+
+NOTE:
+In this storage policy, the move happens implicitly. It is also possible to keep
+_hot_ data on local disks for a fixed period of time and then move them as _cold_.
+
+This approach is possible with
+[Table TTLs](https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/mergetree/#mergetree-table-ttl),
+which are also available with MergeTree table engine.
+
+The ClickHouse documentation shows this feature in detail, in the example of
+[implementing a hot - warm - cold architecture](https://clickhouse.com/docs/en/guides/developer/ttl/#implementing-a-hotwarmcold-architecture).
+
+You can take a similar approach for the example shown above. First, adjust the storage policy:
+
+```xml
+<storage_configuration>
+ ...
+ <policies>
+ <local_disk_and_gcs> <!-- policy name -->
+ <volumes>
+ <hot> <!-- volume name -->
+ <disk>fast_ssd</disk> <!-- disk name -->
+ </hot>
+ <cold>
+ <disk>gcs</disk>
+ </cold>
+ </volumes>
+ </local_disk_and_gcs>
+ ....
+</storage_configuration>
+```
+
+Then create the table as:
+
+```sql
+CREATE TABLE another_key_value_table (
+ event_date Date,
+ key String,
+ value String,
+) ENGINE = MergeTree
+ORDER BY (key)
+PARTITION BY toYYYYMM(event_date)
+TTL
+ event_date TO VOLUME 'hot',
+ event_date + INTERVAL 1 YEAR TO VOLUME 'cold'
+SETTINGS storage_policy = 'local_disk_and_gcs';
+```
+
+This creates the table so that data older than 1 year (evaluated against the
+`event_date` column) is moved to GCS. Such a storage policy can be helpful for append-only
+tables (like audit events) where only the most recent data is accessed frequently.
+You can drop the data altogether, which can be a regulatory requirement.
+
+We don't mention modifying TTLs in this guide, but that is possible as well.
+See ClickHouse documentation for
+[modifying TTL](https://clickhouse.com/docs/en/sql-reference/statements/alter/ttl/#modify-ttl)
+for details.
diff --git a/doc/development/database/index.md b/doc/development/database/index.md
index 8f22eaac496..eaf37cd7699 100644
--- a/doc/development/database/index.md
+++ b/doc/development/database/index.md
@@ -109,6 +109,8 @@ including the major methods:
- [Introduction](clickhouse/index.md)
- [Optimizing query execution](clickhouse/optimization.md)
- [Rebuild GitLab features using ClickHouse 1: Activity data](clickhouse/gitlab_activity_data.md)
+- [Rebuild GitLab features using ClickHouse 2: Merge Request analytics](clickhouse/merge_request_analytics.md)
+- [Tiered Storage in ClickHouse](clickhouse/tiered_storage.md)
## Miscellaneous
diff --git a/doc/development/documentation/index.md b/doc/development/documentation/index.md
index fd9e885e097..207be5e2858 100644
--- a/doc/development/documentation/index.md
+++ b/doc/development/documentation/index.md
@@ -157,19 +157,15 @@ You can use a Rake task to update the `CODEOWNERS` file.
#### Update the `CODEOWNERS` file
-To update the `CODEOWNERS` file:
-
-1. Review the [TW team assignments](https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments)
- in the [`codeowners.rake`](https://gitlab.com/gitlab-org/gitlab/blob/master/lib/tasks/gitlab/tw/codeowners.rake)
- file. If any assignments have changed:
- 1. Update the `codeowners.rake` file with the changes.
- 1. Assign the merge request to a technical writing manager for review and merge.
-1. After the changes to `codeowners.rake` are merged, go to the root of the `gitlab` repository.
+When groups or [TW assignments](https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments)
+change, you must update the `CODEOWNERS` file:
+
+1. Update the [stage and group metadata](#stage-and-group-metadata) for any affected doc pages, if necessary. If there are many changes, you can do this step in a separate MR.
+1. Update the [`codeowners.rake`](https://gitlab.com/gitlab-org/gitlab/blob/master/lib/tasks/gitlab/tw/codeowners.rake) file with the changes.
+1. Go to the root of the `gitlab` repository.
1. Run the Rake task with this command: `bundle exec rake tw:codeowners`
-1. Review the command output for any pages that need attention to
- their metadata. Handle any needed changes in a separate merge request.
-1. Add the changes to the CODEOWNERS file to Git: `git add .gitlab/CODEOWNERS`
-1. Commit your changes to your branch, and push your branch up to `origin`.
+1. Review the changes in the `CODEOWNERS` file.
+1. Add and commit all your changes and push your branch up to `origin`.
1. Create a merge request and assign it to a technical writing manager for review.
## Move, rename, or delete a page
diff --git a/doc/development/documentation/workflow.md b/doc/development/documentation/workflow.md
index 63612861e4d..07ad07375e2 100644
--- a/doc/development/documentation/workflow.md
+++ b/doc/development/documentation/workflow.md
@@ -83,16 +83,16 @@ If you are a member of the GitLab Slack workspace, you can request help in `#doc
When you author an issue or merge request, you must add these labels:
-- A [type label](../contributing/issue_workflow.md#type-labels), either `~"type::feature"` or `~"type::maintenance"`.
-- A [stage label](../contributing/issue_workflow.md#stage-labels) and [group label](../contributing/issue_workflow.md#group-labels).
+- A [type label](../labels/index.md#type-labels), either `~"type::feature"` or `~"type::maintenance"`.
+- A [stage label](../labels/index.md#stage-labels) and [group label](../labels/index.md#group-labels).
For example, `~devops::create` and `~group::source code`.
-- A `~documentation` [specialization label](../contributing/issue_workflow.md#specialization-labels).
+- A `~documentation` [specialization label](../labels/index.md#specialization-labels).
A member of the Technical Writing team adds these labels:
- A [documentation scoped label](../../user/project/labels.md#scoped-labels) with the
`docs::` prefix. For example, `~docs::improvement`.
-- The [`~Technical Writing` team label](../contributing/issue_workflow.md#team-labels).
+- The [`~Technical Writing` team label](../labels/index.md#team-labels).
## Reviewing and merging
diff --git a/doc/development/labels/index.md b/doc/development/labels/index.md
new file mode 100644
index 00000000000..703a0f3fb95
--- /dev/null
+++ b/doc/development/labels/index.md
@@ -0,0 +1,325 @@
+---
+stage: none
+group: Development
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
+---
+
+# Labels
+
+To allow for asynchronous issue handling, we use [milestones](https://gitlab.com/groups/gitlab-org/-/milestones)
+and [labels](https://gitlab.com/gitlab-org/gitlab/-/labels). Leads and product managers handle most of the
+scheduling into milestones. Labeling is a task for everyone. (For some projects, labels can be set only by GitLab team members and not by community contributors).
+
+Most issues will have labels for at least one of the following:
+
+- Type. For example: `~"type::feature"`, `~"type::bug"`, or `~"type::maintenance"`.
+- Stage. For example: `~"devops::plan"` or `~"devops::create"`.
+- Group. For example: `~"group::source code"`, `~"group::knowledge"`, or `~"group::editor"`.
+- Category. For example: `~"Category:Code Analytics"`, `~"Category:DevOps Reports"`, or `~"Category:Templates"`.
+- Feature. For example: `~wiki`, `~ldap`, `~api`, `~issues`, or `~"merge requests"`.
+- Department: `~UX`, `~Quality`
+- Team: `~"Technical Writing"`, `~Delivery`
+- Specialization: `~frontend`, `~backend`, `~documentation`
+- Release Scoping: `~Deliverable`, `~Stretch`, `~"Next Patch Release"`
+- Priority: `~"priority::1"`, `~"priority::2"`, `~"priority::3"`, `~"priority::4"`
+- Severity: `~"severity::1"`, `~"severity::2"`, `~"severity::3"`, `~"severity::4"`
+
+Please add `~"breaking change"` label if the issue can be considered as a [breaking change](../deprecation_guidelines/index.md).
+
+Please add `~security` label if the issue is related to application security.
+
+All labels, their meaning and priority are defined on the
+[labels page](https://gitlab.com/gitlab-org/gitlab/-/labels).
+
+If you come across an issue that has none of these, and you're allowed to set
+labels, you can _always_ add the type, stage, group, and often the category/feature labels.
+
+## Type labels
+
+Type labels are very important. They define what kind of issue this is. Every
+issue should have one and only one.
+
+The SSOT for type and subtype labels is [available in the handbook](https://about.gitlab.com/handbook/engineering/metrics/#work-type-classification).
+
+A number of type labels have a priority assigned to them, which automatically
+makes them float to the top, depending on their importance.
+
+Type labels are always lowercase, and can have any color, besides blue (which is
+already reserved for category labels).
+
+The descriptions on the [labels page](https://gitlab.com/groups/gitlab-org/-/labels)
+explain what falls under each type label.
+
+The GitLab handbook documents [when something is a bug](https://about.gitlab.com/handbook/product/product-processes/#bug-issues) and [when it is a feature request](https://about.gitlab.com/handbook/product/product-processes/#feature-issues).
+
+## Stage labels
+
+Stage labels specify which [stage](https://about.gitlab.com/handbook/product/categories/#hierarchy) the issue belongs to.
+
+### Naming and color convention
+
+Stage labels respects the `devops::<stage_key>` naming convention.
+`<stage_key>` is the stage key as it is in the single source of truth for stages at
+<https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/data/stages.yml>
+with `_` replaced with a space.
+
+For instance, the "Manage" stage is represented by the `~"devops::manage"` label in
+the `gitlab-org` group since its key under `stages` is `manage`.
+
+The current stage labels can be found by [searching the labels list for `devops::`](https://gitlab.com/groups/gitlab-org/-/labels?search=devops::).
+
+These labels are [scoped labels](../../user/project/labels.md#scoped-labels)
+and thus are mutually exclusive.
+
+The Stage labels are used to generate the [direction pages](https://about.gitlab.com/direction/) automatically.
+
+## Group labels
+
+Group labels specify which [groups](https://about.gitlab.com/company/team/structure/#product-groups) the issue belongs to.
+
+It's highly recommended to add a group label, as it's used by our triage
+automation to
+[infer the correct stage label](https://about.gitlab.com/handbook/engineering/quality/triage-operations/#auto-labelling-of-issues-and-merge-requests).
+
+### Naming and color convention
+
+Group labels respects the `group::<group_key>` naming convention and
+their color is `#A8D695`.
+`<group_key>` is the group key as it is in the single source of truth for groups at
+<https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/data/stages.yml>,
+with `_` replaced with a space.
+
+For instance, the "Pipeline Execution" group is represented by the
+`~"group::pipeline execution"` label in the `gitlab-org` group since its key
+under `stages.manage.groups` is `pipeline_execution`.
+
+The current group labels can be found by [searching the labels list for `group::`](https://gitlab.com/groups/gitlab-org/-/labels?search=group::).
+
+These labels are [scoped labels](../../user/project/labels.md#scoped-labels)
+and thus are mutually exclusive.
+
+You can find the groups listed in the [Product Stages, Groups, and Categories](https://about.gitlab.com/handbook/product/categories/) page.
+
+We use the term group to map down product requirements from our product stages.
+As a team needs some way to collect the work their members are planning to be assigned to, we use the `~group::` labels to do so.
+
+## Category labels
+
+From the handbook's
+[Product stages, groups, and categories](https://about.gitlab.com/handbook/product/categories/#hierarchy)
+page:
+
+> Categories are high-level capabilities that may be a standalone product at
+another company, such as Portfolio Management, for example.
+
+It's highly recommended to add a category label, as it's used by our triage
+automation to
+[infer the correct group and stage labels](https://about.gitlab.com/handbook/engineering/quality/triage-operations/#auto-labelling-of-issues).
+
+If you are an expert in a particular area, it makes it easier to find issues to
+work on. You can also subscribe to those labels to receive an email each time an
+issue is labeled with a category label corresponding to your expertise.
+
+### Naming and color convention
+
+Category labels respects the `Category:<Category Name>` naming convention and
+their color is `#428BCA`.
+`<Category Name>` is the category name as it is in the single source of truth for categories at
+<https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/data/categories.yml>.
+
+For instance, the "DevOps Reports" category is represented by the
+`~"Category:DevOps Reports"` label in the `gitlab-org` group since its
+`devops_reports.name` value is "DevOps Reports".
+
+If a category's label doesn't respect this naming convention, it should be specified
+with [the `label` attribute](https://about.gitlab.com/handbook/marketing/digital-experience/website/#category-attributes)
+in <https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/data/categories.yml>.
+
+## Feature labels
+
+From the handbook's
+[Product stages, groups, and categories](https://about.gitlab.com/handbook/product/categories/#hierarchy)
+page:
+
+> Features: Small, discrete functionalities, for example Issue weights. Some common
+features are listed within parentheses to facilitate finding responsible PMs by keyword.
+
+It's highly recommended to add a feature label if no category label applies, as
+it's used by our triage automation to
+[infer the correct group and stage labels](https://about.gitlab.com/handbook/engineering/quality/triage-operations/#auto-labelling-of-issues).
+
+If you are an expert in a particular area, it makes it easier to find issues to
+work on. You can also subscribe to those labels to receive an email each time an
+issue is labeled with a feature label corresponding to your expertise.
+
+Examples of feature labels are `~wiki`, `~ldap`, `~api`, `~issues`, and `~"merge requests"`.
+
+### Naming and color convention
+
+Feature labels are all-lowercase.
+
+## Facet labels
+
+To track additional information or context about created issues, developers may
+add _facet labels_. Facet labels are also sometimes used for issue prioritization
+or for measurements (such as time to close). An example of a facet label is the
+`~"customer"` label, which indicates customer interest.
+
+## Department labels
+
+The current department labels are:
+
+- `~"UX"`
+- `~"Quality"`
+
+## Team labels
+
+**Important**: Most of the historical team labels (like Manage or Plan) are
+now deprecated in favor of [Group labels](#group-labels) and [Stage labels](#stage-labels).
+
+Team labels specify what team is responsible for this issue.
+Assigning a team label makes sure issues get the attention of the appropriate
+people.
+
+The current team labels are:
+
+- `~"Delivery"~`
+- `~"Technical Writing"`
+
+### Naming and color convention
+
+Team labels are always capitalized so that they show up as the first label for
+any issue.
+
+## Specialization labels
+
+These labels narrow the [specialization](https://about.gitlab.com/company/team/structure/#specialist) on a unit of work.
+
+- `~"frontend"`
+- `~"backend"`
+- `~"documentation"`
+
+## Release scoping labels
+
+Release Scoping labels help us clearly communicate expectations of the work for the
+release. There are three levels of Release Scoping labels:
+
+- `~"Deliverable"`: Issues that are expected to be delivered in the current
+ milestone.
+- `~"Stretch"`: Issues that are a stretch goal for delivering in the current
+ milestone. If these issues are not done in the current release, they will
+ strongly be considered for the next release.
+- `~"Next Patch Release"`: Issues to put in the next patch release. Work on these
+ first, and add the `~"Pick into X.Y"` label to the merge request, along with the
+ appropriate milestone.
+
+Each issue scheduled for the current milestone should be labeled `~"Deliverable"~`
+or `~"Stretch"`. Any open issue for a previous milestone should be labeled
+`~"Next Patch Release"`, or otherwise rescheduled to a different milestone.
+
+## Priority labels
+
+We have the following priority labels:
+
+- `~"priority::1"`
+- `~"priority::2"`
+- `~"priority::3"`
+- `~"priority::4"`
+
+Please refer to the issue triage [priority label](https://about.gitlab.com/handbook/engineering/quality/issue-triage/#priority) section in our handbook to see how it's used.
+
+## Severity labels
+
+We have the following severity labels:
+
+- `~"severity::1"`
+- `~"severity::2"`
+- `~"severity::3"`
+- `~"severity::4"`
+
+Please refer to the issue triage [severity label](https://about.gitlab.com/handbook/engineering/quality/issue-triage/#severity) section in our handbook to see how it's used.
+
+## Label for community contributors
+
+There are many issues that have a clear solution with uncontroversial benefit to GitLab users.
+However, GitLab might not have the capacity for all these proposals in the current roadmap.
+These issues are labeled `~"Seeking community contributions"` because we welcome merge requests to resolve them.
+
+Community contributors can submit merge requests for any issue they want, but
+the `~"Seeking community contributions"` label has a special meaning. It points to
+changes that:
+
+1. We already agreed on,
+1. Are well-defined,
+1. Are likely to get accepted by a maintainer.
+
+We want to avoid a situation when a contributor picks an
+~"Seeking community contributions" issue and then their merge request gets closed,
+because we realize that it does not fit our vision, or we want to solve it in a
+different way.
+
+We manually add the `~"Seeking community contributions"` label to issues
+that fit the criteria described above.
+We do not automatically add this label, because it requires human evaluation.
+
+We recommend people that have never contributed to any open source project to
+look for issues labeled `~"Seeking community contributions"` with a
+[weight of 1](https://gitlab.com/groups/gitlab-org/-/issues?sort=created_date&state=opened&label_name[]=Seeking+community+contributions&assignee_id=None&weight=1) or the `~"good for new contributors"`
+[label](https://gitlab.com/gitlab-org/gitlab/-/issues?scope=all&state=opened&label_name[]=good%20for%20new%20contributors&assignee_id=None)
+attached to it.
+More experienced contributors are very welcome to tackle
+[any of them](https://gitlab.com/groups/gitlab-org/-/issues?sort=created_date&state=opened&label_name[]=Seeking+community+contributions&assignee_id=None).
+
+For more complex features that have a weight of 2 or more and clear scope, we recommend looking at issues
+with the [label `~"Community Challenge"`](https://gitlab.com/gitlab-org/gitlab/-/issues?sort=created_date&state=opened&label_name[]=Seeking+community+contributions&label_name[]=Community+challenge).
+If your MR for the `~"Community Challenge"` issue gets merged, you will also have a chance to win a custom
+GitLab merchandise.
+
+If you've decided that you would like to work on an issue, please @-mention
+the [appropriate product manager](https://about.gitlab.com/handbook/product/#who-to-talk-to-for-what)
+as soon as possible. The product manager will then pull in appropriate GitLab team
+members to further discuss scope, design, and technical considerations. This will
+ensure that your contribution is aligned with the GitLab product and minimize
+any rework and delay in getting it merged into main.
+
+GitLab team members who apply the `~"Seeking community contributions"` label to an issue
+should update the issue description with a responsible product manager, inviting
+any potential community contributor to @-mention per above.
+
+## Stewardship label
+
+For issues related to the open source stewardship of GitLab,
+there is the `~"stewardship"` label.
+
+This label is to be used for issues in which the stewardship of GitLab
+is a topic of discussion. For instance if GitLab Inc. is planning to add
+features from GitLab EE to GitLab CE, related issues would be labeled with
+`~"stewardship"`.
+
+A recent example of this was the issue for
+[bringing the time tracking API to GitLab CE](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/25517#note_20019084).
+
+## Technical and UX debt
+
+In order to track things that can be improved in the GitLab codebase,
+we use the `~"technical debt"` label in the [GitLab issue tracker](https://gitlab.com/gitlab-org/gitlab/-/issues).
+We use the `~"UX debt"` label when we choose to deviate from the MVC, in a way that harms the user experience.
+
+These labels should be added to issues that describe things that can be improved,
+shortcuts that have been taken, features that need additional attention, and all
+other things that have been left behind due to high velocity of development.
+For example, code that needs refactoring should use the `~"technical debt"` label,
+something that didn't ship according to our Design System guidelines should
+use the `~"UX debt"` label.
+
+Everyone can create an issue, though you may need to ask for adding a specific
+label, if you do not have permissions to do it by yourself. Additional labels
+can be combined with these labels, to make it easier to schedule
+the improvements for a release.
+
+Issues tagged with these labels have the same priority like issues
+that describe a new feature to be introduced in GitLab, and should be scheduled
+for a release by the appropriate person.
+
+Make sure to mention the merge request that the `~"technical debt"` issue or
+`~"UX debt"` issue is associated with in the description of the issue.
diff --git a/doc/operations/feature_flags.md b/doc/operations/feature_flags.md
index 797e5df6a8c..8c7033f318d 100644
--- a/doc/operations/feature_flags.md
+++ b/doc/operations/feature_flags.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/policy/maintenance.md b/doc/policy/maintenance.md
index fcb6e5c1b20..eed9f006bfa 100644
--- a/doc/policy/maintenance.md
+++ b/doc/policy/maintenance.md
@@ -110,9 +110,9 @@ The decision on whether backporting a change is performed is done at the discret
[current release managers](https://about.gitlab.com/community/release-managers/),
based on *all* of the following:
-1. Estimated [severity](../development/contributing/issue_workflow.md#severity-labels) of the bug:
+1. Estimated [severity](../development/labels/index.md#severity-labels) of the bug:
Highest possible impact to users based on the current definition of severity.
-1. Estimated [priority](../development/contributing/issue_workflow.md#priority-labels) of the bug:
+1. Estimated [priority](../development/labels/index.md#priority-labels) of the bug:
Immediate impact on all impacted users based on the above estimated severity.
1. Potentially incurring data loss and/or security breach.
1. Potentially affecting one or more strategic accounts due to a proven inability by the user to upgrade to the current stable version.
@@ -122,7 +122,7 @@ the current stable release, and two previous monthly releases. In rare cases a r
For instance, if we release `13.2.1` with a fix for a severe bug introduced in
`13.0.0`, we could backport the fix to a new `13.0.x`, and `13.1.x` patch release.
-Note that [severity](../development/contributing/issue_workflow.md#severity-labels) 3 and lower
+Note that [severity](../development/labels/index.md#severity-labels) 3 and lower
requests are automatically turned down.
To request backporting to more than one stable release for consideration, raise an issue in the
diff --git a/doc/update/deprecations.md b/doc/update/deprecations.md
index 5015626737d..f1ab77e3071 100644
--- a/doc/update/deprecations.md
+++ b/doc/update/deprecations.md
@@ -64,6 +64,20 @@ The `omniauth-dingtalk` gem that provides GitLab with the DingTalk OmniAuth prov
major release, GitLab 17.0. This gem sees very little use and is better suited for JiHu edition.
</div>
+
+<div class="deprecation removal-160 breaking-change">
+
+### Environment search query requires at least three characters
+
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
+
+WARNING:
+This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+Review the details carefully before upgrading.
+
+From GitLab 16.0, when you search for environments with the API, you must use at least three characters. This change helps us ensure the scalability of the search operation.
+
+</div>
</div>
<div class="announcement-milestone">
diff --git a/doc/user/analytics/ci_cd_analytics.md b/doc/user/analytics/ci_cd_analytics.md
index ef2d3a76990..4130ff6e036 100644
--- a/doc/user/analytics/ci_cd_analytics.md
+++ b/doc/user/analytics/ci_cd_analytics.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/user/application_security/api_fuzzing/index.md b/doc/user/application_security/api_fuzzing/index.md
index e6fb994d9b7..e52d1755956 100644
--- a/doc/user/application_security/api_fuzzing/index.md
+++ b/doc/user/application_security/api_fuzzing/index.md
@@ -2702,7 +2702,7 @@ You can expedite the investigation with the [testssl.sh tool](https://testssl.sh
To get support for your particular problem use the [getting help channels](https://about.gitlab.com/get-help/).
The [GitLab issue tracker on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues) is the right place for bugs and feature proposals about API Security and API Fuzzing.
-Use `~"Category:API Security"` [label](../../../development/contributing/issue_workflow.md#labels) when opening a new issue regarding API fuzzing to ensure it is quickly reviewed by the right people. Refer to our [review response SLO](https://about.gitlab.com/handbook/engineering/workflow/code-review/#review-response-slo) to understand when you should receive a response.
+Use `~"Category:API Security"` [label](../../../development/labels/index.md) when opening a new issue regarding API fuzzing to ensure it is quickly reviewed by the right people. Refer to our [review response SLO](https://about.gitlab.com/handbook/engineering/workflow/code-review/#review-response-slo) to understand when you should receive a response.
[Search the issue tracker](https://gitlab.com/gitlab-org/gitlab/-/issues) for similar entries before submitting your own, there's a good chance somebody else had the same issue or feature proposal. Show your support with an award emoji and or join the discussion.
diff --git a/doc/user/application_security/api_security/api_discovery/index.md b/doc/user/application_security/api_security/api_discovery/index.md
index e916bf879cf..6e475311663 100644
--- a/doc/user/application_security/api_security/api_discovery/index.md
+++ b/doc/user/application_security/api_security/api_discovery/index.md
@@ -154,7 +154,7 @@ TODO
To get support for your particular problem, use the [getting help channels](https://about.gitlab.com/get-help/).
The [GitLab issue tracker on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues) is the right place for bugs and feature proposals about API Discovery.
-Use `~"Category:API Security"` [label](../../../../development/contributing/issue_workflow.md#labels) when opening a new issue regarding API Discovery to ensure it is quickly reviewed by the right people. Refer to our [review response SLO](https://about.gitlab.com/handbook/engineering/workflow/code-review/#review-response-slo) to understand when you should receive a response.
+Use `~"Category:API Security"` [label](../../../../development/labels/index.md) when opening a new issue regarding API Discovery to ensure it is quickly reviewed by the right people. Refer to our [review response SLO](https://about.gitlab.com/handbook/engineering/workflow/code-review/#review-response-slo) to understand when you should receive a response.
[Search the issue tracker](https://gitlab.com/gitlab-org/gitlab/-/issues) for similar entries before submitting your own, there's a good chance somebody else had the same issue or feature proposal. Show your support with an award emoji and or join the discussion.
diff --git a/doc/user/application_security/dast_api/index.md b/doc/user/application_security/dast_api/index.md
index c663beab2e5..ff2a5b3a069 100644
--- a/doc/user/application_security/dast_api/index.md
+++ b/doc/user/application_security/dast_api/index.md
@@ -2558,7 +2558,7 @@ You can expedite the investigation with the [testssl.sh tool](https://testssl.sh
To get support for your particular problem, use the [getting help channels](https://about.gitlab.com/get-help/).
The [GitLab issue tracker on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues) is the right place for bugs and feature proposals about API Security and DAST API.
-Use `~"Category:API Security"` [label](../../../development/contributing/issue_workflow.md#labels) when opening a new issue regarding DAST API to ensure it is quickly reviewed by the right people. Refer to our [review response SLO](https://about.gitlab.com/handbook/engineering/workflow/code-review/#review-response-slo) to understand when you should receive a response.
+Use `~"Category:API Security"` [label](../../../development/labels/index.md) when opening a new issue regarding DAST API to ensure it is quickly reviewed by the right people. Refer to our [review response SLO](https://about.gitlab.com/handbook/engineering/workflow/code-review/#review-response-slo) to understand when you should receive a response.
[Search the issue tracker](https://gitlab.com/gitlab-org/gitlab/-/issues) for similar entries before submitting your own, there's a good chance somebody else had the same issue or feature proposal. Show your support with an award emoji and or join the discussion.
diff --git a/doc/user/operations_dashboard/index.md b/doc/user/operations_dashboard/index.md
index 2911a700e14..493771fa30a 100644
--- a/doc/user/operations_dashboard/index.md
+++ b/doc/user/operations_dashboard/index.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/user/project/deploy_boards.md b/doc/user/project/deploy_boards.md
index a68f9550ebf..b331dc1a2d8 100644
--- a/doc/user/project/deploy_boards.md
+++ b/doc/user/project/deploy_boards.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
type: howto, reference
---
diff --git a/doc/user/project/deploy_keys/index.md b/doc/user/project/deploy_keys/index.md
index fc88535dc77..16a492eead1 100644
--- a/doc/user/project/deploy_keys/index.md
+++ b/doc/user/project/deploy_keys/index.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/user/project/deploy_tokens/index.md b/doc/user/project/deploy_tokens/index.md
index cfb382d73e2..23cfa7cc500 100644
--- a/doc/user/project/deploy_tokens/index.md
+++ b/doc/user/project/deploy_tokens/index.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/user/project/releases/index.md b/doc/user/project/releases/index.md
index 7de32dccea5..be2c923adcc 100644
--- a/doc/user/project/releases/index.md
+++ b/doc/user/project/releases/index.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/user/project/releases/release_cicd_examples.md b/doc/user/project/releases/release_cicd_examples.md
index 1ec82d6702e..36e36412cf1 100644
--- a/doc/user/project/releases/release_cicd_examples.md
+++ b/doc/user/project/releases/release_cicd_examples.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/user/project/releases/release_cli.md b/doc/user/project/releases/release_cli.md
index 5af19c7cced..953e1d4b082 100644
--- a/doc/user/project/releases/release_cli.md
+++ b/doc/user/project/releases/release_cli.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/user/project/releases/release_fields.md b/doc/user/project/releases/release_fields.md
index 120bbe32a63..93822be89b6 100644
--- a/doc/user/project/releases/release_fields.md
+++ b/doc/user/project/releases/release_fields.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/doc/user/shortcuts.md b/doc/user/shortcuts.md
index dde4abc7a3c..9c2925ec647 100644
--- a/doc/user/shortcuts.md
+++ b/doc/user/shortcuts.md
@@ -39,9 +39,9 @@ These shortcuts are available in most areas of GitLab:
| <kbd>Shift</kbd> + <kbd>m</kbd> | Go to your [Merge requests](project/merge_requests/index.md) page. |
| <kbd>Shift</kbd> + <kbd>r</kbd> | Go to your Review requests page. |
| <kbd>Shift</kbd> + <kbd>t</kbd> | Go to your To-Do List page. |
-| <kbd>p</kbd>, then <kbd>b</kbd> | Show or hide the Performance Bar. |
+| <kbd>p</kbd>, then <kbd>b</kbd> | Show or hide the Performance Bar. |
| <kbd>Escape</kbd> | Hide tooltips or popovers. |
-| <kbd>g</kbd>, then <kbd>x</kbd> | Toggle between [GitLab](https://gitlab.com/) and [GitLab Next](https://next.gitlab.com/) (GitLab SaaS only). |
+| <kbd>g</kbd>, then <kbd>x</kbd> | Toggle between [GitLab](https://gitlab.com/) and [GitLab Next](https://next.gitlab.com/) (GitLab SaaS only). |
| <kbd>.</kbd> | Open the [Web IDE](project/web_ide/index.md). |
Additionally, the following shortcuts are available when editing text in text
@@ -55,10 +55,9 @@ descriptions):
| <kbd>Command</kbd> + <kbd>b</kbd> | <kbd>Control</kbd> + <kbd>b</kbd> | Bold the selected text (surround it with `**`). |
| <kbd>Command</kbd> + <kbd>i</kbd> | <kbd>Control</kbd> + <kbd>i</kbd> | Italicize the selected text (surround it with `_`). |
| <kbd>Command</kbd> + <kbd>Shift</kbd> + <kbd>x</kbd> | <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>x</kbd> | Strike through the selected text (surround it with `~~`). |
-| <kbd>Command</kbd> + <kbd>k</kbd> | <kbd>Control</kbd> + <kbd>k</kbd> | Add a link (surround the selected text with `[]()`). |
-| <kbd>Command</kbd> + <kbd>&#93;</kbd> | <kbd>Control</kbd> + <kbd>&#93;</kbd> | Indent list item. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/351924) in GitLab 15.3. |
-| <kbd>Command</kbd> + <kbd>&#91;</kbd> | <kbd>Control</kbd> + <kbd>&#91;</kbd> | Outdent list item. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/351924) in GitLab 15.3. |
-| <kbd>Shift</kbd> + <kbd>Enter</kbd> | <kbd>Shift</kbd> + <kbd>Enter</kbd> | Add a [line break](markdown.md#newlines). [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/21916) in GitLab 15.10. |
+| <kbd>Command</kbd> + <kbd>k</kbd> | <kbd>Control</kbd> + <kbd>k</kbd> | Add a link (surround the selected text with `[]()`). |
+| <kbd>Command</kbd> + <kbd>&#93;</kbd> | <kbd>Control</kbd> + <kbd>&#93;</kbd> | Indent list item. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/351924) in GitLab 15.3. |
+| <kbd>Command</kbd> + <kbd>&#91;</kbd> | <kbd>Control</kbd> + <kbd>&#91;</kbd> | Outdent list item. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/351924) in GitLab 15.3. |
The shortcuts for editing in text fields are always enabled, even if other
keyboard shortcuts are disabled.
@@ -113,7 +112,7 @@ These shortcuts are available when viewing [merge requests](project/merge_reques
| macOS shortcut | Windows shortcut | Description |
|-----------------------------------|---------------------|-------------|
| <kbd>]</kbd> or <kbd>j</kbd> | | Move to next file. |
-| <kbd>&#91;</kbd> or <kbd>k</kbd> | | Move to previous file. |
+| <kbd>&#91;</kbd> or <kbd>k</kbd> | | Move to previous file. |
| <kbd>Command</kbd> + <kbd>p</kbd> | <kbd>Control</kbd> + <kbd>p</kbd> | Search for, and then jump to a file for review. |
| <kbd>n</kbd> | | Move to next unresolved discussion. |
| <kbd>p</kbd> | | Move to previous unresolved discussion. |
@@ -278,7 +277,7 @@ These shortcuts are available when editing a file with the
| <kbd>Command</kbd> + <kbd>Shift</kbd> + <kbd>h</kbd> | <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>h</kbd> | Highlight |
| <kbd>Command</kbd> + <kbd>,</kbd> | <kbd>Control</kbd> + <kbd>,</kbd> | Subscript |
| <kbd>Command</kbd> + <kbd>.</kbd> | <kbd>Control</kbd> + <kbd>.</kbd> | Superscript |
-| <kbd>Tab</kbd> | <kbd>Tab</kbd> | Indent list |
+| <kbd>Tab</kbd> | <kbd>Tab</kbd> | Indent list |
| <kbd>Shift</kbd> + <kbd>Tab</kbd> | <kbd>Shift</kbd> + <kbd>Tab</kbd> | Outdent list |
#### Text selection
diff --git a/lib/gitlab/metrics/subscribers/rack_attack.rb b/lib/gitlab/metrics/subscribers/rack_attack.rb
index e6cf14a6c8c..2196122df01 100644
--- a/lib/gitlab/metrics/subscribers/rack_attack.rb
+++ b/lib/gitlab/metrics/subscribers/rack_attack.rb
@@ -22,11 +22,6 @@ module Gitlab
}
end
- def redis(event)
- self.class.payload[:rack_attack_redis_count] += 1
- self.class.payload[:rack_attack_redis_duration_s] += event.duration.to_f / 1000
- end
-
def safelist(event)
req = event.payload[:request]
Gitlab::Instrumentation::Throttle.safelist = req.env['rack.attack.matched']
diff --git a/lib/gitlab/rack_attack.rb b/lib/gitlab/rack_attack.rb
index b647965bb22..d999b706d6c 100644
--- a/lib/gitlab/rack_attack.rb
+++ b/lib/gitlab/rack_attack.rb
@@ -19,7 +19,7 @@ module Gitlab
[429, { 'Content-Type' => 'text/plain' }.merge(throttled_headers), [Gitlab::Throttle.rate_limiting_response_text]]
end
- rack_attack.cache.store = cache_store
+ rack_attack.cache.store = Gitlab::RackAttack::Store.new
# Configure the throttles
configure_throttles(rack_attack)
@@ -27,14 +27,6 @@ module Gitlab
configure_user_allowlist
end
- def self.cache_store
- if ENV['GITLAB_RACK_ATTACK_NEW_STORE'] == '1'
- Gitlab::RackAttack::Store.new
- else
- Gitlab::RackAttack::InstrumentedCacheStore.new
- end
- end
-
# Rate Limit HTTP headers are not standardized anywhere. This is the latest
# draft submitted to IETF:
# https://github.com/ietf-wg-httpapi/ratelimit-headers/blob/main/draft-ietf-httpapi-ratelimit-headers.md
diff --git a/lib/gitlab/rack_attack/instrumented_cache_store.rb b/lib/gitlab/rack_attack/instrumented_cache_store.rb
deleted file mode 100644
index d8beb259fba..00000000000
--- a/lib/gitlab/rack_attack/instrumented_cache_store.rb
+++ /dev/null
@@ -1,33 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module RackAttack
- # This class is a proxy for all Redis calls made by RackAttack. All
- # the calls are instrumented, then redirected to the underlying
- # store (in `.store). This class instruments the standard interfaces
- # of ActiveRecord::Cache defined in
- # https://github.com/rails/rails/blob/v6.0.3.1/activesupport/lib/active_support/cache.rb#L315
- #
- # For more information, please see
- # https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/751
- class InstrumentedCacheStore
- NOTIFICATION_CHANNEL = 'redis.rack_attack'
-
- delegate :silence!, :mute, to: :@upstream_store
-
- def initialize(upstream_store: ::Gitlab::Redis::RateLimiting.cache_store, notifier: ActiveSupport::Notifications)
- @upstream_store = upstream_store
- @notifier = notifier
- end
-
- [:fetch, :read, :read_multi, :write_multi, :fetch_multi, :write, :delete,
- :exist?, :delete_matched, :increment, :decrement, :cleanup, :clear].each do |interface|
- define_method interface do |*args, **k_args, &block|
- @notifier.instrument(NOTIFICATION_CHANNEL, operation: interface) do
- @upstream_store.public_send(interface, *args, **k_args, &block) # rubocop:disable GitlabSecurity/PublicSend
- end
- end
- end
- end
- end
-end
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index bb750079eca..f3f173928e9 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -7173,6 +7173,12 @@ msgstr ""
msgid "BranchRules|Allowed to push and merge (%{total})"
msgstr ""
+msgid "BranchRules|Also accepts code pushes that change files listed in CODEOWNERS file."
+msgstr ""
+
+msgid "BranchRules|Also rejects code pushes that change files listed in CODEOWNERS file."
+msgstr ""
+
msgid "BranchRules|An error occurred while fetching branches."
msgstr ""
@@ -7203,6 +7209,9 @@ msgstr ""
msgid "BranchRules|Details"
msgstr ""
+msgid "BranchRules|Does not require approval from code owners"
+msgstr ""
+
msgid "BranchRules|Force push"
msgstr ""
@@ -7248,6 +7257,9 @@ msgstr ""
msgid "BranchRules|Requires CODEOWNERS approval"
msgstr ""
+msgid "BranchRules|Requires approval from code owners"
+msgstr ""
+
msgid "BranchRules|Roles"
msgstr ""
@@ -35585,6 +35597,9 @@ msgstr ""
msgid "Register a one-time password authenticator"
msgstr ""
+msgid "Register a one-time password authenticator or a WebAuthn device first."
+msgstr ""
+
msgid "Register a universal two-factor (U2F) device"
msgstr ""
@@ -46641,6 +46656,9 @@ msgstr ""
msgid "Use the search bar on the top of this page"
msgstr ""
+msgid "Use this section to disable your one-time password authenticator and WebAuthn devices. You can also generate new recovery codes."
+msgstr ""
+
msgid "Use this token to validate received payloads."
msgstr ""
diff --git a/spec/frontend/artifacts/components/artifact_row_spec.js b/spec/frontend/artifacts/components/artifact_row_spec.js
index 2a7156bf480..b9d75e2a9b2 100644
--- a/spec/frontend/artifacts/components/artifact_row_spec.js
+++ b/spec/frontend/artifacts/components/artifact_row_spec.js
@@ -28,10 +28,6 @@ describe('ArtifactRow component', () => {
});
};
- afterEach(() => {
- wrapper.destroy();
- });
-
describe('artifact details', () => {
beforeEach(async () => {
createComponent();
diff --git a/spec/frontend/artifacts/components/artifacts_table_row_details_spec.js b/spec/frontend/artifacts/components/artifacts_table_row_details_spec.js
index d006e0285d2..87bf1be51c6 100644
--- a/spec/frontend/artifacts/components/artifacts_table_row_details_spec.js
+++ b/spec/frontend/artifacts/components/artifacts_table_row_details_spec.js
@@ -47,10 +47,6 @@ describe('ArtifactsTableRowDetails component', () => {
});
};
- afterEach(() => {
- wrapper.destroy();
- });
-
describe('passes correct props', () => {
beforeEach(() => {
createComponent();
diff --git a/spec/frontend/artifacts/components/feedback_banner_spec.js b/spec/frontend/artifacts/components/feedback_banner_spec.js
index 3421486020a..af9599daefa 100644
--- a/spec/frontend/artifacts/components/feedback_banner_spec.js
+++ b/spec/frontend/artifacts/components/feedback_banner_spec.js
@@ -32,10 +32,6 @@ describe('Artifacts management feedback banner', () => {
});
};
- afterEach(() => {
- wrapper.destroy();
- });
-
it('is displayed with the correct props', () => {
createComponent();
diff --git a/spec/frontend/artifacts/components/job_artifacts_table_spec.js b/spec/frontend/artifacts/components/job_artifacts_table_spec.js
index dbe4598f599..9919ea5ad2a 100644
--- a/spec/frontend/artifacts/components/job_artifacts_table_spec.js
+++ b/spec/frontend/artifacts/components/job_artifacts_table_spec.js
@@ -12,7 +12,12 @@ import createMockApollo from 'helpers/mock_apollo_helper';
import { mountExtended } from 'helpers/vue_test_utils_helper';
import getJobArtifactsQuery from '~/artifacts/graphql/queries/get_job_artifacts.query.graphql';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
-import { ARCHIVE_FILE_TYPE, JOBS_PER_PAGE, I18N_FETCH_ERROR } from '~/artifacts/constants';
+import {
+ ARCHIVE_FILE_TYPE,
+ JOBS_PER_PAGE,
+ I18N_FETCH_ERROR,
+ INITIAL_CURRENT_PAGE,
+} from '~/artifacts/constants';
import { totalArtifactsSizeForJob } from '~/artifacts/utils';
import { createAlert } from '~/flash';
@@ -100,10 +105,6 @@ describe('JobArtifactsTable component', () => {
});
};
- afterEach(() => {
- wrapper.destroy();
- });
-
it('renders feedback banner', () => {
createComponent();
@@ -316,11 +317,12 @@ describe('JobArtifactsTable component', () => {
describe('pagination', () => {
const { pageInfo } = getJobArtifactsResponse.data.project.jobs;
+ const query = jest.fn().mockResolvedValue(getJobArtifactsResponseThatPaginates);
beforeEach(async () => {
createComponent(
{
- getJobArtifactsQuery: jest.fn().mockResolvedValue(getJobArtifactsResponseThatPaginates),
+ getJobArtifactsQuery: query,
},
{
count: enoughJobsToPaginate.length,
@@ -332,32 +334,44 @@ describe('JobArtifactsTable component', () => {
});
it('renders pagination and passes page props', () => {
- expect(findPagination().exists()).toBe(true);
expect(findPagination().props()).toMatchObject({
- value: wrapper.vm.pagination.currentPage,
- prevPage: wrapper.vm.prevPage,
- nextPage: wrapper.vm.nextPage,
+ value: INITIAL_CURRENT_PAGE,
+ prevPage: Number(pageInfo.hasPreviousPage),
+ nextPage: Number(pageInfo.hasNextPage),
+ });
+
+ expect(query).toHaveBeenCalledWith({
+ projectPath: 'project/path',
+ firstPageSize: JOBS_PER_PAGE,
+ lastPageSize: null,
+ nextPageCursor: '',
+ prevPageCursor: '',
});
});
- it('updates query variables when going to previous page', () => {
- return setPage(1).then(() => {
- expect(wrapper.vm.queryVariables).toMatchObject({
- projectPath: 'project/path',
- nextPageCursor: undefined,
- prevPageCursor: pageInfo.startCursor,
- });
+ it('updates query variables when going to previous page', async () => {
+ await setPage(1);
+
+ expect(query).toHaveBeenLastCalledWith({
+ projectPath: 'project/path',
+ firstPageSize: null,
+ lastPageSize: JOBS_PER_PAGE,
+ prevPageCursor: pageInfo.startCursor,
});
+ expect(findPagination().props('value')).toEqual(1);
});
- it('updates query variables when going to next page', () => {
- return setPage(2).then(() => {
- expect(wrapper.vm.queryVariables).toMatchObject({
- lastPageSize: null,
- nextPageCursor: pageInfo.endCursor,
- prevPageCursor: '',
- });
+ it('updates query variables when going to next page', async () => {
+ await setPage(2);
+
+ expect(query).toHaveBeenLastCalledWith({
+ projectPath: 'project/path',
+ firstPageSize: JOBS_PER_PAGE,
+ lastPageSize: null,
+ prevPageCursor: '',
+ nextPageCursor: pageInfo.endCursor,
});
+ expect(findPagination().props('value')).toEqual(2);
});
});
});
diff --git a/spec/frontend/lib/utils/text_markdown_spec.js b/spec/frontend/lib/utils/text_markdown_spec.js
index 7ca9715430d..2180ea7e6c2 100644
--- a/spec/frontend/lib/utils/text_markdown_spec.js
+++ b/spec/frontend/lib/utils/text_markdown_spec.js
@@ -10,7 +10,6 @@ import {
} from '~/lib/utils/text_markdown';
import { HTTP_STATUS_OK } from '~/lib/utils/http_status';
import '~/lib/utils/jquery_at_who';
-import { ENTER_KEY } from '~/lib/utils/keys';
import axios from '~/lib/utils/axios_utils';
import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
@@ -209,7 +208,7 @@ describe('init markdown', () => {
let enterEvent;
beforeEach(() => {
- enterEvent = new KeyboardEvent('keydown', { key: ENTER_KEY, cancelable: true });
+ enterEvent = new KeyboardEvent('keydown', { key: 'Enter', cancelable: true });
textArea.addEventListener('keydown', keypressNoteText);
textArea.addEventListener('compositionstart', compositionStartNoteText);
textArea.addEventListener('compositionend', compositionEndNoteText);
@@ -493,53 +492,6 @@ describe('init markdown', () => {
});
});
- describe('adding a hard break using Shift+Enter', () => {
- let enterEvent;
-
- beforeEach(() => {
- enterEvent = new KeyboardEvent('keydown', { key: ENTER_KEY, shiftKey: true });
- textArea.addEventListener('keydown', keypressNoteText);
- textArea.addEventListener('compositionstart', compositionStartNoteText);
- textArea.addEventListener('compositionend', compositionEndNoteText);
- });
-
- it.each`
- selectionStart | selectionEnd | expected | expectedSelectionStart
- ${0} | ${0} | ${'\\\n0123456789'} | ${2}
- ${3} | ${3} | ${'012\\\n3456789'} | ${5}
- ${3} | ${6} | ${'012\\\n6789'} | ${5}
- `(
- 'adds a hard break',
- ({ selectionStart, selectionEnd, expected, expectedSelectionStart }) => {
- const text = '0123456789';
- textArea.value = text;
- textArea.setSelectionRange(selectionStart, selectionEnd);
-
- textArea.dispatchEvent(enterEvent);
-
- expect(textArea.value).toEqual(expected);
- expect(textArea.selectionStart).toEqual(expectedSelectionStart);
- expect(textArea.selectionEnd).toEqual(expectedSelectionStart);
- },
- );
-
- it.each`
- keyEvent
- ${new KeyboardEvent('keydown', { key: ENTER_KEY, shiftKey: false })}
- ${new KeyboardEvent('keydown', { key: ENTER_KEY, shiftKey: true, metaKey: true })}
- ${new KeyboardEvent('keydown', { key: ENTER_KEY, shiftKey: true, altKey: true })}
- ${new KeyboardEvent('keydown', { key: ENTER_KEY, shiftKey: true, ctrlKey: true })}
- `('does not add when shift is pressed with other keys', ({ keyEvent }) => {
- const text = '0123456789';
- textArea.value = text;
- textArea.setSelectionRange(0, 0);
-
- textArea.dispatchEvent(keyEvent);
-
- expect(textArea.value).toEqual(text);
- });
- });
-
describe('with selection', () => {
let text = 'initial selected value';
let selected = 'selected';
diff --git a/spec/frontend/notes/components/discussion_actions_spec.js b/spec/frontend/notes/components/discussion_actions_spec.js
index e414ada1854..0c13173ac87 100644
--- a/spec/frontend/notes/components/discussion_actions_spec.js
+++ b/spec/frontend/notes/components/discussion_actions_spec.js
@@ -47,6 +47,7 @@ describe('DiscussionActions', () => {
it('renders reply placeholder, resolve discussion button, resolve with issue button and jump to next discussion button', () => {
createComponent();
+
expect(wrapper.findComponent(ReplyPlaceholder).exists()).toBe(true);
expect(wrapper.findComponent(ResolveDiscussionButton).exists()).toBe(true);
expect(wrapper.findComponent(ResolveWithIssueButton).exists()).toBe(true);
@@ -94,17 +95,15 @@ describe('DiscussionActions', () => {
it('emits showReplyForm event when clicking on reply placeholder', () => {
createComponent({}, { attachTo: document.body });
- jest.spyOn(wrapper.vm, '$emit');
wrapper.findComponent(ReplyPlaceholder).find('textarea').trigger('focus');
- expect(wrapper.vm.$emit).toHaveBeenCalledWith('showReplyForm');
+ expect(wrapper.emitted().showReplyForm).toHaveLength(1);
});
it('emits resolve event when clicking on resolve button', () => {
createComponent();
- jest.spyOn(wrapper.vm, '$emit');
wrapper.findComponent(ResolveDiscussionButton).find('button').trigger('click');
- expect(wrapper.vm.$emit).toHaveBeenCalledWith('resolve');
+ expect(wrapper.emitted().resolve).toHaveLength(1);
});
});
});
diff --git a/spec/helpers/projects/settings/branch_rules_helper_spec.rb b/spec/helpers/projects/settings/branch_rules_helper_spec.rb
new file mode 100644
index 00000000000..35a21f72f11
--- /dev/null
+++ b/spec/helpers/projects/settings/branch_rules_helper_spec.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::Settings::BranchRulesHelper, feature_category: :source_code_management do
+ let_it_be(:project) { build_stubbed(:project) }
+
+ describe '#branch_rules_data' do
+ subject(:data) { helper.branch_rules_data(project) }
+
+ it 'returns branch rules data' do
+ expect(data).to match({
+ project_path: project.full_path,
+ protected_branches_path: project_settings_repository_path(project, anchor: 'js-protected-branches-settings'),
+ approval_rules_path: project_settings_merge_requests_path(project,
+ anchor: 'js-merge-request-approval-settings'),
+ status_checks_path: project_settings_merge_requests_path(project, anchor: 'js-merge-request-settings'),
+ branches_path: project_branches_path(project),
+ show_status_checks: 'false',
+ show_approvers: 'false',
+ show_code_owners: 'false'
+ })
+ end
+ end
+end
diff --git a/spec/lib/gitlab/metrics/subscribers/rack_attack_spec.rb b/spec/lib/gitlab/metrics/subscribers/rack_attack_spec.rb
index 9f939d0d7d6..13965bf1244 100644
--- a/spec/lib/gitlab/metrics/subscribers/rack_attack_spec.rb
+++ b/spec/lib/gitlab/metrics/subscribers/rack_attack_spec.rb
@@ -32,33 +32,6 @@ RSpec.describe Gitlab::Metrics::Subscribers::RackAttack, :request_store do
end
end
- describe '#redis' do
- it 'accumulates per-request RackAttack cache usage' do
- freeze_time do
- subscriber.redis(
- ActiveSupport::Notifications::Event.new(
- 'redis.rack_attack', Time.current, Time.current + 1.second, '1', { operation: 'fetch' }
- )
- )
- subscriber.redis(
- ActiveSupport::Notifications::Event.new(
- 'redis.rack_attack', Time.current, Time.current + 2.seconds, '1', { operation: 'write' }
- )
- )
- subscriber.redis(
- ActiveSupport::Notifications::Event.new(
- 'redis.rack_attack', Time.current, Time.current + 3.seconds, '1', { operation: 'read' }
- )
- )
- end
-
- expect(Gitlab::SafeRequestStore[:rack_attack_instrumentation]).to eql(
- rack_attack_redis_count: 3,
- rack_attack_redis_duration_s: 6.0
- )
- end
- end
-
shared_examples 'log into auth logger' do
context 'when matched throttle does not require user information' do
let(:event) do
diff --git a/spec/lib/gitlab/rack_attack/instrumented_cache_store_spec.rb b/spec/lib/gitlab/rack_attack/instrumented_cache_store_spec.rb
deleted file mode 100644
index 8151519ddec..00000000000
--- a/spec/lib/gitlab/rack_attack/instrumented_cache_store_spec.rb
+++ /dev/null
@@ -1,89 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::RackAttack::InstrumentedCacheStore do
- using RSpec::Parameterized::TableSyntax
-
- let(:store) { ::ActiveSupport::Cache::NullStore.new }
-
- subject { described_class.new(upstream_store: store) }
-
- where(:operation, :params, :test_proc) do
- :fetch | [:key] | ->(s) { s.fetch(:key) }
- :read | [:key] | ->(s) { s.read(:key) }
- :read_multi | [:key_1, :key_2, :key_3] | ->(s) { s.read_multi(:key_1, :key_2, :key_3) }
- :write_multi | [{ key_1: 1, key_2: 2, key_3: 3 }] | ->(s) { s.write_multi(key_1: 1, key_2: 2, key_3: 3) }
- :fetch_multi | [:key_1, :key_2, :key_3] | ->(s) { s.fetch_multi(:key_1, :key_2, :key_3) {} }
- :write | [:key, :value, { option_1: 1 }] | ->(s) { s.write(:key, :value, option_1: 1) }
- :delete | [:key] | ->(s) { s.delete(:key) }
- :exist? | [:key, { option_1: 1 }] | ->(s) { s.exist?(:key, option_1: 1) }
- :delete_matched | [/^key$/, { option_1: 1 }] | ->(s) { s.delete_matched(/^key$/, option_1: 1 ) }
- :increment | [:key, 1] | ->(s) { s.increment(:key, 1) }
- :decrement | [:key, 1] | ->(s) { s.decrement(:key, 1) }
- :cleanup | [] | ->(s) { s.cleanup }
- :clear | [] | ->(s) { s.clear }
- end
-
- with_them do
- it 'publishes a notification' do
- event = nil
-
- begin
- subscriber = ActiveSupport::Notifications.subscribe("redis.rack_attack") do |*args|
- event = ActiveSupport::Notifications::Event.new(*args)
- end
-
- test_proc.call(subject)
- ensure
- ActiveSupport::Notifications.unsubscribe(subscriber) if subscriber
- end
-
- expect(event).not_to be_nil
- expect(event.name).to eq("redis.rack_attack")
- expect(event.duration).to be_a(Float).and(be > 0.0)
- expect(event.payload[:operation]).to eql(operation)
- end
-
- it 'publishes a notification even if the cache store returns an error' do
- allow(store).to receive(operation).and_raise('Something went wrong')
-
- event = nil
- exception = nil
-
- begin
- subscriber = ActiveSupport::Notifications.subscribe("redis.rack_attack") do |*args|
- event = ActiveSupport::Notifications::Event.new(*args)
- end
-
- begin
- test_proc.call(subject)
- rescue StandardError => e
- exception = e
- end
- ensure
- ActiveSupport::Notifications.unsubscribe(subscriber) if subscriber
- end
-
- expect(event).not_to be_nil
- expect(event.name).to eq("redis.rack_attack")
- expect(event.duration).to be_a(Float).and(be > 0.0)
- expect(event.payload[:operation]).to eql(operation)
-
- expect(exception).not_to be_nil
- expect(exception.message).to eql('Something went wrong')
- end
-
- it 'delegates to the upstream store' do
- allow(store).to receive(operation).and_call_original
-
- if params.empty?
- expect(store).to receive(operation).with(no_args)
- else
- expect(store).to receive(operation).with(*params)
- end
-
- test_proc.call(subject)
- end
- end
-end
diff --git a/spec/lib/gitlab/rack_attack_spec.rb b/spec/lib/gitlab/rack_attack_spec.rb
index 6836a1a1b14..960a81b8c9d 100644
--- a/spec/lib/gitlab/rack_attack_spec.rb
+++ b/spec/lib/gitlab/rack_attack_spec.rb
@@ -320,18 +320,4 @@ RSpec.describe Gitlab::RackAttack, :aggregate_failures do
end
end
end
-
- describe '.cache_store' do
- subject { described_class.cache_store }
-
- it { expect(subject).to be_a(Gitlab::RackAttack::InstrumentedCacheStore) }
-
- context 'when GITLAB_RACK_ATTACK_NEW_STORE is set' do
- before do
- stub_env('GITLAB_RACK_ATTACK_NEW_STORE', '1')
- end
-
- it { expect(subject).to be_a(Gitlab::RackAttack::Store) }
- end
- end
end
diff --git a/spec/services/ci/abort_pipelines_service_spec.rb b/spec/services/ci/abort_pipelines_service_spec.rb
index e43faf0af51..60f3ee11442 100644
--- a/spec/services/ci/abort_pipelines_service_spec.rb
+++ b/spec/services/ci/abort_pipelines_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::AbortPipelinesService do
+RSpec.describe Ci::AbortPipelinesService, feature_category: :continuous_integration do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project, namespace: user.namespace) }
diff --git a/spec/services/ci/append_build_trace_service_spec.rb b/spec/services/ci/append_build_trace_service_spec.rb
index 20f7967d1f1..113c88dc5f3 100644
--- a/spec/services/ci/append_build_trace_service_spec.rb
+++ b/spec/services/ci/append_build_trace_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::AppendBuildTraceService do
+RSpec.describe Ci::AppendBuildTraceService, feature_category: :continuous_integration do
let_it_be(:project) { create(:project) }
let_it_be(:pipeline) { create(:ci_pipeline, project: project) }
let_it_be_with_reload(:build) { create(:ci_build, :running, pipeline: pipeline) }
diff --git a/spec/services/ci/build_cancel_service_spec.rb b/spec/services/ci/build_cancel_service_spec.rb
index fe036dc1368..314d2e86bd3 100644
--- a/spec/services/ci/build_cancel_service_spec.rb
+++ b/spec/services/ci/build_cancel_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::BuildCancelService do
+RSpec.describe Ci::BuildCancelService, feature_category: :continuous_integration do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project) }
let_it_be(:pipeline) { create(:ci_pipeline, project: project) }
diff --git a/spec/services/ci/build_erase_service_spec.rb b/spec/services/ci/build_erase_service_spec.rb
index e750a163621..35e74f76a26 100644
--- a/spec/services/ci/build_erase_service_spec.rb
+++ b/spec/services/ci/build_erase_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::BuildEraseService do
+RSpec.describe Ci::BuildEraseService, feature_category: :continuous_integration do
let_it_be(:user) { user }
let(:build) { create(:ci_build, :artifacts, :trace_artifact, artifacts_expire_at: 100.days.from_now) }
diff --git a/spec/services/ci/build_report_result_service_spec.rb b/spec/services/ci/build_report_result_service_spec.rb
index c5238b7f5e0..c3ce6714241 100644
--- a/spec/services/ci/build_report_result_service_spec.rb
+++ b/spec/services/ci/build_report_result_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::BuildReportResultService do
+RSpec.describe Ci::BuildReportResultService, feature_category: :continuous_integration do
describe '#execute', :clean_gitlab_redis_shared_state do
subject(:build_report_result) { described_class.new.execute(build) }
diff --git a/spec/services/ci/build_unschedule_service_spec.rb b/spec/services/ci/build_unschedule_service_spec.rb
index d784d9a2754..539c66047e4 100644
--- a/spec/services/ci/build_unschedule_service_spec.rb
+++ b/spec/services/ci/build_unschedule_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::BuildUnscheduleService do
+RSpec.describe Ci::BuildUnscheduleService, feature_category: :continuous_integration do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project) }
let_it_be(:pipeline) { create(:ci_pipeline, project: project) }
diff --git a/spec/services/ci/change_variable_service_spec.rb b/spec/services/ci/change_variable_service_spec.rb
index f86a87132b1..a9f9e4233d7 100644
--- a/spec/services/ci/change_variable_service_spec.rb
+++ b/spec/services/ci/change_variable_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::ChangeVariableService do
+RSpec.describe Ci::ChangeVariableService, feature_category: :pipeline_composition do
let(:service) { described_class.new(container: group, current_user: user, params: params) }
let_it_be(:user) { create(:user) }
diff --git a/spec/services/ci/change_variables_service_spec.rb b/spec/services/ci/change_variables_service_spec.rb
index b710ca78554..1bc36a78762 100644
--- a/spec/services/ci/change_variables_service_spec.rb
+++ b/spec/services/ci/change_variables_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::ChangeVariablesService do
+RSpec.describe Ci::ChangeVariablesService, feature_category: :pipeline_composition do
let(:service) { described_class.new(container: group, current_user: user, params: params) }
let_it_be(:user) { create(:user) }
diff --git a/spec/services/ci/compare_accessibility_reports_service_spec.rb b/spec/services/ci/compare_accessibility_reports_service_spec.rb
index e0b84219834..57514c18042 100644
--- a/spec/services/ci/compare_accessibility_reports_service_spec.rb
+++ b/spec/services/ci/compare_accessibility_reports_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::CompareAccessibilityReportsService do
+RSpec.describe Ci::CompareAccessibilityReportsService, feature_category: :continuous_integration do
let(:service) { described_class.new(project) }
let(:project) { create(:project, :repository) }
diff --git a/spec/services/ci/compare_codequality_reports_service_spec.rb b/spec/services/ci/compare_codequality_reports_service_spec.rb
index ef762a2e9ad..de2300c354b 100644
--- a/spec/services/ci/compare_codequality_reports_service_spec.rb
+++ b/spec/services/ci/compare_codequality_reports_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::CompareCodequalityReportsService do
+RSpec.describe Ci::CompareCodequalityReportsService, feature_category: :continuous_integration do
let(:service) { described_class.new(project) }
let(:project) { create(:project, :repository) }
diff --git a/spec/services/ci/compare_reports_base_service_spec.rb b/spec/services/ci/compare_reports_base_service_spec.rb
index 20d8cd37553..2906d61066d 100644
--- a/spec/services/ci/compare_reports_base_service_spec.rb
+++ b/spec/services/ci/compare_reports_base_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::CompareReportsBaseService do
+RSpec.describe Ci::CompareReportsBaseService, feature_category: :continuous_integration do
let(:service) { described_class.new(project) }
let(:project) { create(:project, :repository) }
diff --git a/spec/services/ci/compare_test_reports_service_spec.rb b/spec/services/ci/compare_test_reports_service_spec.rb
index f259072fe87..d29cef0c583 100644
--- a/spec/services/ci/compare_test_reports_service_spec.rb
+++ b/spec/services/ci/compare_test_reports_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::CompareTestReportsService do
+RSpec.describe Ci::CompareTestReportsService, feature_category: :continuous_integration do
let(:service) { described_class.new(project) }
let(:project) { create(:project, :repository) }
diff --git a/spec/services/ci/copy_cross_database_associations_service_spec.rb b/spec/services/ci/copy_cross_database_associations_service_spec.rb
index 5938ac258d0..2be0cbd9582 100644
--- a/spec/services/ci/copy_cross_database_associations_service_spec.rb
+++ b/spec/services/ci/copy_cross_database_associations_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::CopyCrossDatabaseAssociationsService do
+RSpec.describe Ci::CopyCrossDatabaseAssociationsService, feature_category: :continuous_integration do
let_it_be(:project) { create(:project) }
let_it_be(:pipeline) { create(:ci_pipeline, project: project) }
let_it_be(:old_build) { create(:ci_build, pipeline: pipeline) }
diff --git a/spec/services/ci/create_pipeline_service/artifacts_spec.rb b/spec/services/ci/create_pipeline_service/artifacts_spec.rb
index e5e405492a0..c193900b2d3 100644
--- a/spec/services/ci/create_pipeline_service/artifacts_spec.rb
+++ b/spec/services/ci/create_pipeline_service/artifacts_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
require 'spec_helper'
-RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do
+RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness, feature_category: :build_artifacts do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { project.first_owner }
diff --git a/spec/services/ci/create_pipeline_service/cache_spec.rb b/spec/services/ci/create_pipeline_service/cache_spec.rb
index f9640f99031..e8d9cec6695 100644
--- a/spec/services/ci/create_pipeline_service/cache_spec.rb
+++ b/spec/services/ci/create_pipeline_service/cache_spec.rb
@@ -2,7 +2,8 @@
require 'spec_helper'
-RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do
+RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness,
+ feature_category: :continuous_integration do
context 'cache' do
let(:project) { create(:project, :custom_repo, files: files) }
let(:user) { project.first_owner }
diff --git a/spec/services/ci/create_pipeline_service/creation_errors_and_warnings_spec.rb b/spec/services/ci/create_pipeline_service/creation_errors_and_warnings_spec.rb
index 0ebcecdd6e6..036116dc037 100644
--- a/spec/services/ci/create_pipeline_service/creation_errors_and_warnings_spec.rb
+++ b/spec/services/ci/create_pipeline_service/creation_errors_and_warnings_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do
+RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness, feature_category: :continuous_integration do
describe 'creation errors and warnings' do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { project.first_owner }
diff --git a/spec/services/ci/create_pipeline_service/cross_project_pipeline_spec.rb b/spec/services/ci/create_pipeline_service/cross_project_pipeline_spec.rb
index 0d5017a763f..dc87cc872e3 100644
--- a/spec/services/ci/create_pipeline_service/cross_project_pipeline_spec.rb
+++ b/spec/services/ci/create_pipeline_service/cross_project_pipeline_spec.rb
@@ -2,7 +2,8 @@
require 'spec_helper'
-RSpec.describe Ci::CreatePipelineService, '#execute', :yaml_processor_feature_flag_corectness do
+RSpec.describe Ci::CreatePipelineService, '#execute', :yaml_processor_feature_flag_corectness,
+ feature_category: :continuous_integration do
let_it_be(:group) { create(:group, name: 'my-organization') }
let(:upstream_project) { create(:project, :repository, name: 'upstream', group: group) }
diff --git a/spec/services/ci/create_pipeline_service/custom_config_content_spec.rb b/spec/services/ci/create_pipeline_service/custom_config_content_spec.rb
index dafa227c4c8..819946bfd27 100644
--- a/spec/services/ci/create_pipeline_service/custom_config_content_spec.rb
+++ b/spec/services/ci/create_pipeline_service/custom_config_content_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
require 'spec_helper'
-RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do
+RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness, feature_category: :continuous_integration do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { project.first_owner }
diff --git a/spec/services/ci/create_pipeline_service/custom_yaml_tags_spec.rb b/spec/services/ci/create_pipeline_service/custom_yaml_tags_spec.rb
index 3b042f05fc0..b78ad68194a 100644
--- a/spec/services/ci/create_pipeline_service/custom_yaml_tags_spec.rb
+++ b/spec/services/ci/create_pipeline_service/custom_yaml_tags_spec.rb
@@ -1,7 +1,8 @@
# frozen_string_literal: true
require 'spec_helper'
-RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do
+RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness,
+ feature_category: :continuous_integration do
describe '!reference tags' do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { project.first_owner }
diff --git a/spec/services/ci/create_pipeline_service/dry_run_spec.rb b/spec/services/ci/create_pipeline_service/dry_run_spec.rb
index de1ed251c82..7136fa5dc13 100644
--- a/spec/services/ci/create_pipeline_service/dry_run_spec.rb
+++ b/spec/services/ci/create_pipeline_service/dry_run_spec.rb
@@ -2,7 +2,8 @@
require 'spec_helper'
-RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do
+RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness,
+ feature_category: :continuous_integration do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { project.first_owner }
diff --git a/spec/services/ci/create_pipeline_service/environment_spec.rb b/spec/services/ci/create_pipeline_service/environment_spec.rb
index b713cad2cad..96e54af43cd 100644
--- a/spec/services/ci/create_pipeline_service/environment_spec.rb
+++ b/spec/services/ci/create_pipeline_service/environment_spec.rb
@@ -2,7 +2,8 @@
require 'spec_helper'
-RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do
+RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness,
+ feature_category: :pipeline_composition do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:developer) { create(:user) }
diff --git a/spec/services/ci/create_pipeline_service/evaluate_runner_tags_spec.rb b/spec/services/ci/create_pipeline_service/evaluate_runner_tags_spec.rb
index e84726d31f6..b40e504f99b 100644
--- a/spec/services/ci/create_pipeline_service/evaluate_runner_tags_spec.rb
+++ b/spec/services/ci/create_pipeline_service/evaluate_runner_tags_spec.rb
@@ -2,7 +2,8 @@
require 'spec_helper'
-RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do
+RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness,
+ feature_category: :pipeline_composition do
let_it_be(:group) { create(:group, :private) }
let_it_be(:group_variable) { create(:ci_group_variable, group: group, key: 'RUNNER_TAG', value: 'group') }
let_it_be(:project) { create(:project, :repository, group: group) }
diff --git a/spec/services/ci/create_pipeline_service/limit_active_jobs_spec.rb b/spec/services/ci/create_pipeline_service/limit_active_jobs_spec.rb
index 003d109a27c..b0730eaf215 100644
--- a/spec/services/ci/create_pipeline_service/limit_active_jobs_spec.rb
+++ b/spec/services/ci/create_pipeline_service/limit_active_jobs_spec.rb
@@ -1,7 +1,8 @@
# frozen_string_literal: true
require 'spec_helper'
-RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do
+RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness,
+ feature_category: :continuous_integration do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { project.first_owner }
let_it_be(:existing_pipeline) { create(:ci_pipeline, project: project) }
diff --git a/spec/services/ci/create_pipeline_service/merge_requests_spec.rb b/spec/services/ci/create_pipeline_service/merge_requests_spec.rb
index 80f48451e5c..8d04b3d020f 100644
--- a/spec/services/ci/create_pipeline_service/merge_requests_spec.rb
+++ b/spec/services/ci/create_pipeline_service/merge_requests_spec.rb
@@ -2,7 +2,8 @@
require 'spec_helper'
-RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do
+RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness,
+feature_category: :continuous_integration do
context 'merge requests handling' do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { project.first_owner }
diff --git a/spec/services/ci/create_pipeline_service/needs_spec.rb b/spec/services/ci/create_pipeline_service/needs_spec.rb
index 38e330316ea..068cad68e64 100644
--- a/spec/services/ci/create_pipeline_service/needs_spec.rb
+++ b/spec/services/ci/create_pipeline_service/needs_spec.rb
@@ -2,7 +2,8 @@
require 'spec_helper'
-RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do
+RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness,
+ feature_category: :pipeline_composition do
context 'needs' do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { project.first_owner }
diff --git a/spec/services/ci/create_pipeline_service/parallel_spec.rb b/spec/services/ci/create_pipeline_service/parallel_spec.rb
index 5ee378a9719..71434fe0b0c 100644
--- a/spec/services/ci/create_pipeline_service/parallel_spec.rb
+++ b/spec/services/ci/create_pipeline_service/parallel_spec.rb
@@ -1,7 +1,8 @@
# frozen_string_literal: true
require 'spec_helper'
-RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do
+RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness,
+ feature_category: :continuous_integration do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { project.first_owner }
diff --git a/spec/services/ci/create_pipeline_service/parameter_content_spec.rb b/spec/services/ci/create_pipeline_service/parameter_content_spec.rb
index cae88bb67cf..16555dd68d6 100644
--- a/spec/services/ci/create_pipeline_service/parameter_content_spec.rb
+++ b/spec/services/ci/create_pipeline_service/parameter_content_spec.rb
@@ -2,7 +2,8 @@
require 'spec_helper'
-RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do
+RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness,
+ feature_category: :continuous_integration do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { project.first_owner }
diff --git a/spec/services/ci/create_pipeline_service/parent_child_pipeline_spec.rb b/spec/services/ci/create_pipeline_service/parent_child_pipeline_spec.rb
index eb17935967c..e644273df9a 100644
--- a/spec/services/ci/create_pipeline_service/parent_child_pipeline_spec.rb
+++ b/spec/services/ci/create_pipeline_service/parent_child_pipeline_spec.rb
@@ -2,7 +2,8 @@
require 'spec_helper'
-RSpec.describe Ci::CreatePipelineService, '#execute', :yaml_processor_feature_flag_corectness do
+RSpec.describe Ci::CreatePipelineService, '#execute', :yaml_processor_feature_flag_corectness,
+ feature_category: :continuous_integration do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { create(:user) }
diff --git a/spec/services/ci/create_pipeline_service/pre_post_stages_spec.rb b/spec/services/ci/create_pipeline_service/pre_post_stages_spec.rb
index db110bdc608..d935824e6cc 100644
--- a/spec/services/ci/create_pipeline_service/pre_post_stages_spec.rb
+++ b/spec/services/ci/create_pipeline_service/pre_post_stages_spec.rb
@@ -1,7 +1,8 @@
# frozen_string_literal: true
require 'spec_helper'
-RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do
+RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness,
+ feature_category: :continuous_integration do
describe '.pre/.post stages' do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { project.first_owner }
diff --git a/spec/services/ci/create_pipeline_service/rate_limit_spec.rb b/spec/services/ci/create_pipeline_service/rate_limit_spec.rb
index dfa74870341..31bea10f062 100644
--- a/spec/services/ci/create_pipeline_service/rate_limit_spec.rb
+++ b/spec/services/ci/create_pipeline_service/rate_limit_spec.rb
@@ -3,7 +3,8 @@ require 'spec_helper'
RSpec.describe Ci::CreatePipelineService, :freeze_time,
:clean_gitlab_redis_rate_limiting,
- :yaml_processor_feature_flag_corectness do
+ :yaml_processor_feature_flag_corectness,
+ feature_category: :continuous_integration do
describe 'rate limiting' do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { project.first_owner }
diff --git a/spec/services/ci/create_pipeline_service/scripts_spec.rb b/spec/services/ci/create_pipeline_service/scripts_spec.rb
index 770db9331cd..d541257a086 100644
--- a/spec/services/ci/create_pipeline_service/scripts_spec.rb
+++ b/spec/services/ci/create_pipeline_service/scripts_spec.rb
@@ -2,7 +2,8 @@
require 'spec_helper'
-RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do
+RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness,
+ feature_category: :continuous_integration do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { project.first_owner }
diff --git a/spec/services/ci/create_pipeline_service/tags_spec.rb b/spec/services/ci/create_pipeline_service/tags_spec.rb
index 7450df11eac..cb2dbf1c3a4 100644
--- a/spec/services/ci/create_pipeline_service/tags_spec.rb
+++ b/spec/services/ci/create_pipeline_service/tags_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
require 'spec_helper'
-RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do
+RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness, feature_category: :continuous_integration do
describe 'tags:' do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { project.first_owner }
diff --git a/spec/services/ci/create_pipeline_service/variables_spec.rb b/spec/services/ci/create_pipeline_service/variables_spec.rb
index fd138bde656..64f8b90f2f2 100644
--- a/spec/services/ci/create_pipeline_service/variables_spec.rb
+++ b/spec/services/ci/create_pipeline_service/variables_spec.rb
@@ -2,7 +2,8 @@
require 'spec_helper'
-RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness do
+RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness,
+ feature_category: :pipeline_composition do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { project.first_owner }
diff --git a/spec/services/ci/create_web_ide_terminal_service_spec.rb b/spec/services/ci/create_web_ide_terminal_service_spec.rb
index 3462b48cfe7..b22ca1472b7 100644
--- a/spec/services/ci/create_web_ide_terminal_service_spec.rb
+++ b/spec/services/ci/create_web_ide_terminal_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::CreateWebIdeTerminalService do
+RSpec.describe Ci::CreateWebIdeTerminalService, feature_category: :continuous_integration do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { create(:user) }
diff --git a/spec/services/ci/daily_build_group_report_result_service_spec.rb b/spec/services/ci/daily_build_group_report_result_service_spec.rb
index 32651247adb..bb6ce559fbd 100644
--- a/spec/services/ci/daily_build_group_report_result_service_spec.rb
+++ b/spec/services/ci/daily_build_group_report_result_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::DailyBuildGroupReportResultService, '#execute' do
+RSpec.describe Ci::DailyBuildGroupReportResultService, '#execute', feature_category: :continuous_integration do
let_it_be(:group) { create(:group, :private) }
let_it_be(:pipeline) { create(:ci_pipeline, project: create(:project, group: group), created_at: '2020-02-06 00:01:10') }
let_it_be(:rspec_job) { create(:ci_build, pipeline: pipeline, name: 'rspec 3/3', coverage: 80) }
diff --git a/spec/services/ci/delete_objects_service_spec.rb b/spec/services/ci/delete_objects_service_spec.rb
index 448f8979681..d84ee596721 100644
--- a/spec/services/ci/delete_objects_service_spec.rb
+++ b/spec/services/ci/delete_objects_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::DeleteObjectsService, :aggregate_failure do
+RSpec.describe Ci::DeleteObjectsService, :aggregate_failure, feature_category: :continuous_integration do
let(:service) { described_class.new }
let(:artifact) { create(:ci_job_artifact, :archive) }
let(:data) { [artifact] }
diff --git a/spec/services/ci/delete_unit_tests_service_spec.rb b/spec/services/ci/delete_unit_tests_service_spec.rb
index 4c63c513d48..2f07e709107 100644
--- a/spec/services/ci/delete_unit_tests_service_spec.rb
+++ b/spec/services/ci/delete_unit_tests_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::DeleteUnitTestsService do
+RSpec.describe Ci::DeleteUnitTestsService, feature_category: :continuous_integration do
describe '#execute' do
let!(:unit_test_1) { create(:ci_unit_test) }
let!(:unit_test_2) { create(:ci_unit_test) }
diff --git a/spec/services/ci/deployments/destroy_service_spec.rb b/spec/services/ci/deployments/destroy_service_spec.rb
index 60a57c05728..d0e7f5acb2b 100644
--- a/spec/services/ci/deployments/destroy_service_spec.rb
+++ b/spec/services/ci/deployments/destroy_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe ::Ci::Deployments::DestroyService do
+RSpec.describe ::Ci::Deployments::DestroyService, feature_category: :continuous_integration do
let_it_be(:project) { create(:project, :repository) }
let(:environment) { create(:environment, project: project) }
diff --git a/spec/services/ci/destroy_pipeline_service_spec.rb b/spec/services/ci/destroy_pipeline_service_spec.rb
index 6bd7fe7559c..a1883d90b0a 100644
--- a/spec/services/ci/destroy_pipeline_service_spec.rb
+++ b/spec/services/ci/destroy_pipeline_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe ::Ci::DestroyPipelineService do
+RSpec.describe ::Ci::DestroyPipelineService, feature_category: :continuous_integration do
let_it_be(:project) { create(:project, :repository) }
let!(:pipeline) { create(:ci_pipeline, :success, project: project, sha: project.commit.id) }
diff --git a/spec/services/ci/destroy_secure_file_service_spec.rb b/spec/services/ci/destroy_secure_file_service_spec.rb
index 6a30d33f4ca..321efc2ed71 100644
--- a/spec/services/ci/destroy_secure_file_service_spec.rb
+++ b/spec/services/ci/destroy_secure_file_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe ::Ci::DestroySecureFileService do
+RSpec.describe ::Ci::DestroySecureFileService, feature_category: :continuous_integration do
let_it_be(:maintainer_user) { create(:user) }
let_it_be(:developer_user) { create(:user) }
let_it_be(:project) { create(:project) }
diff --git a/spec/services/ci/disable_user_pipeline_schedules_service_spec.rb b/spec/services/ci/disable_user_pipeline_schedules_service_spec.rb
index 4ff8dcf075b..d422cf0dab9 100644
--- a/spec/services/ci/disable_user_pipeline_schedules_service_spec.rb
+++ b/spec/services/ci/disable_user_pipeline_schedules_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::DisableUserPipelineSchedulesService do
+RSpec.describe Ci::DisableUserPipelineSchedulesService, feature_category: :continuous_integration do
describe '#execute' do
let(:user) { create(:user) }
diff --git a/spec/services/ci/drop_pipeline_service_spec.rb b/spec/services/ci/drop_pipeline_service_spec.rb
index ddb53712d9c..ed45b3460c1 100644
--- a/spec/services/ci/drop_pipeline_service_spec.rb
+++ b/spec/services/ci/drop_pipeline_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::DropPipelineService do
+RSpec.describe Ci::DropPipelineService, feature_category: :continuous_integration do
let_it_be(:user) { create(:user) }
let(:failure_reason) { :user_blocked }
diff --git a/spec/services/ci/ensure_stage_service_spec.rb b/spec/services/ci/ensure_stage_service_spec.rb
index 026814edda6..5d6025095a1 100644
--- a/spec/services/ci/ensure_stage_service_spec.rb
+++ b/spec/services/ci/ensure_stage_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::EnsureStageService, '#execute' do
+RSpec.describe Ci::EnsureStageService, '#execute', feature_category: :continuous_integration do
let_it_be(:project) { create(:project) }
let_it_be(:user) { create(:user) }
diff --git a/spec/services/ci/expire_pipeline_cache_service_spec.rb b/spec/services/ci/expire_pipeline_cache_service_spec.rb
index 8cfe756faf3..3d0ce456aa5 100644
--- a/spec/services/ci/expire_pipeline_cache_service_spec.rb
+++ b/spec/services/ci/expire_pipeline_cache_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::ExpirePipelineCacheService do
+RSpec.describe Ci::ExpirePipelineCacheService, feature_category: :continuous_integration do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project) }
let_it_be(:pipeline) { create(:ci_pipeline, project: project) }
diff --git a/spec/services/ci/external_pull_requests/create_pipeline_service_spec.rb b/spec/services/ci/external_pull_requests/create_pipeline_service_spec.rb
index d5881d3b204..1b548aaf614 100644
--- a/spec/services/ci/external_pull_requests/create_pipeline_service_spec.rb
+++ b/spec/services/ci/external_pull_requests/create_pipeline_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::ExternalPullRequests::CreatePipelineService do
+RSpec.describe Ci::ExternalPullRequests::CreatePipelineService, feature_category: :continuous_integration do
describe '#execute' do
let_it_be(:project) { create(:project, :auto_devops, :repository) }
let_it_be(:user) { create(:user) }
diff --git a/spec/services/ci/find_exposed_artifacts_service_spec.rb b/spec/services/ci/find_exposed_artifacts_service_spec.rb
index 6e11c153a75..69360e73b86 100644
--- a/spec/services/ci/find_exposed_artifacts_service_spec.rb
+++ b/spec/services/ci/find_exposed_artifacts_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::FindExposedArtifactsService do
+RSpec.describe Ci::FindExposedArtifactsService, feature_category: :build_artifacts do
include Gitlab::Routing
let(:metadata) do
diff --git a/spec/services/ci/generate_codequality_mr_diff_report_service_spec.rb b/spec/services/ci/generate_codequality_mr_diff_report_service_spec.rb
index 63bc7a1caf8..c33b182e9a9 100644
--- a/spec/services/ci/generate_codequality_mr_diff_report_service_spec.rb
+++ b/spec/services/ci/generate_codequality_mr_diff_report_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::GenerateCodequalityMrDiffReportService do
+RSpec.describe Ci::GenerateCodequalityMrDiffReportService, feature_category: :code_review_workflow do
let(:service) { described_class.new(project) }
let(:project) { create(:project, :repository) }
diff --git a/spec/services/ci/generate_coverage_reports_service_spec.rb b/spec/services/ci/generate_coverage_reports_service_spec.rb
index 212e6be9d07..811431bf9d6 100644
--- a/spec/services/ci/generate_coverage_reports_service_spec.rb
+++ b/spec/services/ci/generate_coverage_reports_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::GenerateCoverageReportsService do
+RSpec.describe Ci::GenerateCoverageReportsService, feature_category: :code_testing do
let_it_be(:project) { create(:project, :repository) }
let(:service) { described_class.new(project) }
diff --git a/spec/services/ci/generate_kubeconfig_service_spec.rb b/spec/services/ci/generate_kubeconfig_service_spec.rb
index c0858b0f0c9..da18dfe04c3 100644
--- a/spec/services/ci/generate_kubeconfig_service_spec.rb
+++ b/spec/services/ci/generate_kubeconfig_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::GenerateKubeconfigService do
+RSpec.describe Ci::GenerateKubeconfigService, feature_category: :kubernetes_management do
describe '#execute' do
let_it_be(:group) { create(:group) }
let_it_be(:project) { create(:project, group: group) }
diff --git a/spec/services/ci/generate_terraform_reports_service_spec.rb b/spec/services/ci/generate_terraform_reports_service_spec.rb
index c32e8bcaeb8..b2142d391b8 100644
--- a/spec/services/ci/generate_terraform_reports_service_spec.rb
+++ b/spec/services/ci/generate_terraform_reports_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::GenerateTerraformReportsService do
+RSpec.describe Ci::GenerateTerraformReportsService, feature_category: :infrastructure_as_code do
let_it_be(:project) { create(:project, :repository) }
describe '#execute' do
diff --git a/spec/services/ci/job_artifacts/create_service_spec.rb b/spec/services/ci/job_artifacts/create_service_spec.rb
index 47e9e5994ef..1ef06ec7dcd 100644
--- a/spec/services/ci/job_artifacts/create_service_spec.rb
+++ b/spec/services/ci/job_artifacts/create_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::JobArtifacts::CreateService do
+RSpec.describe Ci::JobArtifacts::CreateService, feature_category: :build_artifacts do
let_it_be(:project) { create(:project) }
let(:service) { described_class.new(job) }
diff --git a/spec/services/ci/job_artifacts/delete_project_artifacts_service_spec.rb b/spec/services/ci/job_artifacts/delete_project_artifacts_service_spec.rb
index 74fa42962f3..9c711e54b00 100644
--- a/spec/services/ci/job_artifacts/delete_project_artifacts_service_spec.rb
+++ b/spec/services/ci/job_artifacts/delete_project_artifacts_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::JobArtifacts::DeleteProjectArtifactsService do
+RSpec.describe Ci::JobArtifacts::DeleteProjectArtifactsService, feature_category: :build_artifacts do
let_it_be(:project) { create(:project) }
subject { described_class.new(project: project) }
diff --git a/spec/services/ci/job_artifacts/delete_service_spec.rb b/spec/services/ci/job_artifacts/delete_service_spec.rb
index 78e8be48255..1560d0fc6f4 100644
--- a/spec/services/ci/job_artifacts/delete_service_spec.rb
+++ b/spec/services/ci/job_artifacts/delete_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::JobArtifacts::DeleteService do
+RSpec.describe Ci::JobArtifacts::DeleteService, feature_category: :build_artifacts do
let_it_be(:build, reload: true) do
create(:ci_build, :artifacts, :trace_artifact, artifacts_expire_at: 100.days.from_now)
end
diff --git a/spec/services/ci/job_artifacts/destroy_associations_service_spec.rb b/spec/services/ci/job_artifacts/destroy_associations_service_spec.rb
index ca36c923dcf..0e27f79487c 100644
--- a/spec/services/ci/job_artifacts/destroy_associations_service_spec.rb
+++ b/spec/services/ci/job_artifacts/destroy_associations_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::JobArtifacts::DestroyAssociationsService do
+RSpec.describe Ci::JobArtifacts::DestroyAssociationsService, feature_category: :build_artifacts do
let_it_be(:project_1) { create(:project) }
let_it_be(:project_2) { create(:project) }
diff --git a/spec/services/ci/job_artifacts/destroy_batch_service_spec.rb b/spec/services/ci/job_artifacts/destroy_batch_service_spec.rb
index cde42783d8c..fd8378e9f0f 100644
--- a/spec/services/ci/job_artifacts/destroy_batch_service_spec.rb
+++ b/spec/services/ci/job_artifacts/destroy_batch_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::JobArtifacts::DestroyBatchService do
+RSpec.describe Ci::JobArtifacts::DestroyBatchService, feature_category: :build_artifacts do
let(:artifacts) { Ci::JobArtifact.where(id: [artifact_with_file.id, artifact_without_file.id, trace_artifact.id]) }
let(:skip_projects_on_refresh) { false }
let(:service) do
diff --git a/spec/services/ci/job_artifacts/expire_project_build_artifacts_service_spec.rb b/spec/services/ci/job_artifacts/expire_project_build_artifacts_service_spec.rb
index fb9dd6b876b..69cdf39107a 100644
--- a/spec/services/ci/job_artifacts/expire_project_build_artifacts_service_spec.rb
+++ b/spec/services/ci/job_artifacts/expire_project_build_artifacts_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::JobArtifacts::ExpireProjectBuildArtifactsService do
+RSpec.describe Ci::JobArtifacts::ExpireProjectBuildArtifactsService, feature_category: :build_artifacts do
let_it_be(:project) { create(:project) }
let_it_be(:pipeline, reload: true) { create(:ci_pipeline, :unlocked, project: project) }
diff --git a/spec/services/ci/job_artifacts/track_artifact_report_service_spec.rb b/spec/services/ci/job_artifacts/track_artifact_report_service_spec.rb
index d4d56825e1f..5355bec2d6c 100644
--- a/spec/services/ci/job_artifacts/track_artifact_report_service_spec.rb
+++ b/spec/services/ci/job_artifacts/track_artifact_report_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::JobArtifacts::TrackArtifactReportService do
+RSpec.describe Ci::JobArtifacts::TrackArtifactReportService, feature_category: :build_artifacts do
describe '#execute', :clean_gitlab_redis_shared_state do
let_it_be(:group) { create(:group, :private) }
let_it_be(:project) { create(:project, group: group) }
diff --git a/spec/services/ci/job_artifacts/update_unknown_locked_status_service_spec.rb b/spec/services/ci/job_artifacts/update_unknown_locked_status_service_spec.rb
index 67412e41fb8..5f6a89b89e1 100644
--- a/spec/services/ci/job_artifacts/update_unknown_locked_status_service_spec.rb
+++ b/spec/services/ci/job_artifacts/update_unknown_locked_status_service_spec.rb
@@ -2,7 +2,8 @@
require 'spec_helper'
-RSpec.describe Ci::JobArtifacts::UpdateUnknownLockedStatusService, :clean_gitlab_redis_shared_state do
+RSpec.describe Ci::JobArtifacts::UpdateUnknownLockedStatusService, :clean_gitlab_redis_shared_state,
+ feature_category: :build_artifacts do
include ExclusiveLeaseHelpers
let(:service) { described_class.new }
diff --git a/spec/services/ci/pipeline_artifacts/coverage_report_service_spec.rb b/spec/services/ci/pipeline_artifacts/coverage_report_service_spec.rb
index c4558bddc85..b7b32d2a0af 100644
--- a/spec/services/ci/pipeline_artifacts/coverage_report_service_spec.rb
+++ b/spec/services/ci/pipeline_artifacts/coverage_report_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::PipelineArtifacts::CoverageReportService do
+RSpec.describe Ci::PipelineArtifacts::CoverageReportService, feature_category: :build_artifacts do
describe '#execute' do
let_it_be(:project) { create(:project, :repository) }
diff --git a/spec/services/ci/pipeline_artifacts/create_code_quality_mr_diff_report_service_spec.rb b/spec/services/ci/pipeline_artifacts/create_code_quality_mr_diff_report_service_spec.rb
index 5d854b61f14..20265a0ca48 100644
--- a/spec/services/ci/pipeline_artifacts/create_code_quality_mr_diff_report_service_spec.rb
+++ b/spec/services/ci/pipeline_artifacts/create_code_quality_mr_diff_report_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe ::Ci::PipelineArtifacts::CreateCodeQualityMrDiffReportService do
+RSpec.describe ::Ci::PipelineArtifacts::CreateCodeQualityMrDiffReportService, feature_category: :build_artifacts do
describe '#execute' do
let(:merge_request) { create(:merge_request) }
let(:project) { merge_request.project }
diff --git a/spec/services/ci/pipeline_artifacts/destroy_all_expired_service_spec.rb b/spec/services/ci/pipeline_artifacts/destroy_all_expired_service_spec.rb
index 47e8766c215..b46648760e1 100644
--- a/spec/services/ci/pipeline_artifacts/destroy_all_expired_service_spec.rb
+++ b/spec/services/ci/pipeline_artifacts/destroy_all_expired_service_spec.rb
@@ -2,7 +2,8 @@
require 'spec_helper'
-RSpec.describe Ci::PipelineArtifacts::DestroyAllExpiredService, :clean_gitlab_redis_shared_state do
+RSpec.describe Ci::PipelineArtifacts::DestroyAllExpiredService, :clean_gitlab_redis_shared_state,
+ feature_category: :build_artifacts do
let(:service) { described_class.new }
describe '.execute' do
diff --git a/spec/services/ci/pipeline_bridge_status_service_spec.rb b/spec/services/ci/pipeline_bridge_status_service_spec.rb
index 1346f68c952..3d8219251d6 100644
--- a/spec/services/ci/pipeline_bridge_status_service_spec.rb
+++ b/spec/services/ci/pipeline_bridge_status_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::PipelineBridgeStatusService do
+RSpec.describe Ci::PipelineBridgeStatusService, feature_category: :continuous_integration do
let(:user) { build(:user) }
let_it_be(:project) { create(:project) }
diff --git a/spec/services/ci/pipeline_creation/start_pipeline_service_spec.rb b/spec/services/ci/pipeline_creation/start_pipeline_service_spec.rb
index ab4ba20e716..06139c091b9 100644
--- a/spec/services/ci/pipeline_creation/start_pipeline_service_spec.rb
+++ b/spec/services/ci/pipeline_creation/start_pipeline_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::PipelineCreation::StartPipelineService do
+RSpec.describe Ci::PipelineCreation::StartPipelineService, feature_category: :continuous_integration do
let(:pipeline) { build(:ci_pipeline) }
subject(:service) { described_class.new(pipeline) }
diff --git a/spec/services/ci/pipeline_processing/atomic_processing_service/status_collection_spec.rb b/spec/services/ci/pipeline_processing/atomic_processing_service/status_collection_spec.rb
index d0aa1ba4c6c..6b8584b37b7 100644
--- a/spec/services/ci/pipeline_processing/atomic_processing_service/status_collection_spec.rb
+++ b/spec/services/ci/pipeline_processing/atomic_processing_service/status_collection_spec.rb
@@ -2,7 +2,8 @@
require 'spec_helper'
-RSpec.describe Ci::PipelineProcessing::AtomicProcessingService::StatusCollection do
+RSpec.describe Ci::PipelineProcessing::AtomicProcessingService::StatusCollection,
+ feature_category: :continuous_integration do
using RSpec::Parameterized::TableSyntax
let_it_be(:pipeline) { create(:ci_pipeline) }
diff --git a/spec/services/ci/pipeline_schedules/take_ownership_service_spec.rb b/spec/services/ci/pipeline_schedules/take_ownership_service_spec.rb
index 9a3aad20d89..1d45a06f9ea 100644
--- a/spec/services/ci/pipeline_schedules/take_ownership_service_spec.rb
+++ b/spec/services/ci/pipeline_schedules/take_ownership_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::PipelineSchedules::TakeOwnershipService do
+RSpec.describe Ci::PipelineSchedules::TakeOwnershipService, feature_category: :continuous_integration do
let_it_be(:user) { create(:user) }
let_it_be(:owner) { create(:user) }
let_it_be(:reporter) { create(:user) }
diff --git a/spec/services/ci/pipeline_trigger_service_spec.rb b/spec/services/ci/pipeline_trigger_service_spec.rb
index 4946367380e..b6e07e82bb5 100644
--- a/spec/services/ci/pipeline_trigger_service_spec.rb
+++ b/spec/services/ci/pipeline_trigger_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::PipelineTriggerService do
+RSpec.describe Ci::PipelineTriggerService, feature_category: :continuous_integration do
include AfterNextHelpers
let_it_be(:project) { create(:project, :repository) }
diff --git a/spec/services/ci/pipelines/add_job_service_spec.rb b/spec/services/ci/pipelines/add_job_service_spec.rb
index c62aa9506bd..9fb1d6933c6 100644
--- a/spec/services/ci/pipelines/add_job_service_spec.rb
+++ b/spec/services/ci/pipelines/add_job_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::Pipelines::AddJobService do
+RSpec.describe Ci::Pipelines::AddJobService, feature_category: :continuous_integration do
include ExclusiveLeaseHelpers
let_it_be_with_reload(:pipeline) { create(:ci_pipeline) }
diff --git a/spec/services/ci/pipelines/hook_service_spec.rb b/spec/services/ci/pipelines/hook_service_spec.rb
index 8d138a3d957..e773ae2d2c3 100644
--- a/spec/services/ci/pipelines/hook_service_spec.rb
+++ b/spec/services/ci/pipelines/hook_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::Pipelines::HookService do
+RSpec.describe Ci::Pipelines::HookService, feature_category: :continuous_integration do
describe '#execute_hooks' do
let_it_be(:namespace) { create(:namespace) }
let_it_be(:project) { create(:project, :repository, namespace: namespace) }
diff --git a/spec/services/ci/play_bridge_service_spec.rb b/spec/services/ci/play_bridge_service_spec.rb
index 56b1615a56d..5727ed64f8b 100644
--- a/spec/services/ci/play_bridge_service_spec.rb
+++ b/spec/services/ci/play_bridge_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::PlayBridgeService, '#execute' do
+RSpec.describe Ci::PlayBridgeService, '#execute', feature_category: :continuous_integration do
let(:project) { create(:project) }
let(:user) { create(:user) }
let(:pipeline) { create(:ci_pipeline, project: project) }
diff --git a/spec/services/ci/play_build_service_spec.rb b/spec/services/ci/play_build_service_spec.rb
index fc07801b672..f439538b4cc 100644
--- a/spec/services/ci/play_build_service_spec.rb
+++ b/spec/services/ci/play_build_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::PlayBuildService, '#execute' do
+RSpec.describe Ci::PlayBuildService, '#execute', feature_category: :continuous_integration do
let(:user) { create(:user, developer_projects: [project]) }
let(:project) { create(:project) }
let(:pipeline) { create(:ci_pipeline, project: project) }
diff --git a/spec/services/ci/play_manual_stage_service_spec.rb b/spec/services/ci/play_manual_stage_service_spec.rb
index 24f0a21f3dd..1aca4ffec2d 100644
--- a/spec/services/ci/play_manual_stage_service_spec.rb
+++ b/spec/services/ci/play_manual_stage_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::PlayManualStageService, '#execute' do
+RSpec.describe Ci::PlayManualStageService, '#execute', feature_category: :continuous_integration do
let(:current_user) { create(:user) }
let(:pipeline) { create(:ci_pipeline, user: current_user) }
let(:project) { pipeline.project }
diff --git a/spec/services/ci/prepare_build_service_spec.rb b/spec/services/ci/prepare_build_service_spec.rb
index f75cb322fe9..8583b8e667c 100644
--- a/spec/services/ci/prepare_build_service_spec.rb
+++ b/spec/services/ci/prepare_build_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::PrepareBuildService do
+RSpec.describe Ci::PrepareBuildService, feature_category: :continuous_integration do
describe '#execute' do
let(:build) { create(:ci_build, :preparing) }
diff --git a/spec/services/ci/process_build_service_spec.rb b/spec/services/ci/process_build_service_spec.rb
index de308bb1a87..d1442b75731 100644
--- a/spec/services/ci/process_build_service_spec.rb
+++ b/spec/services/ci/process_build_service_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
require 'spec_helper'
-RSpec.describe Ci::ProcessBuildService, '#execute' do
+RSpec.describe Ci::ProcessBuildService, '#execute', feature_category: :continuous_integration do
using RSpec::Parameterized::TableSyntax
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project) }
diff --git a/spec/services/ci/process_pipeline_service_spec.rb b/spec/services/ci/process_pipeline_service_spec.rb
index 404e1bf7c87..d1586ad4c8b 100644
--- a/spec/services/ci/process_pipeline_service_spec.rb
+++ b/spec/services/ci/process_pipeline_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::ProcessPipelineService do
+RSpec.describe Ci::ProcessPipelineService, feature_category: :continuous_integration do
let_it_be(:project) { create(:project) }
let(:pipeline) do
diff --git a/spec/services/ci/process_sync_events_service_spec.rb b/spec/services/ci/process_sync_events_service_spec.rb
index 7ab7911e578..c042a9bd46e 100644
--- a/spec/services/ci/process_sync_events_service_spec.rb
+++ b/spec/services/ci/process_sync_events_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::ProcessSyncEventsService do
+RSpec.describe Ci::ProcessSyncEventsService, feature_category: :continuous_integration do
let!(:group) { create(:group) }
let!(:project1) { create(:project, group: group) }
let!(:project2) { create(:project, group: group) }
diff --git a/spec/services/ci/prometheus_metrics/observe_histograms_service_spec.rb b/spec/services/ci/prometheus_metrics/observe_histograms_service_spec.rb
index 0b100af5902..a9ee5216d81 100644
--- a/spec/services/ci/prometheus_metrics/observe_histograms_service_spec.rb
+++ b/spec/services/ci/prometheus_metrics/observe_histograms_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::PrometheusMetrics::ObserveHistogramsService do
+RSpec.describe Ci::PrometheusMetrics::ObserveHistogramsService, feature_category: :continuous_integration do
let_it_be(:project) { create(:project) }
let(:params) { {} }
diff --git a/spec/services/ci/queue/pending_builds_strategy_spec.rb b/spec/services/ci/queue/pending_builds_strategy_spec.rb
index 6f22c256c17..ea9207ddb8f 100644
--- a/spec/services/ci/queue/pending_builds_strategy_spec.rb
+++ b/spec/services/ci/queue/pending_builds_strategy_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::Queue::PendingBuildsStrategy do
+RSpec.describe Ci::Queue::PendingBuildsStrategy, feature_category: :continuous_integration do
let_it_be(:group) { create(:group) }
let_it_be(:group_runner) { create(:ci_runner, :group, groups: [group]) }
let_it_be(:project) { create(:project, group: group) }
diff --git a/spec/services/ci/resource_groups/assign_resource_from_resource_group_service_spec.rb b/spec/services/ci/resource_groups/assign_resource_from_resource_group_service_spec.rb
index 3d1abe290bc..ea15e3ea2c0 100644
--- a/spec/services/ci/resource_groups/assign_resource_from_resource_group_service_spec.rb
+++ b/spec/services/ci/resource_groups/assign_resource_from_resource_group_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::ResourceGroups::AssignResourceFromResourceGroupService do
+RSpec.describe Ci::ResourceGroups::AssignResourceFromResourceGroupService, feature_category: :continuous_integration do
include ConcurrentHelpers
let_it_be(:project) { create(:project) }
diff --git a/spec/services/ci/retry_pipeline_service_spec.rb b/spec/services/ci/retry_pipeline_service_spec.rb
index 07518c35fab..51a894640ab 100644
--- a/spec/services/ci/retry_pipeline_service_spec.rb
+++ b/spec/services/ci/retry_pipeline_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::RetryPipelineService, '#execute' do
+RSpec.describe Ci::RetryPipelineService, '#execute', feature_category: :continuous_integration do
include ProjectForksHelper
let_it_be_with_refind(:user) { create(:user) }
diff --git a/spec/services/ci/run_scheduled_build_service_spec.rb b/spec/services/ci/run_scheduled_build_service_spec.rb
index 27d25e88944..e3ae1d93e5e 100644
--- a/spec/services/ci/run_scheduled_build_service_spec.rb
+++ b/spec/services/ci/run_scheduled_build_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::RunScheduledBuildService do
+RSpec.describe Ci::RunScheduledBuildService, feature_category: :continuous_integration do
let(:user) { create(:user) }
let(:project) { create(:project) }
let(:pipeline) { create(:ci_pipeline, project: project) }
diff --git a/spec/services/ci/stuck_builds/drop_pending_service_spec.rb b/spec/services/ci/stuck_builds/drop_pending_service_spec.rb
index a452a65829a..6d91f5098eb 100644
--- a/spec/services/ci/stuck_builds/drop_pending_service_spec.rb
+++ b/spec/services/ci/stuck_builds/drop_pending_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::StuckBuilds::DropPendingService do
+RSpec.describe Ci::StuckBuilds::DropPendingService, feature_category: :runner_fleet do
let_it_be(:runner) { create(:ci_runner) }
let_it_be(:pipeline) { create(:ci_empty_pipeline) }
let_it_be_with_reload(:job) do
diff --git a/spec/services/ci/stuck_builds/drop_running_service_spec.rb b/spec/services/ci/stuck_builds/drop_running_service_spec.rb
index c1c92c2b8e2..deb807753c2 100644
--- a/spec/services/ci/stuck_builds/drop_running_service_spec.rb
+++ b/spec/services/ci/stuck_builds/drop_running_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::StuckBuilds::DropRunningService do
+RSpec.describe Ci::StuckBuilds::DropRunningService, feature_category: :runner_fleet do
let!(:runner) { create :ci_runner }
let!(:job) { create(:ci_build, runner: runner, created_at: created_at, updated_at: updated_at, status: status) }
diff --git a/spec/services/ci/stuck_builds/drop_scheduled_service_spec.rb b/spec/services/ci/stuck_builds/drop_scheduled_service_spec.rb
index a4f9f97fffc..f2e658c3ae3 100644
--- a/spec/services/ci/stuck_builds/drop_scheduled_service_spec.rb
+++ b/spec/services/ci/stuck_builds/drop_scheduled_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::StuckBuilds::DropScheduledService do
+RSpec.describe Ci::StuckBuilds::DropScheduledService, feature_category: :runner_fleet do
let_it_be(:runner) { create :ci_runner }
let!(:job) { create :ci_build, :scheduled, scheduled_at: scheduled_at, runner: runner }
diff --git a/spec/services/ci/test_failure_history_service_spec.rb b/spec/services/ci/test_failure_history_service_spec.rb
index 10f6c6f5007..e77c6533483 100644
--- a/spec/services/ci/test_failure_history_service_spec.rb
+++ b/spec/services/ci/test_failure_history_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::TestFailureHistoryService, :aggregate_failures do
+RSpec.describe Ci::TestFailureHistoryService, :aggregate_failures, feature_category: :continuous_integration do
let_it_be(:project) { create(:project, :repository) }
let_it_be_with_reload(:pipeline) do
diff --git a/spec/services/ci/track_failed_build_service_spec.rb b/spec/services/ci/track_failed_build_service_spec.rb
index 676769d2fc7..23e7cee731d 100644
--- a/spec/services/ci/track_failed_build_service_spec.rb
+++ b/spec/services/ci/track_failed_build_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::TrackFailedBuildService do
+RSpec.describe Ci::TrackFailedBuildService, feature_category: :continuous_integration do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project, :public) }
let_it_be(:pipeline) { create(:ci_pipeline, project: project, user: user) }
diff --git a/spec/services/ci/unlock_artifacts_service_spec.rb b/spec/services/ci/unlock_artifacts_service_spec.rb
index c15e1cb2b5d..3aaae74ff8c 100644
--- a/spec/services/ci/unlock_artifacts_service_spec.rb
+++ b/spec/services/ci/unlock_artifacts_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::UnlockArtifactsService do
+RSpec.describe Ci::UnlockArtifactsService, feature_category: :continuous_integration do
using RSpec::Parameterized::TableSyntax
where(:tag) do
diff --git a/spec/services/ci/update_build_queue_service_spec.rb b/spec/services/ci/update_build_queue_service_spec.rb
index dd26339831c..4fd4492278d 100644
--- a/spec/services/ci/update_build_queue_service_spec.rb
+++ b/spec/services/ci/update_build_queue_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::UpdateBuildQueueService do
+RSpec.describe Ci::UpdateBuildQueueService, feature_category: :continuous_integration do
let(:project) { create(:project, :repository) }
let(:pipeline) { create(:ci_pipeline, project: project) }
let(:build) { create(:ci_build, pipeline: pipeline) }
diff --git a/spec/services/ci/update_instance_variables_service_spec.rb b/spec/services/ci/update_instance_variables_service_spec.rb
index f235d006e34..19f28793f90 100644
--- a/spec/services/ci/update_instance_variables_service_spec.rb
+++ b/spec/services/ci/update_instance_variables_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::UpdateInstanceVariablesService do
+RSpec.describe Ci::UpdateInstanceVariablesService, feature_category: :pipeline_composition do
let(:params) { { variables_attributes: variables_attributes } }
subject { described_class.new(params) }
diff --git a/spec/services/ci/update_pending_build_service_spec.rb b/spec/services/ci/update_pending_build_service_spec.rb
index e49b22299f0..abf31dd5184 100644
--- a/spec/services/ci/update_pending_build_service_spec.rb
+++ b/spec/services/ci/update_pending_build_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Ci::UpdatePendingBuildService do
+RSpec.describe Ci::UpdatePendingBuildService, feature_category: :continuous_integration do
let_it_be(:group) { create(:group) }
let_it_be(:project) { create(:project, namespace: group) }
let_it_be_with_reload(:pending_build_1) { create(:ci_pending_build, project: project, instance_runners_enabled: false) }