summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.rubocop_todo.yml31
-rw-r--r--.rubocop_todo/rails/file_path.yml145
-rw-r--r--.rubocop_todo/rails/lexically_scoped_action_filter.yml48
-rw-r--r--.rubocop_todo/rspec/any_instance_of.yml2
-rw-r--r--.rubocop_todo/rspec/context_wording.yml3925
-rw-r--r--.rubocop_todo/style/numeric_literal_prefix.yml79
-rw-r--r--.rubocop_todo/style/string_concatenation.yml336
-rw-r--r--app/assets/javascripts/header_search/components/app.vue4
-rw-r--r--app/assets/javascripts/header_search/index.js16
-rw-r--r--app/assets/stylesheets/framework/header.scss8
-rw-r--r--app/assets/stylesheets/pages/search.scss46
-rw-r--r--app/assets/stylesheets/startup/startup-dark.scss47
-rw-r--r--app/assets/stylesheets/startup/startup-general.scss47
-rw-r--r--app/graphql/mutations/ci/ci_cd_settings_update.rb37
-rw-r--r--app/graphql/mutations/ci/project_ci_cd_settings_update.rb43
-rw-r--r--app/graphql/mutations/incident_management/timeline_event/base.rb29
-rw-r--r--app/graphql/mutations/incident_management/timeline_event/create.rb37
-rw-r--r--app/graphql/mutations/incident_management/timeline_event/destroy.rb24
-rw-r--r--app/graphql/mutations/incident_management/timeline_event/promote_from_note.rb46
-rw-r--r--app/graphql/mutations/incident_management/timeline_event/update.rb33
-rw-r--r--app/graphql/resolvers/incident_management/timeline_events_resolver.rb32
-rw-r--r--app/graphql/types/incident_management/timeline_event_type.rb72
-rw-r--r--app/graphql/types/mutation_type.rb11
-rw-r--r--app/graphql/types/packages/package_base_type.rb60
-rw-r--r--app/graphql/types/packages/package_details_type.rb4
-rw-r--r--app/graphql/types/packages/package_type.rb53
-rw-r--r--app/graphql/types/project_type.rb13
-rw-r--r--app/helpers/instance_configuration_helper.rb4
-rw-r--r--app/models/instance_configuration.rb18
-rw-r--r--app/views/help/instance_configuration.html.haml1
-rw-r--r--app/views/help/instance_configuration/_ci_cd_limits.html.haml52
-rw-r--r--app/views/layouts/_header_search.html.haml2
-rw-r--r--app/views/layouts/header/_default.html.haml12
-rw-r--r--app/views/layouts/header/_new_dropdown.html.haml4
-rw-r--r--config/feature_flags/ops/certificate_based_clusters.yml2
-rw-r--r--config/metrics/counts_28d/20220510024223_p_ci_templates_jobs_sast_iac_monthly.yml26
-rw-r--r--config/metrics/counts_28d/20220510024223_p_ci_templates_security_sast_iac_monthly.yml26
-rw-r--r--config/metrics/counts_7d/20220510024437_p_ci_templates_jobs_sast_iac_weekly.yml26
-rw-r--r--config/metrics/counts_7d/20220510024437_p_ci_templates_security_sast_iac_weekly.yml26
-rw-r--r--data/deprecations/15-0-ci-cd-settings-update-mutation-renamed.yml19
-rw-r--r--data/removals/15_0/15-0-Legacy-approval-status-names-from-License-Compliance-API.yml11
-rw-r--r--data/removals/15_0/15-0-Retire-js-analyzer.yml13
-rw-r--r--data/removals/15_0/15-0-bundler-audit.yml13
-rw-r--r--data/removals/15_0/15-0-ds-default-analyzers.yml12
-rw-r--r--data/removals/15_0/15-0-sast-dotnet-21.yml33
-rw-r--r--data/removals/15_0/removal-manage-premium-required-pipelines.yml18
-rw-r--r--data/removals/15_0/removal_manage_optional_pat_expiration.yml13
-rw-r--r--data/removals/15_0/removal_manage_ssh_expiration.yml13
-rw-r--r--data/removals/15_0/removal_manage_status_check_passed_status.yml25
-rw-r--r--db/post_migrate/20220412044906_finalize_traversal_ids_background_migrations.rb2
-rw-r--r--doc/administration/gitaly/index.md131
-rw-r--r--doc/api/graphql/reference/index.md78
-rw-r--r--doc/ci/jobs/index.md2
-rw-r--r--doc/ci/pipelines/cicd_minutes.md2
-rw-r--r--doc/integration/alicloud.md4
-rw-r--r--doc/integration/auth0.md4
-rw-r--r--doc/integration/azure.md4
-rw-r--r--doc/integration/bitbucket.md4
-rw-r--r--doc/integration/cas.md4
-rw-r--r--doc/integration/ding_talk.md4
-rw-r--r--doc/integration/facebook.md4
-rw-r--r--doc/integration/github.md4
-rw-r--r--doc/integration/gitlab.md4
-rw-r--r--doc/integration/google.md4
-rw-r--r--doc/integration/oauth2_generic.md4
-rw-r--r--doc/integration/omniauth.md4
-rw-r--r--doc/integration/openid_connect_provider.md4
-rw-r--r--doc/integration/salesforce.md4
-rw-r--r--doc/integration/twitter.md4
-rw-r--r--doc/security/rate_limits.md15
-rw-r--r--doc/update/deprecations.md18
-rw-r--r--doc/update/removals.md123
-rw-r--r--doc/user/application_security/dast/index.md2
-rw-r--r--doc/user/application_security/sast/index.md2
-rw-r--r--doc/user/infrastructure/iac/troubleshooting.md38
-rw-r--r--lib/gitlab/ci/templates/Jobs/SAST-IaC.gitlab-ci.yml41
-rw-r--r--lib/gitlab/ci/templates/Qualys-IaC-Security.gitlab-ci.yml3
-rw-r--r--lib/gitlab/ci/templates/Security/SAST-IaC.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/templates/Terraform.gitlab-ci.yml21
-rw-r--r--lib/gitlab/ci/templates/Terraform.latest.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/templates/Terraform/Base.gitlab-ci.yml32
-rw-r--r--lib/gitlab/ci/templates/Terraform/Base.latest.gitlab-ci.yml10
-rw-r--r--lib/gitlab/database/migrations/background_migration_helpers.rb18
-rw-r--r--lib/gitlab/import_export/group/import_export.yml1
-rw-r--r--lib/gitlab/usage_data_counters/known_events/ci_templates.yml16
-rw-r--r--locale/gitlab.pot12
-rw-r--r--qa/qa/specs/features/api/5_package/container_registry_spec.rb2
-rw-r--r--spec/graphql/mutations/incident_management/timeline_event/create_spec.rb51
-rw-r--r--spec/graphql/mutations/incident_management/timeline_event/destroy_spec.rb66
-rw-r--r--spec/graphql/mutations/incident_management/timeline_event/promote_from_note_spec.rb85
-rw-r--r--spec/graphql/mutations/incident_management/timeline_event/update_spec.rb100
-rw-r--r--spec/graphql/resolvers/incident_management/timeline_events_resolver_spec.rb70
-rw-r--r--spec/graphql/types/incident_management/timeline_event_type_spec.rb28
-rw-r--r--spec/graphql/types/packages/package_base_type_spec.rb21
-rw-r--r--spec/graphql/types/packages/package_details_type_spec.rb13
-rw-r--r--spec/graphql/types/packages/package_type_spec.rb6
-rw-r--r--spec/graphql/types/project_type_spec.rb1
-rw-r--r--spec/helpers/instance_configuration_helper_spec.rb10
-rw-r--r--spec/lib/gitlab/ci/templates/Jobs/sast_iac_gitlab_ci_yaml_spec.rb4
-rw-r--r--spec/lib/gitlab/ci/templates/Jobs/sast_iac_latest_gitlab_ci_yaml_spec.rb65
-rw-r--r--spec/lib/gitlab/ci/templates/Terraform/base_gitlab_ci_yaml_spec.rb1
-rw-r--r--spec/lib/gitlab/ci/templates/templates_spec.rb3
-rw-r--r--spec/lib/gitlab/ci/templates/terraform_gitlab_ci_yaml_spec.rb5
-rw-r--r--spec/lib/gitlab/ci/templates/terraform_latest_gitlab_ci_yaml_spec.rb4
-rw-r--r--spec/lib/gitlab/database/migrations/background_migration_helpers_spec.rb44
-rw-r--r--spec/models/instance_configuration_spec.rb55
-rw-r--r--spec/requests/api/graphql/mutations/ci/project_ci_cd_settings_update_spec.rb (renamed from spec/requests/api/graphql/mutations/ci/ci_cd_settings_update_spec.rb)2
-rw-r--r--spec/requests/api/graphql/mutations/incident_management/timeline_event/create_spec.rb60
-rw-r--r--spec/requests/api/graphql/mutations/incident_management/timeline_event/destroy_spec.rb67
-rw-r--r--spec/requests/api/graphql/mutations/incident_management/timeline_event/promote_from_note_spec.rb62
-rw-r--r--spec/requests/api/graphql/mutations/incident_management/timeline_event/update_spec.rb80
-rw-r--r--spec/requests/api/graphql/project/incident_management/timeline_events_spec.rb127
-rw-r--r--spec/support/helpers/migrations_helpers.rb7
-rw-r--r--spec/support/shared_examples/graphql/mutations/incident_management_timeline_events_shared_examples.rb48
-rw-r--r--spec/views/help/instance_configuration.html.haml_spec.rb2
115 files changed, 7049 insertions, 268 deletions
diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml
index 178311bbc95..abe3a4faf4d 100644
--- a/.rubocop_todo.yml
+++ b/.rubocop_todo.yml
@@ -27,12 +27,6 @@ Performance/CollectionLiteralInLoop:
Performance/ConstantRegexp:
Enabled: false
-# Offense count: 15209
-# Configuration parameters: Prefixes.
-# Prefixes: when, with, without
-RSpec/ContextWording:
- Enabled: false
-
# Offense count: 1428
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
@@ -96,12 +90,6 @@ Rails/ContentTag:
Rails/CreateTableWithTimestamps:
Enabled: false
-# Offense count: 361
-# Configuration parameters: EnforcedStyle.
-# SupportedStyles: slashes, arguments
-Rails/FilePath:
- Enabled: false
-
# Offense count: 354
# Configuration parameters: Include.
# Include: app/models/**/*.rb
@@ -125,13 +113,6 @@ Rails/IndexWith:
Rails/InverseOf:
Enabled: false
-# Offense count: 62
-# Configuration parameters: Include.
-# Include: app/controllers/**/*.rb
-Rails/LexicallyScopedActionFilter:
- Enabled: false
-
-
# Offense count: 1
# Cop supports --auto-correct.
# Configuration parameters: Include.
@@ -211,13 +192,6 @@ Style/KeywordParametersOrder:
Style/Lambda:
Enabled: false
-# Offense count: 101
-# Cop supports --auto-correct.
-# Configuration parameters: EnforcedOctalStyle.
-# SupportedOctalStyles: zero_with_o, zero_only
-Style/NumericLiteralPrefix:
- Enabled: false
-
# Offense count: 279
# Cop supports --auto-correct.
Style/RedundantRegexpEscape:
@@ -232,8 +206,3 @@ Style/RescueModifier:
# Cop supports --auto-correct.
Style/SingleArgumentDig:
Enabled: false
-
-# Offense count: 562
-# Cop supports --auto-correct.
-Style/StringConcatenation:
- Enabled: false
diff --git a/.rubocop_todo/rails/file_path.yml b/.rubocop_todo/rails/file_path.yml
new file mode 100644
index 00000000000..58fa6d6255d
--- /dev/null
+++ b/.rubocop_todo/rails/file_path.yml
@@ -0,0 +1,145 @@
+---
+Rails/FilePath:
+ # Offense count: 212
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/controllers/clusters/clusters_controller.rb'
+ - 'app/controllers/help_controller.rb'
+ - 'app/helpers/startupjs_helper.rb'
+ - 'app/models/clusters/applications/cert_manager.rb'
+ - 'app/models/clusters/applications/elastic_stack.rb'
+ - 'app/models/clusters/concerns/application_data.rb'
+ - 'app/models/concerns/cross_database_modification.rb'
+ - 'app/models/release_highlight.rb'
+ - 'app/serializers/review_app_setup_entity.rb'
+ - 'app/services/clusters/aws/fetch_credentials_service.rb'
+ - 'app/services/clusters/aws/provision_service.rb'
+ - 'app/services/metrics/sample_metrics_service.rb'
+ - 'app/services/projects/readme_renderer_service.rb'
+ - 'config/environments/development.rb'
+ - 'config/initializers/1_settings.rb'
+ - 'config/initializers/7_prometheus_metrics.rb'
+ - 'config/initializers/lograge.rb'
+ - 'config/initializers_before_autoloader/001_fast_gettext.rb'
+ - 'db/migrate/20210517144856_require_snapshot_namespace.rb'
+ - 'db/post_migrate/20210630025020_migrate_push_event_payloads_event_id_back_to_integer_for_gitlab_com.rb'
+ - 'ee/app/helpers/ee/application_helper.rb'
+ - 'ee/app/services/security/security_orchestration_policies/project_create_service.rb'
+ - 'ee/db/fixtures/development/20_vulnerabilities.rb'
+ - 'ee/db/fixtures/development/21_dast_profiles.rb'
+ - 'ee/db/fixtures/development/32_compliance_report_violations.rb'
+ - 'ee/lib/ee/feature/definition.rb'
+ - 'ee/lib/ee/gitlab/usage/metric_definition.rb'
+ - 'ee/lib/generators/geo_migration/geo_migration_generator.rb'
+ - 'ee/lib/gitlab/geo/health_check.rb'
+ - 'ee/lib/tasks/gitlab/seed/metrics.rake'
+ - 'ee/spec/db/production/license_spec.rb'
+ - 'ee/spec/factories/spdx_catalogue.rb'
+ - 'ee/spec/factories/vulnerabilities/findings.rb'
+ - 'ee/spec/features/epics/update_epic_spec.rb'
+ - 'ee/spec/lib/gitlab/code_owners/file_spec.rb'
+ - 'ee/spec/lib/gitlab/spdx/catalogue_gateway_spec.rb'
+ - 'ee/spec/lib/gitlab/spdx/catalogue_spec.rb'
+ - 'ee/spec/models/geo/every_geo_event_spec.rb'
+ - 'ee/spec/models/release_highlight_spec.rb'
+ - 'ee/spec/requests/api/experiments_spec.rb'
+ - 'ee/spec/services/ee/merge_requests/refresh_service_spec.rb'
+ - 'ee/spec/support/factory_bot.rb'
+ - 'ee/spec/uploaders/every_gitlab_uploader_spec.rb'
+ - 'ee/spec/validators/json_schema_validator_spec.rb'
+ - 'lib/api/api.rb'
+ - 'lib/error_tracking/collector/payload_validator.rb'
+ - 'lib/feature/definition.rb'
+ - 'lib/gitlab/ci/reports/codequality_reports.rb'
+ - 'lib/gitlab/database/migrations/runner.rb'
+ - 'lib/gitlab/favicon.rb'
+ - 'lib/gitlab/feature_categories.rb'
+ - 'lib/gitlab/graphql/queries.rb'
+ - 'lib/gitlab/language_data.rb'
+ - 'lib/gitlab/metrics/exporter/base_exporter.rb'
+ - 'lib/gitlab/middleware/multipart.rb'
+ - 'lib/gitlab/profiler.rb'
+ - 'lib/gitlab/robots_txt.rb'
+ - 'lib/gitlab/setup_helper.rb'
+ - 'lib/gitlab/sidekiq_config.rb'
+ - 'lib/gitlab/tracking/event_definition.rb'
+ - 'lib/gitlab/usage/metric_definition.rb'
+ - 'lib/pager_duty/webhook_payload_parser.rb'
+ - 'lib/system_check/app/database_config_exists_check.rb'
+ - 'lib/system_check/app/gitlab_config_exists_check.rb'
+ - 'lib/system_check/app/gitlab_config_up_to_date_check.rb'
+ - 'lib/system_check/app/systemd_unit_files_or_init_script_up_to_date_check.rb'
+ - 'lib/system_check/app/uploads_directory_exists_check.rb'
+ - 'lib/system_check/incoming_email/imap_authentication_check.rb'
+ - 'lib/tasks/gitlab/metrics_exporter.rake'
+ - 'lib/tasks/tanuki_emoji.rake'
+ - 'metrics_server/metrics_server.rb'
+ - 'spec/commands/metrics_server/metrics_server_spec.rb'
+ - 'spec/config/object_store_settings_spec.rb'
+ - 'spec/controllers/help_controller_spec.rb'
+ - 'spec/db/development/create_base_work_item_types_spec.rb'
+ - 'spec/db/development/import_common_metrics_spec.rb'
+ - 'spec/db/production/create_base_work_item_types_spec.rb'
+ - 'spec/db/production/import_common_metrics_spec.rb'
+ - 'spec/db/schema_spec.rb'
+ - 'spec/factories/design_management/designs.rb'
+ - 'spec/factories/design_management/versions.rb'
+ - 'spec/factories/error_tracking/error_event.rb'
+ - 'spec/factories/file_uploaders.rb'
+ - 'spec/factories/packages/debian/distribution_key.rb'
+ - 'spec/factories/pages_domains.rb'
+ - 'spec/factories/serverless/domain_cluster.rb'
+ - 'spec/features/admin/admin_appearance_spec.rb'
+ - 'spec/features/groups/group_settings_spec.rb'
+ - 'spec/features/groups/import_export/import_file_spec.rb'
+ - 'spec/features/help_pages_spec.rb'
+ - 'spec/features/issues/user_creates_issue_spec.rb'
+ - 'spec/features/profiles/user_edit_profile_spec.rb'
+ - 'spec/features/projects/files/user_replaces_files_spec.rb'
+ - 'spec/features/projects/import_export/import_file_spec.rb'
+ - 'spec/features/projects/issues/design_management/user_uploads_designs_spec.rb'
+ - 'spec/features/projects/issues/design_management/user_views_designs_with_svg_xss_spec.rb'
+ - 'spec/features/projects/settings/repository_settings_spec.rb'
+ - 'spec/features/projects/settings/user_changes_avatar_spec.rb'
+ - 'spec/features/projects/snippets/create_snippet_spec.rb'
+ - 'spec/features/projects/tags/user_edits_tags_spec.rb'
+ - 'spec/features/projects/tree/upload_file_spec.rb'
+ - 'spec/features/refactor_blob_viewer_disabled/projects/files/user_replaces_files_spec.rb'
+ - 'spec/features/snippets/user_creates_snippet_spec.rb'
+ - 'spec/features/snippets/user_edits_snippet_spec.rb'
+ - 'spec/features/uploads/user_uploads_avatar_to_group_spec.rb'
+ - 'spec/features/uploads/user_uploads_avatar_to_profile_spec.rb'
+ - 'spec/features/uploads/user_uploads_file_to_note_spec.rb'
+ - 'spec/helpers/blob_helper_spec.rb'
+ - 'spec/helpers/startupjs_helper_spec.rb'
+ - 'spec/lib/backup/database_spec.rb'
+ - 'spec/lib/gitlab/background_migration/fix_first_mentioned_in_commit_at_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/security/validators/schema_validator_spec.rb'
+ - 'spec/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_base_spec.rb'
+ - 'spec/lib/gitlab/database/schema_migrations/context_spec.rb'
+ - 'spec/lib/gitlab/feature_categories_spec.rb'
+ - 'spec/lib/gitlab/file_hook_spec.rb'
+ - 'spec/lib/gitlab/http_spec.rb'
+ - 'spec/lib/gitlab/jwt_authenticatable_spec.rb'
+ - 'spec/lib/gitlab/mail_room/mail_room_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/finder_spec.rb'
+ - 'spec/lib/gitlab/middleware/multipart/handler_spec.rb'
+ - 'spec/lib/gitlab/project_transfer_spec.rb'
+ - 'spec/lib/gitlab/sanitizers/svg_spec.rb'
+ - 'spec/metrics_server/metrics_server_spec.rb'
+ - 'spec/models/clusters/applications/cert_manager_spec.rb'
+ - 'spec/models/release_highlight_spec.rb'
+ - 'spec/requests/api/internal/mail_room_spec.rb'
+ - 'spec/serializers/review_app_setup_entity_spec.rb'
+ - 'spec/services/clusters/aws/fetch_credentials_service_spec.rb'
+ - 'spec/services/clusters/aws/provision_service_spec.rb'
+ - 'spec/services/metrics/sample_metrics_service_spec.rb'
+ - 'spec/support/helpers/test_env.rb'
+ - 'spec/support/helpers/upload_helpers.rb'
+ - 'spec/support/shared_examples/features/project_upload_files_shared_examples.rb'
+ - 'spec/support/shared_examples/features/wiki/file_attachments_shared_examples.rb'
+ - 'spec/support/shared_examples/models/application_setting_shared_examples.rb'
+ - 'spec/support/shared_examples/models/wiki_shared_examples.rb'
+ - 'spec/tasks/gitlab/db_rake_spec.rb'
+ - 'spec/tasks/gitlab/generate_sample_prometheus_data_spec.rb'
diff --git a/.rubocop_todo/rails/lexically_scoped_action_filter.yml b/.rubocop_todo/rails/lexically_scoped_action_filter.yml
new file mode 100644
index 00000000000..84b85f76c68
--- /dev/null
+++ b/.rubocop_todo/rails/lexically_scoped_action_filter.yml
@@ -0,0 +1,48 @@
+---
+Rails/LexicallyScopedActionFilter:
+ # Offense count: 73
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/controllers/admin/groups_controller.rb'
+ - 'app/controllers/clusters/base_controller.rb'
+ - 'app/controllers/clusters/clusters_controller.rb'
+ - 'app/controllers/concerns/enforces_two_factor_authentication.rb'
+ - 'app/controllers/concerns/integrations/actions.rb'
+ - 'app/controllers/concerns/multiple_boards_actions.rb'
+ - 'app/controllers/concerns/oauth_applications.rb'
+ - 'app/controllers/concerns/spammable_actions/captcha_check/html_format_actions_support.rb'
+ - 'app/controllers/confirmations_controller.rb'
+ - 'app/controllers/dashboard_controller.rb'
+ - 'app/controllers/groups/group_members_controller.rb'
+ - 'app/controllers/groups/milestones_controller.rb'
+ - 'app/controllers/groups/runners_controller.rb'
+ - 'app/controllers/groups/uploads_controller.rb'
+ - 'app/controllers/groups_controller.rb'
+ - 'app/controllers/import/base_controller.rb'
+ - 'app/controllers/oauth/applications_controller.rb'
+ - 'app/controllers/passwords_controller.rb'
+ - 'app/controllers/projects/badges_controller.rb'
+ - 'app/controllers/projects/branches_controller.rb'
+ - 'app/controllers/projects/environments_controller.rb'
+ - 'app/controllers/projects/incidents_controller.rb'
+ - 'app/controllers/projects/issue_links_controller.rb'
+ - 'app/controllers/projects/issues_controller.rb'
+ - 'app/controllers/projects/labels_controller.rb'
+ - 'app/controllers/projects/merge_requests_controller.rb'
+ - 'app/controllers/projects/milestones_controller.rb'
+ - 'app/controllers/projects/notes_controller.rb'
+ - 'app/controllers/projects/pipelines_controller.rb'
+ - 'app/controllers/projects/project_members_controller.rb'
+ - 'app/controllers/projects/prometheus/alerts_controller.rb'
+ - 'app/controllers/projects/releases_controller.rb'
+ - 'app/controllers/projects/service_hook_logs_controller.rb'
+ - 'app/controllers/projects/snippets_controller.rb'
+ - 'app/controllers/projects/tags_controller.rb'
+ - 'app/controllers/projects/todos_controller.rb'
+ - 'app/controllers/projects/tree_controller.rb'
+ - 'app/controllers/projects/uploads_controller.rb'
+ - 'app/controllers/snippets/blobs_controller.rb'
+ - 'app/controllers/snippets/notes_controller.rb'
+ - 'app/controllers/snippets_controller.rb'
+ - 'app/controllers/uploads_controller.rb'
diff --git a/.rubocop_todo/rspec/any_instance_of.yml b/.rubocop_todo/rspec/any_instance_of.yml
index 55d2627402c..f4edf741d89 100644
--- a/.rubocop_todo/rspec/any_instance_of.yml
+++ b/.rubocop_todo/rspec/any_instance_of.yml
@@ -229,11 +229,9 @@ RSpec/AnyInstanceOf:
- spec/lib/gitlab/ci/templates/Jobs/code_quality_gitlab_ci_yaml_spec.rb
- spec/lib/gitlab/ci/templates/Jobs/deploy_gitlab_ci_yaml_spec.rb
- spec/lib/gitlab/ci/templates/Jobs/test_gitlab_ci_yaml_spec.rb
- - spec/lib/gitlab/ci/templates/Terraform/base_gitlab_ci_yaml_spec.rb
- spec/lib/gitlab/ci/templates/Verify/load_performance_testing_gitlab_ci_yaml_spec.rb
- spec/lib/gitlab/ci/templates/auto_devops_gitlab_ci_yaml_spec.rb
- spec/lib/gitlab/ci/templates/npm_spec.rb
- - spec/lib/gitlab/ci/templates/terraform_latest_gitlab_ci_yaml_spec.rb
- spec/lib/gitlab/ci/trace_spec.rb
- spec/lib/gitlab/current_settings_spec.rb
- spec/lib/gitlab/cycle_analytics/base_event_fetcher_spec.rb
diff --git a/.rubocop_todo/rspec/context_wording.yml b/.rubocop_todo/rspec/context_wording.yml
new file mode 100644
index 00000000000..8734fca753f
--- /dev/null
+++ b/.rubocop_todo/rspec/context_wording.yml
@@ -0,0 +1,3925 @@
+---
+RSpec/ContextWording:
+ # Offense count: 18360
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'ee/spec/controllers/admin/application_settings_controller_spec.rb'
+ - 'ee/spec/controllers/admin/audit_logs_controller_spec.rb'
+ - 'ee/spec/controllers/admin/dev_ops_report_controller_spec.rb'
+ - 'ee/spec/controllers/admin/emails_controller_spec.rb'
+ - 'ee/spec/controllers/admin/geo/projects_controller_spec.rb'
+ - 'ee/spec/controllers/admin/licenses_controller_spec.rb'
+ - 'ee/spec/controllers/admin/push_rules_controller_spec.rb'
+ - 'ee/spec/controllers/admin/users_controller_spec.rb'
+ - 'ee/spec/controllers/autocomplete_controller_spec.rb'
+ - 'ee/spec/controllers/boards/lists_controller_spec.rb'
+ - 'ee/spec/controllers/dashboard_controller_spec.rb'
+ - 'ee/spec/controllers/ee/dashboard/projects_controller_spec.rb'
+ - 'ee/spec/controllers/ee/groups/variables_controller_spec.rb'
+ - 'ee/spec/controllers/ee/groups_controller_spec.rb'
+ - 'ee/spec/controllers/ee/profiles/preferences_controller_spec.rb'
+ - 'ee/spec/controllers/ee/projects/jobs_controller_spec.rb'
+ - 'ee/spec/controllers/ee/projects/merge_requests/content_controller_spec.rb'
+ - 'ee/spec/controllers/ee/registrations_controller_spec.rb'
+ - 'ee/spec/controllers/ee/root_controller_spec.rb'
+ - 'ee/spec/controllers/ee/search_controller_spec.rb'
+ - 'ee/spec/controllers/ee/sent_notifications_controller_spec.rb'
+ - 'ee/spec/controllers/ee/sessions_controller_spec.rb'
+ - 'ee/spec/controllers/groups/analytics/cycle_analytics_controller_spec.rb'
+ - 'ee/spec/controllers/groups/analytics/productivity_analytics_controller_spec.rb'
+ - 'ee/spec/controllers/groups/audit_events_controller_spec.rb'
+ - 'ee/spec/controllers/groups/billings_controller_spec.rb'
+ - 'ee/spec/controllers/groups/boards_controller_spec.rb'
+ - 'ee/spec/controllers/groups/dependency_proxy_for_containers_controller_spec.rb'
+ - 'ee/spec/controllers/groups/epic_boards_controller_spec.rb'
+ - 'ee/spec/controllers/groups/epics/notes_controller_spec.rb'
+ - 'ee/spec/controllers/groups/epics_controller_spec.rb'
+ - 'ee/spec/controllers/groups/group_members_controller_spec.rb'
+ - 'ee/spec/controllers/groups/groups_controller_spec.rb'
+ - 'ee/spec/controllers/groups/hooks_controller_spec.rb'
+ - 'ee/spec/controllers/groups/omniauth_callbacks_controller_spec.rb'
+ - 'ee/spec/controllers/groups/push_rules_controller_spec.rb'
+ - 'ee/spec/controllers/groups/saml_providers_controller_spec.rb'
+ - 'ee/spec/controllers/groups/scim_oauth_controller_spec.rb'
+ - 'ee/spec/controllers/groups/security/compliance_dashboards_controller_spec.rb'
+ - 'ee/spec/controllers/groups/security/dashboard_controller_spec.rb'
+ - 'ee/spec/controllers/groups/security/merge_commit_reports_controller_spec.rb'
+ - 'ee/spec/controllers/groups/security/vulnerabilities_controller_spec.rb'
+ - 'ee/spec/controllers/groups/sso_controller_spec.rb'
+ - 'ee/spec/controllers/ldap/omniauth_callbacks_controller_spec.rb'
+ - 'ee/spec/controllers/oauth/applications_controller_spec.rb'
+ - 'ee/spec/controllers/oauth/geo_auth_controller_spec.rb'
+ - 'ee/spec/controllers/operations_controller_spec.rb'
+ - 'ee/spec/controllers/profiles_controller_spec.rb'
+ - 'ee/spec/controllers/projects/approver_groups_controller_spec.rb'
+ - 'ee/spec/controllers/projects/approvers_controller_spec.rb'
+ - 'ee/spec/controllers/projects/audit_events_controller_spec.rb'
+ - 'ee/spec/controllers/projects/boards_controller_spec.rb'
+ - 'ee/spec/controllers/projects/branches_controller_spec.rb'
+ - 'ee/spec/controllers/projects/environments_controller_spec.rb'
+ - 'ee/spec/controllers/projects/imports_controller_spec.rb'
+ - 'ee/spec/controllers/projects/incident_management/escalation_policies_controller_spec.rb'
+ - 'ee/spec/controllers/projects/incident_management/oncall_schedules_controller_spec.rb'
+ - 'ee/spec/controllers/projects/integrations/jira/issues_controller_spec.rb'
+ - 'ee/spec/controllers/projects/integrations/zentao/issues_controller_spec.rb'
+ - 'ee/spec/controllers/projects/issues_controller_spec.rb'
+ - 'ee/spec/controllers/projects/legacy_pipelines_controller_spec.rb'
+ - 'ee/spec/controllers/projects/merge_requests/creations_controller_spec.rb'
+ - 'ee/spec/controllers/projects/merge_requests_controller_spec.rb'
+ - 'ee/spec/controllers/projects/mirrors_controller_spec.rb'
+ - 'ee/spec/controllers/projects/pipelines_controller_spec.rb'
+ - 'ee/spec/controllers/projects/push_rules_controller_spec.rb'
+ - 'ee/spec/controllers/projects/requirements_management/requirements_controller_spec.rb'
+ - 'ee/spec/controllers/projects/settings/integrations_controller_spec.rb'
+ - 'ee/spec/controllers/projects/settings/operations_controller_spec.rb'
+ - 'ee/spec/controllers/projects/settings/repository_controller_spec.rb'
+ - 'ee/spec/controllers/projects/vulnerability_feedback_controller_spec.rb'
+ - 'ee/spec/controllers/projects_controller_spec.rb'
+ - 'ee/spec/controllers/registrations/company_controller_spec.rb'
+ - 'ee/spec/controllers/registrations/groups_projects_controller_spec.rb'
+ - 'ee/spec/controllers/registrations/welcome_controller_spec.rb'
+ - 'ee/spec/controllers/repositories/git_http_controller_spec.rb'
+ - 'ee/spec/controllers/security/dashboard_controller_spec.rb'
+ - 'ee/spec/controllers/security/projects_controller_spec.rb'
+ - 'ee/spec/controllers/security/vulnerabilities_controller_spec.rb'
+ - 'ee/spec/controllers/subscriptions_controller_spec.rb'
+ - 'ee/spec/controllers/trial_registrations_controller_spec.rb'
+ - 'ee/spec/controllers/trials_controller_spec.rb'
+ - 'ee/spec/controllers/users_controller_spec.rb'
+ - 'ee/spec/elastic/migrate/migration_shared_examples.rb'
+ - 'ee/spec/elastic_integration/global_search_spec.rb'
+ - 'ee/spec/features/admin/admin_audit_logs_spec.rb'
+ - 'ee/spec/features/admin/admin_credentials_inventory_spec.rb'
+ - 'ee/spec/features/admin/admin_dashboard_spec.rb'
+ - 'ee/spec/features/admin/admin_dev_ops_reports_spec.rb'
+ - 'ee/spec/features/admin/admin_settings_spec.rb'
+ - 'ee/spec/features/admin/geo/admin_geo_nodes_spec.rb'
+ - 'ee/spec/features/admin/geo/admin_geo_sidebar_spec.rb'
+ - 'ee/spec/features/admin/groups/admin_subscription_alerts_spec.rb'
+ - 'ee/spec/features/admin/licenses/admin_adds_license_spec.rb'
+ - 'ee/spec/features/admin/licenses/show_user_count_threshold_spec.rb'
+ - 'ee/spec/features/analytics/code_analytics_spec.rb'
+ - 'ee/spec/features/billings/billing_plans_spec.rb'
+ - 'ee/spec/features/boards/boards_licensed_features_spec.rb'
+ - 'ee/spec/features/boards/boards_spec.rb'
+ - 'ee/spec/features/boards/new_issue_spec.rb'
+ - 'ee/spec/features/boards/scoped_issue_board_spec.rb'
+ - 'ee/spec/features/boards/sidebar_spec.rb'
+ - 'ee/spec/features/boards/swimlanes/epics_swimlanes_drag_drop_spec.rb'
+ - 'ee/spec/features/boards/swimlanes/epics_swimlanes_filtering_spec.rb'
+ - 'ee/spec/features/boards/swimlanes/epics_swimlanes_sidebar_labels_spec.rb'
+ - 'ee/spec/features/boards/swimlanes/epics_swimlanes_sidebar_spec.rb'
+ - 'ee/spec/features/boards/swimlanes/epics_swimlanes_spec.rb'
+ - 'ee/spec/features/boards/user_visits_board_spec.rb'
+ - 'ee/spec/features/discussion_comments/epic_quick_actions_spec.rb'
+ - 'ee/spec/features/epic_boards/epic_boards_sidebar_spec.rb'
+ - 'ee/spec/features/epic_boards/epic_boards_spec.rb'
+ - 'ee/spec/features/epic_boards/multiple_epic_boards_spec.rb'
+ - 'ee/spec/features/epic_boards/new_epic_spec.rb'
+ - 'ee/spec/features/epics/epic_issues_spec.rb'
+ - 'ee/spec/features/epics/epics_list_spec.rb'
+ - 'ee/spec/features/epics/gfm_autocomplete_spec.rb'
+ - 'ee/spec/features/epics/issue_promotion_spec.rb'
+ - 'ee/spec/features/epics/referencing_epics_spec.rb'
+ - 'ee/spec/features/epics/update_epic_spec.rb'
+ - 'ee/spec/features/epics/user_uses_quick_actions_spec.rb'
+ - 'ee/spec/features/geo_node_spec.rb'
+ - 'ee/spec/features/google_analytics_datalayer_spec.rb'
+ - 'ee/spec/features/groups/active_tabs_spec.rb'
+ - 'ee/spec/features/groups/analytics/cycle_analytics/charts_spec.rb'
+ - 'ee/spec/features/groups/analytics/cycle_analytics/filters_and_data_spec.rb'
+ - 'ee/spec/features/groups/analytics/cycle_analytics/multiple_value_streams_spec.rb'
+ - 'ee/spec/features/groups/audit_events_spec.rb'
+ - 'ee/spec/features/groups/group_overview_spec.rb'
+ - 'ee/spec/features/groups/group_roadmap_spec.rb'
+ - 'ee/spec/features/groups/group_settings_spec.rb'
+ - 'ee/spec/features/groups/groups_security_credentials_spec.rb'
+ - 'ee/spec/features/groups/issues_spec.rb'
+ - 'ee/spec/features/groups/iteration_spec.rb'
+ - 'ee/spec/features/groups/iterations/iterations_list_spec.rb'
+ - 'ee/spec/features/groups/iterations/user_edits_iteration_cadence_spec.rb'
+ - 'ee/spec/features/groups/iterations/user_edits_iteration_spec.rb'
+ - 'ee/spec/features/groups/ldap_group_links_spec.rb'
+ - 'ee/spec/features/groups/members/manage_groups_spec.rb'
+ - 'ee/spec/features/groups/members/manage_members_spec.rb'
+ - 'ee/spec/features/groups/push_rules_spec.rb'
+ - 'ee/spec/features/groups/saml_enforcement_spec.rb'
+ - 'ee/spec/features/groups/saml_providers_spec.rb'
+ - 'ee/spec/features/groups/seat_usage/seat_usage_spec.rb'
+ - 'ee/spec/features/groups/security/compliance_dashboards_spec.rb'
+ - 'ee/spec/features/groups/settings/user_searches_in_settings_spec.rb'
+ - 'ee/spec/features/groups/sso_spec.rb'
+ - 'ee/spec/features/groups/usage_quotas_spec.rb'
+ - 'ee/spec/features/groups/wiki/user_views_wiki_empty_spec.rb'
+ - 'ee/spec/features/groups_spec.rb'
+ - 'ee/spec/features/ide/user_opens_ide_spec.rb'
+ - 'ee/spec/features/incidents/incident_details_spec.rb'
+ - 'ee/spec/features/integrations/jira/jira_issues_list_spec.rb'
+ - 'ee/spec/features/issues/epic_in_issue_sidebar_spec.rb'
+ - 'ee/spec/features/issues/filtered_search/filter_issues_by_iteration_spec.rb'
+ - 'ee/spec/features/issues/form_spec.rb'
+ - 'ee/spec/features/issues/gfm_autocomplete_ee_spec.rb'
+ - 'ee/spec/features/issues/issue_sidebar_spec.rb'
+ - 'ee/spec/features/issues/user_bulk_edits_issues_spec.rb'
+ - 'ee/spec/features/labels_hierarchy_spec.rb'
+ - 'ee/spec/features/markdown/markdown_spec.rb'
+ - 'ee/spec/features/markdown/metrics_spec.rb'
+ - 'ee/spec/features/merge_request/merge_request_widget_blocking_mrs_spec.rb'
+ - 'ee/spec/features/merge_request/user_approves_spec.rb'
+ - 'ee/spec/features/merge_request/user_creates_merge_request_with_blocking_mrs_spec.rb'
+ - 'ee/spec/features/merge_request/user_edits_approval_rules_mr_spec.rb'
+ - 'ee/spec/features/merge_request/user_edits_merge_request_blocking_mrs_spec.rb'
+ - 'ee/spec/features/merge_request/user_edits_multiple_reviewers_mr_spec.rb'
+ - 'ee/spec/features/merge_request/user_merges_with_push_rules_spec.rb'
+ - 'ee/spec/features/merge_request/user_sees_approval_widget_spec.rb'
+ - 'ee/spec/features/merge_request/user_sees_closing_issues_message_spec.rb'
+ - 'ee/spec/features/merge_request/user_sees_status_checks_widget_spec.rb'
+ - 'ee/spec/features/merge_request/user_selects_branches_for_new_mr_spec.rb'
+ - 'ee/spec/features/merge_request/user_sets_approvers_spec.rb'
+ - 'ee/spec/features/merge_request/user_views_blocked_merge_request_spec.rb'
+ - 'ee/spec/features/merge_requests/user_filters_by_approvers_spec.rb'
+ - 'ee/spec/features/oncall_schedules/user_creates_schedule_spec.rb'
+ - 'ee/spec/features/profiles/account_spec.rb'
+ - 'ee/spec/features/projects/active_tabs_spec.rb'
+ - 'ee/spec/features/projects/audit_events_spec.rb'
+ - 'ee/spec/features/projects/custom_projects_template_spec.rb'
+ - 'ee/spec/features/projects/issues/user_creates_issue_spec.rb'
+ - 'ee/spec/features/projects/iterations/iteration_cadences_list_spec.rb'
+ - 'ee/spec/features/projects/iterations/iterations_list_spec.rb'
+ - 'ee/spec/features/projects/iterations/user_views_iteration_spec.rb'
+ - 'ee/spec/features/projects/jobs_spec.rb'
+ - 'ee/spec/features/projects/kerberos_clone_instructions_spec.rb'
+ - 'ee/spec/features/projects/members/invite_group_and_members_spec.rb'
+ - 'ee/spec/features/projects/members/member_leaves_project_spec.rb'
+ - 'ee/spec/features/projects/milestones/milestone_spec.rb'
+ - 'ee/spec/features/projects/new_project_from_template_spec.rb'
+ - 'ee/spec/features/projects/new_project_spec.rb'
+ - 'ee/spec/features/projects/pipelines/pipeline_spec.rb'
+ - 'ee/spec/features/projects/push_rules_spec.rb'
+ - 'ee/spec/features/projects/quality/test_case_create_spec.rb'
+ - 'ee/spec/features/projects/quality/test_case_list_spec.rb'
+ - 'ee/spec/features/projects/quality/test_case_show_spec.rb'
+ - 'ee/spec/features/projects/requirements_management/requirements_list_spec.rb'
+ - 'ee/spec/features/projects/security/user_views_security_configuration_spec.rb'
+ - 'ee/spec/features/projects/settings/ee/repository_mirrors_settings_spec.rb'
+ - 'ee/spec/features/projects/settings/issues_settings_spec.rb'
+ - 'ee/spec/features/projects/settings/merge_requests_settings_spec.rb'
+ - 'ee/spec/features/projects/settings/protected_environments_spec.rb'
+ - 'ee/spec/features/projects/settings/push_rules_settings_spec.rb'
+ - 'ee/spec/features/projects/settings/user_manages_members_spec.rb'
+ - 'ee/spec/features/projects/show_project_spec.rb'
+ - 'ee/spec/features/promotion_spec.rb'
+ - 'ee/spec/features/protected_branches_spec.rb'
+ - 'ee/spec/features/registrations/saas_user_registration_spec.rb'
+ - 'ee/spec/features/registrations/welcome_spec.rb'
+ - 'ee/spec/features/search/elastic/global_search_spec.rb'
+ - 'ee/spec/features/search/elastic/snippet_search_spec.rb'
+ - 'ee/spec/features/security/project/snippet/internal_access_spec.rb'
+ - 'ee/spec/features/security/project/snippet/public_access_spec.rb'
+ - 'ee/spec/features/signup_spec.rb'
+ - 'ee/spec/features/subscriptions/expiring_subscription_message_spec.rb'
+ - 'ee/spec/features/trial_registrations/company_information_spec.rb'
+ - 'ee/spec/features/trials/select_namespace_spec.rb'
+ - 'ee/spec/features/users/login_spec.rb'
+ - 'ee/spec/features/users/signup_spec.rb'
+ - 'ee/spec/finders/audit_log_finder_spec.rb'
+ - 'ee/spec/finders/autocomplete/vulnerabilities_autocomplete_finder_spec.rb'
+ - 'ee/spec/finders/billed_users_finder_spec.rb'
+ - 'ee/spec/finders/clusters/environments_finder_spec.rb'
+ - 'ee/spec/finders/compliance_management/merge_requests/compliance_violations_finder_spec.rb'
+ - 'ee/spec/finders/custom_project_templates_finder_spec.rb'
+ - 'ee/spec/finders/dast/profiles_finder_spec.rb'
+ - 'ee/spec/finders/dast_scanner_profiles_finder_spec.rb'
+ - 'ee/spec/finders/dast_site_profiles_finder_spec.rb'
+ - 'ee/spec/finders/dast_site_validations_finder_spec.rb'
+ - 'ee/spec/finders/ee/alert_management/alerts_finder_spec.rb'
+ - 'ee/spec/finders/ee/alert_management/http_integrations_finder_spec.rb'
+ - 'ee/spec/finders/ee/clusters/agent_authorizations_finder_spec.rb'
+ - 'ee/spec/finders/ee/group_members_finder_spec.rb'
+ - 'ee/spec/finders/ee/namespaces/projects_finder_spec.rb'
+ - 'ee/spec/finders/ee/projects_finder_spec.rb'
+ - 'ee/spec/finders/ee/user_recent_events_finder_spec.rb'
+ - 'ee/spec/finders/epics_finder_spec.rb'
+ - 'ee/spec/finders/geo_node_finder_spec.rb'
+ - 'ee/spec/finders/group_projects_finder_spec.rb'
+ - 'ee/spec/finders/incident_management/member_oncall_rotations_finder_spec.rb'
+ - 'ee/spec/finders/incident_management/oncall_rotations_finder_spec.rb'
+ - '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/merge_requests/by_approvers_finder_spec.rb'
+ - 'ee/spec/finders/merge_requests_finder_spec.rb'
+ - 'ee/spec/finders/productivity_analytics_finder_spec.rb'
+ - 'ee/spec/finders/scim_finder_spec.rb'
+ - 'ee/spec/finders/security/findings_finder_spec.rb'
+ - 'ee/spec/finders/security/pipeline_vulnerabilities_finder_spec.rb'
+ - 'ee/spec/finders/security/training_providers/base_url_finder_spec.rb'
+ - 'ee/spec/finders/security/training_urls_finder_spec.rb'
+ - 'ee/spec/finders/security/vulnerabilities_finder_spec.rb'
+ - 'ee/spec/finders/security/vulnerability_reads_finder_spec.rb'
+ - 'ee/spec/finders/snippets_finder_spec.rb'
+ - 'ee/spec/finders/software_license_policies_finder_spec.rb'
+ - 'ee/spec/finders/status_page/incidents_finder_spec.rb'
+ - 'ee/spec/finders/template_finder_spec.rb'
+ - 'ee/spec/frontend/fixtures/dast_profiles.rb'
+ - 'ee/spec/frontend/fixtures/on_demand_dast_scans.rb'
+ - 'ee/spec/frontend/fixtures/projects.rb'
+ - 'ee/spec/frontend/fixtures/search.rb'
+ - 'ee/spec/graphql/ee/resolvers/board_list_issues_resolver_spec.rb'
+ - 'ee/spec/graphql/ee/resolvers/namespace_projects_resolver_spec.rb'
+ - 'ee/spec/graphql/ee/types/projects/service_type_enum_spec.rb'
+ - 'ee/spec/graphql/mutations/boards/epic_boards/create_spec.rb'
+ - 'ee/spec/graphql/mutations/boards/epic_boards/destroy_spec.rb'
+ - 'ee/spec/graphql/mutations/boards/epic_boards/epic_move_list_spec.rb'
+ - 'ee/spec/graphql/mutations/boards/epic_boards/update_spec.rb'
+ - 'ee/spec/graphql/mutations/boards/epic_lists/update_spec.rb'
+ - 'ee/spec/graphql/mutations/boards/epics/create_spec.rb'
+ - 'ee/spec/graphql/mutations/compliance_management/frameworks/create_spec.rb'
+ - 'ee/spec/graphql/mutations/compliance_management/frameworks/destroy_spec.rb'
+ - 'ee/spec/graphql/mutations/compliance_management/frameworks/update_spec.rb'
+ - 'ee/spec/graphql/mutations/incident_management/escalation_policy/create_spec.rb'
+ - 'ee/spec/graphql/mutations/incident_management/escalation_policy/destroy_spec.rb'
+ - 'ee/spec/graphql/mutations/incident_management/escalation_policy/update_spec.rb'
+ - 'ee/spec/graphql/mutations/incident_management/oncall_rotation/create_spec.rb'
+ - 'ee/spec/graphql/mutations/incident_management/oncall_rotation/destroy_spec.rb'
+ - 'ee/spec/graphql/mutations/incident_management/oncall_rotation/update_spec.rb'
+ - 'ee/spec/graphql/mutations/incident_management/oncall_schedule/create_spec.rb'
+ - 'ee/spec/graphql/mutations/incident_management/oncall_schedule/destroy_spec.rb'
+ - 'ee/spec/graphql/mutations/incident_management/oncall_schedule/update_spec.rb'
+ - 'ee/spec/graphql/mutations/issues/create_spec.rb'
+ - 'ee/spec/graphql/mutations/issues/update_spec.rb'
+ - 'ee/spec/graphql/mutations/projects/set_compliance_framework_spec.rb'
+ - 'ee/spec/graphql/mutations/releases/update_spec.rb'
+ - 'ee/spec/graphql/mutations/security_policy/assign_security_policy_project_spec.rb'
+ - 'ee/spec/graphql/mutations/security_policy/commit_scan_execution_policy_spec.rb'
+ - 'ee/spec/graphql/mutations/security_policy/create_security_policy_project_spec.rb'
+ - 'ee/spec/graphql/mutations/security_policy/unassign_security_policy_project_spec.rb'
+ - 'ee/spec/graphql/mutations/vulnerabilities/create_external_issue_link_spec.rb'
+ - 'ee/spec/graphql/resolvers/admin/cloud_licenses/subscription_future_entries_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/analytics/devops_adoption/enabled_namespaces_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/boards/board_list_epics_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/compliance_management/merge_requests/compliance_violation_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/epics_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/incident_management/oncall_schedule_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/instance_security_dashboard/projects_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/iterations/cadences_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/iterations_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/path_locks_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/requirements_management/requirements_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/security_report_summary_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/vulnerabilities_resolver_spec.rb'
+ - 'ee/spec/graphql/types/global_id_type_spec.rb'
+ - 'ee/spec/graphql/types/incident_management/escalation_rule_input_type_spec.rb'
+ - 'ee/spec/graphql/types/issue_type_spec.rb'
+ - 'ee/spec/graphql/types/project_type_spec.rb'
+ - 'ee/spec/graphql/types/vulnerability_request_response_header_type_spec.rb'
+ - 'ee/spec/graphql/types/vulnerability_request_type_spec.rb'
+ - 'ee/spec/graphql/types/vulnerability_response_type_spec.rb'
+ - 'ee/spec/graphql/types/vulnerability_type_spec.rb'
+ - 'ee/spec/helpers/application_helper_spec.rb'
+ - 'ee/spec/helpers/boards_helper_spec.rb'
+ - 'ee/spec/helpers/compliance_management/compliance_framework/group_settings_helper_spec.rb'
+ - 'ee/spec/helpers/ee/application_settings_helper_spec.rb'
+ - 'ee/spec/helpers/ee/auth_helper_spec.rb'
+ - 'ee/spec/helpers/ee/dashboard_helper_spec.rb'
+ - 'ee/spec/helpers/ee/environments_helper_spec.rb'
+ - 'ee/spec/helpers/ee/events_helper_spec.rb'
+ - 'ee/spec/helpers/ee/gitlab_routing_helper_spec.rb'
+ - 'ee/spec/helpers/ee/groups_helper_spec.rb'
+ - 'ee/spec/helpers/ee/integrations_helper_spec.rb'
+ - 'ee/spec/helpers/ee/issuables_helper_spec.rb'
+ - 'ee/spec/helpers/ee/issues_helper_spec.rb'
+ - 'ee/spec/helpers/ee/learn_gitlab_helper_spec.rb'
+ - 'ee/spec/helpers/ee/lock_helper_spec.rb'
+ - 'ee/spec/helpers/ee/namespaces_helper_spec.rb'
+ - 'ee/spec/helpers/ee/operations_helper_spec.rb'
+ - 'ee/spec/helpers/ee/personal_access_tokens_helper_spec.rb'
+ - 'ee/spec/helpers/ee/projects/security/api_fuzzing_configuration_helper_spec.rb'
+ - 'ee/spec/helpers/ee/security_orchestration_helper_spec.rb'
+ - 'ee/spec/helpers/ee/system_note_helper_spec.rb'
+ - 'ee/spec/helpers/ee/version_check_helper_spec.rb'
+ - 'ee/spec/helpers/ee/welcome_helper_spec.rb'
+ - 'ee/spec/helpers/groups/security_features_helper_spec.rb'
+ - 'ee/spec/helpers/license_helper_spec.rb'
+ - 'ee/spec/helpers/license_monitoring_helper_spec.rb'
+ - 'ee/spec/helpers/notes_helper_spec.rb'
+ - 'ee/spec/helpers/paid_feature_callout_helper_spec.rb'
+ - 'ee/spec/helpers/projects/security/discover_helper_spec.rb'
+ - 'ee/spec/helpers/projects_helper_spec.rb'
+ - 'ee/spec/helpers/roadmaps_helper_spec.rb'
+ - 'ee/spec/helpers/subscriptions_helper_spec.rb'
+ - 'ee/spec/helpers/timeboxes_helper_spec.rb'
+ - 'ee/spec/helpers/vulnerabilities_helper_spec.rb'
+ - 'ee/spec/initializers/1_settings_spec.rb'
+ - 'ee/spec/initializers/database_config_spec.rb'
+ - 'ee/spec/initializers/session_store_spec.rb'
+ - 'ee/spec/lib/analytics/devops_adoption/snapshot_calculator_spec.rb'
+ - 'ee/spec/lib/analytics/refresh_comments_data_spec.rb'
+ - 'ee/spec/lib/audit/details_spec.rb'
+ - 'ee/spec/lib/audit/group_push_rules_changes_auditor_spec.rb'
+ - 'ee/spec/lib/banzai/filter/references/epic_reference_filter_spec.rb'
+ - 'ee/spec/lib/banzai/filter/references/iteration_reference_filter_spec.rb'
+ - 'ee/spec/lib/banzai/filter/references/vulnerability_reference_filters_spec.rb'
+ - 'ee/spec/lib/banzai/reference_parser/iteration_parser_spec.rb'
+ - 'ee/spec/lib/container_registry/client_spec.rb'
+ - 'ee/spec/lib/ee/api/entities/analytics/group_activity_spec.rb'
+ - 'ee/spec/lib/ee/api/entities/billable_member_spec.rb'
+ - 'ee/spec/lib/ee/api/entities/geo_node_status_spec.rb'
+ - 'ee/spec/lib/ee/api/entities/project_spec.rb'
+ - 'ee/spec/lib/ee/api/entities/user_with_admin_spec.rb'
+ - 'ee/spec/lib/ee/api/helpers/variables_helpers_spec.rb'
+ - 'ee/spec/lib/ee/api/helpers_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/alert_management/payload/generic_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/application_context_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/auth/ldap/sync/group_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/auth/ldap/sync/groups_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/backfill_iteration_cadence_id_for_boards_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/drop_invalid_remediations_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/fix_incorrect_max_seats_used_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/migrate_approver_to_approval_rules_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/checks/push_rule_check_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/checks/push_rules/commit_check_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/config/entry/needs_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/matching/runner_matcher_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/parsers/security/validators/schema_validator_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/pipeline/quota/activity_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/pipeline/quota/job_activity_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/pipeline/quota/size_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/templates/templates_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/cleanup/orphan_job_artifact_files_batch_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/cleanup/orphan_job_artifact_files_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/database_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/elastic/helper_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/email/handler/service_desk_handler_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/gon_helper_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/group_search_results_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/hook_data/group_member_builder_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/hook_data/issue_builder_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/hook_data/user_builder_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/import_export/group/legacy_tree_restorer_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/import_export/group/legacy_tree_saver_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/import_export/group/tree_restorer_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/import_export/group/tree_saver_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/import_export/project/tree_saver_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ip_restriction/enforcer_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/issuable_metadata_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/metrics/samplers/database_sampler_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/omniauth_initializer_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/prometheus/metric_group_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/repo_path_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/scim/provisioning_service_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/usage/service_ping/payload_keys_processor_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/usage/service_ping_report_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/usage_data_counters/issue_activity_unique_counter_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/usage_data_spec.rb'
+ - 'ee/spec/lib/elastic/multi_version_class_proxy_spec.rb'
+ - 'ee/spec/lib/elastic/multi_version_instance_proxy_spec.rb'
+ - 'ee/spec/lib/gitlab/analytics/cycle_analytics/data_collector_spec.rb'
+ - 'ee/spec/lib/gitlab/analytics/cycle_analytics/request_params_spec.rb'
+ - 'ee/spec/lib/gitlab/analytics/cycle_analytics/summary/lead_time_for_changes_spec.rb'
+ - 'ee/spec/lib/gitlab/analytics/cycle_analytics/summary/lead_time_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/group_saml/gma_membership_enforcer_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/group_saml/group_lookup_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/group_saml/identity_linker_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/group_saml/sso_enforcer_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/group_saml/token_actor_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/ldap/access_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/ldap/adapter_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/ldap/person_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/o_auth/auth_hash_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/saml/user_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/smartcard/certificate_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/smartcard/ldap_certificate_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/smartcard/san_extension_spec.rb'
+ - 'ee/spec/lib/gitlab/background_migration/remove_all_trace_expiration_dates_spec.rb'
+ - 'ee/spec/lib/gitlab/cache_spec.rb'
+ - 'ee/spec/lib/gitlab/checks/diff_check_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/minutes/cost_factor_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/minutes/runners_availability_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/pipeline/chain/create_cross_database_associations_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/reports/dependency_list/dependency_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/Jobs/browser_performance_testing_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/Jobs/dast_default_branch_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/Jobs/load_performance_testing_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/Verify/browser_performance_testing_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/Verify/load_performance_testing_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/api_security_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/api_security_latest_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/container_scanning_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/coverage_fuzzing_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/dast_api_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/dast_api_latest_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/dast_latest_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/dependency_scanning_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/license_scanning_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/sast_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/sast_iac_latest_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/sast_latest_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/secret_detection_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/yaml_processor_spec.rb'
+ - 'ee/spec/lib/gitlab/cidr_spec.rb'
+ - 'ee/spec/lib/gitlab/code_owners/entry_spec.rb'
+ - 'ee/spec/lib/gitlab/code_owners/file_spec.rb'
+ - 'ee/spec/lib/gitlab/code_owners/groups_loader_spec.rb'
+ - 'ee/spec/lib/gitlab/code_owners/loader_spec.rb'
+ - 'ee/spec/lib/gitlab/code_owners/users_loader_spec.rb'
+ - 'ee/spec/lib/gitlab/com_spec.rb'
+ - 'ee/spec/lib/gitlab/contribution_analytics/data_collector_spec.rb'
+ - 'ee/spec/lib/gitlab/custom_file_templates_spec.rb'
+ - 'ee/spec/lib/gitlab/elastic/bulk_indexer_spec.rb'
+ - 'ee/spec/lib/gitlab/elastic/client_spec.rb'
+ - 'ee/spec/lib/gitlab/elastic/group_search_results_spec.rb'
+ - 'ee/spec/lib/gitlab/elastic/indexer_spec.rb'
+ - 'ee/spec/lib/gitlab/elastic/project_search_results_spec.rb'
+ - 'ee/spec/lib/gitlab/elastic/search_results_spec.rb'
+ - 'ee/spec/lib/gitlab/elastic/snippet_search_results_spec.rb'
+ - 'ee/spec/lib/gitlab/email/handler/create_note_handler_spec.rb'
+ - 'ee/spec/lib/gitlab/expiring_subscription_message_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/cron_manager_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/geo_node_status_check_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/git_ssh_proxy_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/health_check_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/jwt_request_decoder_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/log_cursor/events/repository_updated_event_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/log_helpers_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/oauth/session_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/replication/blob_downloader_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/replication/file_downloader_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/replication/file_retriever_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/replication/file_transfer_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/replication/job_artifact_downloader_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/replication/job_artifact_transfer_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/replicator_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/signed_data_spec.rb'
+ - 'ee/spec/lib/gitlab/geo_spec.rb'
+ - 'ee/spec/lib/gitlab/git_access_spec.rb'
+ - 'ee/spec/lib/gitlab/git_access_wiki_spec.rb'
+ - 'ee/spec/lib/gitlab/gl_repository/identifier_spec.rb'
+ - 'ee/spec/lib/gitlab/gl_repository/repo_type_spec.rb'
+ - 'ee/spec/lib/gitlab/graphql/aggregations/epics/epic_node_spec.rb'
+ - 'ee/spec/lib/gitlab/graphql/aggregations/epics/lazy_epic_aggregate_spec.rb'
+ - 'ee/spec/lib/gitlab/graphql/aggregations/issues/lazy_block_aggregate_spec.rb'
+ - 'ee/spec/lib/gitlab/graphql/aggregations/security_orchestration_policies/lazy_dast_profile_aggregate_spec.rb'
+ - 'ee/spec/lib/gitlab/graphql/aggregations/vulnerabilities/lazy_user_notes_count_aggregate_spec.rb'
+ - 'ee/spec/lib/gitlab/graphql/aggregations/vulnerability_statistics/lazy_aggregate_spec.rb'
+ - 'ee/spec/lib/gitlab/graphql/loaders/bulk_epic_aggregate_loader_spec.rb'
+ - 'ee/spec/lib/gitlab/import_export/group/group_and_descendants_repo_restorer_spec.rb'
+ - 'ee/spec/lib/gitlab/import_export/group/group_and_descendants_repo_saver_spec.rb'
+ - 'ee/spec/lib/gitlab/import_export/group/relation_factory_spec.rb'
+ - 'ee/spec/lib/gitlab/import_export/project/object_builder_spec.rb'
+ - 'ee/spec/lib/gitlab/insights/finders/issuable_finder_spec.rb'
+ - 'ee/spec/lib/gitlab/insights/project_insights_config_spec.rb'
+ - 'ee/spec/lib/gitlab/legacy_github_import/project_creator_spec.rb'
+ - 'ee/spec/lib/gitlab/pagination_delegate_spec.rb'
+ - 'ee/spec/lib/gitlab/patch/database_config_spec.rb'
+ - 'ee/spec/lib/gitlab/reference_extractor_spec.rb'
+ - 'ee/spec/lib/gitlab/search/aggregation_parser_spec.rb'
+ - 'ee/spec/lib/gitlab/sitemaps/generator_spec.rb'
+ - 'ee/spec/lib/gitlab/sitemaps/url_extractor_spec.rb'
+ - 'ee/spec/lib/gitlab/slash_commands/presenters/issue_show_spec.rb'
+ - 'ee/spec/lib/gitlab/status_page/filter/image_filter_spec.rb'
+ - 'ee/spec/lib/gitlab/status_page/storage/s3_client_spec.rb'
+ - 'ee/spec/lib/gitlab/status_page/storage/s3_multipart_upload_spec.rb'
+ - 'ee/spec/lib/gitlab/tracking/snowplow_schema_validation_spec.rb'
+ - 'ee/spec/lib/gitlab/tracking/standard_context_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/advanced_search/build_type_metric_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/advanced_search/distribution_metric_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/advanced_search/lucene_version_metric_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/advanced_search/version_metric_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/approval_project_rules_with_user_metric_spec.rb'
+ - 'ee/spec/lib/gitlab/usage_data_counters/epic_activity_unique_counter_spec.rb'
+ - 'ee/spec/lib/incident_management/oncall_shift_generator_spec.rb'
+ - 'ee/spec/lib/omni_auth/strategies/group_saml_spec.rb'
+ - 'ee/spec/lib/system_check/app/search_check_spec.rb'
+ - 'ee/spec/lib/system_check/geo/authorized_keys_check_spec.rb'
+ - 'ee/spec/lib/system_check/geo/http_connection_check_spec.rb'
+ - 'ee/spec/lib/system_check/rake_task/geo_task_spec.rb'
+ - 'ee/spec/mailers/ee/emails/issues_spec.rb'
+ - 'ee/spec/mailers/notify_spec.rb'
+ - 'ee/spec/migrations/schedule_requirements_migration_spec.rb'
+ - 'ee/spec/migrations/schedule_trace_expiry_removal_spec.rb'
+ - 'ee/spec/models/alert_management/alert_payload_field_spec.rb'
+ - 'ee/spec/models/allowed_email_domain_spec.rb'
+ - 'ee/spec/models/analytics/cycle_analytics/group_stage_spec.rb'
+ - 'ee/spec/models/analytics/cycle_analytics/project_stage_spec.rb'
+ - 'ee/spec/models/application_setting_spec.rb'
+ - 'ee/spec/models/approval_merge_request_rule_spec.rb'
+ - 'ee/spec/models/approval_project_rule_spec.rb'
+ - 'ee/spec/models/approval_state_spec.rb'
+ - 'ee/spec/models/board_spec.rb'
+ - 'ee/spec/models/boards/epic_board_position_spec.rb'
+ - 'ee/spec/models/broadcast_message_spec.rb'
+ - 'ee/spec/models/ci/build_spec.rb'
+ - 'ee/spec/models/ci/minutes/namespace_monthly_usage_spec.rb'
+ - 'ee/spec/models/ci/minutes/project_monthly_usage_spec.rb'
+ - 'ee/spec/models/ci/pipeline_spec.rb'
+ - 'ee/spec/models/ci/sources/project_spec.rb'
+ - 'ee/spec/models/ci/subscriptions/project_spec.rb'
+ - 'ee/spec/models/compliance_management/framework_spec.rb'
+ - 'ee/spec/models/concerns/approval_rule_like_spec.rb'
+ - 'ee/spec/models/concerns/approver_migrate_hook_spec.rb'
+ - 'ee/spec/models/concerns/deprecated_approvals_before_merge_spec.rb'
+ - 'ee/spec/models/concerns/ee/issuable_spec.rb'
+ - 'ee/spec/models/concerns/ee/milestoneable_spec.rb'
+ - 'ee/spec/models/concerns/ee/participable_spec.rb'
+ - 'ee/spec/models/concerns/elastic/issue_spec.rb'
+ - 'ee/spec/models/concerns/elastic/note_spec.rb'
+ - 'ee/spec/models/concerns/elastic/project_spec.rb'
+ - 'ee/spec/models/concerns/elastic/repository_spec.rb'
+ - 'ee/spec/models/concerns/epic_tree_sorting_spec.rb'
+ - 'ee/spec/models/concerns/geo/verification_state_spec.rb'
+ - 'ee/spec/models/container_registry/event_spec.rb'
+ - 'ee/spec/models/container_repository_spec.rb'
+ - 'ee/spec/models/dast/profiles_pipeline_spec.rb'
+ - 'ee/spec/models/dast_scanner_profile_spec.rb'
+ - 'ee/spec/models/dast_site_profile_spec.rb'
+ - 'ee/spec/models/dast_site_validation_spec.rb'
+ - 'ee/spec/models/deployment_spec.rb'
+ - 'ee/spec/models/dora/change_failure_rate_metric_spec.rb'
+ - 'ee/spec/models/dora/time_to_restore_service_metric_spec.rb'
+ - 'ee/spec/models/ee/audit_event_spec.rb'
+ - 'ee/spec/models/ee/award_emoji_spec.rb'
+ - 'ee/spec/models/ee/ci/build_dependencies_spec.rb'
+ - 'ee/spec/models/ee/ci/job_artifact_spec.rb'
+ - 'ee/spec/models/ee/ci/runner_spec.rb'
+ - 'ee/spec/models/ee/event_spec.rb'
+ - 'ee/spec/models/ee/group_spec.rb'
+ - 'ee/spec/models/ee/incident_management/project_incident_management_setting_spec.rb'
+ - 'ee/spec/models/ee/integrations/jira_spec.rb'
+ - 'ee/spec/models/ee/iteration_spec.rb'
+ - 'ee/spec/models/ee/iterations/cadence_spec.rb'
+ - 'ee/spec/models/ee/key_spec.rb'
+ - 'ee/spec/models/ee/merge_request_diff_spec.rb'
+ - 'ee/spec/models/ee/namespace/root_storage_size_spec.rb'
+ - 'ee/spec/models/ee/namespace_ci_cd_setting_spec.rb'
+ - 'ee/spec/models/ee/namespace_limit_spec.rb'
+ - 'ee/spec/models/ee/namespace_spec.rb'
+ - 'ee/spec/models/ee/notification_setting_spec.rb'
+ - 'ee/spec/models/ee/personal_access_token_spec.rb'
+ - 'ee/spec/models/ee/project_group_link_spec.rb'
+ - 'ee/spec/models/ee/protected_branch_spec.rb'
+ - 'ee/spec/models/ee/protected_ref_spec.rb'
+ - 'ee/spec/models/ee/service_desk_setting_spec.rb'
+ - 'ee/spec/models/ee/user_spec.rb'
+ - 'ee/spec/models/environment_spec.rb'
+ - 'ee/spec/models/epic_issue_spec.rb'
+ - 'ee/spec/models/epic_spec.rb'
+ - 'ee/spec/models/geo/container_repository_registry_spec.rb'
+ - 'ee/spec/models/geo/design_registry_spec.rb'
+ - 'ee/spec/models/geo/job_artifact_registry_spec.rb'
+ - 'ee/spec/models/geo/project_registry_spec.rb'
+ - 'ee/spec/models/geo/secondary_usage_data_spec.rb'
+ - 'ee/spec/models/geo_node_spec.rb'
+ - 'ee/spec/models/geo_node_status_spec.rb'
+ - 'ee/spec/models/gitlab_subscription_spec.rb'
+ - 'ee/spec/models/gitlab_subscriptions/features_spec.rb'
+ - 'ee/spec/models/group_member_spec.rb'
+ - 'ee/spec/models/group_wiki_repository_spec.rb'
+ - 'ee/spec/models/group_wiki_spec.rb'
+ - 'ee/spec/models/incident_management/escalation_rule_spec.rb'
+ - 'ee/spec/models/incident_management/oncall_rotation_spec.rb'
+ - 'ee/spec/models/incident_management/oncall_shift_spec.rb'
+ - 'ee/spec/models/incident_management/pending_escalations/alert_spec.rb'
+ - 'ee/spec/models/incident_management/pending_escalations/issue_spec.rb'
+ - 'ee/spec/models/integrations/github/remote_project_spec.rb'
+ - 'ee/spec/models/integrations/github_spec.rb'
+ - 'ee/spec/models/ip_restriction_spec.rb'
+ - 'ee/spec/models/issuable_metric_image_spec.rb'
+ - 'ee/spec/models/issuable_sla_spec.rb'
+ - 'ee/spec/models/issue_link_spec.rb'
+ - 'ee/spec/models/issue_spec.rb'
+ - 'ee/spec/models/license_spec.rb'
+ - 'ee/spec/models/member_spec.rb'
+ - 'ee/spec/models/merge_request/blocking_spec.rb'
+ - 'ee/spec/models/merge_request_spec.rb'
+ - 'ee/spec/models/merge_train_spec.rb'
+ - 'ee/spec/models/namespace_setting_spec.rb'
+ - 'ee/spec/models/note_spec.rb'
+ - 'ee/spec/models/packages/package_file_spec.rb'
+ - 'ee/spec/models/path_lock_spec.rb'
+ - 'ee/spec/models/productivity_analytics_spec.rb'
+ - 'ee/spec/models/project_import_data_spec.rb'
+ - 'ee/spec/models/project_import_state_spec.rb'
+ - 'ee/spec/models/project_member_spec.rb'
+ - 'ee/spec/models/project_spec.rb'
+ - 'ee/spec/models/project_team_spec.rb'
+ - 'ee/spec/models/protected_environment_spec.rb'
+ - 'ee/spec/models/protected_environments/approval_summary_spec.rb'
+ - 'ee/spec/models/push_rule_spec.rb'
+ - 'ee/spec/models/release_highlight_spec.rb'
+ - 'ee/spec/models/remote_mirror_spec.rb'
+ - 'ee/spec/models/repository_spec.rb'
+ - 'ee/spec/models/requirements_management/requirement_spec.rb'
+ - 'ee/spec/models/requirements_management/test_report_spec.rb'
+ - 'ee/spec/models/saml_group_link_spec.rb'
+ - 'ee/spec/models/saml_provider_spec.rb'
+ - 'ee/spec/models/status_page/project_setting_spec.rb'
+ - 'ee/spec/models/uploads/local_spec.rb'
+ - 'ee/spec/models/vulnerabilities/export_spec.rb'
+ - 'ee/spec/models/vulnerabilities/feedback_spec.rb'
+ - 'ee/spec/models/vulnerabilities/finding_pipeline_spec.rb'
+ - 'ee/spec/models/vulnerabilities/finding_spec.rb'
+ - 'ee/spec/models/vulnerabilities/read_spec.rb'
+ - 'ee/spec/models/vulnerabilities/statistic_spec.rb'
+ - 'ee/spec/policies/app_sec/fuzzing/coverage/corpus_policy_spec.rb'
+ - 'ee/spec/policies/compliance_management/framework_policy_spec.rb'
+ - 'ee/spec/policies/ee/namespaces/user_namespace_policy_spec.rb'
+ - 'ee/spec/policies/epic_policy_spec.rb'
+ - 'ee/spec/policies/global_policy_spec.rb'
+ - 'ee/spec/policies/group_policy_spec.rb'
+ - 'ee/spec/policies/identity_provider_policy_spec.rb'
+ - 'ee/spec/policies/incident_management/oncall_rotation_policy_spec.rb'
+ - 'ee/spec/policies/incident_management/oncall_schedule_policy_spec.rb'
+ - 'ee/spec/policies/incident_management/oncall_shift_policy_spec.rb'
+ - 'ee/spec/policies/issuable_policy_spec.rb'
+ - 'ee/spec/policies/merge_request_policy_spec.rb'
+ - 'ee/spec/policies/note_policy_spec.rb'
+ - 'ee/spec/policies/project_policy_spec.rb'
+ - 'ee/spec/policies/project_snippet_policy_spec.rb'
+ - 'ee/spec/policies/protected_branch_policy_spec.rb'
+ - 'ee/spec/policies/saml_provider_policy_spec.rb'
+ - 'ee/spec/policies/user_policy_spec.rb'
+ - 'ee/spec/presenters/approval_rule_presenter_spec.rb'
+ - 'ee/spec/presenters/audit_event_presenter_spec.rb'
+ - 'ee/spec/presenters/ci/build_runner_presenter_spec.rb'
+ - 'ee/spec/presenters/ee/issue_presenter_spec.rb'
+ - 'ee/spec/presenters/group_clusterable_presenter_spec.rb'
+ - 'ee/spec/presenters/merge_request_approver_presenter_spec.rb'
+ - 'ee/spec/presenters/subscription_presenter_spec.rb'
+ - 'ee/spec/requests/admin/credentials_controller_spec.rb'
+ - 'ee/spec/requests/admin/geo/replicables_controller_spec.rb'
+ - 'ee/spec/requests/api/analytics/group_activity_analytics_spec.rb'
+ - 'ee/spec/requests/api/audit_events_spec.rb'
+ - 'ee/spec/requests/api/award_emoji_spec.rb'
+ - 'ee/spec/requests/api/boards_spec.rb'
+ - 'ee/spec/requests/api/ci/jobs_spec.rb'
+ - 'ee/spec/requests/api/ci/pipelines_spec.rb'
+ - 'ee/spec/requests/api/ci/runner_spec.rb'
+ - 'ee/spec/requests/api/ci/triggers_spec.rb'
+ - 'ee/spec/requests/api/commits_spec.rb'
+ - 'ee/spec/requests/api/deployments_spec.rb'
+ - 'ee/spec/requests/api/epic_issues_spec.rb'
+ - 'ee/spec/requests/api/epic_links_spec.rb'
+ - 'ee/spec/requests/api/epics_spec.rb'
+ - 'ee/spec/requests/api/experiments_spec.rb'
+ - 'ee/spec/requests/api/geo_nodes_spec.rb'
+ - 'ee/spec/requests/api/geo_spec.rb'
+ - 'ee/spec/requests/api/graphql/boards/epic_boards_query_spec.rb'
+ - 'ee/spec/requests/api/graphql/ci/runner_spec.rb'
+ - 'ee/spec/requests/api/graphql/compliance_management/merge_requests/compliance_violations_spec.rb'
+ - 'ee/spec/requests/api/graphql/epics/epic_resolver_spec.rb'
+ - 'ee/spec/requests/api/graphql/geo/geo_node_spec.rb'
+ - 'ee/spec/requests/api/graphql/group/epic/epic_aggregate_query_spec.rb'
+ - 'ee/spec/requests/api/graphql/group/epic/epic_issues_spec.rb'
+ - 'ee/spec/requests/api/graphql/group/epics_spec.rb'
+ - 'ee/spec/requests/api/graphql/instance_security_dashboard_spec.rb'
+ - 'ee/spec/requests/api/graphql/iteration_spec.rb'
+ - 'ee/spec/requests/api/graphql/iterations/cadences_spec.rb'
+ - 'ee/spec/requests/api/graphql/iterations/iterations_spec.rb'
+ - 'ee/spec/requests/api/graphql/milestone_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/boards/epic_boards/epic_move_list_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/boards/lists/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/boards/lists/update_limit_metrics_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/compliance_management/frameworks/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/compliance_management/frameworks/destroy_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/compliance_management/frameworks/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/epics/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/incident_management/escalation_policy/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/incident_management/oncall_rotation/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/incident_management/oncall_rotation/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/issues/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/security_policy/assign_security_policy_project_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/security_policy/commit_scan_execution_policy_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/security_policy/create_security_policy_project_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/security_policy/unassign_security_policy_project_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/vulnerabilities/create_external_issue_link_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/code_coverage_summary_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/incident_management/escalation_policies_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/incident_management/oncall_participants_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/incident_management/oncall_shifts_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/issues_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/path_locks_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/requirements_management/requirements_spec.rb'
+ - 'ee/spec/requests/api/graphql/projects/compliance_frameworks_spec.rb'
+ - 'ee/spec/requests/api/graphql/vulnerabilities/sort_spec.rb'
+ - 'ee/spec/requests/api/group_clusters_spec.rb'
+ - 'ee/spec/requests/api/group_hooks_spec.rb'
+ - 'ee/spec/requests/api/group_push_rule_spec.rb'
+ - 'ee/spec/requests/api/group_variables_spec.rb'
+ - 'ee/spec/requests/api/groups_spec.rb'
+ - 'ee/spec/requests/api/internal/base_spec.rb'
+ - 'ee/spec/requests/api/internal/kubernetes_spec.rb'
+ - 'ee/spec/requests/api/invitations_spec.rb'
+ - 'ee/spec/requests/api/issues_spec.rb'
+ - 'ee/spec/requests/api/iterations_spec.rb'
+ - 'ee/spec/requests/api/ldap_group_links_spec.rb'
+ - 'ee/spec/requests/api/managed_licenses_spec.rb'
+ - 'ee/spec/requests/api/members_spec.rb'
+ - 'ee/spec/requests/api/merge_request_approval_rules_spec.rb'
+ - 'ee/spec/requests/api/merge_request_approval_settings_spec.rb'
+ - 'ee/spec/requests/api/merge_request_approvals_spec.rb'
+ - 'ee/spec/requests/api/merge_requests_spec.rb'
+ - 'ee/spec/requests/api/namespaces_spec.rb'
+ - 'ee/spec/requests/api/project_aliases_spec.rb'
+ - 'ee/spec/requests/api/project_approval_rules_spec.rb'
+ - 'ee/spec/requests/api/project_approval_settings_spec.rb'
+ - 'ee/spec/requests/api/project_approvals_spec.rb'
+ - 'ee/spec/requests/api/project_clusters_spec.rb'
+ - 'ee/spec/requests/api/project_import_spec.rb'
+ - 'ee/spec/requests/api/project_mirror_spec.rb'
+ - 'ee/spec/requests/api/project_push_rule_spec.rb'
+ - 'ee/spec/requests/api/projects_spec.rb'
+ - 'ee/spec/requests/api/protected_branches_spec.rb'
+ - 'ee/spec/requests/api/releases_spec.rb'
+ - 'ee/spec/requests/api/scim_spec.rb'
+ - 'ee/spec/requests/api/search_spec.rb'
+ - 'ee/spec/requests/api/settings_spec.rb'
+ - 'ee/spec/requests/api/status_checks_spec.rb'
+ - 'ee/spec/requests/api/users_spec.rb'
+ - 'ee/spec/requests/api/v3/github_spec.rb'
+ - 'ee/spec/requests/api/visual_review_discussions_spec.rb'
+ - 'ee/spec/requests/api/vulnerabilities_spec.rb'
+ - 'ee/spec/requests/api/vulnerability_exports_spec.rb'
+ - 'ee/spec/requests/api/vulnerability_findings_spec.rb'
+ - 'ee/spec/requests/git_http_geo_spec.rb'
+ - 'ee/spec/requests/groups/group_members_controller_spec.rb'
+ - 'ee/spec/requests/groups/roadmap_controller_spec.rb'
+ - 'ee/spec/requests/groups/security/credentials_controller_spec.rb'
+ - 'ee/spec/requests/groups/usage_quotas_spec.rb'
+ - 'ee/spec/requests/groups_controller_spec.rb'
+ - 'ee/spec/requests/jwt_controller_spec.rb'
+ - 'ee/spec/requests/lfs_http_spec.rb'
+ - 'ee/spec/requests/projects/analytics/code_reviews_controller_spec.rb'
+ - 'ee/spec/requests/projects/on_demand_scans_controller_spec.rb'
+ - 'ee/spec/requests/projects/requirements_management/requirements_controller_spec.rb'
+ - 'ee/spec/requests/projects/security/corpus_management_controller_spec.rb'
+ - 'ee/spec/requests/projects/security/dast_configuration_controller_spec.rb'
+ - 'ee/spec/requests/projects/security/dast_profiles_controller_spec.rb'
+ - 'ee/spec/requests/projects/security/dast_scanner_profiles_controller_spec.rb'
+ - 'ee/spec/requests/projects/security/dast_site_profiles_controller_spec.rb'
+ - 'ee/spec/requests/projects/security/scanned_resources_controller_spec.rb'
+ - 'ee/spec/requests/rack_attack_spec.rb'
+ - 'ee/spec/requests/repositories/git_http_controller_spec.rb'
+ - 'ee/spec/requests/search_controller_spec.rb'
+ - 'ee/spec/requests/smartcard_controller_spec.rb'
+ - 'ee/spec/routing/user_routing_spec.rb'
+ - 'ee/spec/serializers/analytics/cycle_analytics/value_stream_errors_serializer_spec.rb'
+ - 'ee/spec/serializers/blocking_merge_request_entity_spec.rb'
+ - 'ee/spec/serializers/board_serializer_spec.rb'
+ - 'ee/spec/serializers/clusters/environment_entity_spec.rb'
+ - 'ee/spec/serializers/dashboard_operations_project_entity_spec.rb'
+ - 'ee/spec/serializers/ee/blob_entity_spec.rb'
+ - 'ee/spec/serializers/ee/group_child_entity_spec.rb'
+ - 'ee/spec/serializers/ee/issue_sidebar_basic_entity_spec.rb'
+ - 'ee/spec/serializers/ee/issue_sidebar_extras_entity_spec.rb'
+ - 'ee/spec/serializers/ee/merge_request_poll_cached_widget_entity_spec.rb'
+ - 'ee/spec/serializers/ee/user_serializer_spec.rb'
+ - 'ee/spec/serializers/environment_entity_spec.rb'
+ - 'ee/spec/serializers/epic_note_entity_spec.rb'
+ - 'ee/spec/serializers/issue_serializer_spec.rb'
+ - 'ee/spec/serializers/member_entity_spec.rb'
+ - 'ee/spec/serializers/member_user_entity_spec.rb'
+ - 'ee/spec/serializers/merge_request_widget_entity_spec.rb'
+ - 'ee/spec/serializers/project_mirror_entity_spec.rb'
+ - 'ee/spec/serializers/service_field_entity_spec.rb'
+ - 'ee/spec/serializers/vulnerabilities/finding_entity_spec.rb'
+ - 'ee/spec/services/alert_management/process_prometheus_alert_service_spec.rb'
+ - 'ee/spec/services/analytics/cycle_analytics/consistency_check_service_spec.rb'
+ - 'ee/spec/services/analytics/cycle_analytics/stages/delete_service_spec.rb'
+ - 'ee/spec/services/analytics/cycle_analytics/value_streams/update_service_spec.rb'
+ - 'ee/spec/services/analytics/devops_adoption/enabled_namespaces/create_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/builds/associate_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/profiles/create_associations_service_spec.rb'
+ - 'ee/spec/services/application_settings/update_service_spec.rb'
+ - 'ee/spec/services/approval_rules/create_service_spec.rb'
+ - 'ee/spec/services/approval_rules/merge_request_rule_destroy_service_spec.rb'
+ - 'ee/spec/services/approval_rules/params_filtering_service_spec.rb'
+ - 'ee/spec/services/approval_rules/project_rule_destroy_service_spec.rb'
+ - 'ee/spec/services/approval_rules/update_service_spec.rb'
+ - 'ee/spec/services/audit_event_service_spec.rb'
+ - 'ee/spec/services/audit_events/export_csv_service_spec.rb'
+ - 'ee/spec/services/audit_events/register_runner_audit_event_service_spec.rb'
+ - 'ee/spec/services/audit_events/runners_token_audit_event_service_spec.rb'
+ - 'ee/spec/services/audit_events/unregister_runner_audit_event_service_spec.rb'
+ - 'ee/spec/services/award_emojis/add_service_spec.rb'
+ - 'ee/spec/services/boards/create_service_spec.rb'
+ - 'ee/spec/services/boards/epic_boards/create_service_spec.rb'
+ - 'ee/spec/services/boards/epics/move_service_spec.rb'
+ - 'ee/spec/services/boards/epics/position_create_service_spec.rb'
+ - 'ee/spec/services/boards/lists/update_service_spec.rb'
+ - 'ee/spec/services/ci/copy_cross_database_associations_service_spec.rb'
+ - 'ee/spec/services/ci/create_pipeline_service_spec.rb'
+ - 'ee/spec/services/ci/minutes/update_build_minutes_service_spec.rb'
+ - 'ee/spec/services/ci/minutes/update_project_and_namespace_usage_service_spec.rb'
+ - 'ee/spec/services/ci/process_build_service_spec.rb'
+ - 'ee/spec/services/ci/register_job_service_spec.rb'
+ - 'ee/spec/services/ci/retry_job_service_spec.rb'
+ - 'ee/spec/services/ci/runners/unregister_runner_service_spec.rb'
+ - 'ee/spec/services/ci/sync_reports_to_approval_rules_service_spec.rb'
+ - 'ee/spec/services/ci_cd/setup_project_spec.rb'
+ - 'ee/spec/services/compliance_management/frameworks/create_service_spec.rb'
+ - 'ee/spec/services/compliance_management/frameworks/update_service_spec.rb'
+ - 'ee/spec/services/compliance_management/merge_requests/create_compliance_violations_service_spec.rb'
+ - 'ee/spec/services/dashboard/projects/list_service_spec.rb'
+ - 'ee/spec/services/deployments/approval_service_spec.rb'
+ - 'ee/spec/services/dora/aggregate_metrics_service_spec.rb'
+ - 'ee/spec/services/ee/alert_management/alerts/update_service_spec.rb'
+ - 'ee/spec/services/ee/allowed_email_domains/update_service_spec.rb'
+ - 'ee/spec/services/ee/auth/container_registry_authentication_service_spec.rb'
+ - 'ee/spec/services/ee/boards/issues/create_service_spec.rb'
+ - 'ee/spec/services/ee/boards/issues/list_service_spec.rb'
+ - 'ee/spec/services/ee/boards/issues/move_service_spec.rb'
+ - 'ee/spec/services/ee/boards/lists/create_service_spec.rb'
+ - 'ee/spec/services/ee/ci/job_artifacts/destroy_batch_service_spec.rb'
+ - 'ee/spec/services/ee/git/branch_push_service_spec.rb'
+ - 'ee/spec/services/ee/groups/autocomplete_service_spec.rb'
+ - 'ee/spec/services/ee/incident_management/issuable_escalation_statuses/after_update_service_spec.rb'
+ - 'ee/spec/services/ee/integrations/test/project_service_spec.rb'
+ - 'ee/spec/services/ee/ip_restrictions/update_service_spec.rb'
+ - 'ee/spec/services/ee/issuable/bulk_update_service_spec.rb'
+ - 'ee/spec/services/ee/issuable/clone/attributes_rewriter_spec.rb'
+ - 'ee/spec/services/ee/issuable/common_system_notes_service_spec.rb'
+ - 'ee/spec/services/ee/issues/clone_service_spec.rb'
+ - 'ee/spec/services/ee/issues/close_service_spec.rb'
+ - 'ee/spec/services/ee/issues/create_service_spec.rb'
+ - 'ee/spec/services/ee/issues/move_service_spec.rb'
+ - 'ee/spec/services/ee/issues/reopen_service_spec.rb'
+ - 'ee/spec/services/ee/issues/update_service_spec.rb'
+ - 'ee/spec/services/ee/labels/create_service_spec.rb'
+ - 'ee/spec/services/ee/members/create_service_spec.rb'
+ - 'ee/spec/services/ee/members/destroy_service_spec.rb'
+ - 'ee/spec/services/ee/members/invite_service_spec.rb'
+ - 'ee/spec/services/ee/merge_requests/base_service_spec.rb'
+ - 'ee/spec/services/ee/merge_requests/create_service_spec.rb'
+ - 'ee/spec/services/ee/merge_requests/post_merge_service_spec.rb'
+ - 'ee/spec/services/ee/merge_requests/refresh_service_spec.rb'
+ - 'ee/spec/services/ee/merge_requests/update_assignees_service_spec.rb'
+ - 'ee/spec/services/ee/merge_requests/update_service_spec.rb'
+ - 'ee/spec/services/ee/namespace_settings/update_service_spec.rb'
+ - 'ee/spec/services/ee/notes/create_service_spec.rb'
+ - 'ee/spec/services/ee/notes/post_process_service_spec.rb'
+ - 'ee/spec/services/ee/notes/quick_actions_service_spec.rb'
+ - 'ee/spec/services/ee/notes/update_service_spec.rb'
+ - 'ee/spec/services/ee/notification_service_spec.rb'
+ - 'ee/spec/services/ee/personal_access_tokens/revoke_service_spec.rb'
+ - 'ee/spec/services/ee/preview_markdown_service_spec.rb'
+ - 'ee/spec/services/ee/protected_branches/create_service_spec.rb'
+ - 'ee/spec/services/ee/quick_actions/target_service_spec.rb'
+ - 'ee/spec/services/ee/resource_events/merge_into_notes_service_spec.rb'
+ - 'ee/spec/services/ee/service_ping/build_payload_service_spec.rb'
+ - 'ee/spec/services/ee/service_ping/permit_data_categories_service_spec.rb'
+ - 'ee/spec/services/ee/users/build_service_spec.rb'
+ - 'ee/spec/services/ee/users/create_service_spec.rb'
+ - 'ee/spec/services/ee/users/destroy_service_spec.rb'
+ - 'ee/spec/services/ee/users/migrate_to_ghost_user_service_spec.rb'
+ - 'ee/spec/services/ee/users/reject_service_spec.rb'
+ - 'ee/spec/services/ee/users/update_service_spec.rb'
+ - 'ee/spec/services/ee/vulnerability_feedback_module/update_service_spec.rb'
+ - 'ee/spec/services/elastic/cluster_reindexing_service_spec.rb'
+ - 'ee/spec/services/elastic/data_migration_service_spec.rb'
+ - 'ee/spec/services/elastic/indexing_control_service_spec.rb'
+ - 'ee/spec/services/elastic/process_bookkeeping_service_spec.rb'
+ - 'ee/spec/services/epic_issues/destroy_service_spec.rb'
+ - 'ee/spec/services/epic_issues/list_service_spec.rb'
+ - 'ee/spec/services/epic_issues/update_service_spec.rb'
+ - 'ee/spec/services/epics/create_service_spec.rb'
+ - 'ee/spec/services/epics/epic_links/list_service_spec.rb'
+ - 'ee/spec/services/epics/issue_promote_service_spec.rb'
+ - 'ee/spec/services/epics/related_epic_links/create_service_spec.rb'
+ - 'ee/spec/services/epics/related_epic_links/destroy_service_spec.rb'
+ - 'ee/spec/services/epics/update_dates_service_spec.rb'
+ - 'ee/spec/services/epics/update_service_spec.rb'
+ - 'ee/spec/services/external_status_checks/create_service_spec.rb'
+ - 'ee/spec/services/external_status_checks/dispatch_service_spec.rb'
+ - 'ee/spec/services/geo/container_repository_sync_service_spec.rb'
+ - 'ee/spec/services/geo/container_repository_sync_spec.rb'
+ - 'ee/spec/services/geo/design_repository_sync_service_spec.rb'
+ - 'ee/spec/services/geo/file_download_service_spec.rb'
+ - 'ee/spec/services/geo/file_registry_removal_service_spec.rb'
+ - 'ee/spec/services/geo/file_upload_service_spec.rb'
+ - 'ee/spec/services/geo/framework_repository_sync_service_spec.rb'
+ - 'ee/spec/services/geo/hashed_storage_migration_service_spec.rb'
+ - 'ee/spec/services/geo/move_repository_service_spec.rb'
+ - 'ee/spec/services/geo/node_update_service_spec.rb'
+ - 'ee/spec/services/geo/project_housekeeping_service_spec.rb'
+ - 'ee/spec/services/geo/prune_event_log_service_spec.rb'
+ - 'ee/spec/services/geo/rename_repository_service_spec.rb'
+ - 'ee/spec/services/geo/repository_created_event_store_spec.rb'
+ - 'ee/spec/services/geo/repository_sync_service_spec.rb'
+ - 'ee/spec/services/geo/repository_verification_reset_spec.rb'
+ - 'ee/spec/services/geo/repository_verification_secondary_service_spec.rb'
+ - 'ee/spec/services/geo/wiki_sync_service_spec.rb'
+ - 'ee/spec/services/gitlab_subscriptions/apply_trial_service_spec.rb'
+ - 'ee/spec/services/gitlab_subscriptions/create_hand_raise_lead_service_spec.rb'
+ - 'ee/spec/services/gitlab_subscriptions/create_service_spec.rb'
+ - 'ee/spec/services/gitlab_subscriptions/extend_reactivate_trial_service_spec.rb'
+ - 'ee/spec/services/group_saml/group_managed_accounts/clean_up_members_service_spec.rb'
+ - 'ee/spec/services/group_saml/group_managed_accounts/transfer_membership_service_spec.rb'
+ - 'ee/spec/services/groups/create_service_spec.rb'
+ - 'ee/spec/services/groups/destroy_service_spec.rb'
+ - 'ee/spec/services/groups/mark_for_deletion_service_spec.rb'
+ - 'ee/spec/services/groups/memberships/export_service_spec.rb'
+ - 'ee/spec/services/groups/restore_service_spec.rb'
+ - 'ee/spec/services/groups/sync_service_spec.rb'
+ - 'ee/spec/services/groups/update_service_spec.rb'
+ - 'ee/spec/services/historical_user_data/csv_service_spec.rb'
+ - 'ee/spec/services/ide/schemas_config_service_spec.rb'
+ - 'ee/spec/services/incident_management/escalation_policies/create_service_spec.rb'
+ - 'ee/spec/services/incident_management/incidents/create_sla_service_spec.rb'
+ - 'ee/spec/services/incident_management/incidents/upload_metric_service_spec.rb'
+ - 'ee/spec/services/incident_management/oncall_rotations/create_service_spec.rb'
+ - 'ee/spec/services/incident_management/oncall_rotations/edit_service_spec.rb'
+ - 'ee/spec/services/incident_management/oncall_rotations/remove_participant_service_spec.rb'
+ - 'ee/spec/services/incident_management/oncall_schedules/update_service_spec.rb'
+ - 'ee/spec/services/incident_management/pending_escalations/create_service_spec.rb'
+ - 'ee/spec/services/incident_management/pending_escalations/process_service_spec.rb'
+ - 'ee/spec/services/issues/build_service_spec.rb'
+ - 'ee/spec/services/issues/export_csv_service_spec.rb'
+ - 'ee/spec/services/iterations/cadences/create_service_spec.rb'
+ - 'ee/spec/services/iterations/create_service_spec.rb'
+ - 'ee/spec/services/iterations/update_service_spec.rb'
+ - 'ee/spec/services/jira/jql_builder_service_spec.rb'
+ - 'ee/spec/services/ldap_group_reset_service_spec.rb'
+ - 'ee/spec/services/members/activate_service_spec.rb'
+ - 'ee/spec/services/merge_commits/export_csv_service_spec.rb'
+ - 'ee/spec/services/merge_request_approval_settings/update_service_spec.rb'
+ - 'ee/spec/services/merge_requests/approval_service_spec.rb'
+ - 'ee/spec/services/merge_requests/build_service_spec.rb'
+ - 'ee/spec/services/merge_requests/merge_service_spec.rb'
+ - 'ee/spec/services/merge_requests/update_blocks_service_spec.rb'
+ - 'ee/spec/services/milestones/update_service_spec.rb'
+ - 'ee/spec/services/namespaces/check_storage_size_service_spec.rb'
+ - 'ee/spec/services/namespaces/in_product_marketing_emails_service_spec.rb'
+ - 'ee/spec/services/namespaces/storage/email_notification_service_spec.rb'
+ - 'ee/spec/services/personal_access_tokens/revoke_invalid_tokens_spec.rb'
+ - 'ee/spec/services/personal_access_tokens/rotation_verifier_service_spec.rb'
+ - 'ee/spec/services/projects/alerting/notify_service_spec.rb'
+ - 'ee/spec/services/projects/create_from_template_service_spec.rb'
+ - 'ee/spec/services/projects/create_service_spec.rb'
+ - 'ee/spec/services/projects/destroy_service_spec.rb'
+ - 'ee/spec/services/projects/gitlab_projects_import_service_spec.rb'
+ - 'ee/spec/services/projects/group_links/create_service_spec.rb'
+ - 'ee/spec/services/projects/group_links/destroy_service_spec.rb'
+ - 'ee/spec/services/projects/hashed_storage/migrate_attachments_service_spec.rb'
+ - 'ee/spec/services/projects/import_export/export_service_spec.rb'
+ - 'ee/spec/services/projects/mark_for_deletion_service_spec.rb'
+ - 'ee/spec/services/projects/operations/update_service_spec.rb'
+ - 'ee/spec/services/projects/protect_default_branch_service_spec.rb'
+ - 'ee/spec/services/projects/restore_service_spec.rb'
+ - 'ee/spec/services/projects/slack_application_install_service_spec.rb'
+ - 'ee/spec/services/projects/transfer_service_spec.rb'
+ - 'ee/spec/services/projects/update_mirror_service_spec.rb'
+ - 'ee/spec/services/projects/update_service_spec.rb'
+ - 'ee/spec/services/protected_environments/create_service_spec.rb'
+ - 'ee/spec/services/protected_environments/update_service_spec.rb'
+ - 'ee/spec/services/quick_actions/interpret_service_spec.rb'
+ - 'ee/spec/services/requirements_management/export_csv_service_spec.rb'
+ - 'ee/spec/services/requirements_management/update_requirement_service_spec.rb'
+ - 'ee/spec/services/resource_access_tokens/create_service_spec.rb'
+ - 'ee/spec/services/resource_access_tokens/revoke_service_spec.rb'
+ - 'ee/spec/services/search/global_service_spec.rb'
+ - 'ee/spec/services/search/group_service_spec.rb'
+ - 'ee/spec/services/search/project_service_spec.rb'
+ - 'ee/spec/services/search/snippet_service_spec.rb'
+ - 'ee/spec/services/search_service_spec.rb'
+ - 'ee/spec/services/security/dependency_list_service_spec.rb'
+ - 'ee/spec/services/security/merge_reports_service_spec.rb'
+ - 'ee/spec/services/security/orchestration/assign_service_spec.rb'
+ - 'ee/spec/services/security/orchestration/unassign_service_spec.rb'
+ - 'ee/spec/services/security/report_summary_service_spec.rb'
+ - 'ee/spec/services/security/scanned_resources_counting_service_spec.rb'
+ - 'ee/spec/services/security/scanned_resources_service_spec.rb'
+ - 'ee/spec/services/security/security_orchestration_policies/create_pipeline_service_spec.rb'
+ - 'ee/spec/services/security/security_orchestration_policies/policy_commit_service_spec.rb'
+ - 'ee/spec/services/security/security_orchestration_policies/process_policy_service_spec.rb'
+ - 'ee/spec/services/security/store_grouped_scans_service_spec.rb'
+ - 'ee/spec/services/security/track_scan_service_spec.rb'
+ - 'ee/spec/services/security/vulnerability_counting_service_spec.rb'
+ - 'ee/spec/services/slash_commands/global_slack_handler_spec.rb'
+ - 'ee/spec/services/software_license_policies/update_service_spec.rb'
+ - 'ee/spec/services/status_page/publish_attachments_service_spec.rb'
+ - 'ee/spec/services/status_page/publish_details_service_spec.rb'
+ - 'ee/spec/services/status_page/trigger_publish_service_spec.rb'
+ - 'ee/spec/services/system_notes/epics_service_spec.rb'
+ - 'ee/spec/services/timebox_report_service_spec.rb'
+ - 'ee/spec/services/todo_service_spec.rb'
+ - 'ee/spec/services/upcoming_reconciliations/update_service_spec.rb'
+ - 'ee/spec/services/user_permissions/export_service_spec.rb'
+ - 'ee/spec/services/vulnerabilities/create_service_spec.rb'
+ - 'ee/spec/services/vulnerabilities/historical_statistics/deletion_service_spec.rb'
+ - 'ee/spec/services/vulnerability_exports/export_service_spec.rb'
+ - 'ee/spec/services/vulnerability_external_issue_links/create_service_spec.rb'
+ - 'ee/spec/support/features/manual_quarterly_co_term_banner_examples.rb'
+ - 'ee/spec/support/features/manual_renewal_banner_examples.rb'
+ - 'ee/spec/support/protected_tags/access_control_shared_examples.rb'
+ - 'ee/spec/support/shared_contexts/audit_event_not_licensed_shared_context.rb'
+ - 'ee/spec/support/shared_contexts/audit_event_queue_shared_context.rb'
+ - 'ee/spec/support/shared_contexts/epic_aggregate_constants.rb'
+ - 'ee/spec/support/shared_contexts/fixtures/analytics_shared_context.rb'
+ - 'ee/spec/support/shared_contexts/gitlab_team_member_shared_context.rb'
+ - 'ee/spec/support/shared_contexts/graphql/resolvers/security_orchestration/resolves_orchestration_policy_shared_contexts.rb'
+ - 'ee/spec/support/shared_contexts/lib/gitlab/insights/reducers/reducers_shared_contexts.rb'
+ - 'ee/spec/support/shared_contexts/push_rules_checks_shared_context.rb'
+ - 'ee/spec/support/shared_contexts/requests/api/members_shared_contexts.rb'
+ - 'ee/spec/support/shared_contexts/status_page/status_page_enabled_context.rb'
+ - 'ee/spec/support/shared_contexts/status_page/status_page_list_objects.rb'
+ - 'ee/spec/support/shared_examples/controllers/analytics/cycle_analytics/shared_stage_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/controllers/analytics/issues_analytics/shared_issues_analytics_examples.rb'
+ - 'ee/spec/support/shared_examples/controllers/boards_actions_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/controllers/cluster_metrics_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/controllers/concerns/description_diff_actions_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/controllers/registrations/groups_controller_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/controllers/registrations/projects_controller_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/controllers/security/application_controller_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/features/credentials_inventory_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/features/insights_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/features/protected_branches_access_control_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/features/sidebar_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/features/ultimate_trial_callout_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/graphql/mutations/epics/permission_check_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/graphql/mutations/update_health_status_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/lib/gitlab/git_access_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/lib/gitlab/middleware/allowlisted_admin_geo_requests_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/lib/gitlab/middleware/maintenance_mode_gitlab_ee_instance_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/lib/gitlab/middleware/read_only_gitlab_ee_instance_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/lib/gitlab/smartcard_certificate_store_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/concerns/blob_replicator_strategy_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/concerns/health_status_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/concerns/issuable_links_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/concerns/replicator_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/concerns/repository_replicator_strategy_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/concerns/verifiable_replicator_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/geo_batcher_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/geo_framework_registry_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/geo_verifiable_registry_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/member_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/mentionable_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/protected_environments/authorizable_examples.rb'
+ - 'ee/spec/support/shared_examples/quick_actions/issue/status_page_quick_actions_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/requests/api/project_approval_rules_api_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/requests/credentials_inventory_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/requests/security/security_dashboard_json_endpoint_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/alert_management/alert_processing/alert_firing_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/alert_management/alert_processing/alert_recovery_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/base_sync_service_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/boards/base_service_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/merge_merge_requests_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/scoped_label_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/search_notes_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/search_service_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/update_issuable_health_status_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/views/registration_features_prompt_settings_link_shared_examples.rb'
+ - 'ee/spec/tasks/gitlab/elastic_rake_spec.rb'
+ - 'ee/spec/tasks/gitlab/license_rake_spec.rb'
+ - 'ee/spec/tasks/gitlab/uploads/migrate_rake_spec.rb'
+ - 'ee/spec/uploaders/every_gitlab_uploader_spec.rb'
+ - 'ee/spec/views/admin/application_settings/_elasticsearch_form.html.haml_spec.rb'
+ - 'ee/spec/views/admin/users/show.html.haml_spec.rb'
+ - 'ee/spec/views/compliance_management/compliance_framework/_project_settings.html.haml_spec.rb'
+ - 'ee/spec/views/groups/edit.html.haml_spec.rb'
+ - 'ee/spec/views/groups/security/discover/show.html.haml_spec.rb'
+ - 'ee/spec/views/layouts/header/_new_dropdown.haml_spec.rb'
+ - 'ee/spec/views/layouts/nav/sidebar/_admin.html.haml_spec.rb'
+ - 'ee/spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb'
+ - 'ee/spec/views/layouts/nav/sidebar/_push_rules_link.html.haml_spec.rb'
+ - 'ee/spec/views/profiles/preferences/show.html.haml_spec.rb'
+ - 'ee/spec/views/projects/edit.html.haml_spec.rb'
+ - 'ee/spec/views/projects/issues/show.html.haml_spec.rb'
+ - 'ee/spec/views/projects/security/discover/show.html.haml_spec.rb'
+ - 'ee/spec/views/registrations/groups/new.html.haml_spec.rb'
+ - 'ee/spec/views/registrations/projects/new.html.haml_spec.rb'
+ - 'ee/spec/views/registrations/welcome/show.html.haml_spec.rb'
+ - 'ee/spec/views/search/_category.html.haml_spec.rb'
+ - 'ee/spec/views/shared/_clone_panel.html.haml_spec.rb'
+ - 'ee/spec/views/shared/_kerberos_clone_button.html.haml_spec.rb'
+ - 'ee/spec/views/shared/_mirror_update_button.html.haml_spec.rb'
+ - 'ee/spec/views/shared/credentials_inventory/_expiry_date.html.haml_spec.rb'
+ - 'ee/spec/views/shared/credentials_inventory/gpg_keys/_gpg_key.html.haml_spec.rb'
+ - 'ee/spec/views/shared/credentials_inventory/personal_access_tokens/_personal_access_token.html.haml_spec.rb'
+ - 'ee/spec/views/shared/credentials_inventory/project_access_tokens/_project_access_token.html.haml_spec.rb'
+ - 'ee/spec/views/shared/credentials_inventory/ssh_keys/_ssh_key.html.haml_spec.rb'
+ - 'ee/spec/views/shared/issuable/_sidebar.html.haml_spec.rb'
+ - 'ee/spec/views/shared/labels/_create_label_help_text.html.haml_spec.rb'
+ - 'ee/spec/views/shared/promotions/_promotion_link_project.html.haml_spec.rb'
+ - 'ee/spec/views/subscriptions/groups/edit.html.haml_spec.rb'
+ - 'ee/spec/workers/active_user_count_threshold_worker_spec.rb'
+ - 'ee/spec/workers/adjourned_projects_deletion_cron_worker_spec.rb'
+ - 'ee/spec/workers/admin_emails_worker_spec.rb'
+ - 'ee/spec/workers/analytics/code_review_metrics_worker_spec.rb'
+ - 'ee/spec/workers/audit_events/audit_event_streaming_worker_spec.rb'
+ - 'ee/spec/workers/ci/minutes/refresh_cached_data_worker_spec.rb'
+ - 'ee/spec/workers/ci/minutes/update_project_and_namespace_usage_worker_spec.rb'
+ - 'ee/spec/workers/ci/runners/stale_group_runners_prune_cron_worker_spec.rb'
+ - 'ee/spec/workers/ci/upstream_projects_subscriptions_cleanup_worker_spec.rb'
+ - 'ee/spec/workers/compliance_management/merge_requests/compliance_violations_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_association_indexer_worker_spec.rb'
+ - 'ee/spec/workers/elastic_index_bulk_cron_worker_spec.rb'
+ - 'ee/spec/workers/elastic_indexing_control_worker_spec.rb'
+ - 'ee/spec/workers/geo/create_repository_updated_event_worker_spec.rb'
+ - 'ee/spec/workers/geo/file_download_dispatch_worker_spec.rb'
+ - 'ee/spec/workers/geo/prune_event_log_worker_spec.rb'
+ - 'ee/spec/workers/geo/repository_shard_sync_worker_spec.rb'
+ - 'ee/spec/workers/geo/repository_sync_worker_spec.rb'
+ - 'ee/spec/workers/geo/repository_verification/primary/shard_worker_spec.rb'
+ - 'ee/spec/workers/geo/repository_verification/secondary/shard_worker_spec.rb'
+ - 'ee/spec/workers/geo/verification_timeout_worker_spec.rb'
+ - 'ee/spec/workers/incident_management/apply_incident_sla_exceeded_label_worker_spec.rb'
+ - 'ee/spec/workers/incident_management/oncall_rotations/persist_shifts_job_spec.rb'
+ - 'ee/spec/workers/iterations/cadences/schedule_create_iterations_worker_spec.rb'
+ - 'ee/spec/workers/iterations_update_status_worker_spec.rb'
+ - 'ee/spec/workers/merge_request_reset_approvals_worker_spec.rb'
+ - 'ee/spec/workers/new_epic_worker_spec.rb'
+ - 'ee/spec/workers/personal_access_tokens/groups/policy_worker_spec.rb'
+ - 'ee/spec/workers/personal_access_tokens/instance/policy_worker_spec.rb'
+ - 'ee/spec/workers/post_receive_spec.rb'
+ - 'ee/spec/workers/project_import_schedule_worker_spec.rb'
+ - 'ee/spec/workers/requirements_management/process_requirements_reports_worker_spec.rb'
+ - 'ee/spec/workers/security/generate_scan_finding_rules_worker_spec.rb'
+ - 'ee/spec/workers/security/track_secure_scans_worker_spec.rb'
+ - 'ee/spec/workers/store_security_reports_worker_spec.rb'
+ - 'ee/spec/workers/sync_seat_link_request_worker_spec.rb'
+ - 'ee/spec/workers/sync_seat_link_worker_spec.rb'
+ - 'ee/spec/workers/update_all_mirrors_worker_spec.rb'
+ - 'ee/spec/workers/update_max_seats_used_for_gitlab_com_subscriptions_worker_spec.rb'
+ - 'qa/qa/specs/features/api/1_manage/project_access_token_spec.rb'
+ - 'qa/qa/specs/features/api/1_manage/user_access_termination_spec.rb'
+ - 'qa/qa/specs/features/api/3_create/gitaly/automatic_failover_and_recovery_spec.rb'
+ - 'qa/qa/specs/features/api/3_create/gitaly/backend_node_recovery_spec.rb'
+ - 'qa/qa/specs/features/api/3_create/gitaly/distributed_reads_spec.rb'
+ - 'qa/qa/specs/features/api/3_create/gitaly/gitaly_mtls_spec.rb'
+ - 'qa/qa/specs/features/api/3_create/gitaly/praefect_connectivity_spec.rb'
+ - 'qa/qa/specs/features/api/3_create/gitaly/praefect_dataloss_spec.rb'
+ - 'qa/qa/specs/features/api/3_create/gitaly/praefect_replication_queue_spec.rb'
+ - 'qa/qa/specs/features/api/3_create/gitaly/praefect_repo_sync_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/1_manage/login/2fa_ssh_recovery_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/1_manage/project/create_project_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/1_manage/project/invite_group_to_project_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/1_manage/user/user_access_termination_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/2_plan/milestone/assign_milestone_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/design_management/add_design_content_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/design_management/archive_design_content_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/design_management/modify_design_content_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/merge_request/suggestions/batch_suggestion_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/merge_request/suggestions/custom_commit_suggestion_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/repository/file/create_file_via_web_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/repository/file/delete_file_via_web_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/repository/file/edit_file_via_web_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/repository/ssh_key_support_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/wiki/content_editor_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/wiki/project_based_content_creation_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/wiki/project_based_content_manipulation_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/wiki/project_based_directory_management_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/wiki/project_based_list_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/wiki/project_based_page_deletion_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/4_verify/pipeline/merge_mr_when_pipline_is_blocked_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/4_verify/pipeline/mr_event_rule_pipeline_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_group_level_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/7_configure/kubernetes/kubernetes_integration_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/11_fulfillment/license/cloud_activation_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/11_fulfillment/license/license_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/11_fulfillment/purchase/purchase_ci_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/11_fulfillment/purchase/purchase_storage_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/12_geo/http_push_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/12_geo/http_push_to_secondary_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/12_geo/ssh_push_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/12_geo/ssh_push_to_secondary_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/12_geo/wiki_http_push_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/12_geo/wiki_ssh_push_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/13_secure/enable_scanning_from_configuration_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/13_secure/license_compliance_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/13_secure/security_reports_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/group/group_audit_logs_1_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/group/group_audit_logs_2_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/group/group_ldap_sync_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/insights/default_insights_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/instance/instance_audit_logs_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/project/project_audit_logs_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/project/project_templates_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/2_plan/epic/epics_management_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/2_plan/issue_boards/project_issue_boards_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/3_create/repository/merge_with_code_owner_in_root_group_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/3_create/repository/merge_with_code_owner_in_subgroup_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/3_create/repository/push_rules_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/3_create/wiki/create_group_wiki_page_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/4_verify/new_discussion_not_dropping_merge_trains_mr_spec.rb'
+ - 'qa/spec/git/repository_spec.rb'
+ - 'qa/spec/page/element_spec.rb'
+ - 'qa/spec/service/docker_run/gitlab_runner_spec.rb'
+ - 'qa/spec/service/docker_run/k3s_spec.rb'
+ - 'qa/spec/specs/helpers/context_selector_spec.rb'
+ - 'qa/spec/specs/helpers/feature_flag_spec.rb'
+ - 'qa/spec/specs/helpers/quarantine_spec.rb'
+ - 'qa/spec/specs/runner_spec.rb'
+ - 'qa/spec/support/loglinking_spec.rb'
+ - 'qa/spec/support/page_error_checker_spec.rb'
+ - 'spec/benchmarks/banzai_benchmark.rb'
+ - 'spec/bin/feature_flag_spec.rb'
+ - 'spec/commands/sidekiq_cluster/cli_spec.rb'
+ - 'spec/components/diffs/overflow_warning_component_spec.rb'
+ - 'spec/components/pajamas/alert_component_spec.rb'
+ - 'spec/config/object_store_settings_spec.rb'
+ - 'spec/controllers/admin/application_settings_controller_spec.rb'
+ - 'spec/controllers/admin/clusters_controller_spec.rb'
+ - 'spec/controllers/admin/dev_ops_report_controller_spec.rb'
+ - 'spec/controllers/admin/impersonations_controller_spec.rb'
+ - 'spec/controllers/admin/instance_review_controller_spec.rb'
+ - 'spec/controllers/admin/integrations_controller_spec.rb'
+ - 'spec/controllers/admin/runner_projects_controller_spec.rb'
+ - 'spec/controllers/admin/sessions_controller_spec.rb'
+ - 'spec/controllers/admin/topics_controller_spec.rb'
+ - 'spec/controllers/admin/users_controller_spec.rb'
+ - 'spec/controllers/application_controller_spec.rb'
+ - 'spec/controllers/autocomplete_controller_spec.rb'
+ - 'spec/controllers/boards/issues_controller_spec.rb'
+ - 'spec/controllers/concerns/controller_with_cross_project_access_check_spec.rb'
+ - 'spec/controllers/concerns/enforces_admin_authentication_spec.rb'
+ - 'spec/controllers/concerns/graceful_timeout_handling_spec.rb'
+ - 'spec/controllers/concerns/group_tree_spec.rb'
+ - 'spec/controllers/concerns/import_url_params_spec.rb'
+ - 'spec/controllers/concerns/issuable_collections_spec.rb'
+ - 'spec/controllers/concerns/metrics_dashboard_spec.rb'
+ - 'spec/controllers/concerns/renders_commits_spec.rb'
+ - 'spec/controllers/concerns/send_file_upload_spec.rb'
+ - 'spec/controllers/confirmations_controller_spec.rb'
+ - 'spec/controllers/dashboard/milestones_controller_spec.rb'
+ - 'spec/controllers/dashboard/projects_controller_spec.rb'
+ - 'spec/controllers/dashboard/todos_controller_spec.rb'
+ - 'spec/controllers/dashboard_controller_spec.rb'
+ - 'spec/controllers/every_controller_spec.rb'
+ - 'spec/controllers/explore/groups_controller_spec.rb'
+ - 'spec/controllers/explore/projects_controller_spec.rb'
+ - 'spec/controllers/google_api/authorizations_controller_spec.rb'
+ - 'spec/controllers/groups/children_controller_spec.rb'
+ - 'spec/controllers/groups/clusters_controller_spec.rb'
+ - 'spec/controllers/groups/dependency_proxy_auth_controller_spec.rb'
+ - 'spec/controllers/groups/dependency_proxy_for_containers_controller_spec.rb'
+ - 'spec/controllers/groups/group_members_controller_spec.rb'
+ - 'spec/controllers/groups/labels_controller_spec.rb'
+ - 'spec/controllers/groups/milestones_controller_spec.rb'
+ - 'spec/controllers/groups/packages_controller_spec.rb'
+ - 'spec/controllers/groups/registry/repositories_controller_spec.rb'
+ - 'spec/controllers/groups/releases_controller_spec.rb'
+ - 'spec/controllers/groups/settings/ci_cd_controller_spec.rb'
+ - 'spec/controllers/groups/settings/integrations_controller_spec.rb'
+ - 'spec/controllers/groups/settings/repository_controller_spec.rb'
+ - 'spec/controllers/groups/uploads_controller_spec.rb'
+ - 'spec/controllers/groups_controller_spec.rb'
+ - 'spec/controllers/help_controller_spec.rb'
+ - 'spec/controllers/import/bitbucket_controller_spec.rb'
+ - 'spec/controllers/import/bulk_imports_controller_spec.rb'
+ - 'spec/controllers/import/fogbugz_controller_spec.rb'
+ - 'spec/controllers/import/github_controller_spec.rb'
+ - 'spec/controllers/import/gitlab_controller_spec.rb'
+ - 'spec/controllers/jira_connect/events_controller_spec.rb'
+ - 'spec/controllers/jira_connect/subscriptions_controller_spec.rb'
+ - 'spec/controllers/ldap/omniauth_callbacks_controller_spec.rb'
+ - 'spec/controllers/metrics_controller_spec.rb'
+ - 'spec/controllers/oauth/applications_controller_spec.rb'
+ - 'spec/controllers/oauth/authorizations_controller_spec.rb'
+ - 'spec/controllers/omniauth_callbacks_controller_spec.rb'
+ - 'spec/controllers/passwords_controller_spec.rb'
+ - 'spec/controllers/profiles/emails_controller_spec.rb'
+ - 'spec/controllers/profiles/notifications_controller_spec.rb'
+ - 'spec/controllers/profiles/preferences_controller_spec.rb'
+ - 'spec/controllers/profiles/two_factor_auths_controller_spec.rb'
+ - 'spec/controllers/projects/alerting/notifications_controller_spec.rb'
+ - 'spec/controllers/projects/artifacts_controller_spec.rb'
+ - 'spec/controllers/projects/badges_controller_spec.rb'
+ - 'spec/controllers/projects/blame_controller_spec.rb'
+ - 'spec/controllers/projects/blob_controller_spec.rb'
+ - 'spec/controllers/projects/boards_controller_spec.rb'
+ - 'spec/controllers/projects/branches_controller_spec.rb'
+ - 'spec/controllers/projects/ci/lints_controller_spec.rb'
+ - 'spec/controllers/projects/ci/secure_files_controller_spec.rb'
+ - 'spec/controllers/projects/clusters_controller_spec.rb'
+ - 'spec/controllers/projects/commit_controller_spec.rb'
+ - 'spec/controllers/projects/commits_controller_spec.rb'
+ - 'spec/controllers/projects/cycle_analytics_controller_spec.rb'
+ - 'spec/controllers/projects/deploy_keys_controller_spec.rb'
+ - 'spec/controllers/projects/deployments_controller_spec.rb'
+ - 'spec/controllers/projects/discussions_controller_spec.rb'
+ - 'spec/controllers/projects/environments_controller_spec.rb'
+ - 'spec/controllers/projects/feature_flags_clients_controller_spec.rb'
+ - 'spec/controllers/projects/feature_flags_controller_spec.rb'
+ - 'spec/controllers/projects/find_file_controller_spec.rb'
+ - 'spec/controllers/projects/forks_controller_spec.rb'
+ - 'spec/controllers/projects/import/jira_controller_spec.rb'
+ - 'spec/controllers/projects/incidents_controller_spec.rb'
+ - 'spec/controllers/projects/issues_controller_spec.rb'
+ - 'spec/controllers/projects/jobs_controller_spec.rb'
+ - 'spec/controllers/projects/labels_controller_spec.rb'
+ - 'spec/controllers/projects/learn_gitlab_controller_spec.rb'
+ - 'spec/controllers/projects/mattermosts_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests/conflicts_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests/content_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests/creations_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests/diffs_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests/drafts_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests_controller_spec.rb'
+ - 'spec/controllers/projects/milestones_controller_spec.rb'
+ - 'spec/controllers/projects/mirrors_controller_spec.rb'
+ - 'spec/controllers/projects/notes_controller_spec.rb'
+ - 'spec/controllers/projects/packages/packages_controller_spec.rb'
+ - 'spec/controllers/projects/pages_controller_spec.rb'
+ - 'spec/controllers/projects/pages_domains_controller_spec.rb'
+ - 'spec/controllers/projects/performance_monitoring/dashboards_controller_spec.rb'
+ - 'spec/controllers/projects/pipelines_controller_spec.rb'
+ - 'spec/controllers/projects/product_analytics_controller_spec.rb'
+ - 'spec/controllers/projects/project_members_controller_spec.rb'
+ - 'spec/controllers/projects/prometheus/alerts_controller_spec.rb'
+ - 'spec/controllers/projects/prometheus/metrics_controller_spec.rb'
+ - 'spec/controllers/projects/raw_controller_spec.rb'
+ - 'spec/controllers/projects/releases_controller_spec.rb'
+ - 'spec/controllers/projects/repositories_controller_spec.rb'
+ - 'spec/controllers/projects/settings/ci_cd_controller_spec.rb'
+ - 'spec/controllers/projects/settings/operations_controller_spec.rb'
+ - 'spec/controllers/projects/settings/repository_controller_spec.rb'
+ - 'spec/controllers/projects/snippets_controller_spec.rb'
+ - 'spec/controllers/projects/starrers_controller_spec.rb'
+ - 'spec/controllers/projects/static_site_editor_controller_spec.rb'
+ - 'spec/controllers/projects/tags_controller_spec.rb'
+ - 'spec/controllers/projects/todos_controller_spec.rb'
+ - 'spec/controllers/projects/tree_controller_spec.rb'
+ - 'spec/controllers/projects/uploads_controller_spec.rb'
+ - 'spec/controllers/projects/web_ide_terminals_controller_spec.rb'
+ - 'spec/controllers/projects_controller_spec.rb'
+ - 'spec/controllers/registrations/welcome_controller_spec.rb'
+ - 'spec/controllers/registrations_controller_spec.rb'
+ - 'spec/controllers/repositories/git_http_controller_spec.rb'
+ - 'spec/controllers/root_controller_spec.rb'
+ - 'spec/controllers/search_controller_spec.rb'
+ - 'spec/controllers/sent_notifications_controller_spec.rb'
+ - 'spec/controllers/sessions_controller_spec.rb'
+ - 'spec/controllers/snippets/notes_controller_spec.rb'
+ - 'spec/controllers/snippets_controller_spec.rb'
+ - 'spec/controllers/uploads_controller_spec.rb'
+ - 'spec/controllers/users/terms_controller_spec.rb'
+ - 'spec/db/docs_spec.rb'
+ - 'spec/db/production/settings_spec.rb'
+ - 'spec/db/schema_spec.rb'
+ - 'spec/docs_screenshots/container_registry_docs.rb'
+ - 'spec/docs_screenshots/wiki_docs.rb'
+ - 'spec/experiments/application_experiment_spec.rb'
+ - 'spec/experiments/ios_specific_templates_experiment_spec.rb'
+ - 'spec/features/admin/admin_abuse_reports_spec.rb'
+ - 'spec/features/admin/admin_appearance_spec.rb'
+ - 'spec/features/admin/admin_disables_git_access_protocol_spec.rb'
+ - 'spec/features/admin/admin_hooks_spec.rb'
+ - 'spec/features/admin/admin_jobs_spec.rb'
+ - 'spec/features/admin/admin_mode/login_spec.rb'
+ - 'spec/features/admin/admin_mode/logout_spec.rb'
+ - 'spec/features/admin/admin_mode/workers_spec.rb'
+ - 'spec/features/admin/admin_mode_spec.rb'
+ - 'spec/features/admin/admin_runners_spec.rb'
+ - 'spec/features/admin/admin_search_settings_spec.rb'
+ - 'spec/features/admin/admin_settings_spec.rb'
+ - 'spec/features/admin/dashboard_spec.rb'
+ - 'spec/features/admin/users/user_spec.rb'
+ - 'spec/features/admin/users/users_spec.rb'
+ - 'spec/features/atom/dashboard_issues_spec.rb'
+ - 'spec/features/atom/dashboard_spec.rb'
+ - 'spec/features/atom/issues_spec.rb'
+ - 'spec/features/atom/merge_requests_spec.rb'
+ - 'spec/features/atom/users_spec.rb'
+ - 'spec/features/boards/boards_spec.rb'
+ - 'spec/features/boards/issue_ordering_spec.rb'
+ - 'spec/features/boards/keyboard_shortcut_spec.rb'
+ - 'spec/features/boards/new_issue_spec.rb'
+ - 'spec/features/boards/reload_boards_on_browser_back_spec.rb'
+ - 'spec/features/boards/sidebar_assignee_spec.rb'
+ - 'spec/features/boards/sidebar_labels_in_namespaces_spec.rb'
+ - 'spec/features/boards/sidebar_labels_spec.rb'
+ - 'spec/features/boards/user_visits_board_spec.rb'
+ - 'spec/features/calendar_spec.rb'
+ - 'spec/features/clusters/cluster_detail_page_spec.rb'
+ - 'spec/features/clusters/cluster_health_dashboard_spec.rb'
+ - 'spec/features/commits_spec.rb'
+ - 'spec/features/cycle_analytics_spec.rb'
+ - 'spec/features/dashboard/activity_spec.rb'
+ - 'spec/features/dashboard/datetime_on_tooltips_spec.rb'
+ - 'spec/features/dashboard/groups_list_spec.rb'
+ - 'spec/features/dashboard/issues_filter_spec.rb'
+ - 'spec/features/dashboard/label_filter_spec.rb'
+ - 'spec/features/dashboard/merge_requests_spec.rb'
+ - 'spec/features/dashboard/projects_spec.rb'
+ - 'spec/features/dashboard/shortcuts_spec.rb'
+ - 'spec/features/dashboard/snippets_spec.rb'
+ - 'spec/features/dashboard/todos/todos_filtering_spec.rb'
+ - 'spec/features/dashboard/todos/todos_sorting_spec.rb'
+ - 'spec/features/dashboard/todos/todos_spec.rb'
+ - 'spec/features/dashboard/user_filters_projects_spec.rb'
+ - 'spec/features/expand_collapse_diffs_spec.rb'
+ - 'spec/features/file_uploads/multipart_invalid_uploads_spec.rb'
+ - 'spec/features/frequently_visited_projects_and_groups_spec.rb'
+ - 'spec/features/groups/board_sidebar_spec.rb'
+ - 'spec/features/groups/board_spec.rb'
+ - 'spec/features/groups/clusters/user_spec.rb'
+ - 'spec/features/groups/dependency_proxy_for_containers_spec.rb'
+ - 'spec/features/groups/dependency_proxy_spec.rb'
+ - 'spec/features/groups/empty_states_spec.rb'
+ - 'spec/features/groups/group_runners_spec.rb'
+ - 'spec/features/groups/group_settings_spec.rb'
+ - 'spec/features/groups/issues_spec.rb'
+ - 'spec/features/groups/labels/subscription_spec.rb'
+ - 'spec/features/groups/members/tabs_spec.rb'
+ - 'spec/features/groups/merge_requests_spec.rb'
+ - 'spec/features/groups/milestone_spec.rb'
+ - 'spec/features/groups/packages_spec.rb'
+ - 'spec/features/groups/settings/ci_cd_spec.rb'
+ - 'spec/features/groups/settings/group_badges_spec.rb'
+ - 'spec/features/groups/settings/packages_and_registries_spec.rb'
+ - 'spec/features/groups/settings/repository_spec.rb'
+ - 'spec/features/groups/settings/user_searches_in_settings_spec.rb'
+ - 'spec/features/groups/share_lock_spec.rb'
+ - 'spec/features/groups/show_spec.rb'
+ - 'spec/features/groups/user_sees_package_sidebar_spec.rb'
+ - 'spec/features/groups_spec.rb'
+ - 'spec/features/help_pages_spec.rb'
+ - 'spec/features/ics/dashboard_issues_spec.rb'
+ - 'spec/features/ics/group_issues_spec.rb'
+ - 'spec/features/ics/project_issues_spec.rb'
+ - 'spec/features/ide/clientside_preview_csp_spec.rb'
+ - 'spec/features/ide/static_object_external_storage_csp_spec.rb'
+ - 'spec/features/incidents/incident_details_spec.rb'
+ - 'spec/features/incidents/user_creates_new_incident_spec.rb'
+ - 'spec/features/invites_spec.rb'
+ - 'spec/features/issuables/markdown_references/internal_references_spec.rb'
+ - 'spec/features/issuables/sorting_list_spec.rb'
+ - 'spec/features/issuables/user_sees_sidebar_spec.rb'
+ - 'spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb'
+ - 'spec/features/issues/create_issue_for_single_discussion_in_merge_request_spec.rb'
+ - 'spec/features/issues/filtered_search/dropdown_assignee_spec.rb'
+ - 'spec/features/issues/filtered_search/filter_issues_spec.rb'
+ - 'spec/features/issues/form_spec.rb'
+ - 'spec/features/issues/gfm_autocomplete_spec.rb'
+ - 'spec/features/issues/issue_detail_spec.rb'
+ - 'spec/features/issues/issue_header_spec.rb'
+ - 'spec/features/issues/issue_sidebar_spec.rb'
+ - 'spec/features/issues/keyboard_shortcut_spec.rb'
+ - 'spec/features/issues/move_spec.rb'
+ - 'spec/features/issues/note_polling_spec.rb'
+ - 'spec/features/issues/notes_on_issues_spec.rb'
+ - 'spec/features/issues/related_issues_spec.rb'
+ - 'spec/features/issues/service_desk_spec.rb'
+ - 'spec/features/issues/spam_akismet_issue_creation_spec.rb'
+ - 'spec/features/issues/user_bulk_edits_issues_labels_spec.rb'
+ - 'spec/features/issues/user_bulk_edits_issues_spec.rb'
+ - 'spec/features/issues/user_creates_confidential_merge_request_spec.rb'
+ - 'spec/features/issues/user_creates_issue_spec.rb'
+ - 'spec/features/issues/user_edits_issue_spec.rb'
+ - 'spec/features/issues/user_interacts_with_awards_spec.rb'
+ - 'spec/features/issues/user_scrolls_to_deeplinked_note_spec.rb'
+ - 'spec/features/issues/user_sorts_issue_comments_spec.rb'
+ - 'spec/features/issues/user_toggles_subscription_spec.rb'
+ - 'spec/features/issues/user_uses_quick_actions_spec.rb'
+ - 'spec/features/issues/user_views_issues_spec.rb'
+ - 'spec/features/labels_hierarchy_spec.rb'
+ - 'spec/features/markdown/copy_as_gfm_spec.rb'
+ - 'spec/features/markdown/keyboard_shortcuts_spec.rb'
+ - 'spec/features/markdown/markdown_spec.rb'
+ - 'spec/features/markdown/metrics_spec.rb'
+ - 'spec/features/merge_request/batch_comments_spec.rb'
+ - 'spec/features/merge_request/close_reopen_report_toggle_spec.rb'
+ - 'spec/features/merge_request/user_accepts_merge_request_spec.rb'
+ - 'spec/features/merge_request/user_assigns_themselves_spec.rb'
+ - 'spec/features/merge_request/user_comments_on_diff_spec.rb'
+ - 'spec/features/merge_request/user_creates_image_diff_notes_spec.rb'
+ - 'spec/features/merge_request/user_creates_merge_request_spec.rb'
+ - 'spec/features/merge_request/user_creates_mr_spec.rb'
+ - 'spec/features/merge_request/user_edits_mr_spec.rb'
+ - 'spec/features/merge_request/user_interacts_with_batched_mr_diffs_spec.rb'
+ - 'spec/features/merge_request/user_merges_merge_request_spec.rb'
+ - 'spec/features/merge_request/user_merges_only_if_pipeline_succeeds_spec.rb'
+ - 'spec/features/merge_request/user_merges_when_pipeline_succeeds_spec.rb'
+ - 'spec/features/merge_request/user_posts_diff_notes_spec.rb'
+ - 'spec/features/merge_request/user_resolves_conflicts_spec.rb'
+ - 'spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb'
+ - 'spec/features/merge_request/user_scrolls_to_note_on_load_spec.rb'
+ - 'spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb'
+ - 'spec/features/merge_request/user_sees_cherry_pick_modal_spec.rb'
+ - 'spec/features/merge_request/user_sees_closing_issues_message_spec.rb'
+ - 'spec/features/merge_request/user_sees_deployment_widget_spec.rb'
+ - 'spec/features/merge_request/user_sees_diff_spec.rb'
+ - 'spec/features/merge_request/user_sees_discussions_spec.rb'
+ - 'spec/features/merge_request/user_sees_merge_widget_spec.rb'
+ - 'spec/features/merge_request/user_sees_mini_pipeline_graph_spec.rb'
+ - 'spec/features/merge_request/user_suggests_changes_on_diff_spec.rb'
+ - 'spec/features/merge_request/user_uses_quick_actions_spec.rb'
+ - 'spec/features/merge_request/user_views_open_merge_request_spec.rb'
+ - 'spec/features/merge_request/user_views_user_status_on_merge_request_spec.rb'
+ - 'spec/features/merge_requests/filters_generic_behavior_spec.rb'
+ - 'spec/features/merge_requests/user_exports_as_csv_spec.rb'
+ - 'spec/features/merge_requests/user_filters_by_approvals_spec.rb'
+ - 'spec/features/merge_requests/user_filters_by_assignees_spec.rb'
+ - 'spec/features/merge_requests/user_filters_by_labels_spec.rb'
+ - 'spec/features/merge_requests/user_filters_by_target_branch_spec.rb'
+ - 'spec/features/merge_requests/user_lists_merge_requests_spec.rb'
+ - 'spec/features/merge_requests/user_mass_updates_spec.rb'
+ - 'spec/features/merge_requests/user_sees_empty_state_spec.rb'
+ - 'spec/features/milestones/user_views_milestone_spec.rb'
+ - 'spec/features/monitor_sidebar_link_spec.rb'
+ - 'spec/features/nav/top_nav_responsive_spec.rb'
+ - 'spec/features/oauth_login_spec.rb'
+ - 'spec/features/one_trust_spec.rb'
+ - 'spec/features/participants_autocomplete_spec.rb'
+ - 'spec/features/profiles/chat_names_spec.rb'
+ - 'spec/features/profiles/keys_spec.rb'
+ - 'spec/features/profiles/password_spec.rb'
+ - 'spec/features/profiles/user_edit_profile_spec.rb'
+ - 'spec/features/profiles/user_search_settings_spec.rb'
+ - 'spec/features/projects/active_tabs_spec.rb'
+ - 'spec/features/projects/activity/user_sees_design_activity_spec.rb'
+ - 'spec/features/projects/artifacts/file_spec.rb'
+ - 'spec/features/projects/artifacts/user_downloads_artifacts_spec.rb'
+ - 'spec/features/projects/blobs/blob_show_spec.rb'
+ - 'spec/features/projects/blobs/edit_spec.rb'
+ - 'spec/features/projects/branches/user_views_branches_spec.rb'
+ - 'spec/features/projects/branches_spec.rb'
+ - 'spec/features/projects/ci/lint_spec.rb'
+ - 'spec/features/projects/clusters_spec.rb'
+ - 'spec/features/projects/commit/comments/user_adds_comment_spec.rb'
+ - 'spec/features/projects/commits/multi_view_diff_spec.rb'
+ - 'spec/features/projects/commits/user_browses_commits_spec.rb'
+ - 'spec/features/projects/compare_spec.rb'
+ - 'spec/features/projects/diffs/diff_show_spec.rb'
+ - 'spec/features/projects/environments/environment_spec.rb'
+ - 'spec/features/projects/environments/environments_spec.rb'
+ - 'spec/features/projects/features_visibility_spec.rb'
+ - 'spec/features/projects/files/template_selector_menu_spec.rb'
+ - 'spec/features/projects/files/template_type_dropdown_spec.rb'
+ - 'spec/features/projects/files/undo_template_spec.rb'
+ - 'spec/features/projects/files/user_creates_directory_spec.rb'
+ - 'spec/features/projects/fork_spec.rb'
+ - 'spec/features/projects/graph_spec.rb'
+ - 'spec/features/projects/import_export/export_file_spec.rb'
+ - 'spec/features/projects/infrastructure_registry_spec.rb'
+ - 'spec/features/projects/integrations/disable_triggers_spec.rb'
+ - 'spec/features/projects/integrations/user_activates_mattermost_slash_command_spec.rb'
+ - 'spec/features/projects/issuable_templates_spec.rb'
+ - 'spec/features/projects/issues/design_management/user_links_to_designs_in_issue_spec.rb'
+ - 'spec/features/projects/issues/design_management/user_views_designs_spec.rb'
+ - 'spec/features/projects/issues/email_participants_spec.rb'
+ - 'spec/features/projects/jobs/user_browses_jobs_spec.rb'
+ - 'spec/features/projects/jobs_spec.rb'
+ - 'spec/features/projects/labels/search_labels_spec.rb'
+ - 'spec/features/projects/labels/update_prioritization_spec.rb'
+ - 'spec/features/projects/labels/user_creates_labels_spec.rb'
+ - 'spec/features/projects/members/group_members_spec.rb'
+ - 'spec/features/projects/members/groups_with_access_list_spec.rb'
+ - 'spec/features/projects/members/manage_groups_spec.rb'
+ - 'spec/features/projects/members/manage_members_spec.rb'
+ - 'spec/features/projects/members/tabs_spec.rb'
+ - 'spec/features/projects/members/user_requests_access_spec.rb'
+ - 'spec/features/projects/merge_request_button_spec.rb'
+ - 'spec/features/projects/new_project_from_template_spec.rb'
+ - 'spec/features/projects/new_project_spec.rb'
+ - 'spec/features/projects/package_files_spec.rb'
+ - 'spec/features/projects/packages_spec.rb'
+ - 'spec/features/projects/pages/user_edits_settings_spec.rb'
+ - 'spec/features/projects/pipeline_schedules_spec.rb'
+ - 'spec/features/projects/pipelines/pipeline_spec.rb'
+ - 'spec/features/projects/pipelines/pipelines_spec.rb'
+ - 'spec/features/projects/releases/user_views_releases_spec.rb'
+ - 'spec/features/projects/settings/lfs_settings_spec.rb'
+ - 'spec/features/projects/settings/packages_settings_spec.rb'
+ - 'spec/features/projects/settings/pipelines_settings_spec.rb'
+ - 'spec/features/projects/settings/project_badges_spec.rb'
+ - 'spec/features/projects/settings/project_settings_spec.rb'
+ - 'spec/features/projects/settings/registry_settings_spec.rb'
+ - 'spec/features/projects/settings/repository_settings_spec.rb'
+ - 'spec/features/projects/settings/service_desk_setting_spec.rb'
+ - 'spec/features/projects/settings/user_interacts_with_deploy_keys_spec.rb'
+ - 'spec/features/projects/settings/user_renames_a_project_spec.rb'
+ - 'spec/features/projects/settings/user_searches_in_settings_spec.rb'
+ - 'spec/features/projects/settings/user_transfers_a_project_spec.rb'
+ - 'spec/features/projects/settings/visibility_settings_spec.rb'
+ - 'spec/features/projects/settings/webhooks_settings_spec.rb'
+ - 'spec/features/projects/show/user_manages_notifications_spec.rb'
+ - 'spec/features/projects/show/user_sees_collaboration_links_spec.rb'
+ - 'spec/features/projects/show/user_sees_git_instructions_spec.rb'
+ - 'spec/features/projects/show/user_sees_readme_spec.rb'
+ - 'spec/features/projects/show/user_sees_setup_shortcut_buttons_spec.rb'
+ - 'spec/features/projects/snippets/user_views_snippets_spec.rb'
+ - 'spec/features/projects/sourcegraph_csp_spec.rb'
+ - 'spec/features/projects/tags/user_edits_tags_spec.rb'
+ - 'spec/features/projects/tags/user_views_tags_spec.rb'
+ - 'spec/features/projects/tree/tree_show_spec.rb'
+ - 'spec/features/projects/user_creates_project_spec.rb'
+ - 'spec/features/projects/user_sees_sidebar_spec.rb'
+ - 'spec/features/projects/user_sorts_projects_spec.rb'
+ - 'spec/features/projects/user_uses_shortcuts_spec.rb'
+ - 'spec/features/projects/view_on_env_spec.rb'
+ - 'spec/features/projects/wiki/user_views_wiki_empty_spec.rb'
+ - 'spec/features/projects_spec.rb'
+ - 'spec/features/protected_branches_spec.rb'
+ - 'spec/features/refactor_blob_viewer_disabled/projects/blobs/blob_show_spec.rb'
+ - 'spec/features/refactor_blob_viewer_disabled/projects/blobs/edit_spec.rb'
+ - 'spec/features/reportable_note/commit_spec.rb'
+ - 'spec/features/reportable_note/merge_request_spec.rb'
+ - 'spec/features/runners_spec.rb'
+ - 'spec/features/search/user_searches_for_code_spec.rb'
+ - 'spec/features/search/user_uses_header_search_field_spec.rb'
+ - 'spec/features/security/project/snippet/internal_access_spec.rb'
+ - 'spec/features/security/project/snippet/public_access_spec.rb'
+ - 'spec/features/signed_commits_spec.rb'
+ - 'spec/features/snippets/explore_spec.rb'
+ - 'spec/features/tags/developer_creates_tag_spec.rb'
+ - 'spec/features/tags/developer_deletes_tag_spec.rb'
+ - 'spec/features/tags/developer_updates_tag_spec.rb'
+ - 'spec/features/uploads/user_uploads_file_to_note_spec.rb'
+ - 'spec/features/user_can_display_performance_bar_spec.rb'
+ - 'spec/features/user_opens_link_to_comment_spec.rb'
+ - 'spec/features/users/login_spec.rb'
+ - 'spec/features/users/logout_spec.rb'
+ - 'spec/features/users/overview_spec.rb'
+ - 'spec/features/users/show_spec.rb'
+ - 'spec/features/users/snippets_spec.rb'
+ - 'spec/features/users/terms_spec.rb'
+ - 'spec/finders/abuse_reports_finder_spec.rb'
+ - 'spec/finders/admin/projects_finder_spec.rb'
+ - 'spec/finders/alert_management/alerts_finder_spec.rb'
+ - 'spec/finders/alert_management/http_integrations_finder_spec.rb'
+ - 'spec/finders/applications_finder_spec.rb'
+ - 'spec/finders/autocomplete/acts_as_taggable_on/tags_finder_spec.rb'
+ - 'spec/finders/autocomplete/move_to_project_finder_spec.rb'
+ - 'spec/finders/autocomplete/routes_finder_spec.rb'
+ - 'spec/finders/autocomplete/users_finder_spec.rb'
+ - 'spec/finders/branches_finder_spec.rb'
+ - 'spec/finders/ci/commit_statuses_finder_spec.rb'
+ - 'spec/finders/ci/jobs_finder_spec.rb'
+ - 'spec/finders/ci/pipelines_finder_spec.rb'
+ - 'spec/finders/ci/runners_finder_spec.rb'
+ - 'spec/finders/ci/variables_finder_spec.rb'
+ - 'spec/finders/cluster_ancestors_finder_spec.rb'
+ - 'spec/finders/clusters/agent_authorizations_finder_spec.rb'
+ - 'spec/finders/clusters/agents_finder_spec.rb'
+ - 'spec/finders/clusters/kubernetes_namespace_finder_spec.rb'
+ - 'spec/finders/contributed_projects_finder_spec.rb'
+ - 'spec/finders/deploy_tokens/tokens_finder_spec.rb'
+ - 'spec/finders/deployments_finder_spec.rb'
+ - 'spec/finders/design_management/designs_finder_spec.rb'
+ - 'spec/finders/environments/environment_names_finder_spec.rb'
+ - 'spec/finders/environments/environments_by_deployments_finder_spec.rb'
+ - 'spec/finders/environments/environments_finder_spec.rb'
+ - 'spec/finders/events_finder_spec.rb'
+ - 'spec/finders/group_descendants_finder_spec.rb'
+ - 'spec/finders/group_members_finder_spec.rb'
+ - 'spec/finders/group_projects_finder_spec.rb'
+ - 'spec/finders/groups/projects_requiring_authorizations_refresh/on_direct_membership_finder_spec.rb'
+ - 'spec/finders/groups/projects_requiring_authorizations_refresh/on_transfer_finder_spec.rb'
+ - 'spec/finders/groups_finder_spec.rb'
+ - 'spec/finders/issues_finder_spec.rb'
+ - 'spec/finders/joined_groups_finder_spec.rb'
+ - 'spec/finders/keys_finder_spec.rb'
+ - 'spec/finders/labels_finder_spec.rb'
+ - 'spec/finders/license_template_finder_spec.rb'
+ - 'spec/finders/merge_request_target_project_finder_spec.rb'
+ - 'spec/finders/merge_requests/by_approvals_finder_spec.rb'
+ - 'spec/finders/merge_requests_finder/params_spec.rb'
+ - 'spec/finders/merge_requests_finder_spec.rb'
+ - 'spec/finders/metrics/dashboards/annotations_finder_spec.rb'
+ - 'spec/finders/metrics/users_starred_dashboards_finder_spec.rb'
+ - 'spec/finders/milestones_finder_spec.rb'
+ - 'spec/finders/notes_finder_spec.rb'
+ - 'spec/finders/packages/conan/package_finder_spec.rb'
+ - 'spec/finders/packages/go/version_finder_spec.rb'
+ - 'spec/finders/packages/group_packages_finder_spec.rb'
+ - 'spec/finders/packages/helm/packages_finder_spec.rb'
+ - 'spec/finders/packages/maven/package_finder_spec.rb'
+ - 'spec/finders/packages/npm/package_finder_spec.rb'
+ - 'spec/finders/packages/package_finder_spec.rb'
+ - 'spec/finders/packages/packages_finder_spec.rb'
+ - 'spec/finders/packages/pypi/package_finder_spec.rb'
+ - 'spec/finders/packages/pypi/packages_finder_spec.rb'
+ - 'spec/finders/personal_access_tokens_finder_spec.rb'
+ - 'spec/finders/personal_projects_finder_spec.rb'
+ - 'spec/finders/projects/groups_finder_spec.rb'
+ - 'spec/finders/projects/members/effective_access_level_finder_spec.rb'
+ - 'spec/finders/projects/members/effective_access_level_per_user_finder_spec.rb'
+ - 'spec/finders/projects/topics_finder_spec.rb'
+ - 'spec/finders/projects_finder_spec.rb'
+ - 'spec/finders/releases/evidence_pipeline_finder_spec.rb'
+ - 'spec/finders/releases/group_releases_finder_spec.rb'
+ - 'spec/finders/releases_finder_spec.rb'
+ - 'spec/finders/repositories/tree_finder_spec.rb'
+ - 'spec/finders/snippets_finder_spec.rb'
+ - 'spec/finders/starred_projects_finder_spec.rb'
+ - 'spec/finders/tags_finder_spec.rb'
+ - 'spec/finders/template_finder_spec.rb'
+ - 'spec/finders/terraform/states_finder_spec.rb'
+ - 'spec/finders/todos_finder_spec.rb'
+ - 'spec/finders/user_group_notification_settings_finder_spec.rb'
+ - 'spec/finders/user_recent_events_finder_spec.rb'
+ - 'spec/frontend/fixtures/merge_requests.rb'
+ - 'spec/frontend/fixtures/projects.rb'
+ - 'spec/frontend/fixtures/search.rb'
+ - 'spec/frontend/fixtures/u2f.rb'
+ - 'spec/frontend/fixtures/webauthn.rb'
+ - 'spec/graphql/features/feature_flag_spec.rb'
+ - 'spec/graphql/mutations/alert_management/alerts/set_assignees_spec.rb'
+ - 'spec/graphql/mutations/alert_management/create_alert_issue_spec.rb'
+ - 'spec/graphql/mutations/alert_management/http_integration/create_spec.rb'
+ - 'spec/graphql/mutations/alert_management/http_integration/destroy_spec.rb'
+ - 'spec/graphql/mutations/alert_management/http_integration/reset_token_spec.rb'
+ - 'spec/graphql/mutations/alert_management/http_integration/update_spec.rb'
+ - 'spec/graphql/mutations/alert_management/prometheus_integration/create_spec.rb'
+ - 'spec/graphql/mutations/alert_management/prometheus_integration/reset_token_spec.rb'
+ - 'spec/graphql/mutations/alert_management/prometheus_integration/update_spec.rb'
+ - 'spec/graphql/mutations/alert_management/update_alert_status_spec.rb'
+ - 'spec/graphql/mutations/boards/lists/update_spec.rb'
+ - 'spec/graphql/mutations/clusters/agent_tokens/revoke_spec.rb'
+ - 'spec/graphql/mutations/clusters/agents/create_spec.rb'
+ - 'spec/graphql/mutations/custom_emoji/destroy_spec.rb'
+ - 'spec/graphql/mutations/design_management/delete_spec.rb'
+ - 'spec/graphql/mutations/design_management/move_spec.rb'
+ - 'spec/graphql/mutations/groups/update_spec.rb'
+ - 'spec/graphql/mutations/issues/set_severity_spec.rb'
+ - 'spec/graphql/mutations/merge_requests/update_spec.rb'
+ - 'spec/graphql/mutations/release_asset_links/update_spec.rb'
+ - 'spec/graphql/mutations/releases/delete_spec.rb'
+ - 'spec/graphql/mutations/releases/update_spec.rb'
+ - 'spec/graphql/mutations/terraform/state/delete_spec.rb'
+ - 'spec/graphql/mutations/terraform/state/lock_spec.rb'
+ - 'spec/graphql/mutations/terraform/state/unlock_spec.rb'
+ - 'spec/graphql/resolvers/admin/analytics/usage_trends/measurements_resolver_spec.rb'
+ - 'spec/graphql/resolvers/alert_management/alert_resolver_spec.rb'
+ - 'spec/graphql/resolvers/alert_management/http_integrations_resolver_spec.rb'
+ - 'spec/graphql/resolvers/alert_management/integrations_resolver_spec.rb'
+ - 'spec/graphql/resolvers/base_resolver_spec.rb'
+ - 'spec/graphql/resolvers/blobs_resolver_spec.rb'
+ - 'spec/graphql/resolvers/ci/runner_status_resolver_spec.rb'
+ - 'spec/graphql/resolvers/clusters/agent_activity_events_resolver_spec.rb'
+ - 'spec/graphql/resolvers/clusters/agent_tokens_resolver_spec.rb'
+ - 'spec/graphql/resolvers/clusters/agents_resolver_spec.rb'
+ - 'spec/graphql/resolvers/concerns/caching_array_resolver_spec.rb'
+ - 'spec/graphql/resolvers/concerns/resolves_pipelines_spec.rb'
+ - 'spec/graphql/resolvers/container_repository_tags_resolver_spec.rb'
+ - 'spec/graphql/resolvers/design_management/design_at_version_resolver_spec.rb'
+ - 'spec/graphql/resolvers/design_management/design_resolver_spec.rb'
+ - 'spec/graphql/resolvers/design_management/designs_resolver_spec.rb'
+ - 'spec/graphql/resolvers/design_management/version/design_at_version_resolver_spec.rb'
+ - 'spec/graphql/resolvers/design_management/version/designs_at_version_resolver_spec.rb'
+ - 'spec/graphql/resolvers/design_management/version_in_collection_resolver_spec.rb'
+ - 'spec/graphql/resolvers/design_management/version_resolver_spec.rb'
+ - 'spec/graphql/resolvers/design_management/versions_resolver_spec.rb'
+ - 'spec/graphql/resolvers/group_issues_resolver_spec.rb'
+ - 'spec/graphql/resolvers/group_labels_resolver_spec.rb'
+ - 'spec/graphql/resolvers/group_milestones_resolver_spec.rb'
+ - 'spec/graphql/resolvers/group_packages_resolver_spec.rb'
+ - 'spec/graphql/resolvers/issue_status_counts_resolver_spec.rb'
+ - 'spec/graphql/resolvers/issues_resolver_spec.rb'
+ - 'spec/graphql/resolvers/kas/agent_configurations_resolver_spec.rb'
+ - 'spec/graphql/resolvers/kas/agent_connections_resolver_spec.rb'
+ - 'spec/graphql/resolvers/last_commit_resolver_spec.rb'
+ - 'spec/graphql/resolvers/metrics/dashboard_resolver_spec.rb'
+ - 'spec/graphql/resolvers/metrics/dashboards/annotation_resolver_spec.rb'
+ - 'spec/graphql/resolvers/namespace_projects_resolver_spec.rb'
+ - 'spec/graphql/resolvers/project_merge_requests_resolver_spec.rb'
+ - 'spec/graphql/resolvers/project_milestones_resolver_spec.rb'
+ - 'spec/graphql/resolvers/project_pipeline_statistics_resolver_spec.rb'
+ - 'spec/graphql/resolvers/snippets/blobs_resolver_spec.rb'
+ - 'spec/graphql/resolvers/snippets_resolver_spec.rb'
+ - 'spec/graphql/resolvers/terraform/states_resolver_spec.rb'
+ - 'spec/graphql/resolvers/timelog_resolver_spec.rb'
+ - 'spec/graphql/resolvers/user_resolver_spec.rb'
+ - 'spec/graphql/resolvers/users/group_count_resolver_spec.rb'
+ - 'spec/graphql/resolvers/users/participants_resolver_spec.rb'
+ - 'spec/graphql/subscriptions/issuable_updated_spec.rb'
+ - 'spec/graphql/types/base_field_spec.rb'
+ - 'spec/graphql/types/global_id_type_spec.rb'
+ - 'spec/graphql/types/invitation_interface_spec.rb'
+ - 'spec/graphql/types/issue_type_spec.rb'
+ - 'spec/graphql/types/member_interface_spec.rb'
+ - 'spec/graphql/types/range_input_type_spec.rb'
+ - 'spec/graphql/types/release_links_type_spec.rb'
+ - 'spec/graphql/types/user_type_spec.rb'
+ - 'spec/haml_lint/linter/documentation_links_spec.rb'
+ - 'spec/haml_lint/linter/no_plain_nodes_spec.rb'
+ - 'spec/helpers/admin/user_actions_helper_spec.rb'
+ - 'spec/helpers/application_helper_spec.rb'
+ - 'spec/helpers/application_settings_helper_spec.rb'
+ - 'spec/helpers/auth_helper_spec.rb'
+ - 'spec/helpers/auto_devops_helper_spec.rb'
+ - 'spec/helpers/avatars_helper_spec.rb'
+ - 'spec/helpers/award_emoji_helper_spec.rb'
+ - 'spec/helpers/blob_helper_spec.rb'
+ - 'spec/helpers/boards_helper_spec.rb'
+ - 'spec/helpers/ci/runners_helper_spec.rb'
+ - 'spec/helpers/clusters_helper_spec.rb'
+ - 'spec/helpers/colors_helper_spec.rb'
+ - 'spec/helpers/commits_helper_spec.rb'
+ - 'spec/helpers/diff_helper_spec.rb'
+ - 'spec/helpers/emails_helper_spec.rb'
+ - 'spec/helpers/environment_helper_spec.rb'
+ - 'spec/helpers/environments_helper_spec.rb'
+ - 'spec/helpers/events_helper_spec.rb'
+ - 'spec/helpers/git_helper_spec.rb'
+ - 'spec/helpers/gitlab_routing_helper_spec.rb'
+ - 'spec/helpers/groups/crm_settings_helper_spec.rb'
+ - 'spec/helpers/groups/group_members_helper_spec.rb'
+ - 'spec/helpers/groups_helper_spec.rb'
+ - 'spec/helpers/ide_helper_spec.rb'
+ - 'spec/helpers/integrations_helper_spec.rb'
+ - 'spec/helpers/invite_members_helper_spec.rb'
+ - 'spec/helpers/issues_helper_spec.rb'
+ - 'spec/helpers/jira_connect_helper_spec.rb'
+ - 'spec/helpers/labels_helper_spec.rb'
+ - 'spec/helpers/listbox_helper_spec.rb'
+ - 'spec/helpers/markup_helper_spec.rb'
+ - 'spec/helpers/members_helper_spec.rb'
+ - 'spec/helpers/nav/top_nav_helper_spec.rb'
+ - 'spec/helpers/nav_helper_spec.rb'
+ - 'spec/helpers/notes_helper_spec.rb'
+ - 'spec/helpers/operations_helper_spec.rb'
+ - 'spec/helpers/projects/cluster_agents_helper_spec.rb'
+ - 'spec/helpers/projects_helper_spec.rb'
+ - 'spec/helpers/releases_helper_spec.rb'
+ - 'spec/helpers/routing/pseudonymization_helper_spec.rb'
+ - 'spec/helpers/search_helper_spec.rb'
+ - 'spec/helpers/snippets_helper_spec.rb'
+ - 'spec/helpers/sorting_helper_spec.rb'
+ - 'spec/helpers/storage_helper_spec.rb'
+ - 'spec/helpers/submodule_helper_spec.rb'
+ - 'spec/helpers/timeboxes_helper_spec.rb'
+ - 'spec/helpers/timeboxes_routing_helper_spec.rb'
+ - 'spec/helpers/todos_helper_spec.rb'
+ - 'spec/helpers/tree_helper_spec.rb'
+ - 'spec/helpers/users/group_callouts_helper_spec.rb'
+ - 'spec/helpers/users_helper_spec.rb'
+ - 'spec/helpers/visibility_level_helper_spec.rb'
+ - 'spec/helpers/whats_new_helper_spec.rb'
+ - 'spec/helpers/wiki_helper_spec.rb'
+ - 'spec/initializers/00_rails_disable_joins_spec.rb'
+ - 'spec/initializers/0_log_deprecations_spec.rb'
+ - 'spec/initializers/carrierwave_patch_spec.rb'
+ - 'spec/initializers/lograge_spec.rb'
+ - 'spec/initializers/mail_encoding_patch_spec.rb'
+ - 'spec/initializers/net_http_patch_spec.rb'
+ - 'spec/initializers/rack_multipart_patch_spec.rb'
+ - 'spec/initializers/secret_token_spec.rb'
+ - 'spec/initializers/settings_spec.rb'
+ - 'spec/initializers/validate_database_config_spec.rb'
+ - 'spec/initializers/validate_puma_spec.rb'
+ - 'spec/lib/api/entities/application_setting_spec.rb'
+ - 'spec/lib/api/entities/basic_project_details_spec.rb'
+ - 'spec/lib/api/entities/clusters/agent_authorization_spec.rb'
+ - 'spec/lib/api/entities/merge_request_basic_spec.rb'
+ - 'spec/lib/api/entities/nuget/dependency_group_spec.rb'
+ - 'spec/lib/api/entities/user_spec.rb'
+ - 'spec/lib/api/every_api_endpoint_spec.rb'
+ - 'spec/lib/api/helpers/caching_spec.rb'
+ - 'spec/lib/api/helpers/pagination_strategies_spec.rb'
+ - 'spec/lib/api/helpers/related_resources_helpers_spec.rb'
+ - 'spec/lib/api/helpers/variables_helpers_spec.rb'
+ - 'spec/lib/api/helpers_spec.rb'
+ - 'spec/lib/api/support/git_access_actor_spec.rb'
+ - 'spec/lib/api/validations/validators/absence_spec.rb'
+ - 'spec/lib/api/validations/validators/array_none_any_spec.rb'
+ - 'spec/lib/api/validations/validators/email_or_email_list_spec.rb'
+ - 'spec/lib/api/validations/validators/file_path_spec.rb'
+ - 'spec/lib/api/validations/validators/git_ref_spec.rb'
+ - 'spec/lib/api/validations/validators/git_sha_spec.rb'
+ - 'spec/lib/api/validations/validators/integer_none_any_spec.rb'
+ - 'spec/lib/api/validations/validators/integer_or_custom_value_spec.rb'
+ - 'spec/lib/api/validations/validators/limit_spec.rb'
+ - 'spec/lib/api/validations/validators/project_portable_spec.rb'
+ - 'spec/lib/api/validations/validators/untrusted_regexp_spec.rb'
+ - 'spec/lib/atlassian/jira_connect/client_spec.rb'
+ - 'spec/lib/atlassian/jira_connect/jwt/asymmetric_spec.rb'
+ - 'spec/lib/atlassian/jira_connect/jwt/symmetric_spec.rb'
+ - 'spec/lib/atlassian/jira_connect/serializers/deployment_entity_spec.rb'
+ - 'spec/lib/atlassian/jira_connect/serializers/feature_flag_entity_spec.rb'
+ - 'spec/lib/atlassian/jira_connect_spec.rb'
+ - 'spec/lib/backup/files_spec.rb'
+ - 'spec/lib/backup/gitaly_backup_spec.rb'
+ - 'spec/lib/backup/manager_spec.rb'
+ - 'spec/lib/backup/repositories_spec.rb'
+ - 'spec/lib/banzai/color_parser_spec.rb'
+ - 'spec/lib/banzai/filter/absolute_link_filter_spec.rb'
+ - 'spec/lib/banzai/filter/asset_proxy_filter_spec.rb'
+ - 'spec/lib/banzai/filter/audio_link_filter_spec.rb'
+ - 'spec/lib/banzai/filter/autolink_filter_spec.rb'
+ - 'spec/lib/banzai/filter/broadcast_message_placeholders_filter_spec.rb'
+ - 'spec/lib/banzai/filter/broadcast_message_sanitization_filter_spec.rb'
+ - 'spec/lib/banzai/filter/commit_trailers_filter_spec.rb'
+ - 'spec/lib/banzai/filter/external_link_filter_spec.rb'
+ - 'spec/lib/banzai/filter/front_matter_filter_spec.rb'
+ - 'spec/lib/banzai/filter/gollum_tags_filter_spec.rb'
+ - 'spec/lib/banzai/filter/inline_metrics_redactor_filter_spec.rb'
+ - 'spec/lib/banzai/filter/issuable_reference_expansion_filter_spec.rb'
+ - 'spec/lib/banzai/filter/markdown_filter_spec.rb'
+ - 'spec/lib/banzai/filter/reference_redactor_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/abstract_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/alert_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/commit_range_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/commit_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/design_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/external_issue_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/issue_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/label_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/merge_request_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/milestone_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/project_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/snippet_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/user_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/suggestion_filter_spec.rb'
+ - 'spec/lib/banzai/filter/syntax_highlight_filter_spec.rb'
+ - 'spec/lib/banzai/filter/table_of_contents_filter_spec.rb'
+ - 'spec/lib/banzai/filter/table_of_contents_tag_filter_spec.rb'
+ - 'spec/lib/banzai/filter/upload_link_filter_spec.rb'
+ - 'spec/lib/banzai/filter/video_link_filter_spec.rb'
+ - 'spec/lib/banzai/filter/wiki_link_filter_spec.rb'
+ - 'spec/lib/banzai/pipeline/broadcast_message_pipeline_spec.rb'
+ - 'spec/lib/banzai/pipeline_spec.rb'
+ - 'spec/lib/banzai/reference_parser/alert_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/base_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/commit_range_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/design_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/feature_flag_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/issue_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/label_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/mentioned_group_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/mentioned_project_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/mentioned_user_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/merge_request_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/milestone_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/project_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/snippet_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/user_parser_spec.rb'
+ - 'spec/lib/bitbucket_server/connection_spec.rb'
+ - 'spec/lib/bitbucket_server/representation/pull_request_spec.rb'
+ - 'spec/lib/bulk_imports/clients/http_spec.rb'
+ - 'spec/lib/bulk_imports/common/pipelines/lfs_objects_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/common/pipelines/milestones_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/groups/transformers/member_attributes_transformer_spec.rb'
+ - 'spec/lib/bulk_imports/projects/pipelines/ci_pipelines_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/projects/pipelines/issues_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/projects/pipelines/merge_requests_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/projects/pipelines/pipeline_schedules_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/projects/pipelines/releases_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/projects/pipelines/repository_pipeline_spec.rb'
+ - 'spec/lib/constraints/admin_constrainer_spec.rb'
+ - 'spec/lib/constraints/group_url_constrainer_spec.rb'
+ - 'spec/lib/constraints/project_url_constrainer_spec.rb'
+ - 'spec/lib/constraints/user_url_constrainer_spec.rb'
+ - 'spec/lib/container_registry/blob_spec.rb'
+ - 'spec/lib/container_registry/gitlab_api_client_spec.rb'
+ - 'spec/lib/container_registry/migration_spec.rb'
+ - 'spec/lib/container_registry/registry_spec.rb'
+ - 'spec/lib/container_registry/tag_spec.rb'
+ - 'spec/lib/error_tracking/sentry_client/event_spec.rb'
+ - 'spec/lib/error_tracking/sentry_client/issue_link_spec.rb'
+ - 'spec/lib/error_tracking/sentry_client/projects_spec.rb'
+ - 'spec/lib/error_tracking/sentry_client/repo_spec.rb'
+ - 'spec/lib/expand_variables_spec.rb'
+ - 'spec/lib/extracts_path_spec.rb'
+ - 'spec/lib/extracts_ref_spec.rb'
+ - 'spec/lib/feature/definition_spec.rb'
+ - 'spec/lib/feature_spec.rb'
+ - 'spec/lib/generators/gitlab/snowplow_event_definition_generator_spec.rb'
+ - 'spec/lib/generators/gitlab/usage_metric_generator_spec.rb'
+ - 'spec/lib/gitlab/alert_management/alert_status_counts_spec.rb'
+ - 'spec/lib/gitlab/alert_management/fingerprint_spec.rb'
+ - 'spec/lib/gitlab/alert_management/payload/base_spec.rb'
+ - 'spec/lib/gitlab/alert_management/payload_spec.rb'
+ - 'spec/lib/gitlab/analytics/cycle_analytics/average_spec.rb'
+ - 'spec/lib/gitlab/analytics/cycle_analytics/base_query_builder_spec.rb'
+ - 'spec/lib/gitlab/analytics/cycle_analytics/sorting_spec.rb'
+ - 'spec/lib/gitlab/application_rate_limiter_spec.rb'
+ - 'spec/lib/gitlab/asciidoc_spec.rb'
+ - 'spec/lib/gitlab/asset_proxy_spec.rb'
+ - 'spec/lib/gitlab/auth/atlassian/identity_linker_spec.rb'
+ - 'spec/lib/gitlab/auth/atlassian/user_spec.rb'
+ - 'spec/lib/gitlab/auth/auth_finders_spec.rb'
+ - 'spec/lib/gitlab/auth/current_user_mode_spec.rb'
+ - 'spec/lib/gitlab/auth/key_status_checker_spec.rb'
+ - 'spec/lib/gitlab/auth/ldap/access_spec.rb'
+ - 'spec/lib/gitlab/auth/ldap/adapter_spec.rb'
+ - 'spec/lib/gitlab/auth/ldap/auth_hash_spec.rb'
+ - 'spec/lib/gitlab/auth/ldap/dn_spec.rb'
+ - 'spec/lib/gitlab/auth/ldap/person_spec.rb'
+ - 'spec/lib/gitlab/auth/ldap/user_spec.rb'
+ - 'spec/lib/gitlab/auth/o_auth/auth_hash_spec.rb'
+ - 'spec/lib/gitlab/auth/o_auth/identity_linker_spec.rb'
+ - 'spec/lib/gitlab/auth/o_auth/provider_spec.rb'
+ - 'spec/lib/gitlab/auth/o_auth/user_spec.rb'
+ - 'spec/lib/gitlab/auth/otp/strategies/forti_authenticator/manual_otp_spec.rb'
+ - 'spec/lib/gitlab/auth/otp/strategies/forti_authenticator/push_otp_spec.rb'
+ - 'spec/lib/gitlab/auth/otp/strategies/forti_token_cloud_spec.rb'
+ - 'spec/lib/gitlab/auth/request_authenticator_spec.rb'
+ - 'spec/lib/gitlab/auth/saml/auth_hash_spec.rb'
+ - 'spec/lib/gitlab/auth/saml/identity_linker_spec.rb'
+ - 'spec/lib/gitlab/auth/saml/user_spec.rb'
+ - 'spec/lib/gitlab/auth/unique_ips_limiter_spec.rb'
+ - 'spec/lib/gitlab/auth/user_access_denied_reason_spec.rb'
+ - 'spec/lib/gitlab/auth_spec.rb'
+ - 'spec/lib/gitlab/authorized_keys_spec.rb'
+ - 'spec/lib/gitlab/avatar_cache_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_ci_queuing_tables_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests_with_corrected_regex_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_project_repositories_spec.rb'
+ - 'spec/lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy_spec.rb'
+ - 'spec/lib/gitlab/background_migration/cleanup_draft_data_from_faulty_regex_spec.rb'
+ - 'spec/lib/gitlab/background_migration/copy_column_using_background_migration_job_spec.rb'
+ - 'spec/lib/gitlab/background_migration/disable_expiration_policies_linked_to_no_container_images_spec.rb'
+ - 'spec/lib/gitlab/background_migration/project_namespaces/backfill_project_namespaces_spec.rb'
+ - 'spec/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid_spec.rb'
+ - 'spec/lib/gitlab/background_migration/remove_all_trace_expiration_dates_spec.rb'
+ - 'spec/lib/gitlab/bare_repository_import/importer_spec.rb'
+ - 'spec/lib/gitlab/bare_repository_import/repository_spec.rb'
+ - 'spec/lib/gitlab/bitbucket_import/importer_spec.rb'
+ - 'spec/lib/gitlab/bitbucket_server_import/importer_spec.rb'
+ - 'spec/lib/gitlab/blame_spec.rb'
+ - 'spec/lib/gitlab/cache/ci/project_pipeline_status_spec.rb'
+ - 'spec/lib/gitlab/cache/helpers_spec.rb'
+ - 'spec/lib/gitlab/chat/responder_spec.rb'
+ - 'spec/lib/gitlab/chat_name_token_spec.rb'
+ - 'spec/lib/gitlab/checks/branch_check_spec.rb'
+ - 'spec/lib/gitlab/checks/lfs_integrity_spec.rb'
+ - 'spec/lib/gitlab/checks/matching_merge_request_spec.rb'
+ - 'spec/lib/gitlab/checks/push_file_count_check_spec.rb'
+ - 'spec/lib/gitlab/checks/snippet_check_spec.rb'
+ - 'spec/lib/gitlab/checks/tag_check_spec.rb'
+ - 'spec/lib/gitlab/ci/ansi2html_spec.rb'
+ - 'spec/lib/gitlab/ci/ansi2json/style_spec.rb'
+ - 'spec/lib/gitlab/ci/ansi2json_spec.rb'
+ - 'spec/lib/gitlab/ci/badge/coverage/report_spec.rb'
+ - 'spec/lib/gitlab/ci/badge/pipeline/status_spec.rb'
+ - 'spec/lib/gitlab/ci/badge/release/template_spec.rb'
+ - 'spec/lib/gitlab/ci/build/artifacts/metadata_spec.rb'
+ - 'spec/lib/gitlab/ci/build/policy/refs_spec.rb'
+ - 'spec/lib/gitlab/ci/build/prerequisite/factory_spec.rb'
+ - 'spec/lib/gitlab/ci/build/prerequisite/kubernetes_namespace_spec.rb'
+ - 'spec/lib/gitlab/ci/build/releaser_spec.rb'
+ - 'spec/lib/gitlab/ci/build/rules/rule/clause/exists_spec.rb'
+ - 'spec/lib/gitlab/ci/build/rules_spec.rb'
+ - 'spec/lib/gitlab/ci/charts_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/default_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/environment_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/include/rules/rule_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/include_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/inherit/default_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/inherit/variables_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/job_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/jobs_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/kubernetes_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/port_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/ports_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/processable_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/release_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/reports_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/retry_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/rules/rule_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/trigger/forward_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/file/local_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/mapper_spec.rb'
+ - 'spec/lib/gitlab/ci/config_spec.rb'
+ - 'spec/lib/gitlab/ci/jwt_spec.rb'
+ - 'spec/lib/gitlab/ci/lint_spec.rb'
+ - 'spec/lib/gitlab/ci/matching/runner_matcher_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/coverage/sax_document_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/security/common_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/security/validators/schema_validator_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/test/junit_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/command_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/create_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/helpers_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/seed_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/validate/abilities_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/duration_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/expression/parser_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/quota/deployments_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/seed/build_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/seed/environment_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline_object_hierarchy_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/reports_comparer_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/security/aggregated_report_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/security/vulnerability_reports_comparer_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/test_suite_comparer_spec.rb'
+ - 'spec/lib/gitlab/ci/runner_instructions_spec.rb'
+ - 'spec/lib/gitlab/ci/status/bridge/factory_spec.rb'
+ - 'spec/lib/gitlab/ci/status/build/failed_spec.rb'
+ - 'spec/lib/gitlab/ci/status/composite_spec.rb'
+ - 'spec/lib/gitlab/ci/status/factory_spec.rb'
+ - 'spec/lib/gitlab/ci/status/stage/play_manual_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/5_minute_production_app_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/Jobs/build_gitlab_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/Jobs/code_quality_gitlab_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/Jobs/deploy_gitlab_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/Jobs/sast_iac_gitlab_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/Jobs/test_gitlab_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/Verify/load_performance_testing_gitlab_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/auto_devops_gitlab_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/npm_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/templates_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/terraform_gitlab_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/terraform_latest_gitlab_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/themekit_gitlab_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/trace/archive_spec.rb'
+ - 'spec/lib/gitlab/ci/trace/section_parser_spec.rb'
+ - 'spec/lib/gitlab/ci/trace/stream_spec.rb'
+ - 'spec/lib/gitlab/ci/trace_spec.rb'
+ - 'spec/lib/gitlab/ci/variables/builder/group_spec.rb'
+ - 'spec/lib/gitlab/ci/variables/builder_spec.rb'
+ - 'spec/lib/gitlab/ci/variables/collection/item_spec.rb'
+ - 'spec/lib/gitlab/ci/variables/collection/sort_spec.rb'
+ - 'spec/lib/gitlab/ci/variables/collection_spec.rb'
+ - 'spec/lib/gitlab/ci/yaml_processor_spec.rb'
+ - 'spec/lib/gitlab/cleanup/orphan_job_artifact_files_batch_spec.rb'
+ - 'spec/lib/gitlab/cleanup/orphan_lfs_file_references_spec.rb'
+ - 'spec/lib/gitlab/cleanup/project_uploads_spec.rb'
+ - 'spec/lib/gitlab/cluster/lifecycle_events_spec.rb'
+ - 'spec/lib/gitlab/composer/cache_spec.rb'
+ - 'spec/lib/gitlab/config/entry/composable_array_spec.rb'
+ - 'spec/lib/gitlab/config/entry/composable_hash_spec.rb'
+ - 'spec/lib/gitlab/config_checker/puma_rugged_checker_spec.rb'
+ - 'spec/lib/gitlab/console_spec.rb'
+ - 'spec/lib/gitlab/consul/internal_spec.rb'
+ - 'spec/lib/gitlab/content_security_policy/config_loader_spec.rb'
+ - 'spec/lib/gitlab/current_settings_spec.rb'
+ - 'spec/lib/gitlab/cycle_analytics/permissions_spec.rb'
+ - 'spec/lib/gitlab/daemon_spec.rb'
+ - 'spec/lib/gitlab/data_builder/build_spec.rb'
+ - 'spec/lib/gitlab/data_builder/issuable_spec.rb'
+ - 'spec/lib/gitlab/data_builder/pipeline_spec.rb'
+ - 'spec/lib/gitlab/database/background_migration/batch_optimizer_spec.rb'
+ - 'spec/lib/gitlab/database/background_migration/batched_migration_spec.rb'
+ - 'spec/lib/gitlab/database/batch_count_spec.rb'
+ - 'spec/lib/gitlab/database/bulk_update_spec.rb'
+ - 'spec/lib/gitlab/database/count/reltuples_count_strategy_spec.rb'
+ - 'spec/lib/gitlab/database/count/tablesample_count_strategy_spec.rb'
+ - 'spec/lib/gitlab/database/count_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/connection_proxy_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/host_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/load_balancer_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/rack_middleware_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/setup_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/sidekiq_client_middleware_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/sidekiq_server_middleware_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing_spec.rb'
+ - 'spec/lib/gitlab/database/loose_foreign_keys_spec.rb'
+ - 'spec/lib/gitlab/database/migration_helpers/v2_spec.rb'
+ - 'spec/lib/gitlab/database/migration_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/migration_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/background_migration_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/base_background_runner_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/instrumentation_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/observers/total_database_size_change_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/runner_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/test_background_runner_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/test_batched_background_runner_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning/detached_partition_dropper_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning/partition_manager_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning/single_numeric_list_partition_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning/sliding_list_strategy_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning_spec.rb'
+ - 'spec/lib/gitlab/database/postgres_hll/batch_distinct_counter_spec.rb'
+ - 'spec/lib/gitlab/database/query_analyzer_spec.rb'
+ - 'spec/lib/gitlab/database/query_analyzers/gitlab_schemas_metrics_spec.rb'
+ - 'spec/lib/gitlab/database/query_analyzers/prevent_cross_database_modification_spec.rb'
+ - 'spec/lib/gitlab/database/query_analyzers/restrict_allowed_schemas_spec.rb'
+ - 'spec/lib/gitlab/database/reflection_spec.rb'
+ - 'spec/lib/gitlab/database/reindexing/coordinator_spec.rb'
+ - 'spec/lib/gitlab/database/reindexing/grafana_notifier_spec.rb'
+ - 'spec/lib/gitlab/database/reindexing/reindex_action_spec.rb'
+ - 'spec/lib/gitlab/database/reindexing_spec.rb'
+ - 'spec/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_base_spec.rb'
+ - 'spec/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_namespaces_spec.rb'
+ - 'spec/lib/gitlab/database/schema_migrations/context_spec.rb'
+ - 'spec/lib/gitlab/database/with_lock_retries_outside_transaction_spec.rb'
+ - 'spec/lib/gitlab/database/with_lock_retries_spec.rb'
+ - 'spec/lib/gitlab/database_importers/common_metrics/importer_spec.rb'
+ - 'spec/lib/gitlab/database_spec.rb'
+ - 'spec/lib/gitlab/default_branch_spec.rb'
+ - 'spec/lib/gitlab/deploy_key_access_spec.rb'
+ - 'spec/lib/gitlab/diff/custom_diff_spec.rb'
+ - 'spec/lib/gitlab/diff/file_collection/merge_request_diff_batch_spec.rb'
+ - 'spec/lib/gitlab/diff/file_spec.rb'
+ - 'spec/lib/gitlab/diff/formatters/text_formatter_spec.rb'
+ - 'spec/lib/gitlab/diff/highlight_cache_spec.rb'
+ - 'spec/lib/gitlab/diff/lines_unfolder_spec.rb'
+ - 'spec/lib/gitlab/diff/position_spec.rb'
+ - 'spec/lib/gitlab/diff/position_tracer_spec.rb'
+ - 'spec/lib/gitlab/diff/rendered/notebook/diff_file_spec.rb'
+ - 'spec/lib/gitlab/diff/suggestions_parser_spec.rb'
+ - 'spec/lib/gitlab/email/failure_handler_spec.rb'
+ - 'spec/lib/gitlab/email/handler/create_issue_handler_spec.rb'
+ - 'spec/lib/gitlab/email/handler/create_merge_request_handler_spec.rb'
+ - 'spec/lib/gitlab/email/handler/create_note_handler_spec.rb'
+ - 'spec/lib/gitlab/email/handler/service_desk_handler_spec.rb'
+ - 'spec/lib/gitlab/email/handler/unsubscribe_handler_spec.rb'
+ - 'spec/lib/gitlab/email/handler_spec.rb'
+ - 'spec/lib/gitlab/email/message/in_product_marketing/admin_verify_spec.rb'
+ - 'spec/lib/gitlab/email/message/in_product_marketing/base_spec.rb'
+ - 'spec/lib/gitlab/email/message/in_product_marketing/experience_spec.rb'
+ - 'spec/lib/gitlab/email/message/in_product_marketing/helper_spec.rb'
+ - 'spec/lib/gitlab/email/message/in_product_marketing/team_short_spec.rb'
+ - 'spec/lib/gitlab/email/message/in_product_marketing/team_spec.rb'
+ - 'spec/lib/gitlab/email/message/in_product_marketing/trial_short_spec.rb'
+ - 'spec/lib/gitlab/email/message/in_product_marketing/trial_spec.rb'
+ - 'spec/lib/gitlab/email/message/repository_push_spec.rb'
+ - 'spec/lib/gitlab/encoding_helper_spec.rb'
+ - 'spec/lib/gitlab/error_tracking/context_payload_generator_spec.rb'
+ - 'spec/lib/gitlab/error_tracking/processor/sidekiq_processor_spec.rb'
+ - 'spec/lib/gitlab/error_tracking_spec.rb'
+ - 'spec/lib/gitlab/exceptions_app_spec.rb'
+ - 'spec/lib/gitlab/exclusive_lease_helpers/sleeping_lock_spec.rb'
+ - 'spec/lib/gitlab/experimentation/controller_concern_spec.rb'
+ - 'spec/lib/gitlab/experimentation_spec.rb'
+ - 'spec/lib/gitlab/external_authorization/access_spec.rb'
+ - 'spec/lib/gitlab/favicon_spec.rb'
+ - 'spec/lib/gitlab/file_hook_spec.rb'
+ - 'spec/lib/gitlab/fips_spec.rb'
+ - 'spec/lib/gitlab/fogbugz_import/importer_spec.rb'
+ - 'spec/lib/gitlab/gfm/reference_rewriter_spec.rb'
+ - 'spec/lib/gitlab/gfm/uploads_rewriter_spec.rb'
+ - 'spec/lib/gitlab/git/attributes_parser_spec.rb'
+ - 'spec/lib/gitlab/git/blame_spec.rb'
+ - 'spec/lib/gitlab/git/blob_spec.rb'
+ - 'spec/lib/gitlab/git/changes_spec.rb'
+ - 'spec/lib/gitlab/git/commit_spec.rb'
+ - 'spec/lib/gitlab/git/compare_spec.rb'
+ - 'spec/lib/gitlab/git/conflict/parser_spec.rb'
+ - 'spec/lib/gitlab/git/cross_repo_comparer_spec.rb'
+ - 'spec/lib/gitlab/git/diff_collection_spec.rb'
+ - 'spec/lib/gitlab/git/diff_spec.rb'
+ - 'spec/lib/gitlab/git/keep_around_spec.rb'
+ - 'spec/lib/gitlab/git/merge_base_spec.rb'
+ - 'spec/lib/gitlab/git/raw_diff_change_spec.rb'
+ - 'spec/lib/gitlab/git/repository_spec.rb'
+ - 'spec/lib/gitlab/git/rugged_impl/use_rugged_spec.rb'
+ - 'spec/lib/gitlab/git/tag_spec.rb'
+ - 'spec/lib/gitlab/git/wiki_page_version_spec.rb'
+ - 'spec/lib/gitlab/git_access_snippet_spec.rb'
+ - 'spec/lib/gitlab/git_access_spec.rb'
+ - 'spec/lib/gitlab/git_access_wiki_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/call_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/commit_service_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/repository_service_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/labels_importer_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/milestones_importer_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/releases_importer_spec.rb'
+ - 'spec/lib/gitlab/github_import/representation/diff_note_spec.rb'
+ - 'spec/lib/gitlab/github_import/representation/issue_spec.rb'
+ - 'spec/lib/gitlab/github_import/representation/note_spec.rb'
+ - 'spec/lib/gitlab/github_import/representation/pull_request_spec.rb'
+ - 'spec/lib/gitlab/github_import/representation/user_spec.rb'
+ - 'spec/lib/gitlab/github_import_spec.rb'
+ - 'spec/lib/gitlab/gpg/commit_spec.rb'
+ - 'spec/lib/gitlab/gpg/invalid_gpg_signature_updater_spec.rb'
+ - 'spec/lib/gitlab/grape_logging/loggers/exception_logger_spec.rb'
+ - 'spec/lib/gitlab/graphql/batch_key_spec.rb'
+ - 'spec/lib/gitlab/graphql/loaders/issuable_loader_spec.rb'
+ - 'spec/lib/gitlab/graphql/markdown_field_spec.rb'
+ - 'spec/lib/gitlab/graphql/pagination/externally_paginated_array_connection_spec.rb'
+ - 'spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb'
+ - 'spec/lib/gitlab/graphql/pagination/keyset/order_info_spec.rb'
+ - 'spec/lib/gitlab/graphql/queries_spec.rb'
+ - 'spec/lib/gitlab/graphql_logger_spec.rb'
+ - 'spec/lib/gitlab/health_checks/gitaly_check_spec.rb'
+ - 'spec/lib/gitlab/health_checks/middleware_spec.rb'
+ - 'spec/lib/gitlab/health_checks/puma_check_spec.rb'
+ - 'spec/lib/gitlab/health_checks/simple_check_shared.rb'
+ - 'spec/lib/gitlab/highlight_spec.rb'
+ - 'spec/lib/gitlab/hook_data/group_builder_spec.rb'
+ - 'spec/lib/gitlab/hook_data/group_member_builder_spec.rb'
+ - 'spec/lib/gitlab/hook_data/issue_builder_spec.rb'
+ - 'spec/lib/gitlab/hook_data/key_builder_spec.rb'
+ - 'spec/lib/gitlab/hook_data/project_builder_spec.rb'
+ - 'spec/lib/gitlab/hook_data/project_member_builder_spec.rb'
+ - 'spec/lib/gitlab/hook_data/subgroup_builder_spec.rb'
+ - 'spec/lib/gitlab/hook_data/user_builder_spec.rb'
+ - 'spec/lib/gitlab/hotlinking_detector_spec.rb'
+ - 'spec/lib/gitlab/http_spec.rb'
+ - 'spec/lib/gitlab/i18n/po_linter_spec.rb'
+ - 'spec/lib/gitlab/import/merge_request_creator_spec.rb'
+ - 'spec/lib/gitlab/import_export/attributes_finder_spec.rb'
+ - 'spec/lib/gitlab/import_export/command_line_util_spec.rb'
+ - 'spec/lib/gitlab/import_export/fast_hash_serializer_spec.rb'
+ - 'spec/lib/gitlab/import_export/file_importer_spec.rb'
+ - 'spec/lib/gitlab/import_export/group/legacy_tree_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_export/group/legacy_tree_saver_spec.rb'
+ - 'spec/lib/gitlab/import_export/group/object_builder_spec.rb'
+ - 'spec/lib/gitlab/import_export/group/relation_factory_spec.rb'
+ - 'spec/lib/gitlab/import_export/group/tree_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_export/group/tree_saver_spec.rb'
+ - 'spec/lib/gitlab/import_export/importer_spec.rb'
+ - 'spec/lib/gitlab/import_export/json/legacy_reader/file_spec.rb'
+ - 'spec/lib/gitlab/import_export/json/legacy_reader/hash_spec.rb'
+ - 'spec/lib/gitlab/import_export/json/legacy_reader/shared_example.rb'
+ - 'spec/lib/gitlab/import_export/json/ndjson_reader_spec.rb'
+ - 'spec/lib/gitlab/import_export/json/streaming_serializer_spec.rb'
+ - 'spec/lib/gitlab/import_export/members_mapper_spec.rb'
+ - 'spec/lib/gitlab/import_export/merge_request_parser_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/object_builder_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/relation_factory_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/sample/relation_factory_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/sample/relation_tree_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/tree_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/tree_saver_spec.rb'
+ - 'spec/lib/gitlab/import_export/version_checker_spec.rb'
+ - 'spec/lib/gitlab/incoming_email_spec.rb'
+ - 'spec/lib/gitlab/instrumentation/redis_base_spec.rb'
+ - 'spec/lib/gitlab/instrumentation/redis_cluster_validator_spec.rb'
+ - 'spec/lib/gitlab/internal_post_receive/response_spec.rb'
+ - 'spec/lib/gitlab/issuable_metadata_spec.rb'
+ - 'spec/lib/gitlab/issuable_sorter_spec.rb'
+ - 'spec/lib/gitlab/issuables_count_for_state_spec.rb'
+ - 'spec/lib/gitlab/issues/rebalancing/state_spec.rb'
+ - 'spec/lib/gitlab/jira/dvcs_spec.rb'
+ - 'spec/lib/gitlab/jira_import/issue_serializer_spec.rb'
+ - 'spec/lib/gitlab/json_spec.rb'
+ - 'spec/lib/gitlab/jwt_authenticatable_spec.rb'
+ - 'spec/lib/gitlab/kas/client_spec.rb'
+ - 'spec/lib/gitlab/kas_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/default_namespace_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/helm/api_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/helm/v2/certificate_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/helm/v2/init_command_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/kube_client_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/rollout_status_spec.rb'
+ - 'spec/lib/gitlab/legacy_github_import/client_spec.rb'
+ - 'spec/lib/gitlab/lfs/client_spec.rb'
+ - 'spec/lib/gitlab/lfs_token_spec.rb'
+ - 'spec/lib/gitlab/logger_spec.rb'
+ - 'spec/lib/gitlab/lograge/custom_options_spec.rb'
+ - 'spec/lib/gitlab/mail_room/authenticator_spec.rb'
+ - 'spec/lib/gitlab/mail_room/mail_room_spec.rb'
+ - 'spec/lib/gitlab/manifest_import/manifest_spec.rb'
+ - 'spec/lib/gitlab/markdown_cache/active_record/extension_spec.rb'
+ - 'spec/lib/gitlab/merge_requests/commit_message_generator_spec.rb'
+ - 'spec/lib/gitlab/metrics/boot_time_tracker_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/cache_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/finder_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/importer_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/importers/prometheus_metrics_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/processor_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/stages/url_validator_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/transformers/yml/v1/prometheus_metrics_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/url_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/validator/errors_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/validator/post_schema_validator_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/validator_spec.rb'
+ - 'spec/lib/gitlab/metrics/exporter/base_exporter_spec.rb'
+ - 'spec/lib/gitlab/metrics/method_call_spec.rb'
+ - 'spec/lib/gitlab/metrics/methods_spec.rb'
+ - 'spec/lib/gitlab/metrics/requests_rack_middleware_spec.rb'
+ - 'spec/lib/gitlab/metrics/samplers/puma_sampler_spec.rb'
+ - 'spec/lib/gitlab/metrics/samplers/threads_sampler_spec.rb'
+ - 'spec/lib/gitlab/metrics/subscribers/active_record_spec.rb'
+ - 'spec/lib/gitlab/metrics/subscribers/rack_attack_spec.rb'
+ - 'spec/lib/gitlab/metrics_spec.rb'
+ - 'spec/lib/gitlab/middleware/basic_health_check_spec.rb'
+ - 'spec/lib/gitlab/middleware/compressed_json_spec.rb'
+ - 'spec/lib/gitlab/middleware/go_spec.rb'
+ - 'spec/lib/gitlab/middleware/handle_malformed_strings_spec.rb'
+ - 'spec/lib/gitlab/middleware/multipart_spec.rb'
+ - 'spec/lib/gitlab/middleware/rack_multipart_tempfile_factory_spec.rb'
+ - 'spec/lib/gitlab/middleware/request_context_spec.rb'
+ - 'spec/lib/gitlab/middleware/same_site_cookies_spec.rb'
+ - 'spec/lib/gitlab/namespaced_session_store_spec.rb'
+ - 'spec/lib/gitlab/noteable_metadata_spec.rb'
+ - 'spec/lib/gitlab/object_hierarchy_spec.rb'
+ - 'spec/lib/gitlab/other_markup_spec.rb'
+ - 'spec/lib/gitlab/otp_key_rotator_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/column_order_definition_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/in_operator_optimization/query_builder_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/order_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/pager_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/paginator_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/simple_order_builder_spec.rb'
+ - 'spec/lib/gitlab/pagination/offset_header_builder_spec.rb'
+ - 'spec/lib/gitlab/pagination/offset_pagination_spec.rb'
+ - 'spec/lib/gitlab/patch/prependable_spec.rb'
+ - 'spec/lib/gitlab/path_regex_spec.rb'
+ - 'spec/lib/gitlab/performance_bar_spec.rb'
+ - 'spec/lib/gitlab/phabricator_import/issues/importer_spec.rb'
+ - 'spec/lib/gitlab/phabricator_import/user_finder_spec.rb'
+ - 'spec/lib/gitlab/popen_spec.rb'
+ - 'spec/lib/gitlab/process_supervisor_spec.rb'
+ - 'spec/lib/gitlab/profiler_spec.rb'
+ - 'spec/lib/gitlab/project_authorizations_spec.rb'
+ - 'spec/lib/gitlab/project_search_results_spec.rb'
+ - 'spec/lib/gitlab/prometheus/adapter_spec.rb'
+ - 'spec/lib/gitlab/prometheus/queries/additional_metrics_environment_query_spec.rb'
+ - 'spec/lib/gitlab/prometheus/queries/knative_invocation_query_spec.rb'
+ - 'spec/lib/gitlab/prometheus/queries/matched_metric_query_spec.rb'
+ - 'spec/lib/gitlab/prometheus/queries/validate_query_spec.rb'
+ - 'spec/lib/gitlab/prometheus/query_variables_spec.rb'
+ - 'spec/lib/gitlab/prometheus_client_spec.rb'
+ - 'spec/lib/gitlab/query_limiting/middleware_spec.rb'
+ - 'spec/lib/gitlab/query_limiting_spec.rb'
+ - 'spec/lib/gitlab/quick_actions/extractor_spec.rb'
+ - 'spec/lib/gitlab/quick_actions/spend_time_and_date_separator_spec.rb'
+ - 'spec/lib/gitlab/rack_attack_spec.rb'
+ - 'spec/lib/gitlab/reactive_cache_set_cache_spec.rb'
+ - 'spec/lib/gitlab/redis/boolean_spec.rb'
+ - 'spec/lib/gitlab/redis/hll_spec.rb'
+ - 'spec/lib/gitlab/regex_spec.rb'
+ - 'spec/lib/gitlab/relative_positioning/item_context_spec.rb'
+ - 'spec/lib/gitlab/relative_positioning/mover_spec.rb'
+ - 'spec/lib/gitlab/repo_path_spec.rb'
+ - 'spec/lib/gitlab/repository_cache_adapter_spec.rb'
+ - 'spec/lib/gitlab/repository_hash_cache_spec.rb'
+ - 'spec/lib/gitlab/repository_set_cache_spec.rb'
+ - 'spec/lib/gitlab/robots_txt/parser_spec.rb'
+ - 'spec/lib/gitlab/route_map_spec.rb'
+ - 'spec/lib/gitlab/routing_spec.rb'
+ - 'spec/lib/gitlab/runtime_spec.rb'
+ - 'spec/lib/gitlab/sanitizers/exif_spec.rb'
+ - 'spec/lib/gitlab/sanitizers/svg_spec.rb'
+ - 'spec/lib/gitlab/search/params_spec.rb'
+ - 'spec/lib/gitlab/search/sort_options_spec.rb'
+ - 'spec/lib/gitlab/search_context/controller_concern_spec.rb'
+ - 'spec/lib/gitlab/search_results_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_config/worker_router_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_daemon/monitor_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_logging/json_formatter_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/admin_mode/client_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/admin_mode/server_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/client_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/server_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/size_limiter/compressor_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/size_limiter/validator_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/worker_context/server_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_migrate_jobs_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_signals_spec.rb'
+ - 'spec/lib/gitlab/slash_commands/command_spec.rb'
+ - 'spec/lib/gitlab/slash_commands/deploy_spec.rb'
+ - 'spec/lib/gitlab/slash_commands/issue_close_spec.rb'
+ - 'spec/lib/gitlab/slash_commands/issue_new_spec.rb'
+ - 'spec/lib/gitlab/slash_commands/issue_search_spec.rb'
+ - 'spec/lib/gitlab/slash_commands/issue_show_spec.rb'
+ - 'spec/lib/gitlab/slash_commands/presenters/issue_close_spec.rb'
+ - 'spec/lib/gitlab/slash_commands/presenters/issue_show_spec.rb'
+ - 'spec/lib/gitlab/slash_commands/run_spec.rb'
+ - 'spec/lib/gitlab/sourcegraph_spec.rb'
+ - 'spec/lib/gitlab/spamcheck/client_spec.rb'
+ - 'spec/lib/gitlab/sql/pattern_spec.rb'
+ - 'spec/lib/gitlab/ssh_public_key_spec.rb'
+ - 'spec/lib/gitlab/static_site_editor/config/file_config/entry/mount_spec.rb'
+ - 'spec/lib/gitlab/submodule_links_spec.rb'
+ - 'spec/lib/gitlab/subscription_portal_spec.rb'
+ - 'spec/lib/gitlab/suggestions/commit_message_spec.rb'
+ - 'spec/lib/gitlab/template/finders/global_template_finder_spec.rb'
+ - 'spec/lib/gitlab/time_tracking_formatter_spec.rb'
+ - 'spec/lib/gitlab/tracking/destinations/snowplow_spec.rb'
+ - 'spec/lib/gitlab/tracking/incident_management_spec.rb'
+ - 'spec/lib/gitlab/tracking/snowplow_schema_validation_spec.rb'
+ - 'spec/lib/gitlab/tracking/standard_context_spec.rb'
+ - 'spec/lib/gitlab/tree_summary_spec.rb'
+ - 'spec/lib/gitlab/untrusted_regexp/ruby_syntax_spec.rb'
+ - 'spec/lib/gitlab/untrusted_regexp_spec.rb'
+ - 'spec/lib/gitlab/url_blocker_spec.rb'
+ - 'spec/lib/gitlab/url_builder_spec.rb'
+ - 'spec/lib/gitlab/url_sanitizer_spec.rb'
+ - 'spec/lib/gitlab/usage/metric_definition_spec.rb'
+ - 'spec/lib/gitlab/usage/metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/aggregates/aggregate_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/aggregates/sources/postgres_hll_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/count_users_creating_issues_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/redis_hll_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/redis_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/snowplow_configured_to_gitlab_collector_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/snowplow_enabled_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/name_suggestion_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/names_suggestions/generator_spec.rb'
+ - 'spec/lib/gitlab/usage/service_ping/payload_keys_processor_spec.rb'
+ - 'spec/lib/gitlab/usage/service_ping_report_spec.rb'
+ - 'spec/lib/gitlab/usage_data/topology_spec.rb'
+ - 'spec/lib/gitlab/usage_data_counters/ci_template_unique_counter_spec.rb'
+ - 'spec/lib/gitlab/usage_data_counters/editor_unique_counter_spec.rb'
+ - 'spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb'
+ - 'spec/lib/gitlab/usage_data_counters/issue_activity_unique_counter_spec.rb'
+ - 'spec/lib/gitlab/usage_data_counters/kubernetes_agent_counter_spec.rb'
+ - 'spec/lib/gitlab/usage_data_counters/quick_action_activity_unique_counter_spec.rb'
+ - 'spec/lib/gitlab/usage_data_counters/search_counter_spec.rb'
+ - 'spec/lib/gitlab/usage_data_counters/track_unique_events_spec.rb'
+ - 'spec/lib/gitlab/usage_data_spec.rb'
+ - 'spec/lib/gitlab/utils/lazy_attributes_spec.rb'
+ - 'spec/lib/gitlab/utils/mime_type_spec.rb'
+ - 'spec/lib/gitlab/utils/strong_memoize_spec.rb'
+ - 'spec/lib/gitlab/utils/usage_data_spec.rb'
+ - 'spec/lib/gitlab/utils_spec.rb'
+ - 'spec/lib/gitlab/uuid_spec.rb'
+ - 'spec/lib/gitlab/version_info_spec.rb'
+ - 'spec/lib/gitlab/view/presenter/base_spec.rb'
+ - 'spec/lib/gitlab/visibility_level_checker_spec.rb'
+ - 'spec/lib/gitlab/visibility_level_spec.rb'
+ - 'spec/lib/gitlab/web_ide/config/entry/terminal_spec.rb'
+ - 'spec/lib/gitlab/wiki_pages/front_matter_parser_spec.rb'
+ - 'spec/lib/gitlab/workhorse_spec.rb'
+ - 'spec/lib/gitlab/x509/certificate_spec.rb'
+ - 'spec/lib/gitlab/x509/commit_spec.rb'
+ - 'spec/lib/gitlab/x509/signature_spec.rb'
+ - 'spec/lib/gitlab/zentao/client_spec.rb'
+ - 'spec/lib/google_api/cloud_platform/client_spec.rb'
+ - 'spec/lib/json_web_token/hmac_token_spec.rb'
+ - 'spec/lib/json_web_token/rsa_token_spec.rb'
+ - 'spec/lib/json_web_token/token_spec.rb'
+ - 'spec/lib/kramdown/parser/atlassian_document_format_spec.rb'
+ - 'spec/lib/mattermost/client_spec.rb'
+ - 'spec/lib/mattermost/command_spec.rb'
+ - 'spec/lib/mattermost/session_spec.rb'
+ - 'spec/lib/mattermost/team_spec.rb'
+ - 'spec/lib/object_storage/direct_upload_spec.rb'
+ - 'spec/lib/omni_auth/strategies/jwt_spec.rb'
+ - 'spec/lib/peek/views/bullet_detailed_spec.rb'
+ - 'spec/lib/product_analytics/event_params_spec.rb'
+ - 'spec/lib/prometheus/pid_provider_spec.rb'
+ - 'spec/lib/safe_zip/entry_spec.rb'
+ - 'spec/lib/security/ci_configuration/container_scanning_build_action_spec.rb'
+ - 'spec/lib/security/ci_configuration/sast_build_action_spec.rb'
+ - 'spec/lib/security/ci_configuration/sast_iac_build_action_spec.rb'
+ - 'spec/lib/security/ci_configuration/secret_detection_build_action_spec.rb'
+ - 'spec/lib/sidebars/groups/menus/kubernetes_menu_spec.rb'
+ - 'spec/lib/sidebars/projects/menus/analytics_menu_spec.rb'
+ - 'spec/lib/sidebars/projects/menus/external_issue_tracker_menu_spec.rb'
+ - 'spec/lib/sidebars/projects/menus/external_wiki_menu_spec.rb'
+ - 'spec/lib/sidebars/projects/menus/monitor_menu_spec.rb'
+ - 'spec/lib/sidebars/projects/panel_spec.rb'
+ - 'spec/lib/system_check/app/authorized_keys_permission_check_spec.rb'
+ - 'spec/lib/system_check/base_check_spec.rb'
+ - 'spec/lib/system_check/incoming_email/imap_authentication_check_spec.rb'
+ - 'spec/lib/system_check/orphans/namespace_check_spec.rb'
+ - 'spec/lib/system_check/orphans/repository_check_spec.rb'
+ - 'spec/lib/uploaded_file_spec.rb'
+ - 'spec/lib/version_check_spec.rb'
+ - 'spec/mailers/emails/profile_spec.rb'
+ - 'spec/mailers/emails/projects_spec.rb'
+ - 'spec/mailers/emails/releases_spec.rb'
+ - 'spec/mailers/emails/service_desk_spec.rb'
+ - 'spec/mailers/notify_spec.rb'
+ - 'spec/metrics_server/metrics_server_spec.rb'
+ - 'spec/migrations/20210812013042_remove_duplicate_project_authorizations_spec.rb'
+ - 'spec/migrations/20220426185933_backfill_deployments_finished_at_spec.rb'
+ - 'spec/migrations/backfill_cadence_id_for_boards_scoped_to_iteration_spec.rb'
+ - 'spec/migrations/finalize_traversal_ids_background_migrations_spec.rb'
+ - 'spec/migrations/fix_and_backfill_project_namespaces_for_projects_with_duplicate_name_spec.rb'
+ - 'spec/migrations/rename_services_to_integrations_spec.rb'
+ - 'spec/migrations/schedule_security_setting_creation_spec.rb'
+ - 'spec/models/ability_spec.rb'
+ - 'spec/models/active_session_spec.rb'
+ - 'spec/models/alert_management/alert_spec.rb'
+ - 'spec/models/alert_management/http_integration_spec.rb'
+ - 'spec/models/analytics/cycle_analytics/project_stage_spec.rb'
+ - 'spec/models/appearance_spec.rb'
+ - 'spec/models/application_record_spec.rb'
+ - 'spec/models/application_setting_spec.rb'
+ - 'spec/models/approval_spec.rb'
+ - 'spec/models/audit_event_spec.rb'
+ - 'spec/models/award_emoji_spec.rb'
+ - 'spec/models/aws/role_spec.rb'
+ - 'spec/models/badge_spec.rb'
+ - 'spec/models/badges/project_badge_spec.rb'
+ - 'spec/models/blob_spec.rb'
+ - 'spec/models/blob_viewer/package_json_spec.rb'
+ - 'spec/models/board_spec.rb'
+ - 'spec/models/bulk_imports/entity_spec.rb'
+ - 'spec/models/ci/artifact_blob_spec.rb'
+ - 'spec/models/ci/bridge_spec.rb'
+ - 'spec/models/ci/build_dependencies_spec.rb'
+ - 'spec/models/ci/build_metadata_spec.rb'
+ - 'spec/models/ci/build_runner_session_spec.rb'
+ - 'spec/models/ci/build_spec.rb'
+ - 'spec/models/ci/build_trace_chunk_spec.rb'
+ - 'spec/models/ci/deleted_object_spec.rb'
+ - 'spec/models/ci/job_artifact_spec.rb'
+ - 'spec/models/ci/job_token/project_scope_link_spec.rb'
+ - 'spec/models/ci/legacy_stage_spec.rb'
+ - 'spec/models/ci/namespace_mirror_spec.rb'
+ - 'spec/models/ci/pending_build_spec.rb'
+ - 'spec/models/ci/pipeline_artifact_spec.rb'
+ - 'spec/models/ci/pipeline_schedule_spec.rb'
+ - 'spec/models/ci/pipeline_spec.rb'
+ - 'spec/models/ci/processable_spec.rb'
+ - 'spec/models/ci/project_mirror_spec.rb'
+ - 'spec/models/ci/ref_spec.rb'
+ - 'spec/models/ci/resource_spec.rb'
+ - 'spec/models/ci/runner_project_spec.rb'
+ - 'spec/models/ci/runner_spec.rb'
+ - 'spec/models/ci/running_build_spec.rb'
+ - 'spec/models/ci/secure_file_spec.rb'
+ - 'spec/models/ci/sources/pipeline_spec.rb'
+ - 'spec/models/ci/stage_spec.rb'
+ - 'spec/models/ci/trigger_spec.rb'
+ - 'spec/models/ci/variable_spec.rb'
+ - 'spec/models/clusters/agent_spec.rb'
+ - 'spec/models/clusters/applications/cert_manager_spec.rb'
+ - 'spec/models/clusters/applications/crossplane_spec.rb'
+ - 'spec/models/clusters/applications/elastic_stack_spec.rb'
+ - 'spec/models/clusters/applications/helm_spec.rb'
+ - 'spec/models/clusters/applications/ingress_spec.rb'
+ - 'spec/models/clusters/applications/jupyter_spec.rb'
+ - 'spec/models/clusters/applications/knative_spec.rb'
+ - 'spec/models/clusters/applications/prometheus_spec.rb'
+ - 'spec/models/clusters/applications/runner_spec.rb'
+ - 'spec/models/clusters/cluster_spec.rb'
+ - 'spec/models/clusters/clusters_hierarchy_spec.rb'
+ - 'spec/models/clusters/kubernetes_namespace_spec.rb'
+ - 'spec/models/clusters/platforms/kubernetes_spec.rb'
+ - 'spec/models/clusters/providers/aws_spec.rb'
+ - 'spec/models/commit_signatures/x509_commit_signature_spec.rb'
+ - 'spec/models/commit_spec.rb'
+ - 'spec/models/commit_status_spec.rb'
+ - 'spec/models/compare_spec.rb'
+ - 'spec/models/concerns/after_commit_queue_spec.rb'
+ - 'spec/models/concerns/awardable_spec.rb'
+ - 'spec/models/concerns/bulk_insert_safe_spec.rb'
+ - 'spec/models/concerns/bulk_insertable_associations_spec.rb'
+ - 'spec/models/concerns/cache_markdown_field_spec.rb'
+ - 'spec/models/concerns/cacheable_attributes_spec.rb'
+ - 'spec/models/concerns/cascading_namespace_setting_attribute_spec.rb'
+ - 'spec/models/concerns/ci/artifactable_spec.rb'
+ - 'spec/models/concerns/ci/has_ref_spec.rb'
+ - 'spec/models/concerns/ci/has_status_spec.rb'
+ - 'spec/models/concerns/cron_schedulable_spec.rb'
+ - 'spec/models/concerns/cross_database_modification_spec.rb'
+ - 'spec/models/concerns/deployment_platform_spec.rb'
+ - 'spec/models/concerns/group_descendant_spec.rb'
+ - 'spec/models/concerns/ignorable_columns_spec.rb'
+ - 'spec/models/concerns/issuable_spec.rb'
+ - 'spec/models/concerns/mentionable_spec.rb'
+ - 'spec/models/concerns/milestoneable_spec.rb'
+ - 'spec/models/concerns/noteable_spec.rb'
+ - 'spec/models/concerns/nullify_if_blank_spec.rb'
+ - 'spec/models/concerns/participable_spec.rb'
+ - 'spec/models/concerns/protected_ref_access_spec.rb'
+ - 'spec/models/concerns/reactive_caching_spec.rb'
+ - 'spec/models/concerns/resolvable_note_spec.rb'
+ - 'spec/models/concerns/routable_spec.rb'
+ - 'spec/models/concerns/schedulable_spec.rb'
+ - 'spec/models/concerns/sensitive_serializable_hash_spec.rb'
+ - 'spec/models/concerns/spammable_spec.rb'
+ - 'spec/models/concerns/token_authenticatable_spec.rb'
+ - 'spec/models/concerns/triggerable_hooks_spec.rb'
+ - 'spec/models/concerns/usage_statistics_spec.rb'
+ - 'spec/models/container_expiration_policy_spec.rb'
+ - 'spec/models/container_repository_spec.rb'
+ - 'spec/models/customer_relations/issue_contact_spec.rb'
+ - 'spec/models/dependency_proxy/manifest_spec.rb'
+ - 'spec/models/dependency_proxy/registry_spec.rb'
+ - 'spec/models/deploy_key_spec.rb'
+ - 'spec/models/deploy_token_spec.rb'
+ - 'spec/models/deployment_metrics_spec.rb'
+ - 'spec/models/deployment_spec.rb'
+ - 'spec/models/design_management/action_spec.rb'
+ - 'spec/models/design_management/design_action_spec.rb'
+ - 'spec/models/design_management/design_at_version_spec.rb'
+ - 'spec/models/design_management/design_collection_spec.rb'
+ - 'spec/models/design_management/design_spec.rb'
+ - 'spec/models/design_management/version_spec.rb'
+ - 'spec/models/diff_note_position_spec.rb'
+ - 'spec/models/diff_note_spec.rb'
+ - 'spec/models/environment_spec.rb'
+ - 'spec/models/environment_status_spec.rb'
+ - 'spec/models/error_tracking/error_event_spec.rb'
+ - 'spec/models/error_tracking/error_spec.rb'
+ - 'spec/models/event_collection_spec.rb'
+ - 'spec/models/event_spec.rb'
+ - 'spec/models/experiment_spec.rb'
+ - 'spec/models/external_issue_spec.rb'
+ - 'spec/models/external_pull_request_spec.rb'
+ - 'spec/models/fork_network_spec.rb'
+ - 'spec/models/gpg_key_spec.rb'
+ - 'spec/models/grafana_integration_spec.rb'
+ - 'spec/models/group_deploy_token_spec.rb'
+ - 'spec/models/group_label_spec.rb'
+ - 'spec/models/group_spec.rb'
+ - 'spec/models/hooks/active_hook_filter_spec.rb'
+ - 'spec/models/hooks/system_hook_spec.rb'
+ - 'spec/models/identity_spec.rb'
+ - 'spec/models/import_export_upload_spec.rb'
+ - 'spec/models/import_failure_spec.rb'
+ - 'spec/models/incident_management/timeline_event_spec.rb'
+ - 'spec/models/integration_spec.rb'
+ - 'spec/models/integrations/asana_spec.rb'
+ - 'spec/models/integrations/bamboo_spec.rb'
+ - 'spec/models/integrations/base_chat_notification_spec.rb'
+ - 'spec/models/integrations/chat_message/issue_message_spec.rb'
+ - 'spec/models/integrations/chat_message/merge_message_spec.rb'
+ - 'spec/models/integrations/chat_message/note_message_spec.rb'
+ - 'spec/models/integrations/chat_message/push_message_spec.rb'
+ - 'spec/models/integrations/datadog_spec.rb'
+ - 'spec/models/integrations/discord_spec.rb'
+ - 'spec/models/integrations/drone_ci_spec.rb'
+ - 'spec/models/integrations/emails_on_push_spec.rb'
+ - 'spec/models/integrations/every_integration_spec.rb'
+ - 'spec/models/integrations/external_wiki_spec.rb'
+ - 'spec/models/integrations/harbor_spec.rb'
+ - 'spec/models/integrations/jenkins_spec.rb'
+ - 'spec/models/integrations/jira_spec.rb'
+ - 'spec/models/integrations/microsoft_teams_spec.rb'
+ - 'spec/models/integrations/pipelines_email_spec.rb'
+ - 'spec/models/integrations/prometheus_spec.rb'
+ - 'spec/models/integrations/slack_spec.rb'
+ - 'spec/models/integrations/teamcity_spec.rb'
+ - 'spec/models/internal_id_spec.rb'
+ - 'spec/models/issue/metrics_spec.rb'
+ - 'spec/models/issue_assignee_spec.rb'
+ - 'spec/models/issue_collection_spec.rb'
+ - 'spec/models/issue_spec.rb'
+ - 'spec/models/jira_import_state_spec.rb'
+ - 'spec/models/key_spec.rb'
+ - 'spec/models/lfs_download_object_spec.rb'
+ - 'spec/models/lfs_object_spec.rb'
+ - 'spec/models/member_spec.rb'
+ - 'spec/models/members/group_member_spec.rb'
+ - 'spec/models/members/project_member_spec.rb'
+ - 'spec/models/merge_request_assignee_spec.rb'
+ - 'spec/models/merge_request_diff_file_spec.rb'
+ - 'spec/models/merge_request_diff_spec.rb'
+ - 'spec/models/merge_request_reviewer_spec.rb'
+ - 'spec/models/merge_request_spec.rb'
+ - 'spec/models/metrics/dashboard/annotation_spec.rb'
+ - 'spec/models/metrics/users_starred_dashboard_spec.rb'
+ - 'spec/models/milestone_spec.rb'
+ - 'spec/models/namespace/package_setting_spec.rb'
+ - 'spec/models/namespace/root_storage_statistics_spec.rb'
+ - 'spec/models/namespace_setting_spec.rb'
+ - 'spec/models/namespace_spec.rb'
+ - 'spec/models/namespace_statistics_spec.rb'
+ - 'spec/models/note_spec.rb'
+ - 'spec/models/notification_recipient_spec.rb'
+ - 'spec/models/notification_setting_spec.rb'
+ - 'spec/models/onboarding_progress_spec.rb'
+ - 'spec/models/operations/feature_flag_spec.rb'
+ - 'spec/models/packages/conan/file_metadatum_spec.rb'
+ - 'spec/models/packages/debian/file_metadatum_spec.rb'
+ - 'spec/models/packages/dependency_link_spec.rb'
+ - 'spec/models/packages/dependency_spec.rb'
+ - 'spec/models/packages/package_file_spec.rb'
+ - 'spec/models/packages/package_spec.rb'
+ - 'spec/models/pages_domain_spec.rb'
+ - 'spec/models/performance_monitoring/prometheus_dashboard_spec.rb'
+ - 'spec/models/performance_monitoring/prometheus_metric_spec.rb'
+ - 'spec/models/performance_monitoring/prometheus_panel_group_spec.rb'
+ - 'spec/models/performance_monitoring/prometheus_panel_spec.rb'
+ - 'spec/models/personal_access_token_spec.rb'
+ - 'spec/models/plan_limits_spec.rb'
+ - 'spec/models/preloaders/labels_preloader_spec.rb'
+ - 'spec/models/preloaders/users_max_access_level_in_projects_preloader_spec.rb'
+ - 'spec/models/project_authorization_spec.rb'
+ - 'spec/models/project_feature_spec.rb'
+ - 'spec/models/project_feature_usage_spec.rb'
+ - 'spec/models/project_import_state_spec.rb'
+ - 'spec/models/project_label_spec.rb'
+ - 'spec/models/project_metrics_setting_spec.rb'
+ - 'spec/models/project_spec.rb'
+ - 'spec/models/project_team_spec.rb'
+ - 'spec/models/projects/repository_storage_move_spec.rb'
+ - 'spec/models/prometheus_alert_event_spec.rb'
+ - 'spec/models/protectable_dropdown_spec.rb'
+ - 'spec/models/protected_branch_spec.rb'
+ - 'spec/models/raw_usage_data_spec.rb'
+ - 'spec/models/release_highlight_spec.rb'
+ - 'spec/models/release_spec.rb'
+ - 'spec/models/releases/link_spec.rb'
+ - 'spec/models/remote_mirror_spec.rb'
+ - 'spec/models/repository_spec.rb'
+ - 'spec/models/resource_label_event_spec.rb'
+ - 'spec/models/resource_state_event_spec.rb'
+ - 'spec/models/route_spec.rb'
+ - 'spec/models/sent_notification_spec.rb'
+ - 'spec/models/sentry_issue_spec.rb'
+ - 'spec/models/snippet_input_action_spec.rb'
+ - 'spec/models/snippet_repository_spec.rb'
+ - 'spec/models/snippet_spec.rb'
+ - 'spec/models/spam_log_spec.rb'
+ - 'spec/models/ssh_host_key_spec.rb'
+ - 'spec/models/suggestion_spec.rb'
+ - 'spec/models/terraform/state_spec.rb'
+ - 'spec/models/terraform/state_version_spec.rb'
+ - 'spec/models/todo_spec.rb'
+ - 'spec/models/upload_spec.rb'
+ - 'spec/models/uploads/fog_spec.rb'
+ - 'spec/models/uploads/local_spec.rb'
+ - 'spec/models/user_interacted_project_spec.rb'
+ - 'spec/models/user_preference_spec.rb'
+ - 'spec/models/user_spec.rb'
+ - 'spec/models/users/in_product_marketing_email_spec.rb'
+ - 'spec/models/wiki_page/meta_spec.rb'
+ - 'spec/models/wiki_page/slug_spec.rb'
+ - 'spec/models/wiki_page_spec.rb'
+ - 'spec/models/x509_certificate_spec.rb'
+ - 'spec/models/zoom_meeting_spec.rb'
+ - 'spec/policies/application_setting/term_policy_spec.rb'
+ - 'spec/policies/application_setting_policy_spec.rb'
+ - 'spec/policies/base_policy_spec.rb'
+ - 'spec/policies/board_policy_spec.rb'
+ - 'spec/policies/ci/build_policy_spec.rb'
+ - 'spec/policies/clusters/agents/activity_event_policy_spec.rb'
+ - 'spec/policies/clusters/cluster_policy_spec.rb'
+ - 'spec/policies/custom_emoji_policy_spec.rb'
+ - 'spec/policies/deploy_key_policy_spec.rb'
+ - 'spec/policies/deploy_keys_project_policy_spec.rb'
+ - 'spec/policies/design_management/design_policy_spec.rb'
+ - 'spec/policies/global_policy_spec.rb'
+ - 'spec/policies/group_member_policy_spec.rb'
+ - 'spec/policies/group_policy_spec.rb'
+ - 'spec/policies/instance_metadata_policy_spec.rb'
+ - 'spec/policies/issuable_policy_spec.rb'
+ - 'spec/policies/issue_policy_spec.rb'
+ - 'spec/policies/merge_request_policy_spec.rb'
+ - 'spec/policies/metrics/dashboard/annotation_policy_spec.rb'
+ - 'spec/policies/namespaces/project_namespace_policy_spec.rb'
+ - 'spec/policies/namespaces/user_namespace_policy_spec.rb'
+ - 'spec/policies/note_policy_spec.rb'
+ - 'spec/policies/personal_access_token_policy_spec.rb'
+ - 'spec/policies/personal_snippet_policy_spec.rb'
+ - 'spec/policies/project_policy_spec.rb'
+ - 'spec/policies/project_snippet_policy_spec.rb'
+ - 'spec/policies/terraform/state_policy_spec.rb'
+ - 'spec/policies/terraform/state_version_policy_spec.rb'
+ - 'spec/policies/user_policy_spec.rb'
+ - 'spec/presenters/blob_presenter_spec.rb'
+ - 'spec/presenters/blobs/unfold_presenter_spec.rb'
+ - 'spec/presenters/ci/build_presenter_spec.rb'
+ - 'spec/presenters/ci/pipeline_presenter_spec.rb'
+ - 'spec/presenters/clusters/cluster_presenter_spec.rb'
+ - 'spec/presenters/commit_status_presenter_spec.rb'
+ - 'spec/presenters/gitlab/blame_presenter_spec.rb'
+ - 'spec/presenters/group_member_presenter_spec.rb'
+ - 'spec/presenters/merge_request_presenter_spec.rb'
+ - 'spec/presenters/packages/conan/package_presenter_spec.rb'
+ - 'spec/presenters/packages/npm/package_presenter_spec.rb'
+ - 'spec/presenters/packages/nuget/service_index_presenter_spec.rb'
+ - 'spec/presenters/packages/pypi/package_presenter_spec.rb'
+ - 'spec/presenters/project_member_presenter_spec.rb'
+ - 'spec/presenters/project_presenter_spec.rb'
+ - 'spec/presenters/projects/import_export/project_export_presenter_spec.rb'
+ - 'spec/presenters/projects/security/configuration_presenter_spec.rb'
+ - 'spec/presenters/projects/settings/deploy_keys_presenter_spec.rb'
+ - 'spec/presenters/search_service_presenter_spec.rb'
+ - 'spec/presenters/user_presenter_spec.rb'
+ - 'spec/presenters/web_hook_log_presenter_spec.rb'
+ - 'spec/requests/admin/clusters/integrations_controller_spec.rb'
+ - 'spec/requests/admin/integrations_controller_spec.rb'
+ - 'spec/requests/api/access_requests_spec.rb'
+ - 'spec/requests/api/admin/ci/variables_spec.rb'
+ - 'spec/requests/api/admin/instance_clusters_spec.rb'
+ - 'spec/requests/api/admin/plan_limits_spec.rb'
+ - 'spec/requests/api/admin/sidekiq_spec.rb'
+ - 'spec/requests/api/alert_management_alerts_spec.rb'
+ - 'spec/requests/api/api_spec.rb'
+ - 'spec/requests/api/appearance_spec.rb'
+ - 'spec/requests/api/applications_spec.rb'
+ - 'spec/requests/api/avatar_spec.rb'
+ - 'spec/requests/api/award_emoji_spec.rb'
+ - 'spec/requests/api/badges_spec.rb'
+ - 'spec/requests/api/branches_spec.rb'
+ - 'spec/requests/api/broadcast_messages_spec.rb'
+ - 'spec/requests/api/bulk_imports_spec.rb'
+ - 'spec/requests/api/ci/job_artifacts_spec.rb'
+ - 'spec/requests/api/ci/jobs_spec.rb'
+ - 'spec/requests/api/ci/pipeline_schedules_spec.rb'
+ - 'spec/requests/api/ci/pipelines_spec.rb'
+ - 'spec/requests/api/ci/runner/jobs_artifacts_spec.rb'
+ - 'spec/requests/api/ci/runner/jobs_request_post_spec.rb'
+ - 'spec/requests/api/ci/runner/runners_post_spec.rb'
+ - 'spec/requests/api/ci/runner/runners_reset_spec.rb'
+ - 'spec/requests/api/ci/runners_spec.rb'
+ - 'spec/requests/api/ci/secure_files_spec.rb'
+ - 'spec/requests/api/ci/triggers_spec.rb'
+ - 'spec/requests/api/ci/variables_spec.rb'
+ - 'spec/requests/api/clusters/agents_spec.rb'
+ - 'spec/requests/api/commit_statuses_spec.rb'
+ - 'spec/requests/api/commits_spec.rb'
+ - 'spec/requests/api/composer_packages_spec.rb'
+ - 'spec/requests/api/conan_instance_packages_spec.rb'
+ - 'spec/requests/api/conan_project_packages_spec.rb'
+ - 'spec/requests/api/container_repositories_spec.rb'
+ - 'spec/requests/api/dependency_proxy_spec.rb'
+ - 'spec/requests/api/deploy_keys_spec.rb'
+ - 'spec/requests/api/deploy_tokens_spec.rb'
+ - 'spec/requests/api/deployments_spec.rb'
+ - 'spec/requests/api/environments_spec.rb'
+ - 'spec/requests/api/error_tracking/collector_spec.rb'
+ - 'spec/requests/api/error_tracking/project_settings_spec.rb'
+ - 'spec/requests/api/events_spec.rb'
+ - 'spec/requests/api/files_spec.rb'
+ - 'spec/requests/api/generic_packages_spec.rb'
+ - 'spec/requests/api/go_proxy_spec.rb'
+ - 'spec/requests/api/graphql/ci/runner_spec.rb'
+ - 'spec/requests/api/graphql/ci/runners_spec.rb'
+ - 'spec/requests/api/graphql/container_repository/container_repository_details_spec.rb'
+ - 'spec/requests/api/graphql/gitlab_schema_spec.rb'
+ - 'spec/requests/api/graphql/group/container_repositories_spec.rb'
+ - 'spec/requests/api/graphql/group/dependency_proxy_blobs_spec.rb'
+ - 'spec/requests/api/graphql/group/dependency_proxy_manifests_spec.rb'
+ - 'spec/requests/api/graphql/group/group_members_spec.rb'
+ - 'spec/requests/api/graphql/group/issues_spec.rb'
+ - 'spec/requests/api/graphql/group/milestones_spec.rb'
+ - 'spec/requests/api/graphql/metadata_query_spec.rb'
+ - 'spec/requests/api/graphql/metrics/dashboard/annotations_spec.rb'
+ - 'spec/requests/api/graphql/metrics/dashboard_query_spec.rb'
+ - 'spec/requests/api/graphql/mutations/admin/sidekiq_queues/delete_jobs_spec.rb'
+ - 'spec/requests/api/graphql/mutations/alert_management/alerts/todo/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/boards/issues/issue_move_list_spec.rb'
+ - 'spec/requests/api/graphql/mutations/branches/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/ci/runners_registration_token/reset_spec.rb'
+ - 'spec/requests/api/graphql/mutations/commits/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/container_expiration_policy/update_spec.rb'
+ - 'spec/requests/api/graphql/mutations/custom_emoji/destroy_spec.rb'
+ - 'spec/requests/api/graphql/mutations/design_management/delete_spec.rb'
+ - 'spec/requests/api/graphql/mutations/design_management/move_spec.rb'
+ - 'spec/requests/api/graphql/mutations/issues/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/issues/set_crm_contacts_spec.rb'
+ - 'spec/requests/api/graphql/mutations/issues/update_spec.rb'
+ - 'spec/requests/api/graphql/mutations/merge_requests/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/merge_requests/request_attention_spec.rb'
+ - 'spec/requests/api/graphql/mutations/namespace/package_settings/update_spec.rb'
+ - 'spec/requests/api/graphql/mutations/notes/create/diff_note_spec.rb'
+ - 'spec/requests/api/graphql/mutations/notes/create/note_spec.rb'
+ - 'spec/requests/api/graphql/mutations/releases/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/releases/delete_spec.rb'
+ - 'spec/requests/api/graphql/mutations/releases/update_spec.rb'
+ - 'spec/requests/api/graphql/mutations/remove_attention_request_spec.rb'
+ - 'spec/requests/api/graphql/mutations/todos/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/work_items/create_from_task_spec.rb'
+ - 'spec/requests/api/graphql/mutations/work_items/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/work_items/delete_task_spec.rb'
+ - 'spec/requests/api/graphql/mutations/work_items/update_spec.rb'
+ - 'spec/requests/api/graphql/namespace_query_spec.rb'
+ - 'spec/requests/api/graphql/packages/maven_spec.rb'
+ - 'spec/requests/api/graphql/packages/package_spec.rb'
+ - 'spec/requests/api/graphql/project/alert_management/alert/notes_spec.rb'
+ - 'spec/requests/api/graphql/project/alert_management/alerts_spec.rb'
+ - 'spec/requests/api/graphql/project/cluster_agents_spec.rb'
+ - 'spec/requests/api/graphql/project/container_repositories_spec.rb'
+ - 'spec/requests/api/graphql/project/error_tracking/sentry_detailed_error_request_spec.rb'
+ - 'spec/requests/api/graphql/project/issue/design_collection/version_spec.rb'
+ - 'spec/requests/api/graphql/project/issue/designs/designs_spec.rb'
+ - 'spec/requests/api/graphql/project/issue_spec.rb'
+ - 'spec/requests/api/graphql/project/issues_spec.rb'
+ - 'spec/requests/api/graphql/project/jira_import_spec.rb'
+ - 'spec/requests/api/graphql/project/merge_request/diff_notes_spec.rb'
+ - 'spec/requests/api/graphql/project/milestones_spec.rb'
+ - 'spec/requests/api/graphql/project/pipeline_spec.rb'
+ - 'spec/requests/api/graphql/project/project_members_spec.rb'
+ - 'spec/requests/api/graphql/project/release_spec.rb'
+ - 'spec/requests/api/graphql/project/repository_spec.rb'
+ - 'spec/requests/api/graphql/project/terraform/state_spec.rb'
+ - 'spec/requests/api/graphql/project/terraform/states_spec.rb'
+ - 'spec/requests/api/graphql/project_query_spec.rb'
+ - 'spec/requests/api/graphql/query_spec.rb'
+ - 'spec/requests/api/graphql/user/starred_projects_query_spec.rb'
+ - 'spec/requests/api/graphql/user_query_spec.rb'
+ - 'spec/requests/api/graphql/users_spec.rb'
+ - 'spec/requests/api/graphql_spec.rb'
+ - 'spec/requests/api/group_avatar_spec.rb'
+ - 'spec/requests/api/group_clusters_spec.rb'
+ - 'spec/requests/api/group_labels_spec.rb'
+ - 'spec/requests/api/group_packages_spec.rb'
+ - 'spec/requests/api/group_variables_spec.rb'
+ - 'spec/requests/api/groups_spec.rb'
+ - 'spec/requests/api/helm_packages_spec.rb'
+ - 'spec/requests/api/helpers_spec.rb'
+ - 'spec/requests/api/integrations_spec.rb'
+ - 'spec/requests/api/internal/base_spec.rb'
+ - 'spec/requests/api/internal/container_registry/migration_spec.rb'
+ - 'spec/requests/api/internal/kubernetes_spec.rb'
+ - 'spec/requests/api/internal/lfs_spec.rb'
+ - 'spec/requests/api/internal/mail_room_spec.rb'
+ - 'spec/requests/api/internal/pages_spec.rb'
+ - 'spec/requests/api/invitations_spec.rb'
+ - 'spec/requests/api/issue_links_spec.rb'
+ - 'spec/requests/api/issues/get_group_issues_spec.rb'
+ - 'spec/requests/api/issues/get_project_issues_spec.rb'
+ - 'spec/requests/api/issues/issues_spec.rb'
+ - 'spec/requests/api/issues/post_projects_issues_spec.rb'
+ - 'spec/requests/api/issues/put_projects_issues_spec.rb'
+ - 'spec/requests/api/keys_spec.rb'
+ - 'spec/requests/api/labels_spec.rb'
+ - 'spec/requests/api/lint_spec.rb'
+ - 'spec/requests/api/maven_packages_spec.rb'
+ - 'spec/requests/api/members_spec.rb'
+ - 'spec/requests/api/merge_request_approvals_spec.rb'
+ - 'spec/requests/api/merge_request_diffs_spec.rb'
+ - 'spec/requests/api/merge_requests_spec.rb'
+ - 'spec/requests/api/metrics/user_starred_dashboards_spec.rb'
+ - 'spec/requests/api/notes_spec.rb'
+ - 'spec/requests/api/npm_project_packages_spec.rb'
+ - 'spec/requests/api/nuget_group_packages_spec.rb'
+ - 'spec/requests/api/oauth_tokens_spec.rb'
+ - 'spec/requests/api/package_files_spec.rb'
+ - 'spec/requests/api/pages/internal_access_spec.rb'
+ - 'spec/requests/api/pages/private_access_spec.rb'
+ - 'spec/requests/api/pages/public_access_spec.rb'
+ - 'spec/requests/api/personal_access_tokens_spec.rb'
+ - 'spec/requests/api/project_clusters_spec.rb'
+ - 'spec/requests/api/project_container_repositories_spec.rb'
+ - 'spec/requests/api/project_events_spec.rb'
+ - 'spec/requests/api/project_export_spec.rb'
+ - 'spec/requests/api/project_hooks_spec.rb'
+ - 'spec/requests/api/project_import_spec.rb'
+ - 'spec/requests/api/project_packages_spec.rb'
+ - 'spec/requests/api/project_snippets_spec.rb'
+ - 'spec/requests/api/projects_spec.rb'
+ - 'spec/requests/api/pypi_packages_spec.rb'
+ - 'spec/requests/api/releases_spec.rb'
+ - 'spec/requests/api/remote_mirrors_spec.rb'
+ - 'spec/requests/api/repositories_spec.rb'
+ - 'spec/requests/api/rubygem_packages_spec.rb'
+ - 'spec/requests/api/search_spec.rb'
+ - 'spec/requests/api/settings_spec.rb'
+ - 'spec/requests/api/tags_spec.rb'
+ - 'spec/requests/api/task_completion_status_spec.rb'
+ - 'spec/requests/api/templates_spec.rb'
+ - 'spec/requests/api/terraform/modules/v1/packages_spec.rb'
+ - 'spec/requests/api/terraform/state_spec.rb'
+ - 'spec/requests/api/terraform/state_version_spec.rb'
+ - 'spec/requests/api/todos_spec.rb'
+ - 'spec/requests/api/topics_spec.rb'
+ - 'spec/requests/api/usage_data_spec.rb'
+ - 'spec/requests/api/user_counts_spec.rb'
+ - 'spec/requests/api/users_preferences_spec.rb'
+ - 'spec/requests/api/users_spec.rb'
+ - 'spec/requests/api/v3/github_spec.rb'
+ - 'spec/requests/content_security_policy_spec.rb'
+ - 'spec/requests/dashboard/projects_controller_spec.rb'
+ - 'spec/requests/dashboard_controller_spec.rb'
+ - 'spec/requests/git_http_spec.rb'
+ - 'spec/requests/groups/clusters/integrations_controller_spec.rb'
+ - 'spec/requests/groups/crm/contacts_controller_spec.rb'
+ - 'spec/requests/groups/crm/organizations_controller_spec.rb'
+ - 'spec/requests/groups/email_campaigns_controller_spec.rb'
+ - 'spec/requests/groups/milestones_controller_spec.rb'
+ - 'spec/requests/groups/settings/access_tokens_controller_spec.rb'
+ - 'spec/requests/groups_controller_spec.rb'
+ - 'spec/requests/health_controller_spec.rb'
+ - 'spec/requests/ide_controller_spec.rb'
+ - 'spec/requests/jira_connect/installations_controller_spec.rb'
+ - 'spec/requests/jira_routing_spec.rb'
+ - 'spec/requests/jwt_controller_spec.rb'
+ - 'spec/requests/lfs_http_spec.rb'
+ - 'spec/requests/oauth_tokens_spec.rb'
+ - 'spec/requests/openid_connect_spec.rb'
+ - 'spec/requests/product_analytics/collector_app_attack_spec.rb'
+ - 'spec/requests/product_analytics/collector_app_spec.rb'
+ - 'spec/requests/projects/clusters/integrations_controller_spec.rb'
+ - 'spec/requests/projects/commits_controller_spec.rb'
+ - 'spec/requests/projects/google_cloud/deployments_controller_spec.rb'
+ - 'spec/requests/projects/google_cloud/gcp_regions_controller_spec.rb'
+ - 'spec/requests/projects/google_cloud/service_accounts_controller_spec.rb'
+ - 'spec/requests/projects/google_cloud_controller_spec.rb'
+ - 'spec/requests/projects/issues/discussions_spec.rb'
+ - 'spec/requests/projects/issues_controller_spec.rb'
+ - 'spec/requests/projects/merge_requests_controller_spec.rb'
+ - 'spec/requests/projects/merge_requests_discussions_spec.rb'
+ - 'spec/requests/projects/merge_requests_spec.rb'
+ - 'spec/requests/projects/metrics/dashboards/builder_spec.rb'
+ - 'spec/requests/projects/releases_controller_spec.rb'
+ - 'spec/requests/projects/settings/access_tokens_controller_spec.rb'
+ - 'spec/requests/projects/tags_controller_spec.rb'
+ - 'spec/requests/projects/usage_quotas_spec.rb'
+ - 'spec/requests/projects_controller_spec.rb'
+ - 'spec/requests/rack_attack_global_spec.rb'
+ - 'spec/requests/search_controller_spec.rb'
+ - 'spec/requests/sessions_spec.rb'
+ - 'spec/requests/users_controller_spec.rb'
+ - 'spec/routing/git_http_routing_spec.rb'
+ - 'spec/routing/group_routing_spec.rb'
+ - 'spec/routing/project_routing_spec.rb'
+ - 'spec/rubocop/cop/gitlab/avoid_feature_category_not_owned_spec.rb'
+ - 'spec/rubocop/cop/gitlab/change_timezone_spec.rb'
+ - 'spec/rubocop/cop/gitlab/const_get_inherit_false_spec.rb'
+ - 'spec/rubocop/cop/gitlab/duplicate_spec_location_spec.rb'
+ - 'spec/rubocop/cop/gitlab/event_store_subscriber_spec.rb'
+ - 'spec/rubocop/cop/gitlab/feature_available_usage_spec.rb'
+ - 'spec/rubocop/cop/gitlab/mark_used_feature_flags_spec.rb'
+ - 'spec/rubocop/cop/graphql/id_type_spec.rb'
+ - 'spec/rubocop/cop/graphql/json_type_spec.rb'
+ - 'spec/rubocop/cop/graphql/old_types_spec.rb'
+ - 'spec/rubocop/cop/lint/last_keyword_argument_spec.rb'
+ - 'spec/rubocop/cop/migration/add_index_spec.rb'
+ - 'spec/rubocop/cop/migration/add_limit_to_text_columns_spec.rb'
+ - 'spec/rubocop/cop/migration/background_migration_record_spec.rb'
+ - 'spec/rubocop/cop/migration/create_table_with_foreign_keys_spec.rb'
+ - 'spec/rubocop/cop/migration/migration_record_spec.rb'
+ - 'spec/rubocop/cop/migration/remove_concurrent_index_spec.rb'
+ - 'spec/rubocop/cop/migration/safer_boolean_column_spec.rb'
+ - 'spec/rubocop/cop/migration/schedule_async_spec.rb'
+ - 'spec/rubocop/cop/migration/timestamps_spec.rb'
+ - 'spec/rubocop/cop/migration/update_column_in_batches_spec.rb'
+ - 'spec/rubocop/cop/migration/versioned_migration_class_spec.rb'
+ - 'spec/rubocop/cop/performance/ar_exists_and_present_blank_spec.rb'
+ - 'spec/rubocop/cop/performance/readlines_each_spec.rb'
+ - 'spec/rubocop/cop/qa/ambiguous_page_object_name_spec.rb'
+ - 'spec/rubocop/cop/qa/element_with_pattern_spec.rb'
+ - 'spec/rubocop/cop/qa/selector_usage_spec.rb'
+ - 'spec/rubocop/cop/rspec/factory_bot/inline_association_spec.rb'
+ - 'spec/scripts/pipeline_test_report_builder_spec.rb'
+ - 'spec/serializers/analytics_build_entity_spec.rb'
+ - 'spec/serializers/blob_entity_spec.rb'
+ - 'spec/serializers/board_serializer_spec.rb'
+ - 'spec/serializers/ci/job_serializer_spec.rb'
+ - 'spec/serializers/ci/pipeline_entity_spec.rb'
+ - 'spec/serializers/cluster_application_entity_spec.rb'
+ - 'spec/serializers/cluster_entity_spec.rb'
+ - 'spec/serializers/context_commits_diff_entity_spec.rb'
+ - 'spec/serializers/deploy_key_entity_spec.rb'
+ - 'spec/serializers/diff_file_base_entity_spec.rb'
+ - 'spec/serializers/diff_file_entity_spec.rb'
+ - 'spec/serializers/diff_file_metadata_entity_spec.rb'
+ - 'spec/serializers/diffs_entity_spec.rb'
+ - 'spec/serializers/diffs_metadata_entity_spec.rb'
+ - 'spec/serializers/environment_entity_spec.rb'
+ - 'spec/serializers/environment_serializer_spec.rb'
+ - 'spec/serializers/group_child_entity_spec.rb'
+ - 'spec/serializers/group_child_serializer_spec.rb'
+ - 'spec/serializers/group_link/group_group_link_entity_spec.rb'
+ - 'spec/serializers/integrations/project_entity_spec.rb'
+ - 'spec/serializers/issue_serializer_spec.rb'
+ - 'spec/serializers/issue_sidebar_basic_entity_spec.rb'
+ - 'spec/serializers/member_entity_spec.rb'
+ - 'spec/serializers/member_serializer_spec.rb'
+ - 'spec/serializers/merge_request_current_user_entity_spec.rb'
+ - 'spec/serializers/merge_request_diff_entity_spec.rb'
+ - 'spec/serializers/merge_request_for_pipeline_entity_spec.rb'
+ - 'spec/serializers/merge_request_serializer_spec.rb'
+ - 'spec/serializers/merge_request_user_entity_spec.rb'
+ - 'spec/serializers/merge_request_widget_commit_entity_spec.rb'
+ - 'spec/serializers/merge_request_widget_entity_spec.rb'
+ - 'spec/serializers/paginated_diff_entity_spec.rb'
+ - 'spec/serializers/pipeline_details_entity_spec.rb'
+ - 'spec/serializers/service_event_entity_spec.rb'
+ - 'spec/serializers/service_field_entity_spec.rb'
+ - 'spec/serializers/stage_entity_spec.rb'
+ - 'spec/serializers/user_serializer_spec.rb'
+ - 'spec/services/access_token_validation_service_spec.rb'
+ - 'spec/services/alert_management/alerts/update_service_spec.rb'
+ - 'spec/services/alert_management/metric_images/upload_service_spec.rb'
+ - 'spec/services/alert_management/process_prometheus_alert_service_spec.rb'
+ - 'spec/services/application_settings/update_service_spec.rb'
+ - 'spec/services/audit_event_service_spec.rb'
+ - 'spec/services/auth/dependency_proxy_authentication_service_spec.rb'
+ - 'spec/services/authorized_project_update/find_records_due_for_refresh_service_spec.rb'
+ - 'spec/services/auto_merge/merge_when_pipeline_succeeds_service_spec.rb'
+ - 'spec/services/boards/issues/list_service_spec.rb'
+ - 'spec/services/boards/issues/move_service_spec.rb'
+ - 'spec/services/boards/lists/update_service_spec.rb'
+ - 'spec/services/branches/delete_merged_service_spec.rb'
+ - 'spec/services/branches/validate_new_service_spec.rb'
+ - 'spec/services/bulk_create_integration_service_spec.rb'
+ - 'spec/services/chat_names/find_user_service_spec.rb'
+ - 'spec/services/ci/after_requeue_job_service_spec.rb'
+ - 'spec/services/ci/append_build_trace_service_spec.rb'
+ - 'spec/services/ci/archive_trace_service_spec.rb'
+ - 'spec/services/ci/build_report_result_service_spec.rb'
+ - 'spec/services/ci/compare_test_reports_service_spec.rb'
+ - 'spec/services/ci/create_downstream_pipeline_service_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/cache_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/custom_config_content_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/include_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/logger_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/rules_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/tags_spec.rb'
+ - 'spec/services/ci/create_pipeline_service_spec.rb'
+ - 'spec/services/ci/create_web_ide_terminal_service_spec.rb'
+ - 'spec/services/ci/destroy_pipeline_service_spec.rb'
+ - 'spec/services/ci/destroy_secure_file_service_spec.rb'
+ - 'spec/services/ci/expire_pipeline_cache_service_spec.rb'
+ - 'spec/services/ci/find_exposed_artifacts_service_spec.rb'
+ - 'spec/services/ci/job_artifacts/destroy_batch_service_spec.rb'
+ - 'spec/services/ci/job_artifacts/update_unknown_locked_status_service_spec.rb'
+ - 'spec/services/ci/pipeline_processing/atomic_processing_service_spec.rb'
+ - 'spec/services/ci/pipelines/add_job_service_spec.rb'
+ - 'spec/services/ci/play_build_service_spec.rb'
+ - 'spec/services/ci/prepare_build_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/register_job_service_spec.rb'
+ - 'spec/services/ci/retry_job_service_spec.rb'
+ - 'spec/services/ci/stuck_builds/drop_pending_service_spec.rb'
+ - 'spec/services/ci/stuck_builds/drop_scheduled_service_spec.rb'
+ - 'spec/services/ci/update_build_queue_service_spec.rb'
+ - 'spec/services/ci/update_pending_build_service_spec.rb'
+ - 'spec/services/clusters/agent_tokens/track_usage_service_spec.rb'
+ - 'spec/services/clusters/agents/delete_expired_events_service_spec.rb'
+ - 'spec/services/clusters/agents/refresh_authorization_service_spec.rb'
+ - 'spec/services/clusters/applications/check_uninstall_progress_service_spec.rb'
+ - 'spec/services/clusters/applications/create_service_spec.rb'
+ - 'spec/services/clusters/applications/destroy_service_spec.rb'
+ - 'spec/services/clusters/applications/install_service_spec.rb'
+ - 'spec/services/clusters/applications/patch_service_spec.rb'
+ - 'spec/services/clusters/applications/uninstall_service_spec.rb'
+ - 'spec/services/clusters/applications/update_service_spec.rb'
+ - 'spec/services/clusters/applications/upgrade_service_spec.rb'
+ - 'spec/services/clusters/aws/authorize_role_service_spec.rb'
+ - 'spec/services/clusters/aws/fetch_credentials_service_spec.rb'
+ - 'spec/services/clusters/aws/finalize_creation_service_spec.rb'
+ - 'spec/services/clusters/aws/provision_service_spec.rb'
+ - 'spec/services/clusters/aws/verify_provision_status_service_spec.rb'
+ - 'spec/services/clusters/build_kubernetes_namespace_service_spec.rb'
+ - 'spec/services/clusters/create_service_spec.rb'
+ - 'spec/services/clusters/gcp/finalize_creation_service_spec.rb'
+ - 'spec/services/clusters/kubernetes/configure_istio_ingress_service_spec.rb'
+ - 'spec/services/clusters/kubernetes/create_or_update_namespace_service_spec.rb'
+ - 'spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb'
+ - 'spec/services/clusters/management/validate_management_project_permissions_service_spec.rb'
+ - 'spec/services/clusters/update_service_spec.rb'
+ - 'spec/services/commits/tag_service_spec.rb'
+ - 'spec/services/compare_service_spec.rb'
+ - 'spec/services/concerns/merge_requests/assigns_merge_params_spec.rb'
+ - 'spec/services/concerns/rate_limited_service_spec.rb'
+ - 'spec/services/container_expiration_policies/cleanup_service_spec.rb'
+ - 'spec/services/database/consistency_check_service_spec.rb'
+ - 'spec/services/database/consistency_fix_service_spec.rb'
+ - 'spec/services/dependency_proxy/find_cached_manifest_service_spec.rb'
+ - 'spec/services/dependency_proxy/head_manifest_service_spec.rb'
+ - 'spec/services/dependency_proxy/request_token_service_spec.rb'
+ - 'spec/services/deployments/older_deployments_drop_service_spec.rb'
+ - 'spec/services/deployments/update_environment_service_spec.rb'
+ - 'spec/services/design_management/delete_designs_service_spec.rb'
+ - 'spec/services/design_management/generate_image_versions_service_spec.rb'
+ - 'spec/services/design_management/move_designs_service_spec.rb'
+ - 'spec/services/discussions/capture_diff_note_position_service_spec.rb'
+ - 'spec/services/discussions/capture_diff_note_positions_service_spec.rb'
+ - 'spec/services/discussions/resolve_service_spec.rb'
+ - 'spec/services/draft_notes/create_service_spec.rb'
+ - 'spec/services/draft_notes/destroy_service_spec.rb'
+ - 'spec/services/draft_notes/publish_service_spec.rb'
+ - 'spec/services/environments/schedule_to_delete_review_apps_service_spec.rb'
+ - 'spec/services/error_tracking/collect_error_service_spec.rb'
+ - 'spec/services/error_tracking/list_issues_service_spec.rb'
+ - 'spec/services/error_tracking/list_projects_service_spec.rb'
+ - 'spec/services/events/destroy_service_spec.rb'
+ - 'spec/services/feature_flags/update_service_spec.rb'
+ - 'spec/services/files/create_service_spec.rb'
+ - 'spec/services/git/base_hooks_service_spec.rb'
+ - 'spec/services/git/branch_hooks_service_spec.rb'
+ - 'spec/services/git/branch_push_service_spec.rb'
+ - 'spec/services/git/process_ref_changes_service_spec.rb'
+ - 'spec/services/git/tag_hooks_service_spec.rb'
+ - 'spec/services/git/tag_push_service_spec.rb'
+ - 'spec/services/git/wiki_push_service/change_spec.rb'
+ - 'spec/services/git/wiki_push_service_spec.rb'
+ - 'spec/services/google_cloud/generate_pipeline_service_spec.rb'
+ - 'spec/services/gpg_keys/create_service_spec.rb'
+ - 'spec/services/grafana/proxy_service_spec.rb'
+ - 'spec/services/groups/create_service_spec.rb'
+ - 'spec/services/groups/deploy_tokens/revoke_service_spec.rb'
+ - 'spec/services/groups/destroy_service_spec.rb'
+ - 'spec/services/groups/group_links/create_service_spec.rb'
+ - 'spec/services/groups/group_links/destroy_service_spec.rb'
+ - 'spec/services/groups/nested_create_service_spec.rb'
+ - 'spec/services/groups/transfer_service_spec.rb'
+ - 'spec/services/groups/update_service_spec.rb'
+ - 'spec/services/groups/update_shared_runners_service_spec.rb'
+ - 'spec/services/ide/base_config_service_spec.rb'
+ - 'spec/services/ide/schemas_config_service_spec.rb'
+ - 'spec/services/ide/terminal_config_service_spec.rb'
+ - 'spec/services/import/bitbucket_server_service_spec.rb'
+ - 'spec/services/import/github_service_spec.rb'
+ - 'spec/services/import/gitlab_projects/file_acquisition_strategies/remote_file_s3_spec.rb'
+ - 'spec/services/import/gitlab_projects/file_acquisition_strategies/remote_file_spec.rb'
+ - 'spec/services/incident_management/incidents/create_service_spec.rb'
+ - 'spec/services/incident_management/issuable_escalation_statuses/create_service_spec.rb'
+ - 'spec/services/integrations/propagate_service_spec.rb'
+ - 'spec/services/integrations/test/project_service_spec.rb'
+ - 'spec/services/issuable/clone/attributes_rewriter_spec.rb'
+ - 'spec/services/issuable/common_system_notes_service_spec.rb'
+ - 'spec/services/issue_links/list_service_spec.rb'
+ - 'spec/services/issues/build_service_spec.rb'
+ - 'spec/services/issues/clone_service_spec.rb'
+ - 'spec/services/issues/close_service_spec.rb'
+ - 'spec/services/issues/create_service_spec.rb'
+ - 'spec/services/issues/export_csv_service_spec.rb'
+ - 'spec/services/issues/move_service_spec.rb'
+ - 'spec/services/issues/referenced_merge_requests_service_spec.rb'
+ - 'spec/services/issues/related_branches_service_spec.rb'
+ - 'spec/services/issues/relative_position_rebalancing_service_spec.rb'
+ - 'spec/services/issues/reopen_service_spec.rb'
+ - 'spec/services/issues/set_crm_contacts_service_spec.rb'
+ - 'spec/services/issues/update_service_spec.rb'
+ - 'spec/services/issues/zoom_link_service_spec.rb'
+ - 'spec/services/jira_connect_installations/destroy_service_spec.rb'
+ - 'spec/services/jira_connect_subscriptions/create_service_spec.rb'
+ - 'spec/services/keys/create_service_spec.rb'
+ - 'spec/services/keys/expiry_notification_service_spec.rb'
+ - 'spec/services/labels/create_service_spec.rb'
+ - 'spec/services/lfs/file_transformer_spec.rb'
+ - 'spec/services/lfs/locks_finder_service_spec.rb'
+ - 'spec/services/lfs/push_service_spec.rb'
+ - 'spec/services/lfs/unlock_file_service_spec.rb'
+ - 'spec/services/members/approve_access_request_service_spec.rb'
+ - 'spec/services/members/destroy_service_spec.rb'
+ - 'spec/services/merge_requests/add_todo_when_build_fails_service_spec.rb'
+ - 'spec/services/merge_requests/after_create_service_spec.rb'
+ - 'spec/services/merge_requests/approval_service_spec.rb'
+ - 'spec/services/merge_requests/base_service_spec.rb'
+ - 'spec/services/merge_requests/build_service_spec.rb'
+ - 'spec/services/merge_requests/bulk_remove_attention_requested_service_spec.rb'
+ - 'spec/services/merge_requests/cleanup_refs_service_spec.rb'
+ - 'spec/services/merge_requests/close_service_spec.rb'
+ - 'spec/services/merge_requests/create_from_issue_service_spec.rb'
+ - 'spec/services/merge_requests/create_service_spec.rb'
+ - 'spec/services/merge_requests/export_csv_service_spec.rb'
+ - 'spec/services/merge_requests/ff_merge_service_spec.rb'
+ - 'spec/services/merge_requests/get_urls_service_spec.rb'
+ - 'spec/services/merge_requests/link_lfs_objects_service_spec.rb'
+ - 'spec/services/merge_requests/merge_orchestration_service_spec.rb'
+ - 'spec/services/merge_requests/merge_service_spec.rb'
+ - 'spec/services/merge_requests/merge_to_ref_service_spec.rb'
+ - 'spec/services/merge_requests/mergeability_check_service_spec.rb'
+ - 'spec/services/merge_requests/push_options_handler_service_spec.rb'
+ - 'spec/services/merge_requests/rebase_service_spec.rb'
+ - 'spec/services/merge_requests/refresh_service_spec.rb'
+ - 'spec/services/merge_requests/reload_diffs_service_spec.rb'
+ - 'spec/services/merge_requests/reopen_service_spec.rb'
+ - 'spec/services/merge_requests/retarget_chain_service_spec.rb'
+ - 'spec/services/merge_requests/squash_service_spec.rb'
+ - 'spec/services/merge_requests/toggle_attention_requested_service_spec.rb'
+ - 'spec/services/merge_requests/update_assignees_service_spec.rb'
+ - 'spec/services/merge_requests/update_service_spec.rb'
+ - 'spec/services/metrics/dashboard/annotations/create_service_spec.rb'
+ - 'spec/services/metrics/dashboard/annotations/delete_service_spec.rb'
+ - 'spec/services/metrics/dashboard/clone_dashboard_service_spec.rb'
+ - 'spec/services/metrics/dashboard/cluster_dashboard_service_spec.rb'
+ - 'spec/services/metrics/dashboard/cluster_metrics_embed_service_spec.rb'
+ - 'spec/services/metrics/dashboard/custom_dashboard_service_spec.rb'
+ - 'spec/services/metrics/dashboard/custom_metric_embed_service_spec.rb'
+ - 'spec/services/metrics/dashboard/default_embed_service_spec.rb'
+ - 'spec/services/metrics/dashboard/dynamic_embed_service_spec.rb'
+ - 'spec/services/metrics/dashboard/gitlab_alert_embed_service_spec.rb'
+ - 'spec/services/metrics/dashboard/grafana_metric_embed_service_spec.rb'
+ - 'spec/services/metrics/dashboard/panel_preview_service_spec.rb'
+ - 'spec/services/metrics/dashboard/pod_dashboard_service_spec.rb'
+ - 'spec/services/metrics/dashboard/self_monitoring_dashboard_service_spec.rb'
+ - 'spec/services/metrics/dashboard/system_dashboard_service_spec.rb'
+ - 'spec/services/metrics/dashboard/transient_embed_service_spec.rb'
+ - 'spec/services/metrics/dashboard/update_dashboard_service_spec.rb'
+ - 'spec/services/metrics/users_starred_dashboards/create_service_spec.rb'
+ - 'spec/services/milestones/create_service_spec.rb'
+ - 'spec/services/milestones/destroy_service_spec.rb'
+ - 'spec/services/milestones/promote_service_spec.rb'
+ - 'spec/services/milestones/update_service_spec.rb'
+ - 'spec/services/namespace_settings/update_service_spec.rb'
+ - 'spec/services/namespaces/in_product_marketing_emails_service_spec.rb'
+ - 'spec/services/note_summary_spec.rb'
+ - 'spec/services/notes/build_service_spec.rb'
+ - 'spec/services/notes/copy_service_spec.rb'
+ - 'spec/services/notes/create_service_spec.rb'
+ - 'spec/services/notes/destroy_service_spec.rb'
+ - 'spec/services/notes/quick_actions_service_spec.rb'
+ - 'spec/services/notes/update_service_spec.rb'
+ - 'spec/services/notification_recipients/builder/default_spec.rb'
+ - 'spec/services/notification_recipients/builder/new_note_spec.rb'
+ - 'spec/services/notification_service_spec.rb'
+ - 'spec/services/packages/composer/create_package_service_spec.rb'
+ - 'spec/services/packages/conan/create_package_file_service_spec.rb'
+ - 'spec/services/packages/conan/create_package_service_spec.rb'
+ - 'spec/services/packages/create_event_service_spec.rb'
+ - 'spec/services/packages/create_package_file_service_spec.rb'
+ - 'spec/services/packages/debian/create_distribution_service_spec.rb'
+ - 'spec/services/packages/debian/create_package_file_service_spec.rb'
+ - 'spec/services/packages/debian/extract_metadata_service_spec.rb'
+ - 'spec/services/packages/debian/find_or_create_incoming_service_spec.rb'
+ - 'spec/services/packages/debian/find_or_create_package_service_spec.rb'
+ - 'spec/services/packages/debian/process_changes_service_spec.rb'
+ - 'spec/services/packages/helm/process_file_service_spec.rb'
+ - 'spec/services/packages/maven/create_package_service_spec.rb'
+ - 'spec/services/packages/maven/find_or_create_package_service_spec.rb'
+ - 'spec/services/packages/maven/metadata/create_plugins_xml_service_spec.rb'
+ - 'spec/services/packages/maven/metadata/create_versions_xml_service_spec.rb'
+ - 'spec/services/packages/maven/metadata/sync_service_spec.rb'
+ - 'spec/services/packages/npm/create_package_service_spec.rb'
+ - 'spec/services/packages/npm/create_tag_service_spec.rb'
+ - 'spec/services/packages/nuget/metadata_extraction_service_spec.rb'
+ - 'spec/services/packages/nuget/search_service_spec.rb'
+ - 'spec/services/packages/nuget/update_package_from_metadata_service_spec.rb'
+ - 'spec/services/packages/rubygems/dependency_resolver_service_spec.rb'
+ - 'spec/services/packages/rubygems/process_gem_service_spec.rb'
+ - 'spec/services/packages/terraform_module/create_package_service_spec.rb'
+ - 'spec/services/packages/update_tags_service_spec.rb'
+ - 'spec/services/pages/zip_directory_service_spec.rb'
+ - 'spec/services/personal_access_tokens/create_service_spec.rb'
+ - 'spec/services/personal_access_tokens/revoke_service_spec.rb'
+ - 'spec/services/post_receive_service_spec.rb'
+ - 'spec/services/preview_markdown_service_spec.rb'
+ - 'spec/services/projects/after_rename_service_spec.rb'
+ - 'spec/services/projects/autocomplete_service_spec.rb'
+ - 'spec/services/projects/branches_by_mode_service_spec.rb'
+ - 'spec/services/projects/container_repository/cleanup_tags_service_spec.rb'
+ - 'spec/services/projects/container_repository/gitlab/delete_tags_service_spec.rb'
+ - 'spec/services/projects/container_repository/third_party/delete_tags_service_spec.rb'
+ - 'spec/services/projects/create_from_template_service_spec.rb'
+ - 'spec/services/projects/create_service_spec.rb'
+ - 'spec/services/projects/destroy_service_spec.rb'
+ - 'spec/services/projects/download_service_spec.rb'
+ - 'spec/services/projects/enable_deploy_key_service_spec.rb'
+ - 'spec/services/projects/fork_service_spec.rb'
+ - 'spec/services/projects/git_deduplication_service_spec.rb'
+ - 'spec/services/projects/group_links/destroy_service_spec.rb'
+ - 'spec/services/projects/group_links/update_service_spec.rb'
+ - 'spec/services/projects/hashed_storage/migrate_repository_service_spec.rb'
+ - 'spec/services/projects/hashed_storage/migration_service_spec.rb'
+ - 'spec/services/projects/hashed_storage/rollback_repository_service_spec.rb'
+ - 'spec/services/projects/hashed_storage/rollback_service_spec.rb'
+ - 'spec/services/projects/in_product_marketing_campaign_emails_service_spec.rb'
+ - 'spec/services/projects/lfs_pointers/lfs_download_link_list_service_spec.rb'
+ - 'spec/services/projects/lfs_pointers/lfs_download_service_spec.rb'
+ - 'spec/services/projects/operations/update_service_spec.rb'
+ - 'spec/services/projects/overwrite_project_service_spec.rb'
+ - 'spec/services/projects/participants_service_spec.rb'
+ - 'spec/services/projects/prometheus/alerts/notify_service_spec.rb'
+ - 'spec/services/projects/record_target_platforms_service_spec.rb'
+ - 'spec/services/projects/transfer_service_spec.rb'
+ - 'spec/services/projects/unlink_fork_service_spec.rb'
+ - 'spec/services/projects/update_pages_service_spec.rb'
+ - 'spec/services/projects/update_remote_mirror_service_spec.rb'
+ - 'spec/services/projects/update_repository_storage_service_spec.rb'
+ - 'spec/services/projects/update_service_spec.rb'
+ - 'spec/services/prometheus/create_default_alerts_service_spec.rb'
+ - 'spec/services/prometheus/proxy_service_spec.rb'
+ - 'spec/services/prometheus/proxy_variable_substitution_service_spec.rb'
+ - 'spec/services/protected_tags/create_service_spec.rb'
+ - 'spec/services/quick_actions/interpret_service_spec.rb'
+ - 'spec/services/quick_actions/target_service_spec.rb'
+ - 'spec/services/releases/create_service_spec.rb'
+ - 'spec/services/releases/update_service_spec.rb'
+ - 'spec/services/repositories/destroy_service_spec.rb'
+ - 'spec/services/resource_access_tokens/create_service_spec.rb'
+ - 'spec/services/search/global_service_spec.rb'
+ - 'spec/services/search/group_service_spec.rb'
+ - 'spec/services/search/snippet_service_spec.rb'
+ - 'spec/services/search_service_spec.rb'
+ - 'spec/services/security/ci_configuration/sast_parser_service_spec.rb'
+ - 'spec/services/security/merge_reports_service_spec.rb'
+ - 'spec/services/service_ping/submit_service_ping_service_spec.rb'
+ - 'spec/services/snippets/destroy_service_spec.rb'
+ - 'spec/services/snippets/update_service_spec.rb'
+ - 'spec/services/spam/akismet_mark_as_spam_service_spec.rb'
+ - 'spec/services/spam/akismet_service_spec.rb'
+ - 'spec/services/spam/ham_service_spec.rb'
+ - 'spec/services/spam/spam_action_service_spec.rb'
+ - 'spec/services/spam/spam_verdict_service_spec.rb'
+ - 'spec/services/static_site_editor/config_service_spec.rb'
+ - 'spec/services/submodules/update_service_spec.rb'
+ - 'spec/services/suggestions/apply_service_spec.rb'
+ - 'spec/services/suggestions/create_service_spec.rb'
+ - 'spec/services/system_notes/commit_service_spec.rb'
+ - 'spec/services/system_notes/design_management_service_spec.rb'
+ - 'spec/services/system_notes/issuables_service_spec.rb'
+ - 'spec/services/system_notes/merge_requests_service_spec.rb'
+ - 'spec/services/tasks_to_be_done/base_service_spec.rb'
+ - 'spec/services/terraform/remote_state_handler_spec.rb'
+ - 'spec/services/test_hooks/project_service_spec.rb'
+ - 'spec/services/test_hooks/system_service_spec.rb'
+ - 'spec/services/todo_service_spec.rb'
+ - 'spec/services/todos/destroy/entity_leave_service_spec.rb'
+ - 'spec/services/two_factor/destroy_service_spec.rb'
+ - 'spec/services/upload_service_spec.rb'
+ - 'spec/services/user_preferences/update_service_spec.rb'
+ - 'spec/services/users/activity_service_spec.rb'
+ - 'spec/services/users/approve_service_spec.rb'
+ - 'spec/services/users/ban_service_spec.rb'
+ - 'spec/services/users/destroy_service_spec.rb'
+ - 'spec/services/users/migrate_to_ghost_user_service_spec.rb'
+ - 'spec/services/users/refresh_authorized_projects_service_spec.rb'
+ - 'spec/services/users/reject_service_spec.rb'
+ - 'spec/services/users/set_status_service_spec.rb'
+ - 'spec/services/users/unban_service_spec.rb'
+ - 'spec/services/users/update_canonical_email_service_spec.rb'
+ - 'spec/services/users/update_service_spec.rb'
+ - 'spec/services/users/upsert_credit_card_validation_service_spec.rb'
+ - 'spec/services/users/validate_manual_otp_service_spec.rb'
+ - 'spec/services/users/validate_push_otp_service_spec.rb'
+ - 'spec/services/verify_pages_domain_service_spec.rb'
+ - 'spec/services/web_hook_service_spec.rb'
+ - 'spec/services/web_hooks/log_execution_service_spec.rb'
+ - 'spec/services/wiki_pages/base_service_spec.rb'
+ - 'spec/services/wiki_pages/event_create_service_spec.rb'
+ - 'spec/services/wikis/create_attachment_service_spec.rb'
+ - 'spec/services/work_items/create_service_spec.rb'
+ - 'spec/services/x509_certificate_revoke_service_spec.rb'
+ - 'spec/support/banzai/reference_filter_shared_examples.rb'
+ - 'spec/support/prometheus/additional_metrics_shared_examples.rb'
+ - 'spec/support/redis/redis_new_instance_shared_examples.rb'
+ - 'spec/support/redis/redis_shared_examples.rb'
+ - 'spec/support/services/clusters/create_service_shared.rb'
+ - 'spec/support/services/deploy_token_shared_examples.rb'
+ - 'spec/support/services/issuable_import_csv_service_shared_examples.rb'
+ - 'spec/support/services/issuable_update_service_shared_examples.rb'
+ - 'spec/support/services/migrate_to_ghost_user_service_shared_examples.rb'
+ - 'spec/support/shared_contexts/bulk_imports_requests_shared_context.rb'
+ - 'spec/support/shared_contexts/changes_access_checks_shared_context.rb'
+ - 'spec/support/shared_contexts/container_repositories_shared_context.rb'
+ - 'spec/support/shared_contexts/controllers/githubish_import_controller_shared_context.rb'
+ - 'spec/support/shared_contexts/controllers/ldap_omniauth_callbacks_controller_shared_context.rb'
+ - 'spec/support/shared_contexts/controllers/logging_shared_context.rb'
+ - 'spec/support/shared_contexts/csv_response_shared_context.rb'
+ - 'spec/support/shared_contexts/design_management_shared_contexts.rb'
+ - 'spec/support/shared_contexts/email_shared_context.rb'
+ - 'spec/support/shared_contexts/features/error_tracking_shared_context.rb'
+ - 'spec/support/shared_contexts/features/file_uploads_shared_context.rb'
+ - 'spec/support/shared_contexts/features/integrations/group_integrations_shared_context.rb'
+ - 'spec/support/shared_contexts/features/integrations/instance_and_group_integrations_shared_context.rb'
+ - 'spec/support/shared_contexts/features/integrations/instance_integrations_shared_context.rb'
+ - 'spec/support/shared_contexts/features/integrations/integrations_shared_context.rb'
+ - 'spec/support/shared_contexts/features/integrations/project_integrations_jira_context.rb'
+ - 'spec/support/shared_contexts/features/integrations/project_integrations_shared_context.rb'
+ - 'spec/support/shared_contexts/finders/group_projects_finder_shared_contexts.rb'
+ - 'spec/support/shared_contexts/finders/issues_finder_shared_contexts.rb'
+ - 'spec/support/shared_contexts/finders/merge_requests_finder_shared_contexts.rb'
+ - 'spec/support/shared_contexts/finders/packages/npm/package_finder_shared_context.rb'
+ - 'spec/support/shared_contexts/finders/users_finder_shared_contexts.rb'
+ - 'spec/support/shared_contexts/fixtures/analytics_shared_context.rb'
+ - 'spec/support/shared_contexts/graphql/requests/packages_shared_context.rb'
+ - 'spec/support/shared_contexts/graphql/resolvers/runners_resolver_shared_context.rb'
+ - 'spec/support/shared_contexts/issuable/merge_request_shared_context.rb'
+ - 'spec/support/shared_contexts/issuable/project_shared_context.rb'
+ - 'spec/support/shared_contexts/json_response_shared_context.rb'
+ - 'spec/support/shared_contexts/lib/api/helpers/packages/dependency_proxy_helpers_shared_context.rb'
+ - 'spec/support/shared_contexts/lib/container_registry/client_shared_context.rb'
+ - 'spec/support/shared_contexts/lib/container_registry/client_stubs_shared_context.rb'
+ - 'spec/support/shared_contexts/lib/container_registry/tags_shared_context.rb'
+ - 'spec/support/shared_contexts/lib/gitlab/import_export/project/rake_task_object_storage_shared_context.rb'
+ - 'spec/support/shared_contexts/lib/gitlab/import_export/relation_tree_restorer_shared_context.rb'
+ - 'spec/support/shared_contexts/lib/gitlab/sidekiq_logging/structured_logger_shared_context.rb'
+ - 'spec/support/shared_contexts/lib/gitlab/sidekiq_middleware/server_metrics_shared_context.rb'
+ - 'spec/support/shared_contexts/mailers/notify_shared_context.rb'
+ - 'spec/support/shared_contexts/markdown_golden_master_shared_examples.rb'
+ - 'spec/support/shared_contexts/merge_request_create_shared_context.rb'
+ - 'spec/support/shared_contexts/merge_request_edit_shared_context.rb'
+ - 'spec/support/shared_contexts/merge_requests_allowing_collaboration_shared_context.rb'
+ - 'spec/support/shared_contexts/navbar_structure_context.rb'
+ - 'spec/support/shared_contexts/policies/group_policy_shared_context.rb'
+ - 'spec/support/shared_contexts/policies/project_policy_shared_context.rb'
+ - 'spec/support/shared_contexts/policies/project_policy_table_shared_context.rb'
+ - 'spec/support/shared_contexts/prometheus/alert_shared_context.rb'
+ - 'spec/support/shared_contexts/rack_attack_shared_context.rb'
+ - 'spec/support/shared_contexts/read_ci_configuration_shared_context.rb'
+ - 'spec/support/shared_contexts/requests/api/conan_packages_shared_context.rb'
+ - 'spec/support/shared_contexts/requests/api/debian_repository_shared_context.rb'
+ - 'spec/support/shared_contexts/requests/api/go_modules_shared_context.rb'
+ - 'spec/support/shared_contexts/requests/api/graphql/group_and_project_boards_query_shared_context.rb'
+ - 'spec/support/shared_contexts/requests/api/graphql/jira_import/jira_projects_context.rb'
+ - 'spec/support/shared_contexts/requests/api/helm_packages_shared_context.rb'
+ - 'spec/support/shared_contexts/requests/api/npm_packages_shared_context.rb'
+ - 'spec/support/shared_contexts/requests/api/nuget_packages_shared_context.rb'
+ - 'spec/support/shared_contexts/requests/api/workhorse_shared_context.rb'
+ - 'spec/support/shared_contexts/security_and_compliance_permissions_shared_context.rb'
+ - 'spec/support/shared_contexts/sentry_error_tracking_shared_context.rb'
+ - 'spec/support/shared_contexts/serializers/group_group_link_shared_context.rb'
+ - 'spec/support/shared_contexts/services/projects/container_repository/delete_tags_service_shared_context.rb'
+ - 'spec/support/shared_contexts/services/service_ping/stubbed_service_ping_metrics_definitions_shared_context.rb'
+ - 'spec/support/shared_contexts/session_shared_context.rb'
+ - 'spec/support/shared_contexts/single_change_access_checks_shared_context.rb'
+ - 'spec/support/shared_contexts/spam_constants.rb'
+ - 'spec/support/shared_contexts/unique_ip_check_shared_context.rb'
+ - 'spec/support/shared_contexts/upload_type_check_shared_context.rb'
+ - 'spec/support/shared_contexts/url_shared_context.rb'
+ - 'spec/support/shared_examples/banzai/filters/inline_embeds_shared_examples.rb'
+ - 'spec/support/shared_examples/banzai/filters/inline_metrics_redactor_shared_examples.rb'
+ - 'spec/support/shared_examples/boards/multiple_issue_boards_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/clusters_controller_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/githubish_import_controller_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/hotlink_interceptor_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/issuables_list_metadata_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/milestone_tabs_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/repository_lfs_file_load_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/snippet_blob_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/uploads_actions_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/variables_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/wiki_actions_shared_examples.rb'
+ - 'spec/support/shared_examples/csp.rb'
+ - 'spec/support/shared_examples/features/access_tokens_shared_examples.rb'
+ - 'spec/support/shared_examples/features/archive_download_buttons_shared_examples.rb'
+ - 'spec/support/shared_examples/features/board_sidebar_labels_examples.rb'
+ - 'spec/support/shared_examples/features/project_features_apply_to_issuables_shared_examples.rb'
+ - 'spec/support/shared_examples/features/sidebar/sidebar_due_date_shared_examples.rb'
+ - 'spec/support/shared_examples/features/sidebar/sidebar_labels_shared_examples.rb'
+ - 'spec/support/shared_examples/features/sidebar/sidebar_milestone_shared_examples.rb'
+ - 'spec/support/shared_examples/features/sidebar_shared_examples.rb'
+ - 'spec/support/shared_examples/features/snippets_shared_examples.rb'
+ - 'spec/support/shared_examples/features/variable_list_shared_examples.rb'
+ - 'spec/support/shared_examples/features/wiki/file_attachments_shared_examples.rb'
+ - 'spec/support/shared_examples/features/wiki/user_creates_wiki_page_shared_examples.rb'
+ - 'spec/support/shared_examples/features/wiki/user_views_asciidoc_page_with_includes_shared_examples.rb'
+ - 'spec/support/shared_examples/features/wiki/user_views_wiki_page_shared_examples.rb'
+ - 'spec/support/shared_examples/features/wiki/user_views_wiki_pages_shared_examples.rb'
+ - 'spec/support/shared_examples/finders/assignees_filter_shared_examples.rb'
+ - 'spec/support/shared_examples/finders/packages/debian/distributions_finder_shared_examples.rb'
+ - 'spec/support/shared_examples/finders/packages_shared_examples.rb'
+ - 'spec/support/shared_examples/finders/snippet_visibility_shared_examples.rb'
+ - 'spec/support/shared_examples/graphql/connection_redaction_shared_examples.rb'
+ - 'spec/support/shared_examples/graphql/label_fields.rb'
+ - 'spec/support/shared_examples/graphql/mutations/issues/permission_check_shared_examples.rb'
+ - 'spec/support/shared_examples/graphql/mutations/merge_requests/permission_check_shared_examples.rb'
+ - 'spec/support/shared_examples/graphql/notes_on_noteables_shared_examples.rb'
+ - 'spec/support/shared_examples/graphql/resolvers/packages_resolvers_shared_examples.rb'
+ - 'spec/support/shared_examples/graphql/resolves_issuable_shared_examples.rb'
+ - 'spec/support/shared_examples/graphql/spam_protection_shared_examples.rb'
+ - 'spec/support/shared_examples/helm_commands_shared_examples.rb'
+ - 'spec/support/shared_examples/helpers/issuable_description_templates_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/api/internal_base_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/cache_helpers_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/ci/ci_trace_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/config/inheritable_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/import_export/relation_factory_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/middleware/multipart_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/middleware/read_only_gitlab_instance_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/search_confidential_filter_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/search_results_sorted_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/search_state_filter_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/sidekiq_middleware/metrics_middleware_with_worker_attribution_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/sidekiq_middleware/strategy_shared_examples.rb'
+ - 'spec/support/shared_examples/models/application_setting_shared_examples.rb'
+ - 'spec/support/shared_examples/models/chat_integration_shared_examples.rb'
+ - 'spec/support/shared_examples/models/cluster_application_helm_cert_shared_examples.rb'
+ - 'spec/support/shared_examples/models/cluster_application_status_shared_examples.rb'
+ - 'spec/support/shared_examples/models/cluster_application_version_shared_examples.rb'
+ - 'spec/support/shared_examples/models/clusters/elastic_stack_client_shared.rb'
+ - 'spec/support/shared_examples/models/clusters/prometheus_client_shared.rb'
+ - 'spec/support/shared_examples/models/concerns/can_move_repository_storage_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/composite_id_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/incident_management/escalatable_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/integrations/slack_mattermost_notifier_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/issuable_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/repository_storage_movable_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/timebox_shared_examples.rb'
+ - 'spec/support/shared_examples/models/cycle_analytics_stage_shared_examples.rb'
+ - 'spec/support/shared_examples/models/diff_positionable_note_shared_examples.rb'
+ - 'spec/support/shared_examples/models/integrations/base_slash_commands_shared_examples.rb'
+ - 'spec/support/shared_examples/models/mentionable_shared_examples.rb'
+ - 'spec/support/shared_examples/models/packages/debian/component_file_shared_example.rb'
+ - 'spec/support/shared_examples/models/project_latest_successful_build_for_shared_examples.rb'
+ - 'spec/support/shared_examples/models/relative_positioning_shared_examples.rb'
+ - 'spec/support/shared_examples/models/wiki_shared_examples.rb'
+ - 'spec/support/shared_examples/namespaces/traversal_scope_examples.rb'
+ - 'spec/support/shared_examples/path_extraction_shared_examples.rb'
+ - 'spec/support/shared_examples/policies/project_policy_shared_examples.rb'
+ - 'spec/support/shared_examples/policies/resource_access_token_shared_examples.rb'
+ - 'spec/support/shared_examples/quick_actions/commit/tag_quick_action_shared_examples.rb'
+ - 'spec/support/shared_examples/quick_actions/issue/clone_quick_action_shared_examples.rb'
+ - 'spec/support/shared_examples/quick_actions/issue/create_merge_request_quick_action_shared_examples.rb'
+ - 'spec/support/shared_examples/quick_actions/issue/move_quick_action_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/award_emoji_todo_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/composer_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/conan_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/container_repositories_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/debian_common_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/debian_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/discussions_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/graphql/mutations/boards/update_list_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/graphql/mutations/create_list_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/graphql/packages/group_and_project_packages_list_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/graphql/read_only_instance_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/helm_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/issues_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/multiple_and_scoped_issue_boards_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/notes_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/npm_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/nuget_endpoints_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/nuget_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/pypi_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/read_user_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/repositories_shared_context.rb'
+ - 'spec/support/shared_examples/requests/api/repository_storage_moves_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/rubygems_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/status_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/terraform/modules/v1/packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/clusters/certificate_based_clusters_feature_flag_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/lfs_http_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/releases_shared_examples.rb'
+ - 'spec/support/shared_examples/routing/git_http_routing_shared_examples.rb'
+ - 'spec/support/shared_examples/sends_git_audit_streaming_event_shared_examples.rb'
+ - 'spec/support/shared_examples/serializers/diff_file_entity_shared_examples.rb'
+ - 'spec/support/shared_examples/serializers/note_entity_shared_examples.rb'
+ - 'spec/support/shared_examples/services/alert_management/alert_processing/alert_firing_shared_examples.rb'
+ - 'spec/support/shared_examples/services/alert_management/alert_processing/alert_recovery_shared_examples.rb'
+ - 'spec/support/shared_examples/services/alert_management_shared_examples.rb'
+ - 'spec/support/shared_examples/services/boards/update_boards_shared_examples.rb'
+ - 'spec/support/shared_examples/services/container_registry_auth_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/gitlab_projects_import_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/issuable_links/create_links_shared_examples.rb'
+ - 'spec/support/shared_examples/services/issuable_shared_examples.rb'
+ - 'spec/support/shared_examples/services/jira_import/user_mapper_services_shared_examples.rb'
+ - 'spec/support/shared_examples/services/merge_request_shared_examples.rb'
+ - 'spec/support/shared_examples/services/metrics/dashboard_shared_examples.rb'
+ - 'spec/support/shared_examples/services/notification_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/packages_shared_examples.rb'
+ - 'spec/support/shared_examples/services/projects/update_repository_storage_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/repositories/housekeeping_shared_examples.rb'
+ - 'spec/support/shared_examples/services/schedule_bulk_repository_shard_moves_shared_examples.rb'
+ - 'spec/support/shared_examples/services/security/ci_configuration/create_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/updating_mentions_shared_examples.rb'
+ - 'spec/support/shared_examples/services/wiki_pages/create_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/wiki_pages/update_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/wikis/create_attachment_service_shared_examples.rb'
+ - 'spec/support/shared_examples/snippet_blob_shared_examples.rb'
+ - 'spec/support/shared_examples/uploaders/object_storage_shared_examples.rb'
+ - 'spec/support/shared_examples/validators/url_validator_shared_examples.rb'
+ - 'spec/support/shared_examples/views/pipeline_status_changes_email.rb'
+ - 'spec/support/shared_examples/workers/concerns/git_garbage_collect_methods_shared_examples.rb'
+ - 'spec/support/shared_examples/workers/project_export_shared_examples.rb'
+ - 'spec/support_specs/database/multiple_databases_spec.rb'
+ - 'spec/support_specs/helpers/migrations_helpers_spec.rb'
+ - 'spec/support_specs/helpers/stub_feature_flags_spec.rb'
+ - 'spec/tasks/cache/clear/redis_spec.rb'
+ - 'spec/tasks/dev_rake_spec.rb'
+ - 'spec/tasks/gettext_rake_spec.rb'
+ - 'spec/tasks/gitlab/artifacts/migrate_rake_spec.rb'
+ - 'spec/tasks/gitlab/backup_rake_spec.rb'
+ - 'spec/tasks/gitlab/cleanup_rake_spec.rb'
+ - 'spec/tasks/gitlab/db/validate_config_rake_spec.rb'
+ - 'spec/tasks/gitlab/db_rake_spec.rb'
+ - 'spec/tasks/gitlab/dependency_proxy/migrate_rake_spec.rb'
+ - 'spec/tasks/gitlab/gitaly_rake_spec.rb'
+ - 'spec/tasks/gitlab/lfs/migrate_rake_spec.rb'
+ - 'spec/tasks/gitlab/packages/migrate_rake_spec.rb'
+ - 'spec/tasks/gitlab/pages_rake_spec.rb'
+ - 'spec/tasks/gitlab/storage_rake_spec.rb'
+ - 'spec/tasks/gitlab/task_helpers_spec.rb'
+ - 'spec/tasks/gitlab/terraform/migrate_rake_spec.rb'
+ - 'spec/tasks/gitlab/uploads/migrate_rake_spec.rb'
+ - 'spec/tasks/gitlab/user_management_rake_spec.rb'
+ - 'spec/tasks/gitlab/workhorse_rake_spec.rb'
+ - 'spec/tooling/danger/feature_flag_spec.rb'
+ - 'spec/tooling/danger/project_helper_spec.rb'
+ - 'spec/tooling/lib/tooling/parallel_rspec_runner_spec.rb'
+ - 'spec/tooling/rspec_flaky/listener_spec.rb'
+ - 'spec/uploaders/attachment_uploader_spec.rb'
+ - 'spec/uploaders/avatar_uploader_spec.rb'
+ - 'spec/uploaders/content_type_whitelist_spec.rb'
+ - 'spec/uploaders/dependency_proxy/file_uploader_spec.rb'
+ - 'spec/uploaders/design_management/design_v432x230_uploader_spec.rb'
+ - 'spec/uploaders/external_diff_uploader_spec.rb'
+ - 'spec/uploaders/favicon_uploader_spec.rb'
+ - 'spec/uploaders/file_mover_spec.rb'
+ - 'spec/uploaders/file_uploader_spec.rb'
+ - 'spec/uploaders/import_export_uploader_spec.rb'
+ - 'spec/uploaders/job_artifact_uploader_spec.rb'
+ - 'spec/uploaders/lfs_object_uploader_spec.rb'
+ - 'spec/uploaders/namespace_file_uploader_spec.rb'
+ - 'spec/uploaders/object_storage_spec.rb'
+ - 'spec/uploaders/packages/composer/cache_uploader_spec.rb'
+ - 'spec/uploaders/packages/debian/component_file_uploader_spec.rb'
+ - 'spec/uploaders/packages/debian/distribution_release_file_uploader_spec.rb'
+ - 'spec/uploaders/packages/package_file_uploader_spec.rb'
+ - 'spec/uploaders/personal_file_uploader_spec.rb'
+ - 'spec/uploaders/terraform/state_uploader_spec.rb'
+ - 'spec/uploaders/workers/object_storage/background_move_worker_spec.rb'
+ - 'spec/uploaders/workers/object_storage/migrate_uploads_worker_spec.rb'
+ - 'spec/validators/addressable_url_validator_spec.rb'
+ - 'spec/validators/array_members_validator_spec.rb'
+ - 'spec/validators/cron_validator_spec.rb'
+ - 'spec/validators/devise_email_validator_spec.rb'
+ - 'spec/validators/future_date_validator_spec.rb'
+ - 'spec/validators/import/gitlab_projects/remote_file_validator_spec.rb'
+ - 'spec/views/admin/application_settings/_ci_cd.html.haml_spec.rb'
+ - 'spec/views/admin/application_settings/_package_registry.html.haml_spec.rb'
+ - 'spec/views/admin/dashboard/index.html.haml_spec.rb'
+ - 'spec/views/admin/sessions/new.html.haml_spec.rb'
+ - 'spec/views/admin/sessions/two_factor.html.haml_spec.rb'
+ - 'spec/views/ci/status/_badge.html.haml_spec.rb'
+ - 'spec/views/ci/status/_icon.html.haml_spec.rb'
+ - 'spec/views/devise/shared/_signup_box.html.haml_spec.rb'
+ - 'spec/views/events/event/_push.html.haml_spec.rb'
+ - 'spec/views/groups/_home_panel.html.haml_spec.rb'
+ - 'spec/views/groups/edit.html.haml_spec.rb'
+ - 'spec/views/layouts/_header_search.html.haml_spec.rb'
+ - 'spec/views/layouts/application.html.haml_spec.rb'
+ - 'spec/views/layouts/header/_new_dropdown.haml_spec.rb'
+ - 'spec/views/layouts/nav/sidebar/_admin.html.haml_spec.rb'
+ - 'spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb'
+ - 'spec/views/notify/changed_milestone_email.html.haml_spec.rb'
+ - 'spec/views/profiles/keys/_key.html.haml_spec.rb'
+ - 'spec/views/profiles/preferences/show.html.haml_spec.rb'
+ - 'spec/views/projects/_home_panel.html.haml_spec.rb'
+ - 'spec/views/projects/commit/show.html.haml_spec.rb'
+ - 'spec/views/projects/commits/show.html.haml_spec.rb'
+ - 'spec/views/projects/edit.html.haml_spec.rb'
+ - 'spec/views/projects/empty.html.haml_spec.rb'
+ - 'spec/views/projects/hooks/edit.html.haml_spec.rb'
+ - 'spec/views/projects/hooks/index.html.haml_spec.rb'
+ - 'spec/views/projects/pipeline_schedules/_pipeline_schedule.html.haml_spec.rb'
+ - 'spec/views/projects/services/edit.html.haml_spec.rb'
+ - 'spec/views/projects/settings/operations/show.html.haml_spec.rb'
+ - 'spec/views/projects/tags/index.html.haml_spec.rb'
+ - 'spec/views/projects/tree/show.html.haml_spec.rb'
+ - 'spec/views/search/_results.html.haml_spec.rb'
+ - 'spec/views/search/show.html.haml_spec.rb'
+ - 'spec/views/shared/access_tokens/_table.html.haml_spec.rb'
+ - 'spec/views/shared/issuable/_sidebar.html.haml_spec.rb'
+ - 'spec/views/shared/milestones/_issuable.html.haml_spec.rb'
+ - 'spec/views/shared/projects/_list.html.haml_spec.rb'
+ - 'spec/views/shared/snippets/_snippet.html.haml_spec.rb'
+ - 'spec/views/shared/wikis/_sidebar.html.haml_spec.rb'
+ - 'spec/workers/admin_email_worker_spec.rb'
+ - 'spec/workers/analytics/usage_trends/count_job_trigger_worker_spec.rb'
+ - 'spec/workers/authorized_keys_worker_spec.rb'
+ - 'spec/workers/authorized_project_update/project_recalculate_per_user_worker_spec.rb'
+ - 'spec/workers/authorized_project_update/project_recalculate_worker_spec.rb'
+ - 'spec/workers/authorized_project_update/user_refresh_over_user_range_worker_spec.rb'
+ - 'spec/workers/bulk_imports/entity_worker_spec.rb'
+ - 'spec/workers/ci/build_prepare_worker_spec.rb'
+ - 'spec/workers/cleanup_container_repository_worker_spec.rb'
+ - 'spec/workers/cluster_update_app_worker_spec.rb'
+ - 'spec/workers/clusters/agents/delete_expired_events_worker_spec.rb'
+ - 'spec/workers/clusters/applications/activate_service_worker_spec.rb'
+ - 'spec/workers/clusters/applications/deactivate_service_worker_spec.rb'
+ - 'spec/workers/clusters/applications/wait_for_uninstall_app_worker_spec.rb'
+ - 'spec/workers/concerns/application_worker_spec.rb'
+ - 'spec/workers/container_expiration_policies/cleanup_container_repository_worker_spec.rb'
+ - 'spec/workers/container_expiration_policy_worker_spec.rb'
+ - 'spec/workers/container_registry/migration/enqueuer_worker_spec.rb'
+ - 'spec/workers/container_registry/migration/guard_worker_spec.rb'
+ - 'spec/workers/create_commit_signature_worker_spec.rb'
+ - 'spec/workers/database/ci_namespace_mirrors_consistency_check_worker_spec.rb'
+ - 'spec/workers/database/ci_project_mirrors_consistency_check_worker_spec.rb'
+ - 'spec/workers/dependency_proxy/image_ttl_group_policy_worker_spec.rb'
+ - 'spec/workers/deployments/link_merge_request_worker_spec.rb'
+ - 'spec/workers/deployments/update_environment_worker_spec.rb'
+ - 'spec/workers/design_management/new_version_worker_spec.rb'
+ - 'spec/workers/every_sidekiq_worker_spec.rb'
+ - 'spec/workers/expire_build_instance_artifacts_worker_spec.rb'
+ - 'spec/workers/group_import_worker_spec.rb'
+ - 'spec/workers/incident_management/process_alert_worker_v2_spec.rb'
+ - 'spec/workers/integrations/create_external_cross_reference_worker_spec.rb'
+ - 'spec/workers/irker_worker_spec.rb'
+ - 'spec/workers/issue_placement_worker_spec.rb'
+ - 'spec/workers/issues/placement_worker_spec.rb'
+ - 'spec/workers/merge_requests/delete_source_branch_worker_spec.rb'
+ - 'spec/workers/metrics/dashboard/prune_old_annotations_worker_spec.rb'
+ - 'spec/workers/namespaceless_project_destroy_worker_spec.rb'
+ - 'spec/workers/packages/composer/cache_update_worker_spec.rb'
+ - 'spec/workers/packages/go/sync_packages_worker_spec.rb'
+ - 'spec/workers/packages/maven/metadata/sync_worker_spec.rb'
+ - 'spec/workers/packages/nuget/extraction_worker_spec.rb'
+ - 'spec/workers/packages/rubygems/extraction_worker_spec.rb'
+ - 'spec/workers/pages_domain_removal_cron_worker_spec.rb'
+ - 'spec/workers/post_receive_spec.rb'
+ - 'spec/workers/project_export_worker_spec.rb'
+ - 'spec/workers/projects/git_garbage_collect_worker_spec.rb'
+ - 'spec/workers/projects/post_creation_worker_spec.rb'
+ - 'spec/workers/projects/refresh_build_artifacts_size_statistics_worker_spec.rb'
+ - 'spec/workers/prometheus/create_default_alerts_worker_spec.rb'
+ - 'spec/workers/purge_dependency_proxy_cache_worker_spec.rb'
+ - 'spec/workers/remove_expired_group_links_worker_spec.rb'
+ - 'spec/workers/remove_expired_members_worker_spec.rb'
+ - 'spec/workers/remove_unaccepted_member_invites_worker_spec.rb'
+ - 'spec/workers/repository_fork_worker_spec.rb'
+ - 'spec/workers/stuck_merge_jobs_worker_spec.rb'
+ - 'spec/workers/x509_issuer_crl_check_worker_spec.rb'
diff --git a/.rubocop_todo/style/numeric_literal_prefix.yml b/.rubocop_todo/style/numeric_literal_prefix.yml
new file mode 100644
index 00000000000..b469a68ff5a
--- /dev/null
+++ b/.rubocop_todo/style/numeric_literal_prefix.yml
@@ -0,0 +1,79 @@
+---
+# Cop supports --auto-correct.
+Style/NumericLiteralPrefix:
+ # Offense count: 148
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/models/container_repository.rb'
+ - 'app/services/packages/debian/generate_distribution_key_service.rb'
+ - 'config/initializers/01_secret_token.rb'
+ - 'config/initializers/1_settings.rb'
+ - 'db/post_migrate/20220131000001_schedule_trace_expiry_removal.rb'
+ - 'ee/lib/gitlab/geo/replication/base_transfer.rb'
+ - 'ee/lib/gitlab/geo/replication/blob_downloader.rb'
+ - 'ee/spec/lib/bulk_imports/groups/pipelines/iterations_pipeline_spec.rb'
+ - 'ee/spec/lib/gitlab/background_migration/remove_all_trace_expiration_dates_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/replication/blob_downloader_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/replication/file_transfer_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/replication/job_artifact_transfer_spec.rb'
+ - 'ee/spec/migrations/schedule_trace_expiry_removal_spec.rb'
+ - 'ee/spec/models/analytics/devops_adoption/snapshot_spec.rb'
+ - 'ee/spec/models/ci/minutes/quota_spec.rb'
+ - 'ee/spec/models/ee/group_spec.rb'
+ - 'ee/spec/models/gitlab/seat_link_data_spec.rb'
+ - 'ee/spec/services/incident_management/oncall_schedules/update_service_spec.rb'
+ - 'ee/spec/workers/sync_seat_link_worker_spec.rb'
+ - 'lib/backup/database.rb'
+ - 'lib/backup/files.rb'
+ - 'lib/gitlab/background_migration/remove_all_trace_expiration_dates.rb'
+ - 'lib/gitlab/import_export/command_line_util.rb'
+ - 'lib/gitlab/jwt_authenticatable.rb'
+ - 'lib/system_check/app/uploads_path_permission_check.rb'
+ - 'lib/system_check/app/uploads_path_tmp_permission_check.rb'
+ - 'lib/tasks/tanuki_emoji.rake'
+ - 'metrics_server/metrics_server.rb'
+ - 'qa/qa/support/ssh.rb'
+ - 'qa/spec/support/ssh_spec.rb'
+ - 'scripts/security-harness'
+ - 'spec/lib/gitlab/background_migration/remove_all_trace_expiration_dates_spec.rb'
+ - 'spec/lib/gitlab/database/background_migration/batched_job_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers_spec.rb'
+ - 'spec/lib/gitlab/encoding_helper_spec.rb'
+ - 'spec/lib/gitlab/git/diff_spec.rb'
+ - 'spec/lib/gitlab/git/repository_spec.rb'
+ - 'spec/lib/gitlab/git/tree_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/blobs_stitcher_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/conflict_files_stitcher_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/diff_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/diff_stitcher_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/diff_note_importer_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/issue_importer_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/issues_importer_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/milestones_importer_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/note_importer_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/pull_request_importer_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/pull_request_merged_by_importer_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/pull_request_review_importer_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/releases_importer_spec.rb'
+ - 'spec/lib/gitlab/github_import/representation/diff_note_spec.rb'
+ - 'spec/lib/gitlab/github_import/representation/issue_spec.rb'
+ - 'spec/lib/gitlab/github_import/representation/note_spec.rb'
+ - 'spec/lib/gitlab/github_import/representation/pull_request_review_spec.rb'
+ - 'spec/lib/gitlab/github_import/representation/pull_request_spec.rb'
+ - 'spec/lib/gitlab/grape_logging/loggers/cloudflare_logger_spec.rb'
+ - 'spec/lib/gitlab/grape_logging/loggers/queue_duration_logger_spec.rb'
+ - 'spec/lib/gitlab/import_export/command_line_util_spec.rb'
+ - 'spec/lib/gitlab/import_export/file_importer_spec.rb'
+ - 'spec/lib/gitlab/jwt_authenticatable_spec.rb'
+ - 'spec/lib/gitlab/puma_logging/json_formatter_spec.rb'
+ - 'spec/lib/gitlab/relative_positioning/range_spec.rb'
+ - 'spec/metrics_server/metrics_server_spec.rb'
+ - 'spec/models/issue_spec.rb'
+ - 'spec/models/repository_spec.rb'
+ - 'spec/support/helpers/repo_helpers.rb'
+ - 'spec/support/helpers/test_env.rb'
+ - 'spec/support/import_export/export_file_helper.rb'
+ - 'spec/support/shared_examples/requests/api/nuget_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/services/packages/debian/generate_distribution_shared_examples.rb'
+ - 'spec/tasks/gitlab/backup_rake_spec.rb'
diff --git a/.rubocop_todo/style/string_concatenation.yml b/.rubocop_todo/style/string_concatenation.yml
new file mode 100644
index 00000000000..23a16f928f5
--- /dev/null
+++ b/.rubocop_todo/style/string_concatenation.yml
@@ -0,0 +1,336 @@
+---
+# Cop supports --auto-correct.
+Style/StringConcatenation:
+ # Offense count: 611
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/controllers/concerns/creates_commit.rb'
+ - 'app/controllers/groups/dependency_proxy_for_containers_controller.rb'
+ - 'app/controllers/jira_connect/app_descriptor_controller.rb'
+ - 'app/controllers/projects/labels_controller.rb'
+ - 'app/controllers/projects/milestones_controller.rb'
+ - 'app/graphql/types/global_id_type.rb'
+ - 'app/helpers/application_helper.rb'
+ - 'app/helpers/blob_helper.rb'
+ - 'app/helpers/dropdowns_helper.rb'
+ - 'app/helpers/emails_helper.rb'
+ - 'app/helpers/events_helper.rb'
+ - 'app/helpers/numbers_helper.rb'
+ - 'app/helpers/submodule_helper.rb'
+ - 'app/helpers/todos_helper.rb'
+ - 'app/models/application_setting.rb'
+ - 'app/models/commit_range.rb'
+ - 'app/models/concerns/counter_attribute.rb'
+ - 'app/models/concerns/cross_database_modification.rb'
+ - 'app/models/concerns/from_set_operator.rb'
+ - 'app/models/concerns/routable.rb'
+ - 'app/models/integrations/chat_message/merge_message.rb'
+ - 'app/models/integrations/chat_message/note_message.rb'
+ - 'app/models/integrations/discord.rb'
+ - 'app/models/integrations/mock_monitoring.rb'
+ - 'app/models/namespace.rb'
+ - 'app/models/packages/go/module_version.rb'
+ - 'app/models/pages/lookup_path.rb'
+ - 'app/models/pool_repository.rb'
+ - 'app/models/project_wiki.rb'
+ - 'app/models/repository.rb'
+ - 'app/models/serverless/function.rb'
+ - 'app/models/wiki.rb'
+ - 'app/models/wiki_page.rb'
+ - 'app/presenters/snippet_blob_presenter.rb'
+ - 'app/services/clusters/gcp/finalize_creation_service.rb'
+ - 'app/services/feature_flags/update_service.rb'
+ - 'app/services/packages/composer/version_parser_service.rb'
+ - 'app/services/packages/debian/generate_distribution_key_service.rb'
+ - 'app/services/packages/debian/generate_distribution_service.rb'
+ - 'app/services/pages/zip_directory_service.rb'
+ - 'app/services/projects/update_pages_service.rb'
+ - 'app/services/repositories/base_service.rb'
+ - 'app/services/verify_pages_domain_service.rb'
+ - 'app/uploaders/gitlab_uploader.rb'
+ - 'app/uploaders/object_storage.rb'
+ - 'config/initializers/1_settings.rb'
+ - 'config/settings.rb'
+ - 'config/spring.rb'
+ - 'db/migrate/20210412111213_create_security_orchestration_policy_rule_schedule.rb'
+ - 'ee/app/controllers/admin/elasticsearch_controller.rb'
+ - 'ee/app/finders/ee/issuables/label_filter.rb'
+ - 'ee/app/helpers/ee/gitlab_routing_helper.rb'
+ - 'ee/app/helpers/ee/mirror_helper.rb'
+ - 'ee/app/helpers/ee/search_helper.rb'
+ - 'ee/app/models/group_wiki.rb'
+ - 'ee/app/models/license.rb'
+ - 'ee/app/services/analytics/cycle_analytics/data_loader_service.rb'
+ - 'ee/app/services/ee/issues/build_service.rb'
+ - 'ee/app/services/geo/framework_repository_sync_service.rb'
+ - 'ee/app/services/geo/repository_base_sync_service.rb'
+ - 'ee/app/services/merge_requests/update_blocks_service.rb'
+ - 'ee/app/workers/scan_security_report_secrets_worker.rb'
+ - 'ee/lib/api/project_mirror.rb'
+ - 'ee/lib/ee/audit/project_changes_auditor.rb'
+ - 'ee/lib/ee/gitlab/auth/ldap/person.rb'
+ - 'ee/lib/ee/gitlab/background_migration/populate_latest_pipeline_ids.rb'
+ - 'ee/lib/ee/gitlab/background_migration/populate_resolved_on_default_branch_column.rb'
+ - 'ee/lib/elastic/latest/git_class_proxy.rb'
+ - 'ee/lib/gitlab/elastic/search_results.rb'
+ - 'ee/lib/gitlab/geo/git_ssh_proxy.rb'
+ - 'ee/lib/omni_auth/strategies/kerberos_spnego.rb'
+ - 'ee/lib/tasks/gitlab/elastic.rake'
+ - 'ee/lib/tasks/gitlab/license.rake'
+ - 'ee/spec/controllers/trial_registrations_controller_spec.rb'
+ - 'ee/spec/features/boards/boards_spec.rb'
+ - 'ee/spec/features/projects/pipelines/pipeline_spec.rb'
+ - 'ee/spec/helpers/ee/integrations_helper_spec.rb'
+ - 'ee/spec/helpers/search_helper_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/ldap/person_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/o_auth/user_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/api_security_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/api_security_latest_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/dast_api_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/dast_api_latest_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/models/concerns/elastic/repository_spec.rb'
+ - 'ee/spec/models/dast_site_profile_spec.rb'
+ - 'ee/spec/models/dast_site_validation_spec.rb'
+ - 'ee/spec/models/ee/audit_event_spec.rb'
+ - 'ee/spec/models/geo_node_spec.rb'
+ - 'ee/spec/models/status_page/project_setting_spec.rb'
+ - 'ee/spec/requests/api/internal/kubernetes_spec.rb'
+ - 'ee/spec/services/jira/jql_builder_service_spec.rb'
+ - 'ee/spec/services/projects/hashed_storage/migrate_repository_service_spec.rb'
+ - 'ee/spec/services/todo_service_spec.rb'
+ - 'ee/spec/support/shared_examples/models/geo_framework_registry_shared_examples.rb'
+ - 'ee/spec/tasks/gitlab/license_rake_spec.rb'
+ - 'lib/api/entities/tree_object.rb'
+ - 'lib/api/go_proxy.rb'
+ - 'lib/api/internal/kubernetes.rb'
+ - 'lib/backup/files.rb'
+ - 'lib/backup/manager.rb'
+ - 'lib/banzai/filter/blockquote_fence_filter.rb'
+ - 'lib/banzai/filter/references/label_reference_filter.rb'
+ - 'lib/banzai/filter/references/user_reference_filter.rb'
+ - 'lib/bulk_imports/common/pipelines/wiki_pipeline.rb'
+ - 'lib/extracts_ref.rb'
+ - 'lib/feature/definition.rb'
+ - 'lib/gitlab/auth/ldap/dn.rb'
+ - 'lib/gitlab/background_migration/backfill_project_repositories.rb'
+ - 'lib/gitlab/bare_repository_import/importer.rb'
+ - 'lib/gitlab/ci/build/artifacts/metadata/entry.rb'
+ - 'lib/gitlab/ci/status/build/retried.rb'
+ - 'lib/gitlab/config/entry/validators.rb'
+ - 'lib/gitlab/console.rb'
+ - 'lib/gitlab/database/migration_helpers/v2.rb'
+ - 'lib/gitlab/database/rename_reserved_paths_migration/v1/migration_classes.rb'
+ - 'lib/gitlab/database/unidirectional_copy_trigger.rb'
+ - 'lib/gitlab/email/handler/service_desk_handler.rb'
+ - 'lib/gitlab/email/message/in_product_marketing/helper.rb'
+ - 'lib/gitlab/git.rb'
+ - 'lib/gitlab/git/branch.rb'
+ - 'lib/gitlab/git/tag.rb'
+ - 'lib/gitlab/git/wiki.rb'
+ - 'lib/gitlab/github_import/importer/labels_importer.rb'
+ - 'lib/gitlab/graphql/negatable_arguments.rb'
+ - 'lib/gitlab/graphql/queries.rb'
+ - 'lib/gitlab/i18n/po_linter.rb'
+ - 'lib/gitlab/jira/http_client.rb'
+ - 'lib/gitlab/json_logger.rb'
+ - 'lib/gitlab/kubernetes.rb'
+ - 'lib/gitlab/kubernetes/kubectl_cmd.rb'
+ - 'lib/gitlab/lfs/client.rb'
+ - 'lib/gitlab/logger.rb'
+ - 'lib/gitlab/path_regex.rb'
+ - 'lib/gitlab/prometheus/internal.rb'
+ - 'lib/gitlab/quick_actions/extractor.rb'
+ - 'lib/gitlab/route_map.rb'
+ - 'lib/gitlab/sanitizers/exception_message.rb'
+ - 'lib/gitlab/sidekiq_logging/json_formatter.rb'
+ - 'lib/gitlab/slug/environment.rb'
+ - 'lib/gitlab/sql/set_operator.rb'
+ - 'lib/gitlab/ssh_public_key.rb'
+ - 'lib/gitlab/throttle.rb'
+ - 'lib/gitlab/time_tracking_formatter.rb'
+ - 'lib/gitlab/untrusted_regexp.rb'
+ - 'lib/gitlab/usage_data_counters/quick_action_activity_unique_counter.rb'
+ - 'lib/gitlab/usage_data_queries.rb'
+ - 'lib/google_api/cloud_platform/client.rb'
+ - 'lib/kramdown/converter/commonmark.rb'
+ - 'lib/mattermost/session.rb'
+ - 'lib/product_analytics/tracker.rb'
+ - 'lib/tasks/gitlab/sidekiq.rake'
+ - 'lib/tasks/tanuki_emoji.rake'
+ - 'qa/qa/page/component/snippet.rb'
+ - 'qa/qa/page/group/settings/group_deploy_tokens.rb'
+ - 'qa/qa/page/milestone/new.rb'
+ - 'qa/qa/page/project/milestone/new.rb'
+ - 'qa/qa/page/project/settings/deploy_tokens.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/3_create/repository/assign_code_owners_spec.rb'
+ - 'qa/qa/support/page_error_checker.rb'
+ - 'qa/qa/tools/generate_perf_testdata.rb'
+ - 'scripts/perf/gc/print_gc_stats.rb'
+ - 'scripts/perf/query_limiting_report.rb'
+ - 'scripts/used-feature-flags'
+ - 'spec/config/settings_spec.rb'
+ - 'spec/controllers/concerns/redirects_for_missing_path_on_tree_spec.rb'
+ - 'spec/controllers/groups/uploads_controller_spec.rb'
+ - 'spec/controllers/projects/labels_controller_spec.rb'
+ - 'spec/controllers/projects/uploads_controller_spec.rb'
+ - 'spec/controllers/projects_controller_spec.rb'
+ - 'spec/controllers/search_controller_spec.rb'
+ - 'spec/experiments/application_experiment_spec.rb'
+ - 'spec/factories/ci/daily_build_group_report_results.rb'
+ - 'spec/factories/gitaly/commit.rb'
+ - 'spec/features/canonical_link_spec.rb'
+ - 'spec/features/groups/group_settings_spec.rb'
+ - 'spec/features/merge_request/user_resolves_conflicts_spec.rb'
+ - 'spec/features/projects/commits/user_browses_commits_spec.rb'
+ - 'spec/features/projects/files/files_sort_submodules_with_folders_spec.rb'
+ - 'spec/features/projects/import_export/import_file_spec.rb'
+ - 'spec/features/search/user_searches_for_code_spec.rb'
+ - 'spec/finders/packages/go/module_finder_spec.rb'
+ - 'spec/graphql/mutations/issues/create_spec.rb'
+ - 'spec/helpers/application_helper_spec.rb'
+ - 'spec/helpers/diff_helper_spec.rb'
+ - 'spec/helpers/events_helper_spec.rb'
+ - 'spec/helpers/search_helper_spec.rb'
+ - 'spec/lib/api/helpers/related_resources_helpers_spec.rb'
+ - 'spec/lib/atlassian/jira_connect/client_spec.rb'
+ - 'spec/lib/backup/gitaly_backup_spec.rb'
+ - 'spec/lib/backup/repositories_spec.rb'
+ - 'spec/lib/banzai/filter/color_filter_spec.rb'
+ - 'spec/lib/banzai/filter/external_link_filter_spec.rb'
+ - 'spec/lib/banzai/filter/front_matter_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/commit_range_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/issue_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/merge_request_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/user_reference_filter_spec.rb'
+ - 'spec/lib/banzai/pipeline/plain_markdown_pipeline_spec.rb'
+ - 'spec/lib/constraints/project_url_constrainer_spec.rb'
+ - 'spec/lib/container_registry/tag_spec.rb'
+ - 'spec/lib/gitlab/auth/o_auth/user_spec.rb'
+ - 'spec/lib/gitlab/auth/otp/strategies/forti_token_cloud_spec.rb'
+ - 'spec/lib/gitlab/background_migration/migrate_merge_request_diff_commit_users_spec.rb'
+ - 'spec/lib/gitlab/bare_repository_import/importer_spec.rb'
+ - 'spec/lib/gitlab/ci/build/artifacts/metadata_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/artifacts_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/mapper_spec.rb'
+ - 'spec/lib/gitlab/ci/trace/stream_spec.rb'
+ - 'spec/lib/gitlab/content_security_policy/config_loader_spec.rb'
+ - 'spec/lib/gitlab/crypto_helper_spec.rb'
+ - 'spec/lib/gitlab/emoji_spec.rb'
+ - 'spec/lib/gitlab/encoding_helper_spec.rb'
+ - 'spec/lib/gitlab/git/conflict/parser_spec.rb'
+ - 'spec/lib/gitlab/git/tag_spec.rb'
+ - 'spec/lib/gitlab/git/user_spec.rb'
+ - 'spec/lib/gitlab/git_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/blob_service_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/cleanup_service_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/commit_service_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/ref_service_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/remote_service_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/repository_service_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/wiki_service_spec.rb'
+ - 'spec/lib/gitlab/import_export/snippet_repo_restorer_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/kube_client_spec.rb'
+ - 'spec/lib/gitlab/lfs/client_spec.rb'
+ - 'spec/lib/gitlab/other_markup_spec.rb'
+ - 'spec/lib/gitlab/path_regex_spec.rb'
+ - 'spec/lib/gitlab/quick_actions/extractor_spec.rb'
+ - 'spec/lib/gitlab/regex_spec.rb'
+ - 'spec/lib/gitlab/repo_path_spec.rb'
+ - 'spec/lib/gitlab/search/abuse_validators/no_abusive_term_length_validator_spec.rb'
+ - 'spec/lib/gitlab/search/params_spec.rb'
+ - 'spec/lib/gitlab/shell_spec.rb'
+ - 'spec/lib/gitlab/slash_commands/deploy_spec.rb'
+ - 'spec/lib/gitlab/themes_spec.rb'
+ - 'spec/lib/gitlab/throttle_spec.rb'
+ - 'spec/lib/gitlab/tree_summary_spec.rb'
+ - 'spec/lib/gitlab/url_blocker_spec.rb'
+ - 'spec/lib/gitlab/utils_spec.rb'
+ - 'spec/lib/gitlab/wiki_pages/front_matter_parser_spec.rb'
+ - 'spec/lib/gitlab/workhorse_spec.rb'
+ - 'spec/lib/kramdown/kramdown_spec.rb'
+ - 'spec/lib/safe_zip/entry_spec.rb'
+ - 'spec/lib/safe_zip/extract_params_spec.rb'
+ - 'spec/models/application_setting_spec.rb'
+ - 'spec/models/ci/build_spec.rb'
+ - 'spec/models/clusters/platforms/kubernetes_spec.rb'
+ - 'spec/models/commit_range_spec.rb'
+ - 'spec/models/commit_spec.rb'
+ - 'spec/models/concerns/avatarable_spec.rb'
+ - 'spec/models/concerns/pg_full_text_searchable_spec.rb'
+ - 'spec/models/concerns/token_authenticatable_spec.rb'
+ - 'spec/models/container_repository_spec.rb'
+ - 'spec/models/custom_emoji_spec.rb'
+ - 'spec/models/grafana_integration_spec.rb'
+ - 'spec/models/integrations/campfire_spec.rb'
+ - 'spec/models/integrations/chat_message/pipeline_message_spec.rb'
+ - 'spec/models/integrations/chat_message/push_message_spec.rb'
+ - 'spec/models/integrations/jenkins_spec.rb'
+ - 'spec/models/merge_request_diff_spec.rb'
+ - 'spec/models/merge_request_spec.rb'
+ - 'spec/models/namespace_spec.rb'
+ - 'spec/models/packages/package_file_spec.rb'
+ - 'spec/models/packages/sem_ver_spec.rb'
+ - 'spec/models/pages/lookup_path_spec.rb'
+ - 'spec/models/project_metrics_setting_spec.rb'
+ - 'spec/models/project_spec.rb'
+ - 'spec/models/prometheus_alert_spec.rb'
+ - 'spec/models/releases/link_spec.rb'
+ - 'spec/models/repository_spec.rb'
+ - 'spec/models/snippet_spec.rb'
+ - 'spec/models/ssh_host_key_spec.rb'
+ - 'spec/models/wiki_page_spec.rb'
+ - 'spec/requests/api/environments_spec.rb'
+ - 'spec/requests/api/files_spec.rb'
+ - 'spec/requests/api/internal/kubernetes_spec.rb'
+ - 'spec/requests/api/keys_spec.rb'
+ - 'spec/requests/api/maven_packages_spec.rb'
+ - 'spec/requests/api/merge_requests_spec.rb'
+ - 'spec/requests/api/notes_spec.rb'
+ - 'spec/requests/api/pypi_packages_spec.rb'
+ - 'spec/routing/git_http_routing_spec.rb'
+ - 'spec/services/ci/find_exposed_artifacts_service_spec.rb'
+ - 'spec/services/clusters/gcp/finalize_creation_service_spec.rb'
+ - 'spec/services/clusters/kubernetes/configure_istio_ingress_service_spec.rb'
+ - 'spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb'
+ - 'spec/services/error_tracking/list_projects_service_spec.rb'
+ - 'spec/services/merge_requests/build_service_spec.rb'
+ - 'spec/services/metrics/dashboard/grafana_metric_embed_service_spec.rb'
+ - 'spec/services/packages/conan/create_package_file_service_spec.rb'
+ - 'spec/services/packages/debian/create_package_file_service_spec.rb'
+ - 'spec/services/packages/helm/extract_file_metadata_service_spec.rb'
+ - 'spec/services/packages/helm/process_file_service_spec.rb'
+ - 'spec/services/projects/create_service_spec.rb'
+ - 'spec/services/projects/destroy_rollback_service_spec.rb'
+ - 'spec/services/projects/destroy_service_spec.rb'
+ - 'spec/services/projects/download_service_spec.rb'
+ - 'spec/services/push_event_payload_service_spec.rb'
+ - 'spec/services/repositories/destroy_rollback_service_spec.rb'
+ - 'spec/services/repositories/destroy_service_spec.rb'
+ - 'spec/services/snippets/bulk_destroy_service_spec.rb'
+ - 'spec/services/snippets/update_service_spec.rb'
+ - 'spec/services/todo_service_spec.rb'
+ - 'spec/services/users/destroy_service_spec.rb'
+ - 'spec/services/verify_pages_domain_service_spec.rb'
+ - 'spec/support/capybara.rb'
+ - 'spec/support/helpers/ci_artifact_metadata_generator.rb'
+ - 'spec/support/helpers/git_helpers.rb'
+ - 'spec/support/helpers/gitaly_setup.rb'
+ - 'spec/support/helpers/javascript_fixtures_helpers.rb'
+ - 'spec/support/helpers/jira_service_helper.rb'
+ - 'spec/support/helpers/kubernetes_helpers.rb'
+ - 'spec/support/helpers/stub_configuration.rb'
+ - 'spec/support/helpers/workhorse_helpers.rb'
+ - 'spec/support/helpers/workhorse_lfs_helpers.rb'
+ - 'spec/support/shared_examples/features/wiki/user_previews_wiki_changes_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/banzai/reference_parser_shared_examples.rb'
+ - 'spec/support/shared_examples/models/packages/debian/distribution_shared_examples.rb'
+ - 'spec/support/shared_examples/models/wiki_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/snippet_shared_examples.rb'
+ - 'spec/support/unpack-gitlab-git-test'
+ - 'spec/tasks/gitlab/backup_rake_spec.rb'
+ - 'spec/tooling/lib/tooling/kubernetes_client_spec.rb'
+ - 'spec/uploaders/job_artifact_uploader_spec.rb'
+ - 'spec/validators/addressable_url_validator_spec.rb'
+ - 'spec/validators/color_validator_spec.rb'
+ - 'spec/workers/packages/go/sync_packages_worker_spec.rb'
diff --git a/app/assets/javascripts/header_search/components/app.vue b/app/assets/javascripts/header_search/components/app.vue
index 4406cacdf3f..adf304aebc7 100644
--- a/app/assets/javascripts/header_search/components/app.vue
+++ b/app/assets/javascripts/header_search/components/app.vue
@@ -120,9 +120,11 @@ export default {
...mapActions(['setSearch', 'fetchAutocompleteOptions', 'clearAutocomplete']),
openDropdown() {
this.showDropdown = true;
+ this.$emit('toggleDropdown', this.showDropdown);
},
closeDropdown() {
this.showDropdown = false;
+ this.$emit('toggleDropdown', this.showDropdown);
},
submitSearch() {
return visitUrl(this.currentFocusedOption?.url || this.searchQuery);
@@ -146,7 +148,7 @@ export default {
v-outside="closeDropdown"
role="search"
:aria-label="$options.i18n.searchGitlab"
- class="header-search gl-relative gl-rounded-base"
+ class="header-search gl-relative gl-rounded-base gl-w-full"
:class="headerSearchActivityDescriptor"
>
<gl-search-box-by-type
diff --git a/app/assets/javascripts/header_search/index.js b/app/assets/javascripts/header_search/index.js
index 4af8513ecdb..b2c505d569f 100644
--- a/app/assets/javascripts/header_search/index.js
+++ b/app/assets/javascripts/header_search/index.js
@@ -7,6 +7,7 @@ Vue.use(Translate);
export const initHeaderSearchApp = (search = '') => {
const el = document.getElementById('js-header-search');
+ let navBarEl = null;
if (!el) {
return false;
@@ -19,8 +20,21 @@ export const initHeaderSearchApp = (search = '') => {
return new Vue({
el,
store: createStore({ searchPath, issuesPath, mrPath, autocompletePath, searchContext, search }),
+ mounted() {
+ navBarEl = document.querySelector('.header-content');
+ },
render(createElement) {
- return createElement(HeaderSearchApp);
+ return createElement(HeaderSearchApp, {
+ on: {
+ toggleDropdown: (isVisible = false) => {
+ if (isVisible) {
+ navBarEl?.classList.add('header-search-is-active');
+ } else {
+ navBarEl?.classList.remove('header-search-is-active');
+ }
+ },
+ },
+ });
},
});
};
diff --git a/app/assets/stylesheets/framework/header.scss b/app/assets/stylesheets/framework/header.scss
index 261707109eb..f76a0cbbae8 100644
--- a/app/assets/stylesheets/framework/header.scss
+++ b/app/assets/stylesheets/framework/header.scss
@@ -22,14 +22,6 @@
min-height: $header-height;
padding-left: 0;
- .title-container {
- display: flex;
- align-items: stretch;
- flex: 1 1 auto;
- padding-top: 0;
- overflow: visible;
- }
-
.title {
padding-right: 0;
color: currentColor;
diff --git a/app/assets/stylesheets/pages/search.scss b/app/assets/stylesheets/pages/search.scss
index 18a0f119edf..8755db83d35 100644
--- a/app/assets/stylesheets/pages/search.scss
+++ b/app/assets/stylesheets/pages/search.scss
@@ -2,6 +2,11 @@ $search-dropdown-max-height: 400px;
$search-avatar-size: 16px;
$search-sidebar-min-width: 240px;
$search-sidebar-max-width: 300px;
+$search-input-field-x-min-width: 200px;
+$search-input-field-min-width: 320px;
+$search-input-field-max-width: 600px;
+
+$border-radius-medium: 3px;
.search-results {
.search-result-row {
@@ -37,8 +42,44 @@ input[type='checkbox']:hover {
0 0 0 1px lighten($dropdown-input-focus-shadow, 20%);
}
+.header-content {
+ .header-search-new {
+ max-width: $search-input-field-max-width;
+ }
+
+ &.header-search-is-active {
+ .navbar-collapse {
+ flex-grow: 1;
+ }
+
+ @include media-breakpoint-down(lg) {
+ .title-container {
+ flex: 0;
+ overflow: hidden;
+ }
+ }
+
+ @include media-breakpoint-up(xl) {
+ .navbar-nav {
+ padding-left: 1rem;
+ }
+ }
+ }
+}
+
+// This is a temporary workaround!
+// the button in GitLab UI Search components need to be updated to not be the small size
+// see in Figma: https://www.figma.com/file/qEddyqCrI7kPSBjGmwkZzQ/Component-library?node-id=43905%3A45540
+.header-search .gl-search-box-by-type-clear.btn-sm {
+ padding: 0.5rem !important;
+}
+
.header-search {
- width: 320px;
+ min-width: $search-input-field-min-width;
+
+ @include media-breakpoint-between(md, lg) {
+ min-width: $search-input-field-x-min-width;
+ }
input,
svg {
@@ -66,9 +107,10 @@ input[type='checkbox']:hover {
border-width: 0;
border-style: solid;
border-image: none;
- border-radius: 3px;
+ border-radius: $border-radius-medium;
box-shadow: none;
white-space: pre-wrap;
+ box-sizing: border-box;
// Safari
word-wrap: break-word;
overflow-wrap: break-word;
diff --git a/app/assets/stylesheets/startup/startup-dark.scss b/app/assets/stylesheets/startup/startup-dark.scss
index ec7ffdb3dce..001431e517b 100644
--- a/app/assets/stylesheets/startup/startup-dark.scss
+++ b/app/assets/stylesheets/startup/startup-dark.scss
@@ -351,9 +351,6 @@ h1 {
.d-lg-none {
display: none !important;
}
- .d-lg-block {
- display: block !important;
- }
}
.sr-only {
position: absolute;
@@ -777,13 +774,6 @@ input {
min-height: var(--header-height, 40px);
padding-left: 0;
}
-.navbar-gitlab .header-content .title-container {
- display: flex;
- align-items: stretch;
- flex: 1 1 auto;
- padding-top: 0;
- overflow: visible;
-}
.navbar-gitlab .header-content .title {
padding-right: 0;
color: currentColor;
@@ -1513,8 +1503,16 @@ svg.s12 {
svg.s16 {
vertical-align: -3px;
}
+.header-content .header-search-new {
+ max-width: 600px;
+}
.header-search {
- width: 320px;
+ min-width: 320px;
+}
+@media (min-width: 768px) and (max-width: 1199.98px) {
+ .header-search {
+ min-width: 200px;
+ }
}
.header-search.is-not-active::after {
content: "/";
@@ -1535,6 +1533,7 @@ svg.s16 {
border-radius: 3px;
box-shadow: none;
white-space: pre-wrap;
+ box-sizing: border-box;
word-wrap: break-word;
overflow-wrap: break-word;
word-break: keep-all;
@@ -2063,12 +2062,29 @@ body.gl-dark {
display: block;
}
}
+@media (min-width: 992px) {
+ .gl-lg-display-block {
+ display: block;
+ }
+}
+.gl-display-inline-block\! {
+ display: inline-block !important;
+}
+.gl-align-items-stretch {
+ align-items: stretch;
+}
+.gl-flex-grow-1 {
+ flex-grow: 1;
+}
.gl-relative {
position: relative;
}
.gl-absolute {
position: absolute;
}
+.gl-w-full {
+ width: 100%;
+}
.gl-px-3 {
padding-left: 0.5rem;
padding-right: 0.5rem;
@@ -2076,6 +2092,9 @@ body.gl-dark {
.gl-pr-2 {
padding-right: 0.25rem;
}
+.gl-pt-0 {
+ padding-top: 0;
+}
.gl-ml-n2 {
margin-left: -0.25rem;
}
@@ -2086,6 +2105,12 @@ body.gl-dark {
margin-left: 0 !important;
margin-right: 0 !important;
}
+.gl-text-right {
+ text-align: right;
+}
+.gl-white-space-nowrap {
+ white-space: nowrap;
+}
.gl-font-sm {
font-size: 0.75rem;
}
diff --git a/app/assets/stylesheets/startup/startup-general.scss b/app/assets/stylesheets/startup/startup-general.scss
index aacf7cf471a..c42b5554d8d 100644
--- a/app/assets/stylesheets/startup/startup-general.scss
+++ b/app/assets/stylesheets/startup/startup-general.scss
@@ -336,9 +336,6 @@ h1 {
.d-lg-none {
display: none !important;
}
- .d-lg-block {
- display: block !important;
- }
}
.sr-only {
position: absolute;
@@ -762,13 +759,6 @@ input {
min-height: var(--header-height, 40px);
padding-left: 0;
}
-.navbar-gitlab .header-content .title-container {
- display: flex;
- align-items: stretch;
- flex: 1 1 auto;
- padding-top: 0;
- overflow: visible;
-}
.navbar-gitlab .header-content .title {
padding-right: 0;
color: currentColor;
@@ -1498,8 +1488,16 @@ svg.s12 {
svg.s16 {
vertical-align: -3px;
}
+.header-content .header-search-new {
+ max-width: 600px;
+}
.header-search {
- width: 320px;
+ min-width: 320px;
+}
+@media (min-width: 768px) and (max-width: 1199.98px) {
+ .header-search {
+ min-width: 200px;
+ }
}
.header-search.is-not-active::after {
content: "/";
@@ -1520,6 +1518,7 @@ svg.s16 {
border-radius: 3px;
box-shadow: none;
white-space: pre-wrap;
+ box-sizing: border-box;
word-wrap: break-word;
overflow-wrap: break-word;
word-break: keep-all;
@@ -1723,12 +1722,29 @@ svg.s16 {
display: block;
}
}
+@media (min-width: 992px) {
+ .gl-lg-display-block {
+ display: block;
+ }
+}
+.gl-display-inline-block\! {
+ display: inline-block !important;
+}
+.gl-align-items-stretch {
+ align-items: stretch;
+}
+.gl-flex-grow-1 {
+ flex-grow: 1;
+}
.gl-relative {
position: relative;
}
.gl-absolute {
position: absolute;
}
+.gl-w-full {
+ width: 100%;
+}
.gl-px-3 {
padding-left: 0.5rem;
padding-right: 0.5rem;
@@ -1736,6 +1752,9 @@ svg.s16 {
.gl-pr-2 {
padding-right: 0.25rem;
}
+.gl-pt-0 {
+ padding-top: 0;
+}
.gl-ml-n2 {
margin-left: -0.25rem;
}
@@ -1746,6 +1765,12 @@ svg.s16 {
margin-left: 0 !important;
margin-right: 0 !important;
}
+.gl-text-right {
+ text-align: right;
+}
+.gl-white-space-nowrap {
+ white-space: nowrap;
+}
.gl-font-sm {
font-size: 0.75rem;
}
diff --git a/app/graphql/mutations/ci/ci_cd_settings_update.rb b/app/graphql/mutations/ci/ci_cd_settings_update.rb
index dec90ced962..98b8e9567e7 100644
--- a/app/graphql/mutations/ci/ci_cd_settings_update.rb
+++ b/app/graphql/mutations/ci/ci_cd_settings_update.rb
@@ -2,42 +2,9 @@
module Mutations
module Ci
- class CiCdSettingsUpdate < BaseMutation
+ # TODO: Remove in 16.0, see https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87002
+ class CiCdSettingsUpdate < ProjectCiCdSettingsUpdate
graphql_name 'CiCdSettingsUpdate'
-
- include FindsProject
-
- authorize :admin_project
-
- argument :full_path, GraphQL::Types::ID,
- required: true,
- description: 'Full Path of the project the settings belong to.'
-
- argument :keep_latest_artifact, GraphQL::Types::Boolean,
- required: false,
- description: 'Indicates if the latest artifact should be kept for this project.'
-
- argument :job_token_scope_enabled, GraphQL::Types::Boolean,
- required: false,
- description: 'Indicates CI job tokens generated in this project have restricted access to resources.'
-
- field :ci_cd_settings,
- Types::Ci::CiCdSettingType,
- null: false,
- description: 'CI/CD settings after mutation.'
-
- def resolve(full_path:, **args)
- project = authorized_find!(full_path)
- settings = project.ci_cd_settings
- settings.update(args)
-
- {
- ci_cd_settings: settings,
- errors: errors_on_object(settings)
- }
- end
end
end
end
-
-Mutations::Ci::CiCdSettingsUpdate.prepend_mod_with('Mutations::Ci::CiCdSettingsUpdate')
diff --git a/app/graphql/mutations/ci/project_ci_cd_settings_update.rb b/app/graphql/mutations/ci/project_ci_cd_settings_update.rb
new file mode 100644
index 00000000000..b0cffa2c088
--- /dev/null
+++ b/app/graphql/mutations/ci/project_ci_cd_settings_update.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+module Mutations
+ module Ci
+ class ProjectCiCdSettingsUpdate < BaseMutation
+ graphql_name 'ProjectCiCdSettingsUpdate'
+
+ include FindsProject
+
+ authorize :admin_project
+
+ argument :full_path, GraphQL::Types::ID,
+ required: true,
+ description: 'Full Path of the project the settings belong to.'
+
+ argument :keep_latest_artifact, GraphQL::Types::Boolean,
+ required: false,
+ description: 'Indicates if the latest artifact should be kept for this project.'
+
+ argument :job_token_scope_enabled, GraphQL::Types::Boolean,
+ required: false,
+ description: 'Indicates CI job tokens generated in this project have restricted access to resources.'
+
+ field :ci_cd_settings,
+ Types::Ci::CiCdSettingType,
+ null: false,
+ description: 'CI/CD settings after mutation.'
+
+ def resolve(full_path:, **args)
+ project = authorized_find!(full_path)
+ settings = project.ci_cd_settings
+ settings.update(args)
+
+ {
+ ci_cd_settings: settings,
+ errors: errors_on_object(settings)
+ }
+ end
+ end
+ end
+end
+
+Mutations::Ci::ProjectCiCdSettingsUpdate.prepend_mod_with('Mutations::Ci::ProjectCiCdSettingsUpdate')
diff --git a/app/graphql/mutations/incident_management/timeline_event/base.rb b/app/graphql/mutations/incident_management/timeline_event/base.rb
new file mode 100644
index 00000000000..742470b4831
--- /dev/null
+++ b/app/graphql/mutations/incident_management/timeline_event/base.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+module Mutations
+ module IncidentManagement
+ module TimelineEvent
+ class Base < BaseMutation
+ field :timeline_event,
+ ::Types::IncidentManagement::TimelineEventType,
+ null: true,
+ description: 'Timeline event.'
+
+ authorize :admin_incident_management_timeline_event
+
+ private
+
+ def response(result)
+ {
+ timeline_event: result.payload[:timeline_event],
+ errors: result.errors
+ }
+ end
+
+ def find_object(id:)
+ GitlabSchema.object_from_id(id, expected_type: ::IncidentManagement::TimelineEvent).sync
+ end
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/incident_management/timeline_event/create.rb b/app/graphql/mutations/incident_management/timeline_event/create.rb
new file mode 100644
index 00000000000..cbc708a2530
--- /dev/null
+++ b/app/graphql/mutations/incident_management/timeline_event/create.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+module Mutations
+ module IncidentManagement
+ module TimelineEvent
+ class Create < Base
+ graphql_name 'TimelineEventCreate'
+
+ argument :incident_id, Types::GlobalIDType[::Issue],
+ required: true,
+ description: 'Incident ID of the timeline event.'
+
+ argument :note, GraphQL::Types::String,
+ required: true,
+ description: 'Text note of the timeline event.'
+
+ argument :occurred_at, Types::TimeType,
+ required: true,
+ description: 'Timestamp of when the event occurred.'
+
+ def resolve(incident_id:, **args)
+ incident = authorized_find!(id: incident_id)
+
+ authorize!(incident)
+
+ response ::IncidentManagement::TimelineEvents::CreateService.new(incident, current_user, args).execute
+ end
+
+ private
+
+ def find_object(id:)
+ GitlabSchema.object_from_id(id, expected_type: ::Issue).sync
+ end
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/incident_management/timeline_event/destroy.rb b/app/graphql/mutations/incident_management/timeline_event/destroy.rb
new file mode 100644
index 00000000000..728a2e7c0d6
--- /dev/null
+++ b/app/graphql/mutations/incident_management/timeline_event/destroy.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+module Mutations
+ module IncidentManagement
+ module TimelineEvent
+ class Destroy < Base
+ graphql_name 'TimelineEventDestroy'
+
+ argument :id, Types::GlobalIDType[::IncidentManagement::TimelineEvent],
+ required: true,
+ description: 'Timeline event ID to remove.'
+
+ def resolve(id:)
+ timeline_event = authorized_find!(id: id)
+
+ response ::IncidentManagement::TimelineEvents::DestroyService.new(
+ timeline_event,
+ current_user
+ ).execute
+ end
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/incident_management/timeline_event/promote_from_note.rb b/app/graphql/mutations/incident_management/timeline_event/promote_from_note.rb
new file mode 100644
index 00000000000..73a20b8a380
--- /dev/null
+++ b/app/graphql/mutations/incident_management/timeline_event/promote_from_note.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+module Mutations
+ module IncidentManagement
+ module TimelineEvent
+ class PromoteFromNote < Base
+ graphql_name 'TimelineEventPromoteFromNote'
+
+ argument :note_id, Types::GlobalIDType[::Note],
+ required: true,
+ description: 'Note ID from which the timeline event promoted.'
+
+ def resolve(note_id:)
+ note = find_object(id: note_id)
+ incident = note&.noteable
+
+ authorize!(incident)
+
+ response ::IncidentManagement::TimelineEvents::CreateService.new(
+ incident,
+ current_user,
+ promoted_from_note: note,
+ note: note.note,
+ occurred_at: note.created_at
+ ).execute
+ end
+
+ private
+
+ def find_object(id:)
+ GitlabSchema.object_from_id(id, expected_type: ::Note).sync
+ end
+
+ def authorize!(object)
+ raise_noteable_not_incident! if object && !object.try(:incident?)
+
+ super
+ end
+
+ def raise_noteable_not_incident!
+ raise_resource_not_available_error! 'Note does not belong to an incident'
+ end
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/incident_management/timeline_event/update.rb b/app/graphql/mutations/incident_management/timeline_event/update.rb
new file mode 100644
index 00000000000..1f53bdc19cb
--- /dev/null
+++ b/app/graphql/mutations/incident_management/timeline_event/update.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+module Mutations
+ module IncidentManagement
+ module TimelineEvent
+ class Update < Base
+ graphql_name 'TimelineEventUpdate'
+
+ argument :id, ::Types::GlobalIDType[::IncidentManagement::TimelineEvent],
+ required: true,
+ description: 'ID of the timeline event to update.'
+
+ argument :note, GraphQL::Types::String,
+ required: false,
+ description: 'Text note of the timeline event.'
+
+ argument :occurred_at, Types::TimeType,
+ required: false,
+ description: 'Timestamp when the event occurred.'
+
+ def resolve(id:, **args)
+ timeline_event = authorized_find!(id: id)
+
+ response ::IncidentManagement::TimelineEvents::UpdateService.new(
+ timeline_event,
+ current_user,
+ args
+ ).execute
+ end
+ end
+ end
+ end
+end
diff --git a/app/graphql/resolvers/incident_management/timeline_events_resolver.rb b/app/graphql/resolvers/incident_management/timeline_events_resolver.rb
new file mode 100644
index 00000000000..b9978259e6b
--- /dev/null
+++ b/app/graphql/resolvers/incident_management/timeline_events_resolver.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+module Resolvers
+ module IncidentManagement
+ class TimelineEventsResolver < BaseResolver
+ include LooksAhead
+
+ alias_method :project, :object
+
+ type ::Types::IncidentManagement::TimelineEventType.connection_type, null: true
+
+ argument :incident_id,
+ ::Types::GlobalIDType[::Issue],
+ required: true,
+ description: 'ID of the incident.'
+
+ when_single do
+ argument :id,
+ ::Types::GlobalIDType[::IncidentManagement::TimelineEvent],
+ required: true,
+ description: 'ID of the timeline event.',
+ prepare: ->(id, ctx) { id.model_id }
+ end
+
+ def resolve(**args)
+ incident = args[:incident_id].find
+
+ apply_lookahead(::IncidentManagement::TimelineEventsFinder.new(current_user, incident, args).execute)
+ end
+ end
+ end
+end
diff --git a/app/graphql/types/incident_management/timeline_event_type.rb b/app/graphql/types/incident_management/timeline_event_type.rb
new file mode 100644
index 00000000000..a6d3f57404b
--- /dev/null
+++ b/app/graphql/types/incident_management/timeline_event_type.rb
@@ -0,0 +1,72 @@
+# frozen_string_literal: true
+
+module Types
+ module IncidentManagement
+ class TimelineEventType < BaseObject
+ graphql_name 'TimelineEventType'
+ description 'Describes an incident management timeline event'
+
+ authorize :read_incident_management_timeline_event
+
+ field :id,
+ Types::GlobalIDType[::IncidentManagement::TimelineEvent],
+ null: false,
+ description: 'ID of the timeline event.'
+
+ field :author,
+ Types::UserType,
+ null: true,
+ description: 'User that created the timeline event.'
+
+ field :updated_by_user,
+ Types::UserType,
+ null: true,
+ description: 'User that updated the timeline event.'
+
+ field :incident,
+ Types::IssueType,
+ null: false,
+ description: 'Incident of the timeline event.'
+
+ field :note,
+ GraphQL::Types::String,
+ null: true,
+ description: 'Text note of the timeline event.'
+
+ field :note_html,
+ GraphQL::Types::String,
+ null: true,
+ description: 'HTML note of the timeline event.'
+
+ field :promoted_from_note,
+ Types::Notes::NoteType,
+ null: true,
+ description: 'Note from which the timeline event was created.'
+
+ field :editable,
+ GraphQL::Types::Boolean,
+ null: false,
+ description: 'Indicates the timeline event is editable.'
+
+ field :action,
+ GraphQL::Types::String,
+ null: false,
+ description: 'Indicates the timeline event icon.'
+
+ field :occurred_at,
+ Types::TimeType,
+ null: false,
+ description: 'Timestamp when the event occurred.'
+
+ field :created_at,
+ Types::TimeType,
+ null: false,
+ description: 'Timestamp when the event created.'
+
+ field :updated_at,
+ Types::TimeType,
+ null: false,
+ description: 'Timestamp when the event updated.'
+ end
+ end
+end
diff --git a/app/graphql/types/mutation_type.rb b/app/graphql/types/mutation_type.rb
index c9f6a4648dd..7d8ada82d40 100644
--- a/app/graphql/types/mutation_type.rb
+++ b/app/graphql/types/mutation_type.rb
@@ -47,6 +47,10 @@ module Types
mount_mutation Mutations::DependencyProxy::ImageTtlGroupPolicy::Update
mount_mutation Mutations::DependencyProxy::GroupSettings::Update
mount_mutation Mutations::Environments::CanaryIngress::Update
+ mount_mutation Mutations::IncidentManagement::TimelineEvent::Create
+ mount_mutation Mutations::IncidentManagement::TimelineEvent::PromoteFromNote
+ mount_mutation Mutations::IncidentManagement::TimelineEvent::Update
+ mount_mutation Mutations::IncidentManagement::TimelineEvent::Destroy
mount_mutation Mutations::Issues::Create
mount_mutation Mutations::Issues::SetAssignees
mount_mutation Mutations::Issues::SetCrmContacts
@@ -111,7 +115,12 @@ module Types
mount_mutation Mutations::Ci::Pipeline::Cancel
mount_mutation Mutations::Ci::Pipeline::Destroy
mount_mutation Mutations::Ci::Pipeline::Retry
- mount_mutation Mutations::Ci::CiCdSettingsUpdate
+ mount_mutation Mutations::Ci::CiCdSettingsUpdate, deprecated: {
+ reason: :renamed,
+ replacement: 'ProjectCiCdSettingsUpdate',
+ milestone: '15.0'
+ }
+ mount_mutation Mutations::Ci::ProjectCiCdSettingsUpdate
mount_mutation Mutations::Ci::Job::Play
mount_mutation Mutations::Ci::Job::Retry
mount_mutation Mutations::Ci::Job::Cancel
diff --git a/app/graphql/types/packages/package_base_type.rb b/app/graphql/types/packages/package_base_type.rb
new file mode 100644
index 00000000000..06ccde94cd4
--- /dev/null
+++ b/app/graphql/types/packages/package_base_type.rb
@@ -0,0 +1,60 @@
+# frozen_string_literal: true
+
+module Types
+ module Packages
+ class PackageBaseType < ::Types::BaseObject
+ graphql_name 'PackageBase'
+ description 'Represents a package in the Package Registry'
+
+ connection_type_class(Types::CountableConnectionType)
+
+ authorize :read_package
+
+ field :id, ::Types::GlobalIDType[::Packages::Package], null: false,
+ description: 'ID of the package.'
+
+ field :can_destroy, GraphQL::Types::Boolean, null: false, description: 'Whether the user can destroy the package.'
+ field :created_at, Types::TimeType, null: false, description: 'Date of creation.'
+ field :metadata, Types::Packages::MetadataType, null: true,
+ description: 'Package metadata.'
+ field :name, GraphQL::Types::String, null: false, description: 'Name of the package.'
+ field :package_type, Types::Packages::PackageTypeEnum, null: false, description: 'Package type.'
+ field :project, Types::ProjectType, null: false, description: 'Project where the package is stored.'
+ field :status, Types::Packages::PackageStatusEnum, null: false, description: 'Package status.'
+ field :tags, Types::Packages::PackageTagType.connection_type, null: true, description: 'Package tags.'
+ field :updated_at, Types::TimeType, null: false, description: 'Date of most recent update.'
+ field :version, GraphQL::Types::String, null: true, description: 'Version string.'
+
+ def project
+ Gitlab::Graphql::Loaders::BatchModelLoader.new(Project, object.project_id).find
+ end
+
+ def can_destroy
+ Ability.allowed?(current_user, :destroy_package, object)
+ end
+
+ # NOTE: This method must be kept in sync with the union
+ # type: `Types::Packages::MetadataType`.
+ #
+ # `Types::Packages::MetadataType.resolve_type(metadata, ctx)` must never raise.
+ # rubocop: disable GraphQL/ResolverMethodLength
+ def metadata
+ case object.package_type
+ when 'composer'
+ object.composer_metadatum
+ when 'conan'
+ object.conan_metadatum
+ when 'maven'
+ object.maven_metadatum
+ when 'nuget'
+ object.nuget_metadatum
+ when 'pypi'
+ object.pypi_metadatum
+ else
+ nil
+ end
+ end
+ # rubocop: enable GraphQL/ResolverMethodLength
+ end
+ end
+end
diff --git a/app/graphql/types/packages/package_details_type.rb b/app/graphql/types/packages/package_details_type.rb
index d5c4dbf648f..ae57e103f40 100644
--- a/app/graphql/types/packages/package_details_type.rb
+++ b/app/graphql/types/packages/package_details_type.rb
@@ -4,13 +4,13 @@ module Types
module Packages
class PackageDetailsType < PackageType
graphql_name 'PackageDetailsType'
- description 'Represents a package details in the Package Registry. Note that this type is in beta and susceptible to changes'
+ description 'Represents a package details in the Package Registry'
include ::PackagesHelper
authorize :read_package
- field :versions, ::Types::Packages::PackageType.connection_type, null: true,
+ field :versions, ::Types::Packages::PackageBaseType.connection_type, null: true,
description: 'Other versions of the package.'
field :package_files, Types::Packages::PackageFileType.connection_type, null: true, method: :installable_package_files, description: 'Package files.'
diff --git a/app/graphql/types/packages/package_type.rb b/app/graphql/types/packages/package_type.rb
index 953637a5dfd..f6586670c72 100644
--- a/app/graphql/types/packages/package_type.rb
+++ b/app/graphql/types/packages/package_type.rb
@@ -2,60 +2,17 @@
module Types
module Packages
- class PackageType < ::Types::BaseObject
+ class PackageType < Types::Packages::PackageBaseType
graphql_name 'Package'
- description 'Represents a package in the Package Registry. Note that this type is in beta and susceptible to changes'
-
- connection_type_class(Types::CountableConnectionType)
+ description 'Represents a package with pipelines in the Package Registry'
authorize :read_package
- field :id, ::Types::GlobalIDType[::Packages::Package], null: false,
- description: 'ID of the package.'
-
- field :can_destroy, GraphQL::Types::Boolean, null: false, description: 'Whether the user can destroy the package.'
- field :created_at, Types::TimeType, null: false, description: 'Date of creation.'
- field :metadata, Types::Packages::MetadataType, null: true,
- description: 'Package metadata.'
- field :name, GraphQL::Types::String, null: false, description: 'Name of the package.'
- field :package_type, Types::Packages::PackageTypeEnum, null: false, description: 'Package type.'
field :pipelines,
resolver: Resolvers::PackagePipelinesResolver,
- description: "Pipelines that built the package. Max page size #{Resolvers::PackagePipelinesResolver::MAX_PAGE_SIZE}."
- field :project, Types::ProjectType, null: false, description: 'Project where the package is stored.'
- field :status, Types::Packages::PackageStatusEnum, null: false, description: 'Package status.'
- field :tags, Types::Packages::PackageTagType.connection_type, null: true, description: 'Package tags.'
- field :updated_at, Types::TimeType, null: false, description: 'Date of most recent update.'
- field :version, GraphQL::Types::String, null: true, description: 'Version string.'
-
- def project
- Gitlab::Graphql::Loaders::BatchModelLoader.new(Project, object.project_id).find
- end
-
- def can_destroy
- Ability.allowed?(current_user, :destroy_package, object)
- end
-
- # NOTE: This method must be kept in sync with the union
- # type: `Types::Packages::MetadataType`.
- #
- # `Types::Packages::MetadataType.resolve_type(metadata, ctx)` must never raise.
- def metadata
- case object.package_type
- when 'composer'
- object.composer_metadatum
- when 'conan'
- object.conan_metadatum
- when 'maven'
- object.maven_metadatum
- when 'nuget'
- object.nuget_metadatum
- when 'pypi'
- object.pypi_metadatum
- else
- nil
- end
- end
+ description: <<-DESC
+ Pipelines that built the package. Max page size #{Resolvers::PackagePipelinesResolver::MAX_PAGE_SIZE}.
+ DESC
end
end
end
diff --git a/app/graphql/types/project_type.rb b/app/graphql/types/project_type.rb
index 47e9a6c11fc..f1de8e985b3 100644
--- a/app/graphql/types/project_type.rb
+++ b/app/graphql/types/project_type.rb
@@ -295,6 +295,19 @@ module Types
description: 'HTTP Integrations which can receive alerts for the project.',
resolver: Resolvers::AlertManagement::HttpIntegrationsResolver
+ field :incident_management_timeline_events,
+ Types::IncidentManagement::TimelineEventType.connection_type,
+ null: true,
+ description: 'Incident Management Timeline events associated with the incident.',
+ extras: [:lookahead],
+ resolver: Resolvers::IncidentManagement::TimelineEventsResolver
+
+ field :incident_management_timeline_event,
+ Types::IncidentManagement::TimelineEventType,
+ null: true,
+ description: 'Incident Management Timeline event associated with the incident.',
+ resolver: Resolvers::IncidentManagement::TimelineEventsResolver.single
+
field :releases,
Types::ReleaseType.connection_type,
null: true,
diff --git a/app/helpers/instance_configuration_helper.rb b/app/helpers/instance_configuration_helper.rb
index f695be32743..b06e3ff2904 100644
--- a/app/helpers/instance_configuration_helper.rb
+++ b/app/helpers/instance_configuration_helper.rb
@@ -17,4 +17,8 @@ module InstanceConfigurationHelper
number_to_human_size(v, strip_insignificant_zeros: true, significant: false)
end
end
+
+ def instance_configuration_disabled_cell_html(value)
+ instance_configuration_cell_html(value == 0 ? nil : value)
+ end
end
diff --git a/app/models/instance_configuration.rb b/app/models/instance_configuration.rb
index 49e8a04e251..8a8c1a29375 100644
--- a/app/models/instance_configuration.rb
+++ b/app/models/instance_configuration.rb
@@ -13,6 +13,7 @@ class InstanceConfiguration
{ ssh_algorithms_hashes: ssh_algorithms_hashes,
host: host,
gitlab_pages: gitlab_pages,
+ ci_cd_limits: ci_cd_limits,
size_limits: size_limits,
package_file_size_limits: package_file_size_limits,
rate_limits: rate_limits }.deep_symbolize_keys
@@ -129,6 +130,23 @@ class InstanceConfiguration
}
end
+ def ci_cd_limits
+ Plan.all.to_h { |plan| [plan.name.capitalize, plan_ci_cd_limits(plan)] }
+ end
+
+ def plan_ci_cd_limits(plan)
+ plan.actual_limits.slice(
+ :ci_pipeline_size,
+ :ci_active_jobs,
+ :ci_active_pipelines,
+ :ci_project_subscriptions,
+ :ci_pipeline_schedules,
+ :ci_needs_size_limit,
+ :ci_registered_group_runners,
+ :ci_registered_project_runners
+ )
+ end
+
def ssh_algorithm_file(algorithm)
File.join(SSH_ALGORITHMS_PATH, "ssh_host_#{algorithm.downcase}_key.pub")
end
diff --git a/app/views/help/instance_configuration.html.haml b/app/views/help/instance_configuration.html.haml
index 411a81cb976..b6d27123be4 100644
--- a/app/views/help/instance_configuration.html.haml
+++ b/app/views/help/instance_configuration.html.haml
@@ -10,6 +10,7 @@
= render 'help/instance_configuration/size_limits'
= render 'help/instance_configuration/package_registry'
= render 'help/instance_configuration/rate_limits'
+ = render 'help/instance_configuration/ci_cd_limits'
%p
%strong= _("Table of contents")
diff --git a/app/views/help/instance_configuration/_ci_cd_limits.html.haml b/app/views/help/instance_configuration/_ci_cd_limits.html.haml
new file mode 100644
index 00000000000..bd5b8a6f10d
--- /dev/null
+++ b/app/views/help/instance_configuration/_ci_cd_limits.html.haml
@@ -0,0 +1,52 @@
+- ci_cd_limits = @instance_configuration.settings[:ci_cd_limits]
+- return unless ci_cd_limits.present?
+
+- content_for :table_content do
+ %li= link_to _('CI/CD limits'), '#ci-cd-limits'
+
+- content_for :settings_content do
+ %h2#ci-cd-limits
+ = _('CI/CD limits')
+
+ %p
+ = s_('CICD|There are several CI/CD limits in place.')
+ .table-responsive
+ %table
+ %thead
+ %tr
+ %th= s_('CICD|Limit')
+ - ci_cd_limits.each_key do |title|
+ %th= title.to_s.humanize
+ %tbody
+ %tr
+ %td= s_('AdminSettings|Maximum number of jobs in a single pipeline')
+ - ci_cd_limits.each_value do |limits|
+ %td= instance_configuration_disabled_cell_html(limits[:ci_pipeline_size])
+ %tr
+ %td= s_('AdminSettings|Total number of jobs in currently active pipelines')
+ - ci_cd_limits.each_value do |limits|
+ %td= instance_configuration_disabled_cell_html(limits[:ci_active_jobs])
+ %tr
+ %td= s_('AdminSettings|Maximum number of active pipelines per project')
+ - ci_cd_limits.each_value do |limits|
+ %td= instance_configuration_disabled_cell_html(limits[:ci_active_pipelines])
+ %tr
+ %td= s_('AdminSettings|Maximum number of pipeline subscriptions to and from a project')
+ - ci_cd_limits.each_value do |limits|
+ %td= instance_configuration_disabled_cell_html(limits[:ci_project_subscriptions])
+ %tr
+ %td= s_('AdminSettings|Maximum number of pipeline schedules')
+ - ci_cd_limits.each_value do |limits|
+ %td= instance_configuration_disabled_cell_html(limits[:ci_pipeline_schedules])
+ %tr
+ %td= s_('AdminSettings|Maximum number of DAG dependencies that a job can have')
+ - ci_cd_limits.each_value do |limits|
+ %td= instance_configuration_disabled_cell_html(limits[:ci_needs_size_limit])
+ %tr
+ %td= s_('AdminSettings|Maximum number of runners registered per group')
+ - ci_cd_limits.each_value do |limits|
+ %td= instance_configuration_disabled_cell_html(limits[:ci_registered_group_runners])
+ %tr
+ %td= s_('AdminSettings|Maximum number of runners registered per project')
+ - ci_cd_limits.each_value do |limits|
+ %td= instance_configuration_disabled_cell_html(limits[:ci_registered_project_runners])
diff --git a/app/views/layouts/_header_search.html.haml b/app/views/layouts/_header_search.html.haml
index f7b7aac6de4..3c62180214b 100644
--- a/app/views/layouts/_header_search.html.haml
+++ b/app/views/layouts/_header_search.html.haml
@@ -1,4 +1,4 @@
-#js-header-search.header-search.is-not-active.gl-relative{ data: { 'search-context' => header_search_context.to_json,
+#js-header-search.header-search.is-not-active.gl-relative.gl-w-full{ data: { 'search-context' => header_search_context.to_json,
'search-path' => search_path,
'issues-path' => issues_dashboard_path,
'mr-path' => merge_requests_dashboard_path,
diff --git a/app/views/layouts/header/_default.html.haml b/app/views/layouts/header/_default.html.haml
index 2345651e0e4..3cae8186750 100644
--- a/app/views/layouts/header/_default.html.haml
+++ b/app/views/layouts/header/_default.html.haml
@@ -4,8 +4,8 @@
%header.navbar.navbar-gitlab.navbar-expand-sm.js-navbar{ data: { qa_selector: 'navbar' } }
%a.gl-sr-only.gl-accessibility{ href: "#content-body" } Skip to content
.container-fluid
- .header-content
- .title-container.hide-when-top-nav-responsive-open
+ .header-content.js-header-content
+ .title-container.hide-when-top-nav-responsive-open.gl-transition-medium.gl-display-flex.gl-align-items-stretch.gl-pt-0
%h1.title
%span.gl-sr-only GitLab
= link_to root_path, title: _('Dashboard'), id: 'logo', **tracking_attrs('main_navigation', 'click_gitlab_logo_link', 'navigation') do
@@ -31,13 +31,13 @@
.gl-display-none.gl-sm-display-block
= render "layouts/nav/top_nav"
- .navbar-collapse.collapse
- %ul.nav.navbar-nav
+ .navbar-collapse.gl-transition-medium.collapse
+ %ul.nav.navbar-nav.gl-w-full
- if current_user
- = render 'layouts/header/new_dropdown', class: 'gl-display-none gl-sm-display-block'
+ = render 'layouts/header/new_dropdown', class: 'gl-display-none gl-sm-display-block gl-white-space-nowrap gl-text-right'
- if top_nav_show_search
- search_menu_item = top_nav_search_menu_item_attrs
- %li.nav-item.header-search-new.d-none.d-lg-block.m-auto
+ %li.nav-item.header-search-new.gl-display-none.gl-lg-display-block.m-auto.gl-w-full
- unless current_controller?(:search)
- if Feature.enabled?(:new_header_search)
= render 'layouts/header_search'
diff --git a/app/views/layouts/header/_new_dropdown.html.haml b/app/views/layouts/header/_new_dropdown.html.haml
index a0b271fdafa..e5b03acbe3b 100644
--- a/app/views/layouts/header/_new_dropdown.html.haml
+++ b/app/views/layouts/header/_new_dropdown.html.haml
@@ -6,8 +6,8 @@
- return if menu_sections.empty?
-%li.header-new.dropdown{ class: top_class, data: { track_label: "new_dropdown", track_action: "click_dropdown" } }
- = link_to new_project_path, class: "header-new-dropdown-toggle has-tooltip", id: "js-onboarding-new-project-link", title: title, ref: 'tooltip', aria: { label: title }, data: { toggle: 'dropdown', placement: 'bottom', container: 'body', display: 'static', qa_selector: 'new_menu_toggle' } do
+%li.header-new.gl-flex-grow-1.gl-flex-shrink-1.dropdown{ class: top_class, data: { track_label: "new_dropdown", track_action: "click_dropdown" } }
+ = link_to new_project_path, class: "header-new-dropdown-toggle has-tooltip gl-display-inline-block!", id: "js-onboarding-new-project-link", title: title, ref: 'tooltip', aria: { label: title }, data: { toggle: 'dropdown', placement: 'bottom', container: 'body', display: 'static', qa_selector: 'new_menu_toggle' } do
= sprite_icon('plus-square')
= sprite_icon('chevron-down', css_class: 'caret-down')
.dropdown-menu.dropdown-menu-right.dropdown-extended-height
diff --git a/config/feature_flags/ops/certificate_based_clusters.yml b/config/feature_flags/ops/certificate_based_clusters.yml
index eaf4151b80a..65a05377774 100644
--- a/config/feature_flags/ops/certificate_based_clusters.yml
+++ b/config/feature_flags/ops/certificate_based_clusters.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/353410
milestone: '14.9'
type: ops
group: group::configure
-default_enabled: true
+default_enabled: false
diff --git a/config/metrics/counts_28d/20220510024223_p_ci_templates_jobs_sast_iac_monthly.yml b/config/metrics/counts_28d/20220510024223_p_ci_templates_jobs_sast_iac_monthly.yml
new file mode 100644
index 00000000000..b14d684b908
--- /dev/null
+++ b/config/metrics/counts_28d/20220510024223_p_ci_templates_jobs_sast_iac_monthly.yml
@@ -0,0 +1,26 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_jobs_sast_iac_monthly
+description: Count of pipelines using the stable SAST IaC template
+product_section: sec
+product_stage: secure
+product_group: "group::static analysis"
+product_category: SAST
+value_type: number
+status: active
+milestone: "15.0"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86275
+time_frame: 28d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+options:
+ events:
+ - p_ci_templates_jobs_sast_iac
diff --git a/config/metrics/counts_28d/20220510024223_p_ci_templates_security_sast_iac_monthly.yml b/config/metrics/counts_28d/20220510024223_p_ci_templates_security_sast_iac_monthly.yml
new file mode 100644
index 00000000000..0925312f33a
--- /dev/null
+++ b/config/metrics/counts_28d/20220510024223_p_ci_templates_security_sast_iac_monthly.yml
@@ -0,0 +1,26 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_security_sast_iac_monthly
+description: Count of pipelines using the stable SAST IaC template
+product_section: sec
+product_stage: secure
+product_group: "group::static analysis"
+product_category: SAST
+value_type: number
+status: active
+milestone: "15.0"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86275
+time_frame: 28d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+options:
+ events:
+ - p_ci_templates_security_sast_iac
diff --git a/config/metrics/counts_7d/20220510024437_p_ci_templates_jobs_sast_iac_weekly.yml b/config/metrics/counts_7d/20220510024437_p_ci_templates_jobs_sast_iac_weekly.yml
new file mode 100644
index 00000000000..9bba92b5162
--- /dev/null
+++ b/config/metrics/counts_7d/20220510024437_p_ci_templates_jobs_sast_iac_weekly.yml
@@ -0,0 +1,26 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_jobs_sast_iac_weekly
+description: Count of pipelines using the stable SAST IaC template
+product_section: sec
+product_stage: secure
+product_group: "group::static analysis"
+product_category: SAST
+value_type: number
+status: active
+milestone: "15.0"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86275
+time_frame: 7d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+options:
+ events:
+ - p_ci_templates_jobs_sast_iac
diff --git a/config/metrics/counts_7d/20220510024437_p_ci_templates_security_sast_iac_weekly.yml b/config/metrics/counts_7d/20220510024437_p_ci_templates_security_sast_iac_weekly.yml
new file mode 100644
index 00000000000..c28dfd94cad
--- /dev/null
+++ b/config/metrics/counts_7d/20220510024437_p_ci_templates_security_sast_iac_weekly.yml
@@ -0,0 +1,26 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_security_sast_iac_weekly
+description: Count of pipelines using the stable SAST IaC template
+product_section: sec
+product_stage: secure
+product_group: "group::static analysis"
+product_category: SAST
+value_type: number
+status: active
+milestone: "15.0"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86275
+time_frame: 7d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+options:
+ events:
+ - p_ci_templates_security_sast_iac
diff --git a/data/deprecations/15-0-ci-cd-settings-update-mutation-renamed.yml b/data/deprecations/15-0-ci-cd-settings-update-mutation-renamed.yml
new file mode 100644
index 00000000000..7f426190963
--- /dev/null
+++ b/data/deprecations/15-0-ci-cd-settings-update-mutation-renamed.yml
@@ -0,0 +1,19 @@
+- name: "CiCdSettingsUpdate mutation renamed to ProjectCiCdSettingsUpdate"
+ announcement_milestone: "15.0"
+ announcement_date: "2022-05-22"
+ removal_milestone: "16.0"
+ removal_date: "2023-05-22"
+ breaking_change: true
+ reporter: pedropombeiro
+ stage: Verify
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/361801
+ body: |
+ The `CiCdSettingsUpdate` mutation was renamed to `ProjectCiCdSettingsUpdate` in GitLab 15.0.
+ The `CiCdSettingsUpdate` mutation will be removed in GitLab 16.0.
+ Any user scripts that use the `CiCdSettingsUpdate` mutation must be updated to use `ProjectCiCdSettingsUpdate`
+ instead.
+
+ tiers: [Core, Premium, Ultimate]
+ documentation_url: https://docs.gitlab.com/ee/api/graphql/reference/#mutationprojectcicdsettingsupdate
+ image_url:
+ video_url:
diff --git a/data/removals/15_0/15-0-Legacy-approval-status-names-from-License-Compliance-API.yml b/data/removals/15_0/15-0-Legacy-approval-status-names-from-License-Compliance-API.yml
new file mode 100644
index 00000000000..4a241f913a1
--- /dev/null
+++ b/data/removals/15_0/15-0-Legacy-approval-status-names-from-License-Compliance-API.yml
@@ -0,0 +1,11 @@
+- name: "Legacy approval status names in License Compliance API"
+ announcement_milestone: "14.6"
+ announcement_date: "2021-12-13"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: false
+ reporter: sam.white
+ stage: secure
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/345839
+ body: | # (required) Do not modify this line, instead modify the lines below.
+ We have now removed the deprecated legacy names for approval status of license policy (`blacklisted`, `approved`) in the API queries and responses. If you are using our License Compliance API you should stop using the `approved` and `blacklisted` query parameters, they are now `allowed` and `denied`. In 15.0 the responses will also stop using `approved` and `blacklisted` so you may need to adjust any of your custom tools.
diff --git a/data/removals/15_0/15-0-Retire-js-analyzer.yml b/data/removals/15_0/15-0-Retire-js-analyzer.yml
new file mode 100644
index 00000000000..5b5d38d039c
--- /dev/null
+++ b/data/removals/15_0/15-0-Retire-js-analyzer.yml
@@ -0,0 +1,13 @@
+- name: "Retire-JS Dependency Scanning tool"
+ announcement_milestone: "14.8"
+ announcement_date: "2022-02-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ reporter: sam.white
+ body: | # Do not modify this line, instead modify the lines below.
+ We have removed support for retire.js from Dependency Scanning as of May 22, 2022 in GitLab 15.0. JavaScript scanning functionality will not be affected as it is still being covered by Gemnasium.
+
+ If you have explicitly excluded retire.js using the `DS_EXCLUDED_ANALYZERS` variable, then you will be able to remove the reference to retire.js. If you have customized your pipeline’s Dependency Scanning configuration related to the `retire-js-dependency_scanning` job, then you will want to switch to `gemnasium-dependency_scanning`. If you have not used the `DS_EXCLUDED_ANALYZERS` to reference retire.js, or customized your template specifically for retire.js, you will not need to take any action.
+ stage: secure
+ issue_url: "https://gitlab.com/gitlab-org/gitlab/-/issues/289830"
diff --git a/data/removals/15_0/15-0-bundler-audit.yml b/data/removals/15_0/15-0-bundler-audit.yml
new file mode 100644
index 00000000000..991280585ba
--- /dev/null
+++ b/data/removals/15_0/15-0-bundler-audit.yml
@@ -0,0 +1,13 @@
+- name: "bundler-audit Dependency Scanning tool"
+ announcement_milestone: "14.8"
+ announcement_date: "2022-02-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ reporter: sam.white
+ body: | # Do not modify this line, instead modify the lines below.
+ We are removing bundler-audit from Dependency Scanning on May 22, 2022 in 15.0. After this removal, Ruby scanning functionality will not be affected as it is still being covered by Gemnasium.
+
+ If you have explicitly excluded bundler-audit using the `DS_EXCLUDED_ANALYZERS` variable, then you will be able to remove the reference to bundler-audit. If you have customized your pipeline’s Dependency Scanning configuration related to the `bundler-audit-dependency_scanning` job, then you will want to switch to `gemnasium-dependency_scanning`. If you have not used the `DS_EXCLUDED_ANALYZERS` to reference bundler-audit or customized your template specifically for bundler-audit, you will not need to take any action.
+ stage: secure
+ issue_url: "https://gitlab.com/gitlab-org/gitlab/-/issues/347491"
diff --git a/data/removals/15_0/15-0-ds-default-analyzers.yml b/data/removals/15_0/15-0-ds-default-analyzers.yml
new file mode 100644
index 00000000000..702ce854d0d
--- /dev/null
+++ b/data/removals/15_0/15-0-ds-default-analyzers.yml
@@ -0,0 +1,12 @@
+- name: "DS_DEFAULT_ANALYZERS environment variable"
+ announcement_milestone: "14.0"
+ announcement_date: "2021-06-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ reporter: sam.white
+ body: | # Do not modify this line, instead modify the lines below.
+ We are removing the `DS_DEFAULT_ANALYZERS` environment variable from Dependency Scanning on May 22, 2022 in 15.0. After this removal, this variable's value will be ignored. To configure which analyzers to run with the default configuration, you should use the `DS_EXCLUDED_ANALYZERS` variable instead.
+
+ stage: secure
+ issue_url: "https://gitlab.com/gitlab-org/gitlab/-/issues/333299"
diff --git a/data/removals/15_0/15-0-sast-dotnet-21.yml b/data/removals/15_0/15-0-sast-dotnet-21.yml
new file mode 100644
index 00000000000..28f13949154
--- /dev/null
+++ b/data/removals/15_0/15-0-sast-dotnet-21.yml
@@ -0,0 +1,33 @@
+- name: "SAST support for .NET 2.1"
+ announcement_milestone: "14.8"
+ announcement_date: "2022-02-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: false
+ reporter: connorgilbert
+ stage: Secure
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/352553
+ body: | # (required) Do not modify this line, instead modify the lines below.
+ The [GitLab SAST Security Code Scan analyzer](https://gitlab.com/gitlab-org/security-products/analyzers/security-code-scan) scans .NET code for security vulnerabilities.
+ For technical reasons, the analyzer must first build the code to scan it.
+
+ In GitLab versions prior to 15.0, the default analyzer image (version 2) included support for:
+
+ - .NET 2.1
+ - .NET Core 3.1
+ - .NET 5.0
+
+ In GitLab 15.0, we've changed the default major version for this analyzer from version 2 to version 3. This change:
+
+ - Adds [severity values for vulnerabilities](https://gitlab.com/gitlab-org/gitlab/-/issues/350408) along with [other new features and improvements](https://gitlab.com/gitlab-org/security-products/analyzers/security-code-scan/-/blob/master/CHANGELOG.md).
+ - Removes .NET 2.1 support.
+ - Adds support for .NET 6.0, Visual Studio 2019, and Visual Studio 2022.
+
+ Version 3 was [announced in GitLab 14.6](https://about.gitlab.com/releases/2021/12/22/gitlab-14-6-released/#sast-support-for-net-6) and made available as an optional upgrade.
+
+ If you rely on .NET 2.1 support being present in the analyzer image by default, you must take action as detailed in the [deprecation issue for this change](https://gitlab.com/gitlab-org/gitlab/-/issues/352553#breaking-change).
+# The following items are not published on the docs page, but may be used in the future.
+ tiers: [Free, Silver, Gold, Core, Premium, Ultimate]
+ documentation_url: https://docs.gitlab.com/ee/user/application_security/sast/#supported-languages-and-frameworks # (optional) This is a link to the current documentation page
+ image_url: # (optional) This is a link to a thumbnail image depicting the feature
+ video_url: # (optional) Use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg
diff --git a/data/removals/15_0/removal-manage-premium-required-pipelines.yml b/data/removals/15_0/removal-manage-premium-required-pipelines.yml
new file mode 100644
index 00000000000..1e91fe1d3fc
--- /dev/null
+++ b/data/removals/15_0/removal-manage-premium-required-pipelines.yml
@@ -0,0 +1,18 @@
+- name: "Required pipeline configurations in Premium tier"
+ announcement_milestone: "14.8"
+ announcement_date: "2021-02-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ reporter: stkerr
+ body: |
+ [Required pipeline configuration](https://docs.gitlab.com/ee/user/admin_area/settings/continuous_integration.html#required-pipeline-configuration) helps to define and mandate organization-wide pipeline configurations and is a requirement at an executive and organizational level. To align better with our [pricing philosophy](https://about.gitlab.com/company/pricing/#three-tiers), this feature is removed from the Premium tier in GitLab 15.0. This feature continues to be available in the GitLab Ultimate tier.
+
+ We recommend customers use [Compliance Pipelines](https://docs.gitlab.com/ee/user/project/settings/index.html#compliance-pipeline-configuration), also in GitLab Ultimate, as an alternative as it provides greater flexibility, allowing required pipelines to be assigned to specific compliance framework labels.
+
+ This change also helps GitLab remain consistent in our tiering strategy with the other related Ultimate-tier features:
+
+ - [Security policies](https://docs.gitlab.com/ee/user/application_security/policies/).
+ - [Compliance framework pipelines](https://docs.gitlab.com/ee/user/project/settings/index.html#compliance-pipeline-configuration).
+
+ stage: "Manage"
diff --git a/data/removals/15_0/removal_manage_optional_pat_expiration.yml b/data/removals/15_0/removal_manage_optional_pat_expiration.yml
new file mode 100644
index 00000000000..21c5b99d1a8
--- /dev/null
+++ b/data/removals/15_0/removal_manage_optional_pat_expiration.yml
@@ -0,0 +1,13 @@
+- name: "Optional enforcement of personal access token expiration"
+ announcement_milestone: "14.8"
+ announcement_date: "2022-02-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ reporter: stkerr
+ body: |
+ Allowing expired personal access tokens to be used is unusual from a security perspective and could create unusual situations where an
+ expired key is unintentionally able to be used. Unexpected behavior in a security feature is inherently dangerous and so we now do not let expired personal access tokens be used.
+
+ issue_url: "https://gitlab.com/gitlab-org/gitlab/-/issues/351962"
+ documentation_url: "https://docs.gitlab.com/ee/user/admin_area/settings/account_and_limit_settings.html#allow-expired-access-tokens-to-be-used-removed"
diff --git a/data/removals/15_0/removal_manage_ssh_expiration.yml b/data/removals/15_0/removal_manage_ssh_expiration.yml
new file mode 100644
index 00000000000..accd1d49f6f
--- /dev/null
+++ b/data/removals/15_0/removal_manage_ssh_expiration.yml
@@ -0,0 +1,13 @@
+- name: "Optional enforcement of SSH expiration"
+ announcement_milestone: "14.8"
+ announcement_date: "2022-02-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ reporter: stkerr
+ body: |
+ Disabling SSH expiration enforcement is unusual from a security perspective and could create unusual situations where an expired
+ key is unintentionally able to be used. Unexpected behavior in a security feature is inherently dangerous and so now we enforce
+ expiration on all SSH keys.
+ issue_url: "https://gitlab.com/gitlab-org/gitlab/-/issues/351963"
+ documentation_url: "https://docs.gitlab.com/ee/user/admin_area/settings/account_and_limit_settings.html#allow-expired-ssh-keys-to-be-used-deprecated"
diff --git a/data/removals/15_0/removal_manage_status_check_passed_status.yml b/data/removals/15_0/removal_manage_status_check_passed_status.yml
new file mode 100644
index 00000000000..598cba369cb
--- /dev/null
+++ b/data/removals/15_0/removal_manage_status_check_passed_status.yml
@@ -0,0 +1,25 @@
+- name: "External status check API breaking changes"
+ announcement_milestone: "14.8"
+ announcement_date: "2022-02-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ reporter: stkerr
+ body: |
+ The [external status check API](https://docs.gitlab.com/ee/api/status_checks.html) was originally implemented to
+ support pass-by-default requests to mark a status check as passing. Pass-by-default requests are now removed.
+ Specifically, the following are removed:
+
+ - Requests that do not contain the `status` field.
+ - Requests that have the `status` field set to `approved`.
+
+ From GitLab 15.0, status checks are only set to a passing state if the `status` field is both present
+ and set to `passed`. Requests that:
+
+ - Do not contain the `status` field will be rejected with a `400` error. For more information, see [the relevant issue](https://gitlab.com/gitlab-org/gitlab/-/issues/338827).
+ - Contain any value other than `passed`, such as `approved`, cause the status check to fail. For more information, see [the relevant issue](https://gitlab.com/gitlab-org/gitlab/-/issues/339039).
+
+ To align with this change, API calls to list external status checks also return the value of `passed` rather than
+ `approved` for status checks that have passed.
+ stage: "Manage"
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/339039
diff --git a/db/post_migrate/20220412044906_finalize_traversal_ids_background_migrations.rb b/db/post_migrate/20220412044906_finalize_traversal_ids_background_migrations.rb
index f2aa9c0b717..fb43e13364d 100644
--- a/db/post_migrate/20220412044906_finalize_traversal_ids_background_migrations.rb
+++ b/db/post_migrate/20220412044906_finalize_traversal_ids_background_migrations.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
class FinalizeTraversalIdsBackgroundMigrations < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
def up
finalize_background_migration('BackfillNamespaceTraversalIdsRoots')
finalize_background_migration('BackfillNamespaceTraversalIdsChildren')
diff --git a/doc/administration/gitaly/index.md b/doc/administration/gitaly/index.md
index 1660269683d..f43f9f5d6c1 100644
--- a/doc/administration/gitaly/index.md
+++ b/doc/administration/gitaly/index.md
@@ -232,6 +232,137 @@ variable replication factor is tracked in [this issue](https://gitlab.com/groups
As with normal Gitaly storages, virtual storages can be sharded.
+### Storage layout
+
+WARNING:
+The storage layout is an internal detail of Gitaly Cluster and is not guaranteed to remain stable between releases.
+The information here is only for informational purposes and to help with debugging. Performing changes in the
+repositories directly on the disk is not supported and may lead to breakage or the changes being overwritten.
+
+Gitaly Cluster's virtual storages provide an abstraction that looks like a single storage but actually consists of
+multiple physical storages. Gitaly Cluster has to replicate each operation to each physical storage. Operations
+may succeed on some of the physical storages but fail on others.
+
+Partially applied operations can cause problems with other operations and leave the system in a state it can't recover from.
+To avoid these types of problems, each operation should either fully apply or not apply at all. This property of operations is called
+[atomicity](https://en.wikipedia.org/wiki/Atomicity_(database_systems)).
+
+GitLab controls the storage layout on the repository storages. GitLab instructs the repository storage where to create,
+delete, and move repositories. These operations create atomicity issues when they are being applied to multiple physical storages.
+For example:
+
+- GitLab deletes a repository while one of its replicas is unavailable.
+- GitLab later recreates the repository.
+
+As a result, the stale replica that was unavailable at the time of deletion may cause conflicts and prevent
+recreation of the repository.
+
+These atomicity issues have caused multiple problems in the past with:
+
+- Geo syncing to a secondary site with Gitaly Cluster.
+- Backup restoration.
+- Repository moves between repository storages.
+
+Gitaly Cluster provides atomicity for these operations by storing repositories on the disk in a special layout that prevents
+conflicts that could occur due to partially applied operations.
+
+#### Client-generated replica paths
+
+Repositories are stored in the storages at the relative path determined by the [Gitaly client](#gitaly-architecture). These paths can be
+identified by them not beginning with the `@cluster` prefix. The relative paths
+follow the [hashed storage](../repository_storage_types.md#hashed-storage) schema.
+
+#### Praefect-generated replica paths (GitLab 15.0 and later)
+
+> Introduced in GitLab 15.0 behind [a feature flag](https://gitlab.com/gitlab-org/gitaly/-/issues/4218) named `gitaly_praefect_generated_replica_paths`. Disabled by default.
+
+FLAG:
+On self-managed GitLab, by default this feature is not available. To make it available, ask an administrator to [enable the feature flag](../feature_flags.md)
+named `gitaly_praefect_generated_replica_paths`. On GitLab.com, this feature is available but can be configured by GitLab.com administrators only. The feature is not ready for production use.
+
+When Gitaly Cluster creates a repository, it assigns the repository a unique and permanent ID called the _repository ID_. The repository ID is
+internal to Gitaly Cluster and doesn't relate to any IDs elsewhere in GitLab. If a repository is removed from Gitaly Cluster and later moved
+back, the repository is assigned a new repository ID and is a different repository from Gitaly Cluster's perspective. The sequence of repository IDs
+always increases, but there may be gaps in the sequence.
+
+The repository ID is used to derive a unique storage path called _replica path_ for each repository on the cluster. The replicas of
+a repository are all stored at the same replica path on the storages. The replica path is distinct from the _relative path_:
+
+- The relative path is a name the Gitaly client uses to identify a repository, together with its virtual storage, that is unique to them.
+- The replica path is the actual physical path in the physical storages.
+
+Praefect translates the repositories in the RPCs from the virtual `(virtual storage, relative path)` identifier into physical repository
+`(storage, replica_path)` identifier when handling the client requests.
+
+The format of the replica path for:
+
+- Object pools is `@cluster/pools/<xx>/<xx>/<repository ID>`. Object pools are stored in a different directory than other repositories.
+ They must be identifiable by Gitaly to avoid pruning them as part of housekeeping. Pruning object pools can cause data loss in the linked
+ repositories.
+- Other repositories is `@cluster/repositories/<xx>/<xx>/<repository ID>`
+
+For example, `@cluster/repositories/6f/96/54771`.
+
+The last component of the replica path, `54771`, is the repository ID. This can be used to identify the repository on the disk.
+
+`<xx>/<xx>` are the first four hex digits of the SHA256 hash of the string representation of the repository ID. This is used to balance
+the repositories evenly into subdirectories to avoid overly large directories that might cause problems on some file
+systems. In this case, `54771` hashes to `6f960ab01689464e768366d3315b3d3b2c28f38761a58a70110554eb04d582f7` so the
+first four digits are `6f` and `96`.
+
+#### Identify repositories on disk
+
+Use the [`praefect metadata`](troubleshooting.md#view-repository-metadata) subcommand to:
+
+- Retrieve a repository's virtual storage and relative path from the metadata store. After you have the hashed storage path, you can use the Rails
+ console to retrieve the project path.
+- Find where a repository is stored in the cluster with either:
+ - The virtual storage and relative path.
+ - The repository ID.
+
+The repository on disk also contains the project path in the Git configuration file. The configuration file can be used to determine
+the project's location even if the repository's metadata has been deleted. Follow the
+[instructions in hashed storage's documentation](../repository_storage_types.md#from-hashed-path-to-project-name).
+
+#### Atomicity of operations
+
+Gitaly Cluster uses the PostgreSQL metadata store with the storage layout to ensure atomicity of repository creation,
+deletion, and move operations. The disk operations can't be atomically applied across multiple storages. However, PostgreSQL guarantees
+the atomicity of the metadata operations. Gitaly Cluster models the operations in a manner that the failing operations always leave
+the metadata consistent. The disks may contain stale state even after successful operations. This is expected and the leftover state
+won't intefere with future operations but may use up disk space unnecessarily until a clean up is performed.
+
+There is on-going work on a [background crawler](https://gitlab.com/gitlab-org/gitaly/-/issues/3719) that cleans up the leftover
+repositories from the storages.
+
+##### Repository creations
+
+When creating repositories, Praefect:
+
+1. Reserves a repository ID from PostgreSQL. This is atomic and no two creations receive the same ID.
+1. Creates replicas on the Gitaly storages in the replica path derived from the repository ID.
+1. Creates metadata records after the repository is successfully created on disk.
+
+Even if two concurrent operations create the same repository, they'd be stored in different directories on the storages and not
+conflict. The first to complete creates the metadata record and the other operation fails with an "already exists" error.
+The failing creation leaves leftover repositories on the storages. There is on-going work on a
+[background crawler](https://gitlab.com/gitlab-org/gitaly/-/issues/3719) that clean up the leftover repositories from the storages.
+
+The repository IDs are generated from the `repositories_repository_id_seq` in PostgreSQL. In the above example, the failing operation took
+one repository ID without successfully creating a repository with it. Failed repository creations are expected lead to gaps in the repository IDs.
+
+##### Repository deletions
+
+A repository is deleted by removing its metadata record. The repository ceases to logically exist as soon as the metadata record is deleted.
+PostgreSQL guarantees the atomicity of the removal and a concurrent delete fails with a "not found" error. After successfully deleting
+the metadata record, Praefect attempts to remove the replicas from the storages. This may fail and leave leftover state in the storages.
+The leftover state is eventually cleaned up.
+
+##### Repository moves
+
+Unlike Gitaly, Gitaly Cluster doesn't move the repositories in the storages but only virtually moves the repository by updating the
+relative path of the repository in the metadata store.
+
### Moving beyond NFS
Engineering support for NFS for Git repositories is deprecated. Technical support is planned to be unavailable starting
diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md
index 5816d438e10..871c0e4c988 100644
--- a/doc/api/graphql/reference/index.md
+++ b/doc/api/graphql/reference/index.md
@@ -850,6 +850,11 @@ Input type: `BulkEnableDevopsAdoptionNamespacesInput`
### `Mutation.ciCdSettingsUpdate`
+WARNING:
+**Deprecated** in 15.0.
+This was renamed.
+Use: `ProjectCiCdSettingsUpdate`.
+
Input type: `CiCdSettingsUpdateInput`
#### Arguments
@@ -3908,6 +3913,29 @@ Input type: `PipelineRetryInput`
| <a id="mutationpipelineretryerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
| <a id="mutationpipelineretrypipeline"></a>`pipeline` | [`Pipeline`](#pipeline) | Pipeline after mutation. |
+### `Mutation.projectCiCdSettingsUpdate`
+
+Input type: `ProjectCiCdSettingsUpdateInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationprojectcicdsettingsupdateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationprojectcicdsettingsupdatefullpath"></a>`fullPath` | [`ID!`](#id) | Full Path of the project the settings belong to. |
+| <a id="mutationprojectcicdsettingsupdatejobtokenscopeenabled"></a>`jobTokenScopeEnabled` | [`Boolean`](#boolean) | Indicates CI job tokens generated in this project have restricted access to resources. |
+| <a id="mutationprojectcicdsettingsupdatekeeplatestartifact"></a>`keepLatestArtifact` | [`Boolean`](#boolean) | Indicates if the latest artifact should be kept for this project. |
+| <a id="mutationprojectcicdsettingsupdatemergepipelinesenabled"></a>`mergePipelinesEnabled` | [`Boolean`](#boolean) | Indicates if merge pipelines are enabled for the project. |
+| <a id="mutationprojectcicdsettingsupdatemergetrainsenabled"></a>`mergeTrainsEnabled` | [`Boolean`](#boolean) | Indicates if merge trains are enabled for the project. |
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationprojectcicdsettingsupdatecicdsettings"></a>`ciCdSettings` | [`ProjectCiCdSetting!`](#projectcicdsetting) | CI/CD settings after mutation. |
+| <a id="mutationprojectcicdsettingsupdateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationprojectcicdsettingsupdateerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+
### `Mutation.projectSetComplianceFramework`
Assign (or unset) a compliance framework to a project.
@@ -7418,6 +7446,30 @@ The edge type for [`OncallParticipantType`](#oncallparticipanttype).
| <a id="oncallparticipanttypeedgecursor"></a>`cursor` | [`String!`](#string) | A cursor for use in pagination. |
| <a id="oncallparticipanttypeedgenode"></a>`node` | [`OncallParticipantType`](#oncallparticipanttype) | The item at the end of the edge. |
+#### `PackageBaseConnection`
+
+The connection type for [`PackageBase`](#packagebase).
+
+##### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="packagebaseconnectioncount"></a>`count` | [`Int!`](#int) | Total count of collection. |
+| <a id="packagebaseconnectionedges"></a>`edges` | [`[PackageBaseEdge]`](#packagebaseedge) | A list of edges. |
+| <a id="packagebaseconnectionnodes"></a>`nodes` | [`[PackageBase]`](#packagebase) | A list of nodes. |
+| <a id="packagebaseconnectionpageinfo"></a>`pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+#### `PackageBaseEdge`
+
+The edge type for [`PackageBase`](#packagebase).
+
+##### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="packagebaseedgecursor"></a>`cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| <a id="packagebaseedgenode"></a>`node` | [`PackageBase`](#packagebase) | The item at the end of the edge. |
+
#### `PackageConnection`
The connection type for [`Package`](#package).
@@ -13992,7 +14044,7 @@ Active period time range for on-call rotation.
### `Package`
-Represents a package in the Package Registry. Note that this type is in beta and susceptible to changes.
+Represents a package with pipelines in the Package Registry.
#### Fields
@@ -14011,6 +14063,26 @@ Represents a package in the Package Registry. Note that this type is in beta and
| <a id="packageupdatedat"></a>`updatedAt` | [`Time!`](#time) | Date of most recent update. |
| <a id="packageversion"></a>`version` | [`String`](#string) | Version string. |
+### `PackageBase`
+
+Represents a package in the Package Registry.
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="packagebasecandestroy"></a>`canDestroy` | [`Boolean!`](#boolean) | Whether the user can destroy the package. |
+| <a id="packagebasecreatedat"></a>`createdAt` | [`Time!`](#time) | Date of creation. |
+| <a id="packagebaseid"></a>`id` | [`PackagesPackageID!`](#packagespackageid) | ID of the package. |
+| <a id="packagebasemetadata"></a>`metadata` | [`PackageMetadata`](#packagemetadata) | Package metadata. |
+| <a id="packagebasename"></a>`name` | [`String!`](#string) | Name of the package. |
+| <a id="packagebasepackagetype"></a>`packageType` | [`PackageTypeEnum!`](#packagetypeenum) | Package type. |
+| <a id="packagebaseproject"></a>`project` | [`Project!`](#project) | Project where the package is stored. |
+| <a id="packagebasestatus"></a>`status` | [`PackageStatus!`](#packagestatus) | Package status. |
+| <a id="packagebasetags"></a>`tags` | [`PackageTagConnection`](#packagetagconnection) | Package tags. (see [Connections](#connections)) |
+| <a id="packagebaseupdatedat"></a>`updatedAt` | [`Time!`](#time) | Date of most recent update. |
+| <a id="packagebaseversion"></a>`version` | [`String`](#string) | Version string. |
+
### `PackageComposerJsonType`
Represents a composer JSON file.
@@ -14051,7 +14123,7 @@ Represents a package dependency link.
### `PackageDetailsType`
-Represents a package details in the Package Registry. Note that this type is in beta and susceptible to changes.
+Represents a package details in the Package Registry.
#### Fields
@@ -14079,7 +14151,7 @@ Represents a package details in the Package Registry. Note that this type is in
| <a id="packagedetailstypetags"></a>`tags` | [`PackageTagConnection`](#packagetagconnection) | Package tags. (see [Connections](#connections)) |
| <a id="packagedetailstypeupdatedat"></a>`updatedAt` | [`Time!`](#time) | Date of most recent update. |
| <a id="packagedetailstypeversion"></a>`version` | [`String`](#string) | Version string. |
-| <a id="packagedetailstypeversions"></a>`versions` | [`PackageConnection`](#packageconnection) | Other versions of the package. (see [Connections](#connections)) |
+| <a id="packagedetailstypeversions"></a>`versions` | [`PackageBaseConnection`](#packagebaseconnection) | Other versions of the package. (see [Connections](#connections)) |
### `PackageFile`
diff --git a/doc/ci/jobs/index.md b/doc/ci/jobs/index.md
index e589fd8b045..42827dc2d48 100644
--- a/doc/ci/jobs/index.md
+++ b/doc/ci/jobs/index.md
@@ -392,5 +392,5 @@ deploy me:
The behavior of deployment jobs can be controlled with
[deployment safety](../environments/deployment_safety.md) settings like
-[skipping outdated deployment jobs](../environments/deployment_safety.md#prevent-deployments-during-deploy-freeze-windows)
+[skipping outdated deployment jobs](../environments/deployment_safety.md#skip-outdated-deployment-jobs)
and [ensuring only one deployment job runs at a time](../environments/deployment_safety.md#ensure-only-one-deployment-job-runs-at-a-time).
diff --git a/doc/ci/pipelines/cicd_minutes.md b/doc/ci/pipelines/cicd_minutes.md
index ff4715de035..55dc03fd0fa 100644
--- a/doc/ci/pipelines/cicd_minutes.md
+++ b/doc/ci/pipelines/cicd_minutes.md
@@ -90,6 +90,8 @@ To view CI/CD minutes being used for your group:
## View CI/CD minutes used by a personal namespace
+> Displaying shared runners duration [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/345795) in GitLab 15.0.
+
You can view the number of CI/CD minutes being used by a personal namespace:
1. On the top bar, in the top right corner, select your avatar.
diff --git a/doc/integration/alicloud.md b/doc/integration/alicloud.md
index ad92b4657a0..1619bdc9504 100644
--- a/doc/integration/alicloud.md
+++ b/doc/integration/alicloud.md
@@ -1,6 +1,6 @@
---
-stage: Ecosystem
-group: Integrations
+stage: Manage
+group: Authentication and Authorization
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/integration/auth0.md b/doc/integration/auth0.md
index 8bac95c5f04..1e1ee9aebc5 100644
--- a/doc/integration/auth0.md
+++ b/doc/integration/auth0.md
@@ -1,6 +1,6 @@
---
-stage: Ecosystem
-group: Integrations
+stage: Manage
+group: Authentication and Authorization
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/integration/azure.md b/doc/integration/azure.md
index 5749e638164..515e7406545 100644
--- a/doc/integration/azure.md
+++ b/doc/integration/azure.md
@@ -1,6 +1,6 @@
---
-stage: Ecosystem
-group: Integrations
+stage: Manage
+group: Authentication and Authorization
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/integration/bitbucket.md b/doc/integration/bitbucket.md
index 6b5ead6c2da..165d25c0d90 100644
--- a/doc/integration/bitbucket.md
+++ b/doc/integration/bitbucket.md
@@ -1,6 +1,6 @@
---
-stage: Ecosystem
-group: Integrations
+stage: Manage
+group: Authentication and Authorization
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/integration/cas.md b/doc/integration/cas.md
index 9594836164a..a0cb6bd98cd 100644
--- a/doc/integration/cas.md
+++ b/doc/integration/cas.md
@@ -1,6 +1,6 @@
---
-stage: Ecosystem
-group: Integrations
+stage: Manage
+group: Authentication and Authorization
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/integration/ding_talk.md b/doc/integration/ding_talk.md
index 2bc4f29298a..437648b1adf 100644
--- a/doc/integration/ding_talk.md
+++ b/doc/integration/ding_talk.md
@@ -1,6 +1,6 @@
---
-stage: Ecosystem
-group: Integrations
+stage: Manage
+group: Authentication and Authorization
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/integration/facebook.md b/doc/integration/facebook.md
index b94fa24d290..c73a8d5e461 100644
--- a/doc/integration/facebook.md
+++ b/doc/integration/facebook.md
@@ -1,6 +1,6 @@
---
-stage: Ecosystem
-group: Integrations
+stage: Manage
+group: Authentication and Authorization
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/integration/github.md b/doc/integration/github.md
index a265d5c67ed..3c14e8db4de 100644
--- a/doc/integration/github.md
+++ b/doc/integration/github.md
@@ -1,6 +1,6 @@
---
-stage: Ecosystem
-group: Integrations
+stage: Manage
+group: Authentication and Authorization
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/integration/gitlab.md b/doc/integration/gitlab.md
index 132006ab996..68ba676b539 100644
--- a/doc/integration/gitlab.md
+++ b/doc/integration/gitlab.md
@@ -1,6 +1,6 @@
---
-stage: Ecosystem
-group: Integrations
+stage: Manage
+group: Authentication and Authorization
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/integration/google.md b/doc/integration/google.md
index d6a37dbf30f..596700822cd 100644
--- a/doc/integration/google.md
+++ b/doc/integration/google.md
@@ -1,6 +1,6 @@
---
-stage: Ecosystem
-group: Integrations
+stage: Manage
+group: Authentication and Authorization
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/integration/oauth2_generic.md b/doc/integration/oauth2_generic.md
index 3d44da8b4c8..e3ec1aa16a1 100644
--- a/doc/integration/oauth2_generic.md
+++ b/doc/integration/oauth2_generic.md
@@ -1,6 +1,6 @@
---
-stage: Ecosystem
-group: Integrations
+stage: Manage
+group: Authentication and Authorization
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/integration/omniauth.md b/doc/integration/omniauth.md
index f6e41e808af..296de9e511a 100644
--- a/doc/integration/omniauth.md
+++ b/doc/integration/omniauth.md
@@ -1,6 +1,6 @@
---
-stage: Ecosystem
-group: Integrations
+stage: Manage
+group: Authentication and Authorization
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/integration/openid_connect_provider.md b/doc/integration/openid_connect_provider.md
index 1254b29bfb9..cc9c8ffd012 100644
--- a/doc/integration/openid_connect_provider.md
+++ b/doc/integration/openid_connect_provider.md
@@ -1,6 +1,6 @@
---
-stage: Ecosystem
-group: Integrations
+stage: Manage
+group: Authentication and Authorization
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/integration/salesforce.md b/doc/integration/salesforce.md
index 8d4d8ff9f52..67c24415226 100644
--- a/doc/integration/salesforce.md
+++ b/doc/integration/salesforce.md
@@ -1,6 +1,6 @@
---
-stage: Ecosystem
-group: Integrations
+stage: Manage
+group: Authentication and Authorization
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/integration/twitter.md b/doc/integration/twitter.md
index 3aba6b70b94..a7facf76f05 100644
--- a/doc/integration/twitter.md
+++ b/doc/integration/twitter.md
@@ -1,6 +1,6 @@
---
-stage: Ecosystem
-group: Integrations
+stage: Manage
+group: Authentication and Authorization
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/security/rate_limits.md b/doc/security/rate_limits.md
index cdf99e8377d..995eed4c255 100644
--- a/doc/security/rate_limits.md
+++ b/doc/security/rate_limits.md
@@ -70,6 +70,21 @@ For configuration information, see
## Non-configurable limits
+### Git operations using SSH
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78373) in GitLab 14.7.
+
+GitLab rate limits Git operations by user account and project. If a request from a user for a Git operation
+on a project exceeds the rate limit, GitLab drops further connection requests from that user for the project.
+
+The rate limit applies at the Git command ([plumbing](https://git-scm.com/book/en/v2/Git-Internals-Plumbing-and-Porcelain)) level.
+Each command has a rate limit of 600 per minute. For example:
+
+- `git push` has a rate limit of 600 per minute.
+- `git pull` has its own rate limit of 600 per minute.
+
+Because the same commands are shared by `git-upload-pack`, `git pull`, and `git clone`, they share a rate limit.
+
### Repository archives
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/25750) in GitLab 12.9.
diff --git a/doc/update/deprecations.md b/doc/update/deprecations.md
index dd164720ab1..899d827099d 100644
--- a/doc/update/deprecations.md
+++ b/doc/update/deprecations.md
@@ -51,6 +51,24 @@ Most of the deprecations are **planned for removal in 15.0**, and many of them a
<div class="deprecation removal-160 breaking-change">
+### CiCdSettingsUpdate mutation renamed to ProjectCiCdSettingsUpdate
+
+WARNING:
+This feature will be changed or removed in 16.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+The `CiCdSettingsUpdate` mutation was renamed to `ProjectCiCdSettingsUpdate` in GitLab 15.0.
+The `CiCdSettingsUpdate` mutation will be removed in GitLab 16.0.
+Any user scripts that use the `CiCdSettingsUpdate` mutation must be updated to use `ProjectCiCdSettingsUpdate`
+instead.
+
+**Planned removal milestone: <span class="removal-milestone">16.0</span> (2023-05-22)**
+</div>
+
+<div class="deprecation removal-160 breaking-change">
+
### GraphQL API legacyMode argument for Runner status
WARNING:
diff --git a/doc/update/removals.md b/doc/update/removals.md
index a795d2476a3..69330c258ab 100644
--- a/doc/update/removals.md
+++ b/doc/update/removals.md
@@ -116,6 +116,16 @@ The following `geo:db:*` tasks have been removed from GitLab 15.0 and have been
- `geo:db:test:load` -> `db:test:load:geo`
- `geo:db:test:purge` -> `db:test:purge:geo`
+### DS_DEFAULT_ANALYZERS environment variable
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+We are removing the `DS_DEFAULT_ANALYZERS` environment variable from Dependency Scanning on May 22, 2022 in 15.0. After this removal, this variable's value will be ignored. To configure which analyzers to run with the default configuration, you should use the `DS_EXCLUDED_ANALYZERS` variable instead.
+
### Elasticsearch 6.8.x in GitLab 15.0
WARNING:
@@ -130,6 +140,30 @@ You should not upgrade to Elasticsearch 8 until you have completed the GitLab 15
View the [version requirements](https://docs.gitlab.com/ee/integration/elasticsearch.html#version-requirements) for details.
+### External status check API breaking changes
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+The [external status check API](https://docs.gitlab.com/ee/api/status_checks.html) was originally implemented to
+support pass-by-default requests to mark a status check as passing. Pass-by-default requests are now removed.
+Specifically, the following are removed:
+
+- Requests that do not contain the `status` field.
+- Requests that have the `status` field set to `approved`.
+
+From GitLab 15.0, status checks are only set to a passing state if the `status` field is both present
+and set to `passed`. Requests that:
+
+- Do not contain the `status` field will be rejected with a `400` error. For more information, see [the relevant issue](https://gitlab.com/gitlab-org/gitlab/-/issues/338827).
+- Contain any value other than `passed`, such as `approved`, cause the status check to fail. For more information, see [the relevant issue](https://gitlab.com/gitlab-org/gitlab/-/issues/339039).
+
+To align with this change, API calls to list external status checks also return the value of `passed` rather than
+`approved` for status checks that have passed.
+
### GitLab Serverless
WARNING:
@@ -168,6 +202,10 @@ The issue for this removal is [GitLab-#350682](https://gitlab.com/gitlab-org/git
In GitLab 13.0, we introduced new project and design replication details routes in the Geo Admin UI. These routes are `/admin/geo/replication/projects` and `/admin/geo/replication/designs`. We kept the legacy routes and redirected them to the new routes. These legacy routes `/admin/geo/projects` and `/admin/geo/designs` have been removed in GitLab 15.0. Please update any bookmarks or scripts that may use the legacy routes.
+### Legacy approval status names in License Compliance API
+
+We have now removed the deprecated legacy names for approval status of license policy (`blacklisted`, `approved`) in the API queries and responses. If you are using our License Compliance API you should stop using the `approved` and `blacklisted` query parameters, they are now `allowed` and `denied`. In 15.0 the responses will also stop using `approved` and `blacklisted` so you may need to adjust any of your custom tools.
+
### OAuth implicit grant
WARNING:
@@ -190,6 +228,29 @@ GitLab no longer supports OAuth tokens [without an expiration](https://docs.gitl
Any existing token without an expiration has one automatically generated and applied.
+### Optional enforcement of SSH expiration
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+Disabling SSH expiration enforcement is unusual from a security perspective and could create unusual situations where an expired
+key is unintentionally able to be used. Unexpected behavior in a security feature is inherently dangerous and so now we enforce
+expiration on all SSH keys.
+
+### Optional enforcement of personal access token expiration
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+Allowing expired personal access tokens to be used is unusual from a security perspective and could create unusual situations where an
+expired key is unintentionally able to be used. Unexpected behavior in a security feature is inherently dangerous and so we now do not let expired personal access tokens be used.
+
### Remove Versions from PackageType
WARNING:
@@ -275,6 +336,35 @@ It also depends on a few third-party gems that are not actively maintained anymo
For more information, check the [summary section of the deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/352488#deprecation-summary).
+### Required pipeline configurations in Premium tier
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+[Required pipeline configuration](https://docs.gitlab.com/ee/user/admin_area/settings/continuous_integration.html#required-pipeline-configuration) helps to define and mandate organization-wide pipeline configurations and is a requirement at an executive and organizational level. To align better with our [pricing philosophy](https://about.gitlab.com/company/pricing/#three-tiers), this feature is removed from the Premium tier in GitLab 15.0. This feature continues to be available in the GitLab Ultimate tier.
+
+We recommend customers use [Compliance Pipelines](https://docs.gitlab.com/ee/user/project/settings/index.html#compliance-pipeline-configuration), also in GitLab Ultimate, as an alternative as it provides greater flexibility, allowing required pipelines to be assigned to specific compliance framework labels.
+
+This change also helps GitLab remain consistent in our tiering strategy with the other related Ultimate-tier features:
+
+- [Security policies](https://docs.gitlab.com/ee/user/application_security/policies/).
+- [Compliance framework pipelines](https://docs.gitlab.com/ee/user/project/settings/index.html#compliance-pipeline-configuration).
+
+### Retire-JS Dependency Scanning tool
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+We have removed support for retire.js from Dependency Scanning as of May 22, 2022 in GitLab 15.0. JavaScript scanning functionality will not be affected as it is still being covered by Gemnasium.
+
+If you have explicitly excluded retire.js using the `DS_EXCLUDED_ANALYZERS` variable, then you will be able to remove the reference to retire.js. If you have customized your pipeline’s Dependency Scanning configuration related to the `retire-js-dependency_scanning` job, then you will want to switch to `gemnasium-dependency_scanning`. If you have not used the `DS_EXCLUDED_ANALYZERS` to reference retire.js, or customized your template specifically for retire.js, you will not need to take any action.
+
### Runner status `not_connected` API value
WARNING:
@@ -289,6 +379,27 @@ starting in GitLab 15.0.
Runners that have never contacted the GitLab instance will also return `stale` if created more than 3 months ago.
+### SAST support for .NET 2.1
+
+The [GitLab SAST Security Code Scan analyzer](https://gitlab.com/gitlab-org/security-products/analyzers/security-code-scan) scans .NET code for security vulnerabilities.
+For technical reasons, the analyzer must first build the code to scan it.
+
+In GitLab versions prior to 15.0, the default analyzer image (version 2) included support for:
+
+- .NET 2.1
+- .NET Core 3.1
+- .NET 5.0
+
+In GitLab 15.0, we've changed the default major version for this analyzer from version 2 to version 3. This change:
+
+- Adds [severity values for vulnerabilities](https://gitlab.com/gitlab-org/gitlab/-/issues/350408) along with [other new features and improvements](https://gitlab.com/gitlab-org/security-products/analyzers/security-code-scan/-/blob/master/CHANGELOG.md).
+- Removes .NET 2.1 support.
+- Adds support for .NET 6.0, Visual Studio 2019, and Visual Studio 2022.
+
+Version 3 was [announced in GitLab 14.6](https://about.gitlab.com/releases/2021/12/22/gitlab-14-6-released/#sast-support-for-net-6) and made available as an optional upgrade.
+
+If you rely on .NET 2.1 support being present in the analyzer image by default, you must take action as detailed in the [deprecation issue for this change](https://gitlab.com/gitlab-org/gitlab/-/issues/352553#breaking-change).
+
### Sidekiq configuration for metrics and health checks
WARNING:
@@ -416,6 +527,18 @@ to upgrade from the removed integration to the new supported one.
We are not removing Kerberos SPNEGO integration. We are removing the old password-based Kerberos.
+### bundler-audit Dependency Scanning tool
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+We are removing bundler-audit from Dependency Scanning on May 22, 2022 in 15.0. After this removal, Ruby scanning functionality will not be affected as it is still being covered by Gemnasium.
+
+If you have explicitly excluded bundler-audit using the `DS_EXCLUDED_ANALYZERS` variable, then you will be able to remove the reference to bundler-audit. If you have customized your pipeline’s Dependency Scanning configuration related to the `bundler-audit-dependency_scanning` job, then you will want to switch to `gemnasium-dependency_scanning`. If you have not used the `DS_EXCLUDED_ANALYZERS` to reference bundler-audit or customized your template specifically for bundler-audit, you will not need to take any action.
+
## 14.10
### Permissions change for downloading Composer dependencies
diff --git a/doc/user/application_security/dast/index.md b/doc/user/application_security/dast/index.md
index 1c5713664c6..1389db65713 100644
--- a/doc/user/application_security/dast/index.md
+++ b/doc/user/application_security/dast/index.md
@@ -627,7 +627,7 @@ These CI/CD variables are specific to DAST. They can be used to customize the be
| `DAST_AGGREGATE_VULNERABILITIES` | boolean | Vulnerability aggregation is set to `true` by default. To disable this feature and see each vulnerability individually set to `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/254043) in GitLab 14.0. |
| `DAST_API_HOST_OVERRIDE` <sup>1</sup> | string | Used to override domains defined in API specification files. Only supported when importing the API specification from a URL. Example: `example.com:8080`. |
| `DAST_API_OPENAPI` | URL or string | The API specification to import. The specification can be hosted at a URL, or the name of a file present in the `/zap/wrk` directory. The variable `DAST_WEBSITE` must be specified if this is omitted. |
-| `DAST_API_SPECIFICATION` <sup>1</sup> | URL or string | [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/290241) in GitLab 13.12 and replaced by `DAST_API_OPENAPI`. To be removed in GitLab 15.0. The API specification to import. The specification can be hosted at a URL, or the name of a file present in the `/zap/wrk` directory. The variable `DAST_WEBSITE` must be specified if this is omitted. |
+| `DAST_API_SPECIFICATION` <sup>1</sup> | URL or string | **{warning}** **[Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/290241)** in GitLab 15.0. Replaced by `DAST_API_OPENAPI`. The API specification to import. The specification can be hosted at a URL, or the name of a file present in the `/zap/wrk` directory. The variable `DAST_WEBSITE` must be specified if this is omitted. |
| `DAST_AUTH_REPORT` <sup>2</sup> | boolean | Used in combination with exporting the `gl-dast-debug-auth-report.html` artifact to aid in debugging authentication issues. |
| `DAST_AUTH_EXCLUDE_URLS` <sup>2</sup> | URLs | **{warning}** **[Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/289959)** in GitLab 14.0. Replaced by `DAST_EXCLUDE_URLS`. The URLs to skip during the authenticated scan; comma-separated. Regular expression syntax can be used to match multiple URLs. For example, `.*` matches an arbitrary character sequence. Not supported for API scans. |
| `DAST_AUTH_URL` <sup>1,2</sup> | URL | The URL of the page containing the sign-in HTML form on the target website. `DAST_USERNAME` and `DAST_PASSWORD` are submitted with the login form to create an authenticated scan. Not supported for API scans. Example: `https://login.example.com`. |
diff --git a/doc/user/application_security/sast/index.md b/doc/user/application_security/sast/index.md
index 023bc9dd90c..4a3d0ed006d 100644
--- a/doc/user/application_security/sast/index.md
+++ b/doc/user/application_security/sast/index.md
@@ -892,7 +892,7 @@ Some analyzers can be customized with CI/CD variables.
| `GRADLE_PATH` | SpotBugs | Path to the `gradle` executable. |
| `JAVA_OPTS` | SpotBugs | Additional arguments for the `java` executable. |
| `JAVA_PATH` | SpotBugs | Path to the `java` executable. |
-| `SAST_JAVA_VERSION` | SpotBugs | Which Java version to use. Supported versions are `8` and `11`. Defaults to `8`. |
+| `SAST_JAVA_VERSION` | SpotBugs | Which Java version to use. [Starting in GitLab 15.0](https://gitlab.com/gitlab-org/gitlab/-/issues/352549), supported versions are `11` and `17` (default). Before GitLab 15.0, supported versions are `8` (default) and `11`. |
| `MAVEN_CLI_OPTS` | SpotBugs | Additional arguments for the `mvn` or `mvnw` executable. |
| `MAVEN_PATH` | SpotBugs | Path to the `mvn` executable. |
| `MAVEN_REPO_PATH` | SpotBugs | Path to the Maven local repository (shortcut for the `maven.repo.local` property). |
diff --git a/doc/user/infrastructure/iac/troubleshooting.md b/doc/user/infrastructure/iac/troubleshooting.md
index 20c6974717d..9dfe58396e2 100644
--- a/doc/user/infrastructure/iac/troubleshooting.md
+++ b/doc/user/infrastructure/iac/troubleshooting.md
@@ -38,33 +38,37 @@ To workaround this issue, make sure to apply one of the following conditions:
1. Grant Maintainer or Owner role to the `terraform-user` user on `subgroup-B`.
1. The `terraform-user` inherited access to `subgroup-B` and `subgroup-B` contains at least one project.
-### Invalid CI/CD syntax error when using the `latest` base template
+### Invalid CI/CD syntax error when using the base template
-On GitLab 14.2 and later, you might get a CI/CD syntax error when using the
-`latest` Base Terraform template:
+You might encounter a CI/CD syntax error when using the Terraform templates:
+
+- On GitLab 14.2 and later, using the `latest` template.
+- On GitLab 15.0 and later, using any version of the template.
+
+For example:
```yaml
include:
+ # On 14.2 and later, when using either of the following:
- template: Terraform/Base.latest.gitlab-ci.yml
+ - template: Terraform.latest.gitlab-ci.yml
+ # On 15.0 and later, the following templates have also been updated:
+ - template: Terraform/Base.gitlab-ci.yml
+ - template: Terraform.gitlab-ci.yml
-my-Terraform-job:
- extends: .init
+my-terraform-job:
+ extends: .apply
```
-The base template's [jobs were renamed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67719/)
-with better Terraform-specific names. To resolve the syntax error, you can:
-
-- Use the stable `Terraform/Base.gitlab-ci.yml` template, which has not changed.
-- Update your pipeline configuration to use the new job names in
- `https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates/Terraform/Base.latest.gitlab-ci.yml`.
- For example:
+There are two different causes for the error:
- ```yaml
- include:
- - template: Terraform/Base.latest.gitlab-ci.yml
+- In the case of `.init`, the error occurs because the init stage and jobs [were removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71188) from the templates, since they are no longer required. To resolve the syntax error, you can safely remove any jobs extending `.init`.
+- For all other jobs, the reason for the failure is that the base jobs have been [renamed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67719): A `.terraform:` prefix has been added to every job name. For example, `.apply` became `.terraform:apply`. To fix this error, you can update the base job names. For example:
- my-Terraform-job:
- extends: .terraform:init # The updated name.
+ ```diff
+ my-terraform-job:
+ - extends: .apply
+ + extends: .terraform:apply
```
## Troubleshooting Terraform state
diff --git a/lib/gitlab/ci/templates/Jobs/SAST-IaC.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/SAST-IaC.gitlab-ci.yml
new file mode 100644
index 00000000000..488e7ec72fd
--- /dev/null
+++ b/lib/gitlab/ci/templates/Jobs/SAST-IaC.gitlab-ci.yml
@@ -0,0 +1,41 @@
+# Read more about this feature here: https://docs.gitlab.com/ee/user/application_security/iac_scanning/
+#
+# Configure SAST with CI/CD variables (https://docs.gitlab.com/ee/ci/variables/index.html).
+# List of available variables: https://docs.gitlab.com/ee/user/application_security/iac_scanning/index.html
+
+variables:
+ # Setting this variable will affect all Security templates
+ # (SAST, Dependency Scanning, ...)
+ SECURE_ANALYZERS_PREFIX: "registry.gitlab.com/security-products"
+ SAST_IMAGE_SUFFIX: ""
+
+ SAST_EXCLUDED_PATHS: "spec, test, tests, tmp"
+
+iac-sast:
+ stage: test
+ artifacts:
+ reports:
+ sast: gl-sast-report.json
+ rules:
+ - when: never
+ # `rules` must be overridden explicitly by each child job
+ # see https://gitlab.com/gitlab-org/gitlab/-/issues/218444
+ variables:
+ SEARCH_MAX_DEPTH: 4
+ allow_failure: true
+ script:
+ - /analyzer run
+
+kics-iac-sast:
+ extends: iac-sast
+ image:
+ name: "$SAST_ANALYZER_IMAGE"
+ variables:
+ SAST_ANALYZER_IMAGE_TAG: 1
+ SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/kics:$SAST_ANALYZER_IMAGE_TAG$SAST_IMAGE_SUFFIX"
+ rules:
+ - if: $SAST_DISABLED
+ when: never
+ - if: $SAST_EXCLUDED_ANALYZERS =~ /kics/
+ when: never
+ - if: $CI_COMMIT_BRANCH
diff --git a/lib/gitlab/ci/templates/Qualys-IaC-Security.gitlab-ci.yml b/lib/gitlab/ci/templates/Qualys-IaC-Security.gitlab-ci.yml
index 6dbd0ce9561..60707dd0df0 100644
--- a/lib/gitlab/ci/templates/Qualys-IaC-Security.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Qualys-IaC-Security.gitlab-ci.yml
@@ -3,7 +3,8 @@
#
# This template shows how to use Qualys IaC Scan with a GitLab CI/CD pipeline.
# Qualys and GitLab users can use this to scan their IaC templates for misconfigurations.
-# Documentation about this integration: https://www.qualys.com/documentation/qualys-iac-gitlab-integration.pdf
+# The IaC templates are uploaded to Qualys Platform for scanning, which returns the results to GitLab for reporting.
+# Documentation about this integration: https://www.qualys.com/docs/qualys-iac-security-integration-gitlab.pdf
#
# This template should not need editing to work in your project.
# It is not designed to be included in an existing CI/CD configuration with the "include:" keyword.
diff --git a/lib/gitlab/ci/templates/Security/SAST-IaC.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/SAST-IaC.gitlab-ci.yml
new file mode 100644
index 00000000000..2207d4ec17a
--- /dev/null
+++ b/lib/gitlab/ci/templates/Security/SAST-IaC.gitlab-ci.yml
@@ -0,0 +1,2 @@
+include:
+ template: Jobs/SAST-IaC.gitlab-ci.yml
diff --git a/lib/gitlab/ci/templates/Terraform.gitlab-ci.yml b/lib/gitlab/ci/templates/Terraform.gitlab-ci.yml
index 1a857ef3eb3..56151a6bcdf 100644
--- a/lib/gitlab/ci/templates/Terraform.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Terraform.gitlab-ci.yml
@@ -1,27 +1,32 @@
# To contribute improvements to CI/CD templates, please follow the Development guide at:
# https://docs.gitlab.com/ee/development/cicd/templates.html
# This specific template is located at:
-# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform.gitlab-ci.yml
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform.latest.gitlab-ci.yml
include:
- - template: Terraform/Base.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Terraform/Base.latest.gitlab-ci.yml
+ - template: Terraform/Base.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Terraform/Base.gitlab-ci.yml
+ - template: Jobs/SAST-IaC.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Jobs/SAST-IaC.gitlab-ci.yml
stages:
- - init
- validate
+ - test
- build
- deploy
-init:
- extends: .init
+fmt:
+ extends: .terraform:fmt
+ needs: []
validate:
- extends: .validate
+ extends: .terraform:validate
+ needs: []
build:
- extends: .build
+ extends: .terraform:build
deploy:
- extends: .deploy
+ extends: .terraform:deploy
dependencies:
- build
+ environment:
+ name: $TF_STATE_NAME
diff --git a/lib/gitlab/ci/templates/Terraform.latest.gitlab-ci.yml b/lib/gitlab/ci/templates/Terraform.latest.gitlab-ci.yml
index 12c987a8d37..019b970bc30 100644
--- a/lib/gitlab/ci/templates/Terraform.latest.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Terraform.latest.gitlab-ci.yml
@@ -5,7 +5,7 @@
include:
- template: Terraform/Base.latest.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Terraform/Base.latest.gitlab-ci.yml
- - template: Jobs/SAST-IaC.latest.gitlab-ci.yml
+ - template: Jobs/SAST-IaC.latest.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Jobs/SAST-IaC.latest.gitlab-ci.yml
stages:
- validate
diff --git a/lib/gitlab/ci/templates/Terraform/Base.gitlab-ci.yml b/lib/gitlab/ci/templates/Terraform/Base.gitlab-ci.yml
index 84a962e1541..49bdd4b7713 100644
--- a/lib/gitlab/ci/templates/Terraform/Base.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Terraform/Base.gitlab-ci.yml
@@ -1,4 +1,4 @@
-# Terraform/Base.latest
+# Terraform/Base
#
# The purpose of this template is to provide flexibility to the user so
# they are able to only include the jobs that they find interesting.
@@ -7,10 +7,9 @@
# create hidden jobs. See: https://docs.gitlab.com/ee/ci/yaml/#hide-jobs
#
# There is a more opinionated template which we suggest the users to abide,
-# which is the lib/gitlab/ci/templates/Terraform.latest.gitlab-ci.yml
-
+# which is the lib/gitlab/ci/templates/Terraform.gitlab-ci.yml
image:
- name: registry.gitlab.com/gitlab-org/terraform-images/releases/terraform:1.0.3
+ name: registry.gitlab.com/gitlab-org/terraform-images/releases/terraform:1.1.9
variables:
TF_ROOT: ${CI_PROJECT_DIR} # The relative path to the root directory of the Terraform project
@@ -21,43 +20,46 @@ cache:
paths:
- ${TF_ROOT}/.terraform/
-.init: &init
- stage: init
+.terraform:fmt: &terraform_fmt
+ stage: validate
script:
- cd "${TF_ROOT}"
- - gitlab-terraform init
+ - gitlab-terraform fmt
+ allow_failure: true
-.validate: &validate
+.terraform:validate: &terraform_validate
stage: validate
script:
- cd "${TF_ROOT}"
- gitlab-terraform validate
-.build: &build
+.terraform:build: &terraform_build
stage: build
script:
- cd "${TF_ROOT}"
- gitlab-terraform plan
- gitlab-terraform plan-json
+ resource_group: ${TF_STATE_NAME}
artifacts:
paths:
- ${TF_ROOT}/plan.cache
reports:
terraform: ${TF_ROOT}/plan.json
-.deploy: &deploy
+.terraform:deploy: &terraform_deploy
stage: deploy
script:
- cd "${TF_ROOT}"
- gitlab-terraform apply
- when: manual
- only:
- variables:
- - $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+ resource_group: ${TF_STATE_NAME}
+ rules:
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+ when: manual
-.destroy: &destroy
+.terraform:destroy: &terraform_destroy
stage: cleanup
script:
- cd "${TF_ROOT}"
- gitlab-terraform destroy
+ resource_group: ${TF_STATE_NAME}
when: manual
diff --git a/lib/gitlab/ci/templates/Terraform/Base.latest.gitlab-ci.yml b/lib/gitlab/ci/templates/Terraform/Base.latest.gitlab-ci.yml
index a0ec07e61e1..9ba009a5bca 100644
--- a/lib/gitlab/ci/templates/Terraform/Base.latest.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Terraform/Base.latest.gitlab-ci.yml
@@ -24,20 +24,20 @@ cache:
.terraform:fmt: &terraform_fmt
stage: validate
script:
- - cd ${TF_ROOT}
+ - cd "${TF_ROOT}"
- gitlab-terraform fmt
allow_failure: true
.terraform:validate: &terraform_validate
stage: validate
script:
- - cd ${TF_ROOT}
+ - cd "${TF_ROOT}"
- gitlab-terraform validate
.terraform:build: &terraform_build
stage: build
script:
- - cd ${TF_ROOT}
+ - cd "${TF_ROOT}"
- gitlab-terraform plan
- gitlab-terraform plan-json
resource_group: ${TF_STATE_NAME}
@@ -50,7 +50,7 @@ cache:
.terraform:deploy: &terraform_deploy
stage: deploy
script:
- - cd ${TF_ROOT}
+ - cd "${TF_ROOT}"
- gitlab-terraform apply
resource_group: ${TF_STATE_NAME}
rules:
@@ -60,7 +60,7 @@ cache:
.terraform:destroy: &terraform_destroy
stage: cleanup
script:
- - cd ${TF_ROOT}
+ - cd "${TF_ROOT}"
- gitlab-terraform destroy
resource_group: ${TF_STATE_NAME}
when: manual
diff --git a/lib/gitlab/database/migrations/background_migration_helpers.rb b/lib/gitlab/database/migrations/background_migration_helpers.rb
index 543b7d90c99..44aa25413e1 100644
--- a/lib/gitlab/database/migrations/background_migration_helpers.rb
+++ b/lib/gitlab/database/migrations/background_migration_helpers.rb
@@ -41,6 +41,12 @@ module Gitlab
# end
# end
def queue_background_migration_jobs_by_range_at_intervals(model_class, job_class_name, delay_interval, batch_size: BATCH_SIZE, other_job_arguments: [], initial_delay: 0, track_jobs: false, primary_column_name: :id)
+ if transaction_open?
+ raise 'The `#queue_background_migration_jobs_by_range_at_intervals` can not be run inside a transaction, ' \
+ 'you can disable transactions by calling disable_ddl_transaction! ' \
+ 'in the body of your migration class'
+ end
+
raise "#{model_class} does not have an ID column of #{primary_column_name} to use for batch ranges" unless model_class.column_names.include?(primary_column_name.to_s)
raise "#{primary_column_name} is not an integer or string column" unless [:integer, :string].include?(model_class.columns_hash[primary_column_name.to_s].type)
@@ -92,6 +98,12 @@ module Gitlab
def requeue_background_migration_jobs_by_range_at_intervals(job_class_name, delay_interval, batch_size: BATCH_SIZE, initial_delay: 0)
job_coordinator = coordinator_for_tracking_database
+ if transaction_open?
+ raise 'The `#requeue_background_migration_jobs_by_range_at_intervals` can not be run inside a transaction, ' \
+ 'you can disable transactions by calling disable_ddl_transaction! ' \
+ 'in the body of your migration class'
+ end
+
# To not overload the worker too much we enforce a minimum interval both
# when scheduling and performing jobs.
delay_interval = [delay_interval, job_coordinator.minimum_interval].max
@@ -138,6 +150,12 @@ module Gitlab
'For more information visit: https://docs.gitlab.com/ee/development/database/migrations_for_multiple_databases.html'
end
+ if transaction_open?
+ raise 'The `#finalize_background_migration` can not be run inside a transaction, ' \
+ 'you can disable transactions by calling disable_ddl_transaction! ' \
+ 'in the body of your migration class'
+ end
+
job_coordinator = coordinator_for_tracking_database
# Empty the sidekiq queue.
diff --git a/lib/gitlab/import_export/group/import_export.yml b/lib/gitlab/import_export/group/import_export.yml
index b9d2df6e54a..8df5d52bf77 100644
--- a/lib/gitlab/import_export/group/import_export.yml
+++ b/lib/gitlab/import_export/group/import_export.yml
@@ -41,6 +41,7 @@ excluded_attributes:
- :shared_runners_minute_limit
- :extra_shared_runners_minutes_limit
- :repository_size_limit
+ - :max_pages_size
epics:
- :state_id
diff --git a/lib/gitlab/usage_data_counters/known_events/ci_templates.yml b/lib/gitlab/usage_data_counters/known_events/ci_templates.yml
index 16a8af6b4d8..3b883e505f8 100644
--- a/lib/gitlab/usage_data_counters/known_events/ci_templates.yml
+++ b/lib/gitlab/usage_data_counters/known_events/ci_templates.yml
@@ -127,6 +127,10 @@
category: ci_templates
redis_slot: ci_templates
aggregation: weekly
+- name: p_ci_templates_security_sast_iac
+ category: ci_templates
+ redis_slot: ci_templates
+ aggregation: weekly
- name: p_ci_templates_security_dependency_scanning
category: ci_templates
redis_slot: ci_templates
@@ -331,6 +335,10 @@
category: ci_templates
redis_slot: ci_templates
aggregation: weekly
+- name: p_ci_templates_jobs_sast_iac
+ category: ci_templates
+ redis_slot: ci_templates
+ aggregation: weekly
- name: p_ci_templates_jobs_secret_detection_latest
category: ci_templates
redis_slot: ci_templates
@@ -531,6 +539,10 @@
category: ci_templates
redis_slot: ci_templates
aggregation: weekly
+- name: p_ci_templates_implicit_jobs_sast_iac
+ category: ci_templates
+ redis_slot: ci_templates
+ aggregation: weekly
- name: p_ci_templates_implicit_jobs_secret_detection_latest
category: ci_templates
redis_slot: ci_templates
@@ -607,6 +619,10 @@
category: ci_templates
redis_slot: ci_templates
aggregation: weekly
+- name: p_ci_templates_implicit_security_sast_iac
+ category: ci_templates
+ redis_slot: ci_templates
+ aggregation: weekly
- name: p_ci_templates_implicit_security_dependency_scanning
category: ci_templates
redis_slot: ci_templates
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 3afe27f9051..308b38e8c82 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -6727,6 +6727,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD limits"
+msgstr ""
+
msgid "CI/CD minutes"
msgstr ""
@@ -6813,6 +6816,9 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
+msgid "CICD|Limit"
+msgstr ""
+
msgid "CICD|Limit CI_JOB_TOKEN access"
msgstr ""
@@ -6825,6 +6831,9 @@ msgstr ""
msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "CICD|There are several CI/CD limits in place."
+msgstr ""
+
msgid "CICD|group enabled"
msgstr ""
@@ -16328,9 +16337,6 @@ msgstr ""
msgid "Geo|%{title} checksum progress"
msgstr ""
-msgid "Geo|(%{timeAgo})"
-msgstr ""
-
msgid "Geo|Add New Site"
msgstr ""
diff --git a/qa/qa/specs/features/api/5_package/container_registry_spec.rb b/qa/qa/specs/features/api/5_package/container_registry_spec.rb
index 3a1a3ff7169..ca9f137716b 100644
--- a/qa/qa/specs/features/api/5_package/container_registry_spec.rb
+++ b/qa/qa/specs/features/api/5_package/container_registry_spec.rb
@@ -3,7 +3,7 @@
require 'airborne'
module QA
- RSpec.describe 'Package', only: { subdomain: %i[staging pre] } do
+ RSpec.describe 'Package', only: { subdomain: %i[staging pre] }, quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/360466', type: :investigating } do
include Support::API
describe 'Container Registry' do
diff --git a/spec/graphql/mutations/incident_management/timeline_event/create_spec.rb b/spec/graphql/mutations/incident_management/timeline_event/create_spec.rb
new file mode 100644
index 00000000000..63faecad5d5
--- /dev/null
+++ b/spec/graphql/mutations/incident_management/timeline_event/create_spec.rb
@@ -0,0 +1,51 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Mutations::IncidentManagement::TimelineEvent::Create do
+ let_it_be(:current_user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:incident) { create(:incident, project: project) }
+
+ let(:args) { { note: 'note', occurred_at: Time.current } }
+
+ specify { expect(described_class).to require_graphql_authorizations(:admin_incident_management_timeline_event) }
+
+ describe '#resolve' do
+ subject(:resolve) { mutation_for(project, current_user).resolve(incident_id: incident.to_global_id, **args) }
+
+ context 'when a user has permissions to create a timeline event' do
+ let(:expected_timeline_event) do
+ instance_double(
+ 'IncidentManagement::TimelineEvent',
+ note: args[:note],
+ occurred_at: args[:occurred_at].to_s,
+ incident: incident,
+ author: current_user,
+ promoted_from_note: nil
+ )
+ end
+
+ before do
+ project.add_developer(current_user)
+ end
+
+ it_behaves_like 'creating an incident timeline event'
+
+ context 'when TimelineEvents::CreateService responds with an error' do
+ let(:args) { {} }
+
+ it_behaves_like 'responding with an incident timeline errors',
+ errors: ["Occurred at can't be blank, Note can't be blank, and Note html can't be blank"]
+ end
+ end
+
+ it_behaves_like 'failing to create an incident timeline event'
+ end
+
+ private
+
+ def mutation_for(project, user)
+ described_class.new(object: project, context: { current_user: user }, field: nil)
+ end
+end
diff --git a/spec/graphql/mutations/incident_management/timeline_event/destroy_spec.rb b/spec/graphql/mutations/incident_management/timeline_event/destroy_spec.rb
new file mode 100644
index 00000000000..4dd7b2ccb14
--- /dev/null
+++ b/spec/graphql/mutations/incident_management/timeline_event/destroy_spec.rb
@@ -0,0 +1,66 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Mutations::IncidentManagement::TimelineEvent::Destroy do
+ let_it_be(:current_user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:incident) { create(:incident, project: project) }
+
+ let(:timeline_event) { create(:incident_management_timeline_event, incident: incident, project: project) }
+ let(:args) { { id: timeline_event.to_global_id } }
+
+ specify { expect(described_class).to require_graphql_authorizations(:admin_incident_management_timeline_event) }
+
+ describe '#resolve' do
+ subject(:resolve) { mutation_for(project, current_user).resolve(**args) }
+
+ context 'when a user has permissions to delete timeline event' do
+ before do
+ project.add_developer(current_user)
+ end
+
+ context 'when TimelineEvents::DestroyService responds with success' do
+ it 'returns the timeline event with no errors' do
+ expect(resolve).to eq(
+ timeline_event: timeline_event,
+ errors: []
+ )
+ end
+ end
+
+ context 'when TimelineEvents::DestroyService responds with an error' do
+ before do
+ allow_next_instance_of(::IncidentManagement::TimelineEvents::DestroyService) do |service|
+ allow(service)
+ .to receive(:execute)
+ .and_return(ServiceResponse.error(payload: { timeline_event: nil }, message: 'An error has occurred'))
+ end
+ end
+
+ it 'returns errors' do
+ expect(resolve).to eq(
+ timeline_event: nil,
+ errors: ['An error has occurred']
+ )
+ end
+ end
+ end
+
+ context 'when a user has no permissions to delete timeline event' do
+ before do
+ project.add_guest(current_user)
+ end
+
+ it 'raises an error' do
+ expect { resolve }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ end
+ end
+ end
+
+ private
+
+ def mutation_for(project, user)
+ described_class.new(object: project, context: { current_user: user }, field: nil)
+ end
+end
diff --git a/spec/graphql/mutations/incident_management/timeline_event/promote_from_note_spec.rb b/spec/graphql/mutations/incident_management/timeline_event/promote_from_note_spec.rb
new file mode 100644
index 00000000000..598ee496cf1
--- /dev/null
+++ b/spec/graphql/mutations/incident_management/timeline_event/promote_from_note_spec.rb
@@ -0,0 +1,85 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Mutations::IncidentManagement::TimelineEvent::PromoteFromNote do
+ let_it_be(:current_user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:incident) { create(:incident, project: project) }
+ let_it_be(:comment) { create(:note, project: project, noteable: incident) }
+ let_it_be(:issue) { create(:issue, project: project) }
+ let_it_be(:issue_comment) { create(:note, project: project, noteable: issue) }
+ let_it_be(:alert) { create(:alert_management_alert, project: project) }
+ let_it_be(:alert_comment) { create(:note, project: project, noteable: alert) }
+
+ let(:args) { { note_id: comment.to_global_id.to_s } }
+
+ specify { expect(described_class).to require_graphql_authorizations(:admin_incident_management_timeline_event) }
+
+ describe '#resolve' do
+ subject(:resolve) { mutation_for(project, current_user).resolve(**args) }
+
+ context 'when a user has permissions to create timeline event' do
+ let(:expected_timeline_event) do
+ instance_double(
+ 'IncidentManagement::TimelineEvent',
+ note: comment.note,
+ occurred_at: comment.created_at.to_s,
+ incident: incident,
+ author: current_user,
+ promoted_from_note: comment
+ )
+ end
+
+ before do
+ project.add_developer(current_user)
+ end
+
+ it_behaves_like 'creating an incident timeline event'
+
+ context 'when TimelineEvents::CreateService responds with an error' do
+ before do
+ allow_next_instance_of(::IncidentManagement::TimelineEvents::CreateService) do |service|
+ allow(service).to receive(:execute).and_return(
+ ServiceResponse.error(payload: { timeline_event: nil }, message: 'Some error')
+ )
+ end
+ end
+
+ it_behaves_like 'responding with an incident timeline errors', errors: ['Some error']
+ end
+ end
+
+ context 'when note does not exist' do
+ let(:args) { { note_id: 'gid://gitlab/Note/0' } }
+
+ it 'raises an error' do
+ expect { resolve }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ end
+ end
+
+ context 'when note does not belong to an incident' do
+ let(:args) { { note_id: issue_comment.to_global_id.to_s } }
+
+ it 'raises an error' do
+ expect { resolve }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ end
+ end
+
+ context 'when note belongs to anything else but issuable' do
+ let(:args) { { note_id: alert_comment.to_global_id.to_s } }
+
+ it 'raises an error' do
+ expect { resolve }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ end
+ end
+
+ it_behaves_like 'failing to create an incident timeline event'
+ end
+
+ private
+
+ def mutation_for(project, user)
+ described_class.new(object: project, context: { current_user: user }, field: nil)
+ end
+end
diff --git a/spec/graphql/mutations/incident_management/timeline_event/update_spec.rb b/spec/graphql/mutations/incident_management/timeline_event/update_spec.rb
new file mode 100644
index 00000000000..8296e5c6c15
--- /dev/null
+++ b/spec/graphql/mutations/incident_management/timeline_event/update_spec.rb
@@ -0,0 +1,100 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Mutations::IncidentManagement::TimelineEvent::Update do
+ let_it_be(:developer) { create(:user) }
+ let_it_be(:reporter) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:incident) { create(:incident, project: project) }
+ let_it_be_with_reload(:timeline_event) do
+ create(:incident_management_timeline_event, project: project, incident: incident)
+ end
+
+ let(:args) do
+ {
+ id: timeline_event_id,
+ note: note,
+ occurred_at: occurred_at
+ }
+ end
+
+ let(:note) { 'Updated Note' }
+ let(:timeline_event_id) { GitlabSchema.id_from_object(timeline_event).to_s }
+ let(:occurred_at) { 1.minute.ago }
+
+ before do
+ project.add_developer(developer)
+ project.add_reporter(reporter)
+ end
+
+ describe '#resolve' do
+ let(:current_user) { developer }
+
+ subject(:resolve) { mutation_for(current_user).resolve(**args) }
+
+ shared_examples 'failed update with a top-level access error' do |error|
+ specify do
+ expect { resolve }.to raise_error(
+ Gitlab::Graphql::Errors::ResourceNotAvailable,
+ error || Gitlab::Graphql::Authorize::AuthorizeResource::RESOURCE_ACCESS_ERROR
+ )
+ end
+ end
+
+ context 'when user has permissions to update the timeline event' do
+ context 'when timeline event exists' do
+ it 'updates the timeline event' do
+ expect { resolve }.to change { timeline_event.reload.note }.to(note)
+ .and change { timeline_event.reload.occurred_at.to_s }.to(occurred_at.to_s)
+ end
+
+ it 'returns updated timeline event' do
+ expect(resolve).to eq(
+ timeline_event: timeline_event.reload,
+ errors: []
+ )
+ end
+
+ context 'when there is a validation error' do
+ let(:occurred_at) { 'invalid date' }
+
+ it 'does not update the timeline event' do
+ expect { resolve }.not_to change { timeline_event.reload.updated_at }
+ end
+
+ it 'responds with error' do
+ expect(resolve).to eq(
+ timeline_event: nil,
+ errors: ["Occurred at can't be blank"]
+ )
+ end
+ end
+ end
+
+ context 'when timeline event cannot be found' do
+ let(:timeline_event_id) do
+ Gitlab::GlobalId.build(
+ nil,
+ model_name: ::IncidentManagement::TimelineEvent.name,
+ id: non_existing_record_id
+ ).to_s
+ end
+
+ it_behaves_like 'failed update with a top-level access error'
+ end
+ end
+
+ context 'when user does not have permissions to update the timeline event' do
+ let(:current_user) { reporter }
+
+ it_behaves_like 'failed update with a top-level access error'
+ end
+ end
+
+ private
+
+ def mutation_for(user)
+ described_class.new(object: nil, context: { current_user: user }, field: nil)
+ end
+end
diff --git a/spec/graphql/resolvers/incident_management/timeline_events_resolver_spec.rb b/spec/graphql/resolvers/incident_management/timeline_events_resolver_spec.rb
new file mode 100644
index 00000000000..046cf242d56
--- /dev/null
+++ b/spec/graphql/resolvers/incident_management/timeline_events_resolver_spec.rb
@@ -0,0 +1,70 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Resolvers::IncidentManagement::TimelineEventsResolver do
+ include GraphqlHelpers
+
+ let_it_be(:current_user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:incident) { create(:incident, project: project) }
+ let_it_be(:first_timeline_event) do
+ create(:incident_management_timeline_event, project: project, incident: incident)
+ end
+
+ let_it_be(:second_timeline_event) do
+ create(:incident_management_timeline_event, project: project, incident: incident)
+ end
+
+ let(:args) { { incident_id: incident.to_global_id } }
+ let(:resolver) { described_class }
+
+ subject(:resolved_timeline_events) { sync(resolve_timeline_events(args, current_user: current_user).to_a) }
+
+ before do
+ project.add_guest(current_user)
+ end
+
+ specify do
+ expect(resolver).to have_nullable_graphql_type(Types::IncidentManagement::TimelineEventType.connection_type)
+ end
+
+ it 'returns timeline events', :aggregate_failures do
+ expect(resolved_timeline_events.length).to eq(2)
+ expect(resolved_timeline_events.first).to be_a(::IncidentManagement::TimelineEvent)
+ end
+
+ context 'when user does not have permissions' do
+ let(:non_member) { create(:user) }
+
+ subject(:resolved_timeline_events) { sync(resolve_timeline_events(args, current_user: non_member).to_a) }
+
+ before do
+ project.project_feature.update!(issues_access_level: ProjectFeature::PRIVATE)
+ end
+
+ it 'returns no timeline events' do
+ expect(resolved_timeline_events.length).to eq(0)
+ end
+ end
+
+ context 'when resolving a single item' do
+ let(:resolver) { described_class.single }
+
+ subject(:resolved_timeline_event) { sync(resolve_timeline_events(args, current_user: current_user)) }
+
+ context 'when id given' do
+ let(:args) { { incident_id: incident.to_global_id, id: first_timeline_event.to_global_id } }
+
+ it 'returns the timeline event' do
+ expect(resolved_timeline_event).to eq(first_timeline_event)
+ end
+ end
+ end
+
+ private
+
+ def resolve_timeline_events(args = {}, context = { current_user: current_user })
+ resolve(resolver, obj: incident, args: args, ctx: context)
+ end
+end
diff --git a/spec/graphql/types/incident_management/timeline_event_type_spec.rb b/spec/graphql/types/incident_management/timeline_event_type_spec.rb
new file mode 100644
index 00000000000..5a6bc461f20
--- /dev/null
+++ b/spec/graphql/types/incident_management/timeline_event_type_spec.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe GitlabSchema.types['TimelineEventType'] do
+ specify { expect(described_class.graphql_name).to eq('TimelineEventType') }
+
+ specify { expect(described_class).to require_graphql_authorizations(:read_incident_management_timeline_event) }
+
+ it 'exposes the expected fields' do
+ expected_fields = %i[
+ id
+ author
+ updated_by_user
+ incident
+ note
+ note_html
+ promoted_from_note
+ editable
+ action
+ occurred_at
+ created_at
+ updated_at
+ ]
+
+ expect(described_class).to have_graphql_fields(*expected_fields)
+ end
+end
diff --git a/spec/graphql/types/packages/package_base_type_spec.rb b/spec/graphql/types/packages/package_base_type_spec.rb
new file mode 100644
index 00000000000..7156f22c513
--- /dev/null
+++ b/spec/graphql/types/packages/package_base_type_spec.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe GitlabSchema.types['PackageBase'] do
+ specify { expect(described_class.description).to eq('Represents a package in the Package Registry') }
+
+ specify { expect(described_class).to require_graphql_authorizations(:read_package) }
+
+ it 'includes all expected fields' do
+ expected_fields = %w[
+ id name version package_type
+ created_at updated_at
+ project
+ tags metadata
+ status can_destroy
+ ]
+
+ expect(described_class).to include_graphql_fields(*expected_fields)
+ end
+end
diff --git a/spec/graphql/types/packages/package_details_type_spec.rb b/spec/graphql/types/packages/package_details_type_spec.rb
index ceeb000ff85..d5688fc64c5 100644
--- a/spec/graphql/types/packages/package_details_type_spec.rb
+++ b/spec/graphql/types/packages/package_details_type_spec.rb
@@ -3,6 +3,10 @@
require 'spec_helper'
RSpec.describe GitlabSchema.types['PackageDetailsType'] do
+ specify { expect(described_class.description).to eq('Represents a package details in the Package Registry') }
+
+ specify { expect(described_class).to require_graphql_authorizations(:read_package) }
+
it 'includes all the package fields' do
expected_fields = %w[
id name version created_at updated_at package_type tags project
@@ -13,13 +17,4 @@ RSpec.describe GitlabSchema.types['PackageDetailsType'] do
expect(described_class).to include_graphql_fields(*expected_fields)
end
-
- it 'overrides the pipelines field' do
- field = described_class.fields['pipelines']
-
- expect(field).to have_graphql_type(Types::Ci::PipelineType.connection_type)
- expect(field).to have_graphql_extension(Gitlab::Graphql::Extensions::ExternallyPaginatedArrayExtension)
- expect(field).to have_graphql_resolver(Resolvers::PackagePipelinesResolver)
- expect(field).not_to be_connection
- end
end
diff --git a/spec/graphql/types/packages/package_type_spec.rb b/spec/graphql/types/packages/package_type_spec.rb
index 3d7527db45c..df8135ed87e 100644
--- a/spec/graphql/types/packages/package_type_spec.rb
+++ b/spec/graphql/types/packages/package_type_spec.rb
@@ -3,7 +3,11 @@
require 'spec_helper'
RSpec.describe GitlabSchema.types['Package'] do
- it 'includes all the package fields' do
+ specify { expect(described_class.description).to eq('Represents a package with pipelines in the Package Registry') }
+
+ specify { expect(described_class).to require_graphql_authorizations(:read_package) }
+
+ it 'includes all the package fields and pipelines' do
expected_fields = %w[
id name version package_type
created_at updated_at
diff --git a/spec/graphql/types/project_type_spec.rb b/spec/graphql/types/project_type_spec.rb
index 7433d465b38..a08bd717c72 100644
--- a/spec/graphql/types/project_type_spec.rb
+++ b/spec/graphql/types/project_type_spec.rb
@@ -29,6 +29,7 @@ RSpec.describe GitlabSchema.types['Project'] do
grafanaIntegration autocloseReferencedIssues suggestion_commit_message environments
environment boards jira_import_status jira_imports services releases release
alert_management_alerts alert_management_alert alert_management_alert_status_counts
+ incident_management_timeline_event incident_management_timeline_events
container_expiration_policy service_desk_enabled service_desk_address
issue_status_counts terraform_states alert_management_integrations
container_repositories container_repositories_count
diff --git a/spec/helpers/instance_configuration_helper_spec.rb b/spec/helpers/instance_configuration_helper_spec.rb
index 1ba06b97088..921ec7ee588 100644
--- a/spec/helpers/instance_configuration_helper_spec.rb
+++ b/spec/helpers/instance_configuration_helper_spec.rb
@@ -50,4 +50,14 @@ RSpec.describe InstanceConfigurationHelper do
expect(helper.instance_configuration_human_size_cell(1048576)).to eq('1 MB')
end
end
+
+ describe '#instance_configuration_disabled_cell_html' do
+ it 'returns "-" if parameter is 0' do
+ expect(helper.instance_configuration_disabled_cell_html(0)).to eq('-')
+ end
+
+ it 'return parameter if not 0' do
+ expect(helper.instance_configuration_disabled_cell_html(1)).to eq(1)
+ end
+ end
end
diff --git a/spec/lib/gitlab/ci/templates/Jobs/sast_iac_gitlab_ci_yaml_spec.rb b/spec/lib/gitlab/ci/templates/Jobs/sast_iac_gitlab_ci_yaml_spec.rb
index 0f97bc06a4e..85516d0bbb0 100644
--- a/spec/lib/gitlab/ci/templates/Jobs/sast_iac_gitlab_ci_yaml_spec.rb
+++ b/spec/lib/gitlab/ci/templates/Jobs/sast_iac_gitlab_ci_yaml_spec.rb
@@ -2,8 +2,8 @@
require 'spec_helper'
-RSpec.describe 'Jobs/SAST-IaC.latest.gitlab-ci.yml' do
- subject(:template) { Gitlab::Template::GitlabCiYmlTemplate.find('Jobs/SAST-IaC.latest') }
+RSpec.describe 'Jobs/SAST-IaC.gitlab-ci.yml' do
+ subject(:template) { Gitlab::Template::GitlabCiYmlTemplate.find('Jobs/SAST-IaC') }
describe 'the created pipeline' do
let_it_be(:project) { create(:project, :repository) }
diff --git a/spec/lib/gitlab/ci/templates/Jobs/sast_iac_latest_gitlab_ci_yaml_spec.rb b/spec/lib/gitlab/ci/templates/Jobs/sast_iac_latest_gitlab_ci_yaml_spec.rb
new file mode 100644
index 00000000000..0f97bc06a4e
--- /dev/null
+++ b/spec/lib/gitlab/ci/templates/Jobs/sast_iac_latest_gitlab_ci_yaml_spec.rb
@@ -0,0 +1,65 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Jobs/SAST-IaC.latest.gitlab-ci.yml' do
+ subject(:template) { Gitlab::Template::GitlabCiYmlTemplate.find('Jobs/SAST-IaC.latest') }
+
+ describe 'the created pipeline' do
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:user) { project.first_owner }
+
+ let(:default_branch) { 'main' }
+ let(:pipeline_ref) { default_branch }
+ let(:service) { Ci::CreatePipelineService.new(project, user, ref: pipeline_ref) }
+ let(:pipeline) { service.execute!(:push).payload }
+ let(:build_names) { pipeline.builds.pluck(:name) }
+
+ before do
+ stub_ci_pipeline_yaml_file(template.content)
+ allow_next_instance_of(Ci::BuildScheduleWorker) do |instance|
+ allow(instance).to receive(:perform).and_return(true)
+ end
+ allow(project).to receive(:default_branch).and_return(default_branch)
+ end
+
+ context 'on feature branch' do
+ let(:pipeline_ref) { 'feature' }
+
+ it 'creates the kics-iac-sast job' do
+ expect(build_names).to contain_exactly('kics-iac-sast')
+ end
+ end
+
+ context 'on merge request' do
+ let(:service) { MergeRequests::CreatePipelineService.new(project: project, current_user: user) }
+ let(:merge_request) { create(:merge_request, :simple, source_project: project) }
+ let(:pipeline) { service.execute(merge_request).payload }
+
+ it 'has no jobs' do
+ expect(pipeline).to be_merge_request_event
+ expect(build_names).to be_empty
+ end
+ end
+
+ context 'SAST_DISABLED is set' do
+ before do
+ create(:ci_variable, key: 'SAST_DISABLED', value: 'true', project: project)
+ end
+
+ context 'on default branch' do
+ it 'has no jobs' do
+ expect { pipeline }.to raise_error(Ci::CreatePipelineService::CreateError)
+ end
+ end
+
+ context 'on feature branch' do
+ let(:pipeline_ref) { 'feature' }
+
+ it 'has no jobs' do
+ expect { pipeline }.to raise_error(Ci::CreatePipelineService::CreateError)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/templates/Terraform/base_gitlab_ci_yaml_spec.rb b/spec/lib/gitlab/ci/templates/Terraform/base_gitlab_ci_yaml_spec.rb
index 5e9224cebd9..eca79f37779 100644
--- a/spec/lib/gitlab/ci/templates/Terraform/base_gitlab_ci_yaml_spec.rb
+++ b/spec/lib/gitlab/ci/templates/Terraform/base_gitlab_ci_yaml_spec.rb
@@ -16,7 +16,6 @@ RSpec.describe 'Terraform/Base.gitlab-ci.yml' do
before do
stub_ci_pipeline_yaml_file(template.content)
- allow_any_instance_of(Ci::BuildScheduleWorker).to receive(:perform).and_return(true)
allow(project).to receive(:default_branch).and_return(default_branch)
end
diff --git a/spec/lib/gitlab/ci/templates/templates_spec.rb b/spec/lib/gitlab/ci/templates/templates_spec.rb
index ca096fcecc4..36c6e805bdf 100644
--- a/spec/lib/gitlab/ci/templates/templates_spec.rb
+++ b/spec/lib/gitlab/ci/templates/templates_spec.rb
@@ -7,10 +7,9 @@ RSpec.describe 'CI YML Templates' do
let(:all_templates) { Gitlab::Template::GitlabCiYmlTemplate.all.map(&:full_name) }
let(:excluded_templates) do
- excluded = all_templates.select do |name|
+ all_templates.select do |name|
Gitlab::Template::GitlabCiYmlTemplate.excluded_patterns.any? { |pattern| pattern.match?(name) }
end
- excluded + ["Terraform.gitlab-ci.yml"]
end
shared_examples 'require default stages to be included' do
diff --git a/spec/lib/gitlab/ci/templates/terraform_gitlab_ci_yaml_spec.rb b/spec/lib/gitlab/ci/templates/terraform_gitlab_ci_yaml_spec.rb
index 346ab9f7af7..2fc4b509aab 100644
--- a/spec/lib/gitlab/ci/templates/terraform_gitlab_ci_yaml_spec.rb
+++ b/spec/lib/gitlab/ci/templates/terraform_gitlab_ci_yaml_spec.rb
@@ -20,13 +20,16 @@ RSpec.describe 'Terraform.gitlab-ci.yml' do
before do
stub_ci_pipeline_yaml_file(template.content)
+ allow_next_instance_of(Ci::BuildScheduleWorker) do |instance|
+ allow(instance).to receive(:perform).and_return(true)
+ end
allow(project).to receive(:default_branch).and_return(default_branch)
end
context 'on master branch' do
it 'creates init, validate and build jobs', :aggregate_failures do
expect(pipeline.errors).to be_empty
- expect(build_names).to include('init', 'validate', 'build', 'deploy')
+ expect(build_names).to include('validate', 'build', 'deploy')
end
end
diff --git a/spec/lib/gitlab/ci/templates/terraform_latest_gitlab_ci_yaml_spec.rb b/spec/lib/gitlab/ci/templates/terraform_latest_gitlab_ci_yaml_spec.rb
index 6c06403adff..42e56c4ab3c 100644
--- a/spec/lib/gitlab/ci/templates/terraform_latest_gitlab_ci_yaml_spec.rb
+++ b/spec/lib/gitlab/ci/templates/terraform_latest_gitlab_ci_yaml_spec.rb
@@ -20,7 +20,9 @@ RSpec.describe 'Terraform.latest.gitlab-ci.yml' do
before do
stub_ci_pipeline_yaml_file(template.content)
- allow_any_instance_of(Ci::BuildScheduleWorker).to receive(:perform).and_return(true)
+ allow_next_instance_of(Ci::BuildScheduleWorker) do |instance|
+ allow(instance).to receive(:perform).and_return(true)
+ end
allow(project).to receive(:default_branch).and_return(default_branch)
end
diff --git a/spec/lib/gitlab/database/migrations/background_migration_helpers_spec.rb b/spec/lib/gitlab/database/migrations/background_migration_helpers_spec.rb
index 9ec2d96d656..921628d92cc 100644
--- a/spec/lib/gitlab/database/migrations/background_migration_helpers_spec.rb
+++ b/spec/lib/gitlab/database/migrations/background_migration_helpers_spec.rb
@@ -15,6 +15,10 @@ RSpec.describe Gitlab::Database::Migrations::BackgroundMigrationHelpers do
end
describe '#queue_background_migration_jobs_by_range_at_intervals' do
+ before do
+ allow(model).to receive(:transaction_open?).and_return(false)
+ end
+
context 'when the model has an ID column' do
let!(:id1) { create(:user).id }
let!(:id2) { create(:user).id }
@@ -198,6 +202,18 @@ RSpec.describe Gitlab::Database::Migrations::BackgroundMigrationHelpers do
end.to raise_error(StandardError, /does not have an ID/)
end
end
+
+ context 'when within transaction' do
+ before do
+ allow(model).to receive(:transaction_open?).and_return(true)
+ end
+
+ it 'does raise an exception' do
+ expect do
+ model.queue_background_migration_jobs_by_range_at_intervals(ProjectAuthorization, 'FooJob', 10.seconds)
+ end.to raise_error /The `#queue_background_migration_jobs_by_range_at_intervals` can not be run inside a transaction./
+ end
+ end
end
describe '#requeue_background_migration_jobs_by_range_at_intervals' do
@@ -207,6 +223,10 @@ RSpec.describe Gitlab::Database::Migrations::BackgroundMigrationHelpers do
let!(:successful_job_1) { create(:background_migration_job, class_name: job_class_name, status: :succeeded, arguments: [5, 6]) }
let!(:successful_job_2) { create(:background_migration_job, class_name: job_class_name, status: :succeeded, arguments: [7, 8]) }
+ before do
+ allow(model).to receive(:transaction_open?).and_return(false)
+ end
+
around do |example|
freeze_time do
Sidekiq::Testing.fake! do
@@ -221,6 +241,17 @@ RSpec.describe Gitlab::Database::Migrations::BackgroundMigrationHelpers do
expect(subject).to eq(20.minutes)
end
+ context 'when within transaction' do
+ before do
+ allow(model).to receive(:transaction_open?).and_return(true)
+ end
+
+ it 'does raise an exception' do
+ expect { subject }
+ .to raise_error /The `#requeue_background_migration_jobs_by_range_at_intervals` can not be run inside a transaction./
+ end
+ end
+
context 'when nothing is queued' do
subject { model.requeue_background_migration_jobs_by_range_at_intervals('FakeJob', 10.minutes) }
@@ -320,6 +351,8 @@ RSpec.describe Gitlab::Database::Migrations::BackgroundMigrationHelpers do
worker_class.perform_in(10, job_class_name, [5, 6])
worker_class.perform_in(20, job_class_name, [7, 8])
end
+
+ allow(model).to receive(:transaction_open?).and_return(false)
end
it_behaves_like 'finalized tracked background migration', worker_class do
@@ -328,6 +361,17 @@ RSpec.describe Gitlab::Database::Migrations::BackgroundMigrationHelpers do
end
end
+ context 'when within transaction' do
+ before do
+ allow(model).to receive(:transaction_open?).and_return(true)
+ end
+
+ it 'does raise an exception' do
+ expect { model.finalize_background_migration(job_class_name, delete_tracking_jobs: %w[pending succeeded]) }
+ .to raise_error /The `#finalize_background_migration` can not be run inside a transaction./
+ end
+ end
+
context 'when using Migration[2.0]' do
let(:base_class) { ::Gitlab::Database::Migration[2.0] }
diff --git a/spec/models/instance_configuration_spec.rb b/spec/models/instance_configuration_spec.rb
index 4ff743991a6..f57667cc5d6 100644
--- a/spec/models/instance_configuration_spec.rb
+++ b/spec/models/instance_configuration_spec.rb
@@ -180,6 +180,61 @@ RSpec.describe InstanceConfiguration do
end
end
+ describe '#ci_cd_limits' do
+ let_it_be(:plan1) { create(:plan, name: 'plan1', title: 'Plan 1') }
+ let_it_be(:plan2) { create(:plan, name: 'plan2', title: 'Plan 2') }
+
+ before do
+ create(:plan_limits,
+ plan: plan1,
+ ci_pipeline_size: 1001,
+ ci_active_jobs: 1002,
+ ci_active_pipelines: 1003,
+ ci_project_subscriptions: 1004,
+ ci_pipeline_schedules: 1005,
+ ci_needs_size_limit: 1006,
+ ci_registered_group_runners: 1007,
+ ci_registered_project_runners: 1008
+ )
+ create(:plan_limits,
+ plan: plan2,
+ ci_pipeline_size: 1101,
+ ci_active_jobs: 1102,
+ ci_active_pipelines: 1103,
+ ci_project_subscriptions: 1104,
+ ci_pipeline_schedules: 1105,
+ ci_needs_size_limit: 1106,
+ ci_registered_group_runners: 1107,
+ ci_registered_project_runners: 1108
+ )
+ end
+
+ it 'returns CI/CD limits' do
+ ci_cd_size_limits = subject.settings[:ci_cd_limits]
+
+ expect(ci_cd_size_limits[:Plan1]).to eq({
+ ci_active_jobs: 1002,
+ ci_active_pipelines: 1003,
+ ci_needs_size_limit: 1006,
+ ci_pipeline_schedules: 1005,
+ ci_pipeline_size: 1001,
+ ci_project_subscriptions: 1004,
+ ci_registered_group_runners: 1007,
+ ci_registered_project_runners: 1008
+ })
+ expect(ci_cd_size_limits[:Plan2]).to eq({
+ ci_active_jobs: 1102,
+ ci_active_pipelines: 1103,
+ ci_needs_size_limit: 1106,
+ ci_pipeline_schedules: 1105,
+ ci_pipeline_size: 1101,
+ ci_project_subscriptions: 1104,
+ ci_registered_group_runners: 1107,
+ ci_registered_project_runners: 1108
+ })
+ end
+ end
+
describe '#rate_limits' do
before do
Gitlab::CurrentSettings.current_application_settings.update!(
diff --git a/spec/requests/api/graphql/mutations/ci/ci_cd_settings_update_spec.rb b/spec/requests/api/graphql/mutations/ci/project_ci_cd_settings_update_spec.rb
index 30e7f196542..394d9ff53d1 100644
--- a/spec/requests/api/graphql/mutations/ci/ci_cd_settings_update_spec.rb
+++ b/spec/requests/api/graphql/mutations/ci/project_ci_cd_settings_update_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'CiCdSettingsUpdate' do
+RSpec.describe 'ProjectCiCdSettingsUpdate' do
include GraphqlHelpers
let_it_be(:project) do
diff --git a/spec/requests/api/graphql/mutations/incident_management/timeline_event/create_spec.rb b/spec/requests/api/graphql/mutations/incident_management/timeline_event/create_spec.rb
new file mode 100644
index 00000000000..3ea8b38e20f
--- /dev/null
+++ b/spec/requests/api/graphql/mutations/incident_management/timeline_event/create_spec.rb
@@ -0,0 +1,60 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Creating an incident timeline event' do
+ include GraphqlHelpers
+
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:incident) { create(:incident, project: project) }
+ let_it_be(:event_occurred_at) { Time.current }
+ let_it_be(:note) { 'demo note' }
+
+ let(:input) { { incident_id: incident.to_global_id.to_s, note: note, occurred_at: event_occurred_at } }
+ let(:mutation) do
+ graphql_mutation(:timeline_event_create, input) do
+ <<~QL
+ clientMutationId
+ errors
+ timelineEvent {
+ id
+ author { id username }
+ incident { id title }
+ note
+ editable
+ action
+ occurredAt
+ }
+ QL
+ end
+ end
+
+ let(:mutation_response) { graphql_mutation_response(:timeline_event_create) }
+
+ before do
+ project.add_developer(user)
+ end
+
+ it 'creates incident timeline event', :aggregate_failures do
+ post_graphql_mutation(mutation, current_user: user)
+
+ timeline_event_response = mutation_response['timelineEvent']
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(timeline_event_response).to include(
+ 'author' => {
+ 'id' => user.to_global_id.to_s,
+ 'username' => user.username
+ },
+ 'incident' => {
+ 'id' => incident.to_global_id.to_s,
+ 'title' => incident.title
+ },
+ 'note' => note,
+ 'action' => 'comment',
+ 'editable' => false,
+ 'occurredAt' => event_occurred_at.iso8601
+ )
+ end
+end
diff --git a/spec/requests/api/graphql/mutations/incident_management/timeline_event/destroy_spec.rb b/spec/requests/api/graphql/mutations/incident_management/timeline_event/destroy_spec.rb
new file mode 100644
index 00000000000..faff3bfe23a
--- /dev/null
+++ b/spec/requests/api/graphql/mutations/incident_management/timeline_event/destroy_spec.rb
@@ -0,0 +1,67 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Removing an incident timeline event' do
+ include GraphqlHelpers
+
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:incident) { create(:incident, project: project) }
+ let_it_be(:timeline_event) { create(:incident_management_timeline_event, incident: incident, project: project) }
+
+ let(:variables) { { id: timeline_event.to_global_id.to_s } }
+
+ let(:mutation) do
+ graphql_mutation(:timeline_event_destroy, variables) do
+ <<~QL
+ clientMutationId
+ errors
+ timelineEvent {
+ id
+ author { id username }
+ incident { id title }
+ note
+ noteHtml
+ editable
+ action
+ occurredAt
+ createdAt
+ updatedAt
+ }
+ QL
+ end
+ end
+
+ let(:mutation_response) { graphql_mutation_response(:timeline_event_destroy) }
+
+ before do
+ project.add_developer(user)
+ end
+
+ it 'removes incident timeline event', :aggregate_failures do
+ post_graphql_mutation(mutation, current_user: user)
+
+ timeline_event_response = mutation_response['timelineEvent']
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(timeline_event_response).to include(
+ 'author' => {
+ 'id' => timeline_event.author.to_global_id.to_s,
+ 'username' => timeline_event.author.username
+ },
+ 'incident' => {
+ 'id' => incident.to_global_id.to_s,
+ 'title' => incident.title
+ },
+ 'note' => timeline_event.note,
+ 'noteHtml' => timeline_event.note_html,
+ 'editable' => false,
+ 'action' => timeline_event.action,
+ 'occurredAt' => timeline_event.occurred_at.iso8601,
+ 'createdAt' => timeline_event.created_at.iso8601,
+ 'updatedAt' => timeline_event.updated_at.iso8601
+ )
+ expect { timeline_event.reload }.to raise_error ActiveRecord::RecordNotFound
+ end
+end
diff --git a/spec/requests/api/graphql/mutations/incident_management/timeline_event/promote_from_note_spec.rb b/spec/requests/api/graphql/mutations/incident_management/timeline_event/promote_from_note_spec.rb
new file mode 100644
index 00000000000..b92f6af1d3d
--- /dev/null
+++ b/spec/requests/api/graphql/mutations/incident_management/timeline_event/promote_from_note_spec.rb
@@ -0,0 +1,62 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Promote an incident timeline event from a comment' do
+ include GraphqlHelpers
+
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:incident) { create(:incident, project: project) }
+ let_it_be(:comment) { create(:note, project: project, noteable: incident) }
+
+ let(:input) { { note_id: comment.to_global_id.to_s } }
+ let(:mutation) do
+ graphql_mutation(:timeline_event_promote_from_note, input) do
+ <<~QL
+ clientMutationId
+ errors
+ timelineEvent {
+ author { id username }
+ incident { id title }
+ promotedFromNote { id }
+ note
+ action
+ editable
+ occurredAt
+ }
+ QL
+ end
+ end
+
+ let(:mutation_response) { graphql_mutation_response(:timeline_event_promote_from_note) }
+
+ before do
+ project.add_developer(user)
+ end
+
+ it 'creates incident timeline event from the note', :aggregate_failures do
+ post_graphql_mutation(mutation, current_user: user)
+
+ timeline_event_response = mutation_response['timelineEvent']
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(timeline_event_response).to include(
+ 'author' => {
+ 'id' => user.to_global_id.to_s,
+ 'username' => user.username
+ },
+ 'incident' => {
+ 'id' => incident.to_global_id.to_s,
+ 'title' => incident.title
+ },
+ 'promotedFromNote' => {
+ 'id' => comment.to_global_id.to_s
+ },
+ 'note' => comment.note,
+ 'action' => 'comment',
+ 'editable' => false,
+ 'occurredAt' => comment.created_at.iso8601
+ )
+ end
+end
diff --git a/spec/requests/api/graphql/mutations/incident_management/timeline_event/update_spec.rb b/spec/requests/api/graphql/mutations/incident_management/timeline_event/update_spec.rb
new file mode 100644
index 00000000000..1c4439cec6f
--- /dev/null
+++ b/spec/requests/api/graphql/mutations/incident_management/timeline_event/update_spec.rb
@@ -0,0 +1,80 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Updating an incident timeline event' do
+ include GraphqlHelpers
+
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:incident) { create(:incident, project: project) }
+ let_it_be_with_reload(:timeline_event) do
+ create(:incident_management_timeline_event, incident: incident, project: project)
+ end
+
+ let(:occurred_at) { 1.minute.ago.iso8601 }
+
+ let(:variables) do
+ {
+ id: timeline_event.to_global_id.to_s,
+ note: 'Updated note',
+ occurred_at: occurred_at
+ }
+ end
+
+ let(:mutation) do
+ graphql_mutation(:timeline_event_update, variables) do
+ <<~QL
+ clientMutationId
+ errors
+ timelineEvent {
+ id
+ author { id username }
+ updatedByUser { id username }
+ incident { id title }
+ note
+ noteHtml
+ occurredAt
+ createdAt
+ updatedAt
+ }
+ QL
+ end
+ end
+
+ let(:mutation_response) { graphql_mutation_response(:timeline_event_update) }
+
+ before do
+ project.add_developer(user)
+ end
+
+ it 'updates the timeline event', :aggregate_failures do
+ post_graphql_mutation(mutation, current_user: user)
+
+ timeline_event_response = mutation_response['timelineEvent']
+
+ timeline_event.reload
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(timeline_event_response).to include(
+ 'id' => timeline_event.to_global_id.to_s,
+ 'author' => {
+ 'id' => timeline_event.author.to_global_id.to_s,
+ 'username' => timeline_event.author.username
+ },
+ 'updatedByUser' => {
+ 'id' => user.to_global_id.to_s,
+ 'username' => user.username
+ },
+ 'incident' => {
+ 'id' => incident.to_global_id.to_s,
+ 'title' => incident.title
+ },
+ 'note' => 'Updated note',
+ 'noteHtml' => timeline_event.note_html,
+ 'occurredAt' => occurred_at,
+ 'createdAt' => timeline_event.created_at.iso8601,
+ 'updatedAt' => timeline_event.updated_at.iso8601
+ )
+ end
+end
diff --git a/spec/requests/api/graphql/project/incident_management/timeline_events_spec.rb b/spec/requests/api/graphql/project/incident_management/timeline_events_spec.rb
new file mode 100644
index 00000000000..708fa96986c
--- /dev/null
+++ b/spec/requests/api/graphql/project/incident_management/timeline_events_spec.rb
@@ -0,0 +1,127 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'getting incident timeline events' do
+ include GraphqlHelpers
+
+ let_it_be(:project) { create(:project) }
+ let_it_be(:current_user) { create(:user) }
+ let_it_be(:updated_by_user) { create(:user) }
+ let_it_be(:incident) { create(:incident, project: project) }
+ let_it_be(:another_incident) { create(:incident, project: project) }
+ let_it_be(:promoted_from_note) { create(:note, project: project, noteable: incident) }
+
+ let_it_be(:timeline_event) do
+ create(
+ :incident_management_timeline_event,
+ incident: incident,
+ project: project,
+ updated_by_user: updated_by_user,
+ promoted_from_note: promoted_from_note
+ )
+ end
+
+ let_it_be(:second_timeline_event) do
+ create(:incident_management_timeline_event, incident: incident, project: project)
+ end
+
+ let_it_be(:another_timeline_event) do
+ create(:incident_management_timeline_event, incident: another_incident, project: project)
+ end
+
+ let(:params) { { incident_id: incident.to_global_id.to_s } }
+
+ let(:timeline_event_fields) do
+ <<~QUERY
+ nodes {
+ id
+ author { id username }
+ updatedByUser { id username }
+ incident { id title }
+ note
+ noteHtml
+ promotedFromNote { id body }
+ editable
+ action
+ occurredAt
+ createdAt
+ updatedAt
+ }
+ QUERY
+ end
+
+ let(:query) do
+ graphql_query_for(
+ 'project',
+ { 'fullPath' => project.full_path },
+ query_graphql_field('incidentManagementTimelineEvents', params, timeline_event_fields)
+ )
+ end
+
+ let(:timeline_events) do
+ graphql_data.dig('project', 'incidentManagementTimelineEvents', 'nodes')
+ end
+
+ before do
+ project.add_guest(current_user)
+ post_graphql(query, current_user: current_user)
+ end
+
+ it_behaves_like 'a working graphql query'
+
+ it 'returns the correct number of timeline events' do
+ expect(timeline_events.count).to eq(2)
+ end
+
+ it 'returns the correct properties of the incident timeline events' do
+ expect(timeline_events.first).to include(
+ 'author' => {
+ 'id' => timeline_event.author.to_global_id.to_s,
+ 'username' => timeline_event.author.username
+ },
+ 'updatedByUser' => {
+ 'id' => updated_by_user.to_global_id.to_s,
+ 'username' => updated_by_user.username
+ },
+ 'incident' => {
+ 'id' => incident.to_global_id.to_s,
+ 'title' => incident.title
+ },
+ 'note' => timeline_event.note,
+ 'noteHtml' => timeline_event.note_html,
+ 'promotedFromNote' => {
+ 'id' => promoted_from_note.to_global_id.to_s,
+ 'body' => promoted_from_note.note
+ },
+ 'editable' => false,
+ 'action' => timeline_event.action,
+ 'occurredAt' => timeline_event.occurred_at.iso8601,
+ 'createdAt' => timeline_event.created_at.iso8601,
+ 'updatedAt' => timeline_event.updated_at.iso8601
+ )
+ end
+
+ context 'when filtering by id' do
+ let(:params) { { incident_id: incident.to_global_id.to_s, id: timeline_event.to_global_id.to_s } }
+
+ let(:query) do
+ graphql_query_for(
+ 'project',
+ { 'fullPath' => project.full_path },
+ query_graphql_field('incidentManagementTimelineEvent', params, 'id occurredAt')
+ )
+ end
+
+ it_behaves_like 'a working graphql query'
+
+ it 'returns a single timeline event', :aggregate_failures do
+ single_timeline_event = graphql_data.dig('project', 'incidentManagementTimelineEvent')
+
+ expect(single_timeline_event).to include(
+ 'id' => timeline_event.to_global_id.to_s,
+ 'occurredAt' => timeline_event.occurred_at.iso8601
+ )
+ end
+ end
+end
diff --git a/spec/support/helpers/migrations_helpers.rb b/spec/support/helpers/migrations_helpers.rb
index 0c60871d2e7..60097e301c4 100644
--- a/spec/support/helpers/migrations_helpers.rb
+++ b/spec/support/helpers/migrations_helpers.rb
@@ -156,6 +156,13 @@ module MigrationsHelpers
end
def migrate!
+ open_transactions = ActiveRecord::Base.connection.open_transactions
+ allow_next_instance_of(described_class) do |migration|
+ allow(migration).to receive(:transaction_open?) do
+ ActiveRecord::Base.connection.open_transactions > open_transactions
+ end
+ end
+
migration_context.up do |migration|
migration.name == described_class.name
end
diff --git a/spec/support/shared_examples/graphql/mutations/incident_management_timeline_events_shared_examples.rb b/spec/support/shared_examples/graphql/mutations/incident_management_timeline_events_shared_examples.rb
new file mode 100644
index 00000000000..b989dbc6524
--- /dev/null
+++ b/spec/support/shared_examples/graphql/mutations/incident_management_timeline_events_shared_examples.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+# Requres:
+# * subject with a 'resolve' name
+# * Defined expected timeline event via `let(:expected_timeline_event) { instance_double(...) }`
+RSpec.shared_examples 'creating an incident timeline event' do
+ it 'creates a timeline event' do
+ expect { resolve }.to change(IncidentManagement::TimelineEvent, :count).by(1)
+ end
+
+ it 'responds with a timeline event', :aggregate_failures do
+ response = resolve
+ timeline_event = IncidentManagement::TimelineEvent.last!
+
+ expect(response).to match(timeline_event: timeline_event, errors: be_empty)
+
+ expect(timeline_event.promoted_from_note).to eq(expected_timeline_event.promoted_from_note)
+ expect(timeline_event.note).to eq(expected_timeline_event.note)
+ expect(timeline_event.occurred_at.to_s).to eq(expected_timeline_event.occurred_at)
+ expect(timeline_event.incident).to eq(expected_timeline_event.incident)
+ expect(timeline_event.author).to eq(expected_timeline_event.author)
+ end
+end
+
+# Requres
+# * subject with a 'resolve' name
+# * a user factory with a 'current_user' name
+RSpec.shared_examples 'failing to create an incident timeline event' do
+ context 'when a user has no permissions to create timeline event' do
+ before do
+ project.add_guest(current_user)
+ end
+
+ it 'raises an error' do
+ expect { resolve }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ end
+ end
+end
+
+# Requres:
+# * subject with a 'resolve' name
+RSpec.shared_examples 'responding with an incident timeline errors' do |errors:|
+ it 'returns errors' do
+ expect(resolve).to eq(timeline_event: nil, errors: errors)
+ end
+end
diff --git a/spec/views/help/instance_configuration.html.haml_spec.rb b/spec/views/help/instance_configuration.html.haml_spec.rb
index c4542046a9d..fbf84a5d272 100644
--- a/spec/views/help/instance_configuration.html.haml_spec.rb
+++ b/spec/views/help/instance_configuration.html.haml_spec.rb
@@ -21,6 +21,7 @@ RSpec.describe 'help/instance_configuration' do
expect(rendered).to have_link(nil, href: '#size-limits')
expect(rendered).to have_link(nil, href: '#package-registry')
expect(rendered).to have_link(nil, href: '#rate-limits')
+ expect(rendered).to have_link(nil, href: '#ci-cd-limits')
end
it 'has several sections' do
@@ -31,6 +32,7 @@ RSpec.describe 'help/instance_configuration' do
expect(rendered).to have_css('h2#size-limits')
expect(rendered).to have_css('h2#package-registry')
expect(rendered).to have_css('h2#rate-limits')
+ expect(rendered).to have_css('h2#ci-cd-limits')
end
end
end