From 5e3d4ef8cca60e49769e6ba7d3d6c803af5b2301 Mon Sep 17 00:00:00 2001 From: Thong Kuah Date: Wed, 25 Aug 2021 13:23:25 +1200 Subject: [PATCH 1/3] Skip sql queries generated by database_cleaner --- spec/support/database/prevent_cross_joins.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/spec/support/database/prevent_cross_joins.rb b/spec/support/database/prevent_cross_joins.rb index 22e1885ffb9c8d..aff148f7bfadda 100644 --- a/spec/support/database/prevent_cross_joins.rb +++ b/spec/support/database/prevent_cross_joins.rb @@ -24,6 +24,10 @@ module PreventCrossJoins def self.validate_cross_joins!(sql) return if Thread.current[:allow_cross_joins_across_databases] + # Allow spec/support/database_cleaner.rb queries to disable/enable triggers for many tables + # See https://gitlab.com/gitlab-org/gitlab/-/issues/339396 + return if sql.include?("DISABLE TRIGGER") || sql.include?("ENABLE TRIGGER") + # PgQuery might fail in some cases due to limited nesting: # https://github.com/pganalyze/pg_query/issues/209 tables = PgQuery.parse(sql).tables -- GitLab From 40f9110d0803f84d639889c14cf619a126581359 Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Fri, 20 Aug 2021 06:29:11 +0000 Subject: [PATCH 2/3] Prevent cross joins for all while allowing existing failures This uses a filename based approach to allowlist spec files Add documentation about cross-database joins detection --- .cross-join-allowlist.yml | 1 + doc/development/database/multiple_databases.md | 4 ++++ spec/support/database/prevent_cross_joins.rb | 16 ++++++++++++---- .../database/prevent_cross_joins_spec.rb | 10 +--------- 4 files changed, 18 insertions(+), 13 deletions(-) create mode 100644 .cross-join-allowlist.yml diff --git a/.cross-join-allowlist.yml b/.cross-join-allowlist.yml new file mode 100644 index 00000000000000..8d65dd2e129b13 --- /dev/null +++ b/.cross-join-allowlist.yml @@ -0,0 +1 @@ +- ./ee/spec/lib/analytics/devops_adoption/snapshot_calculator_spec.rb diff --git a/doc/development/database/multiple_databases.md b/doc/development/database/multiple_databases.md index 71dcc5bb866004..a9d53d5ee45d10 100644 --- a/doc/development/database/multiple_databases.md +++ b/doc/development/database/multiple_databases.md @@ -109,6 +109,10 @@ already many such examples that need to be fixed in The following are some real examples that have resulted from this and these patterns may apply to future cases. +[Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68620) in GitLab 14.3, any +queries detected that join across databases raises an error (except +for pre-existing queries). + #### Remove the code The simplest solution we've seen several times now has been an existing scope diff --git a/spec/support/database/prevent_cross_joins.rb b/spec/support/database/prevent_cross_joins.rb index aff148f7bfadda..8ec946997fb9fc 100644 --- a/spec/support/database/prevent_cross_joins.rb +++ b/spec/support/database/prevent_cross_joins.rb @@ -33,7 +33,8 @@ def self.validate_cross_joins!(sql) tables = PgQuery.parse(sql).tables schemas = Database::GitlabSchema.table_schemas(tables) - if schemas.many? + if schemas.include?(:gitlab_ci) && schemas.include?(:gitlab_main) + Thread.current[:has_cross_join_exception] = true raise CrossJoinAcrossUnsupportedTablesError, "Unsupported cross-join across '#{tables.join(", ")}' modifying '#{schemas.to_a.join(", ")}' discovered " \ "when executing query '#{sql}'" @@ -66,11 +67,18 @@ def allow_cross_joins_across_databases(url:) Gitlab::Database.singleton_class.prepend( Database::PreventCrossJoins::GitlabDatabaseMixin) +ALLOW_LIST = Set.new(YAML.load_file(Rails.root.join('.cross-join-allowlist.yml'))).freeze + RSpec.configure do |config| config.include(::Database::PreventCrossJoins::SpecHelpers) - # TODO: remove `:prevent_cross_joins` to enable the check by default - config.around(:each, :prevent_cross_joins) do |example| - with_cross_joins_prevented { example.run } + config.around do |example| + Thread.current[:has_cross_join_exception] = false + + if ALLOW_LIST.include?(example.file_path) + example.run + else + with_cross_joins_prevented { example.run } + end end end diff --git a/spec/support_specs/database/prevent_cross_joins_spec.rb b/spec/support_specs/database/prevent_cross_joins_spec.rb index dd4ed9c40b83f2..b26b862b34b443 100644 --- a/spec/support_specs/database/prevent_cross_joins_spec.rb +++ b/spec/support_specs/database/prevent_cross_joins_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' RSpec.describe Database::PreventCrossJoins do - context 'when running in :prevent_cross_joins scope', :prevent_cross_joins do + context 'when running in a default scope' do context 'when only non-CI tables are used' do it 'does not raise exception' do expect { main_only_query }.not_to raise_error @@ -32,14 +32,6 @@ end end - context 'when running in a default scope' do - context 'when CI and non-CI tables are used' do - it 'does not raise exception' do - expect { main_and_ci_query }.not_to raise_error - end - end - end - private def main_only_query -- GitLab From c34d6739f6350cc69680b08109e80d6fa1992c6d Mon Sep 17 00:00:00 2001 From: Thong Kuah Date: Wed, 25 Aug 2021 15:43:41 +1200 Subject: [PATCH 3/3] Update allowlist based on CI run --- .cross-join-allowlist.yml | 419 +++++++++++++++++++++++++++++++++++++- 1 file changed, 418 insertions(+), 1 deletion(-) diff --git a/.cross-join-allowlist.yml b/.cross-join-allowlist.yml index 8d65dd2e129b13..19be59cc74a75b 100644 --- a/.cross-join-allowlist.yml +++ b/.cross-join-allowlist.yml @@ -1 +1,418 @@ -- ./ee/spec/lib/analytics/devops_adoption/snapshot_calculator_spec.rb +- "./ee/spec/controllers/ee/projects/jobs_controller_spec.rb" +- "./ee/spec/controllers/ee/search_controller_spec.rb" +- "./ee/spec/controllers/operations_controller_spec.rb" +- "./ee/spec/controllers/projects/issues_controller_spec.rb" +- "./ee/spec/controllers/projects/security/vulnerabilities_controller_spec.rb" +- "./ee/spec/features/ci/ci_minutes_spec.rb" +- "./ee/spec/features/ci_shared_runner_warnings_spec.rb" +- "./ee/spec/features/groups/analytics/cycle_analytics/filters_and_data_spec.rb" +- "./ee/spec/features/merge_request/sidebar_spec.rb" +- "./ee/spec/features/merge_requests/user_resets_approvers_spec.rb" +- "./ee/spec/features/merge_request/user_approves_with_password_spec.rb" +- "./ee/spec/features/merge_request/user_creates_merge_request_spec.rb" +- "./ee/spec/features/merge_request/user_creates_merge_request_with_blocking_mrs_spec.rb" +- "./ee/spec/features/merge_request/user_edits_merge_request_blocking_mrs_spec.rb" +- "./ee/spec/features/merge_request/user_merges_immediately_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_merge_widget_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_approval_rules_spec.rb" +- "./ee/spec/features/merge_request/user_sets_approvers_spec.rb" +- "./ee/spec/features/merge_request/user_uses_slash_commands_spec.rb" +- "./ee/spec/features/merge_request/user_views_blocked_merge_request_spec.rb" +- "./ee/spec/features/merge_trains/two_merge_requests_on_train_spec.rb" +- "./ee/spec/features/merge_trains/user_adds_merge_request_to_merge_train_spec.rb" +- "./ee/spec/features/merge_trains/user_adds_to_merge_train_when_pipeline_succeeds_spec.rb" +- "./ee/spec/features/projects/jobs_spec.rb" +- "./ee/spec/features/projects/merge_requests/user_approves_merge_request_spec.rb" +- "./ee/spec/features/projects/pipelines/pipeline_spec.rb" +- "./ee/spec/features/projects/settings/auto_rollback_spec.rb" +- "./ee/spec/features/projects/settings/pipeline_subscriptions_spec.rb" +- "./ee/spec/features/projects/settings/protected_environments_spec.rb" +- "./ee/spec/features/search/elastic/group_search_spec.rb" +- "./ee/spec/finders/ee/namespaces/projects_finder_spec.rb" +- "./ee/spec/finders/group_projects_finder_spec.rb" +- "./ee/spec/finders/security/findings_finder_spec.rb" +- "./ee/spec/frontend/fixtures/analytics/metrics.rb" +- "./ee/spec/frontend/fixtures/analytics/value_streams_code_stage.rb" +- "./ee/spec/frontend/fixtures/analytics/value_streams_issue_stage.rb" +- "./ee/spec/frontend/fixtures/analytics/value_streams_plan_stage.rb" +- "./ee/spec/frontend/fixtures/analytics/value_streams.rb" +- "./ee/spec/frontend/fixtures/analytics/value_streams_review_stage.rb" +- "./ee/spec/frontend/fixtures/analytics/value_streams_staging_stage.rb" +- "./ee/spec/frontend/fixtures/merge_requests.rb" +- "./ee/spec/graphql/ee/mutations/ci/runner/update_spec.rb" +- "./ee/spec/graphql/ee/resolvers/namespace_projects_resolver_spec.rb" +- "./ee/spec/lib/analytics/devops_adoption/snapshot_calculator_spec.rb" +- "./ee/spec/lib/ee/gitlab/background_migration/migrate_approver_to_approval_rules_spec.rb" +- "./ee/spec/lib/ee/gitlab/background_migration/migrate_security_scans_spec.rb" +- "./ee/spec/lib/ee/gitlab/background_migration/populate_latest_pipeline_ids_spec.rb" +- "./ee/spec/lib/ee/gitlab/background_migration/populate_resolved_on_default_branch_column_spec.rb" +- "./ee/spec/lib/ee/gitlab/background_migration/populate_uuids_for_security_findings_spec.rb" +- "./ee/spec/lib/ee/gitlab/background_migration/populate_vulnerability_feedback_pipeline_id_spec.rb" +- "./ee/spec/lib/ee/gitlab/usage_data_spec.rb" +- "./ee/spec/lib/gitlab/ci/minutes/build_consumption_spec.rb" +- "./ee/spec/lib/gitlab/ci/minutes/runners_availability_spec.rb" +- "./ee/spec/lib/gitlab/ci/templates/Jobs/browser_performance_testing_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/migrations/schedule_populate_resolved_on_default_branch_column_spec.rb" +- "./ee/spec/models/analytics/cycle_analytics/group_level_spec.rb" +- "./ee/spec/models/ci/build_spec.rb" +- "./ee/spec/models/ci/minutes/project_monthly_usage_spec.rb" +- "./ee/spec/models/ci/pipeline_spec.rb" +- "./ee/spec/models/ee/ci/runner_spec.rb" +- "./ee/spec/models/ee/vulnerability_spec.rb" +- "./ee/spec/models/merge_request_spec.rb" +- "./ee/spec/models/project_spec.rb" +- "./ee/spec/models/security/finding_spec.rb" +- "./ee/spec/models/security/scan_spec.rb" +- "./ee/spec/presenters/ci/pipeline_presenter_spec.rb" +- "./ee/spec/requests/api/ci/jobs_spec.rb" +- "./ee/spec/requests/api/ci/minutes_spec.rb" +- "./ee/spec/requests/api/ci/runner_spec.rb" +- "./ee/spec/requests/api/graphql/ci/minutes/usage_spec.rb" +- "./ee/spec/requests/api/graphql/mutations/environments/canary_ingress/update_spec.rb" +- "./ee/spec/requests/api/graphql/mutations/vulnerabilities/create_external_issue_link_spec.rb" +- "./ee/spec/requests/api/graphql/project/pipeline/security_report_summary_spec.rb" +- "./ee/spec/requests/api/graphql/vulnerabilities/location_spec.rb" +- "./ee/spec/requests/api/groups_spec.rb" +- "./ee/spec/requests/api/namespaces_spec.rb" +- "./ee/spec/requests/api/search_spec.rb" +- "./ee/spec/requests/api/vulnerability_findings_spec.rb" +- "./ee/spec/serializers/dashboard_environment_entity_spec.rb" +- "./ee/spec/serializers/dashboard_environments_serializer_spec.rb" +- "./ee/spec/serializers/dashboard_operations_project_entity_spec.rb" +- "./ee/spec/serializers/ee/build_details_entity_spec.rb" +- "./ee/spec/serializers/merge_request_poll_widget_entity_spec.rb" +- "./ee/spec/services/auto_merge/add_to_merge_train_when_pipeline_succeeds_service_spec.rb" +- "./ee/spec/services/ci/create_pipeline_service/needs_spec.rb" +- "./ee/spec/services/ci/create_pipeline_service/runnable_builds_spec.rb" +- "./ee/spec/services/ci/minutes/additional_packs/change_namespace_service_spec.rb" +- "./ee/spec/services/ci/minutes/additional_packs/create_service_spec.rb" +- "./ee/spec/services/ci/minutes/refresh_cached_data_service_spec.rb" +- "./ee/spec/services/ci/pipeline_creation/drop_not_runnable_builds_service_spec.rb" +- "./ee/spec/services/ci/process_pipeline_service_spec.rb" +- "./ee/spec/services/ci/register_job_service_spec.rb" +- "./ee/spec/services/ci/retry_build_service_spec.rb" +- "./ee/spec/services/ci/retry_pipeline_service_spec.rb" +- "./ee/spec/services/ci/trigger_downstream_subscription_service_spec.rb" +- "./ee/spec/services/clear_namespace_shared_runners_minutes_service_spec.rb" +- "./ee/spec/services/deployments/auto_rollback_service_spec.rb" +- "./ee/spec/services/ee/ci/job_artifacts/destroy_all_expired_service_spec.rb" +- "./ee/spec/services/ee/ci/job_artifacts/destroy_batch_service_spec.rb" +- "./ee/spec/services/ee/issues/build_from_vulnerability_service_spec.rb" +- "./ee/spec/services/ee/merge_requests/after_create_service_spec.rb" +- "./ee/spec/services/ee/merge_requests/create_pipeline_service_spec.rb" +- "./ee/spec/services/ee/merge_requests/refresh_service_spec.rb" +- "./ee/spec/services/merge_trains/refresh_merge_request_service_spec.rb" +- "./ee/spec/services/search/group_service_spec.rb" +- "./ee/spec/services/security/report_summary_service_spec.rb" +- "./ee/spec/services/security/vulnerability_counting_service_spec.rb" +- "./ee/spec/support/features/redacted_search_results_examples.rb" +- "./ee/spec/support/shared_examples/fixtures/analytics_value_streams_shared_examples.rb" +- "./ee/spec/support/shared_examples/services/build_execute_shared_examples.rb" +- "./ee/spec/support/shared_examples/services/search_service_shared_examples.rb" +- "./ee/spec/workers/ci/initial_pipeline_process_worker_spec.rb" +- "./ee/spec/workers/scan_security_report_secrets_worker_spec.rb" +- "./ee/spec/workers/security/store_scans_worker_spec.rb" +- "./spec/controllers/admin/runners_controller_spec.rb" +- "./spec/controllers/groups/runners_controller_spec.rb" +- "./spec/controllers/groups/settings/ci_cd_controller_spec.rb" +- "./spec/controllers/projects/issues_controller_spec.rb" +- "./spec/controllers/projects/jobs_controller_spec.rb" +- "./spec/controllers/projects/logs_controller_spec.rb" +- "./spec/controllers/projects/merge_requests/content_controller_spec.rb" +- "./spec/controllers/projects/merge_requests_controller_spec.rb" +- "./spec/controllers/projects/pipelines_controller_spec.rb" +- "./spec/controllers/projects/runners_controller_spec.rb" +- "./spec/controllers/projects/serverless/functions_controller_spec.rb" +- "./spec/controllers/projects/settings/ci_cd_controller_spec.rb" +- "./spec/controllers/projects/web_ide_terminals_controller_spec.rb" +- "./spec/features/admin/admin_builds_spec.rb" +- "./spec/features/admin/admin_runners_spec.rb" +- "./spec/features/commits_spec.rb" +- "./spec/features/cycle_analytics_spec.rb" +- "./spec/features/groups/settings/ci_cd_spec.rb" +- "./spec/features/ide/user_opens_merge_request_spec.rb" +- "./spec/features/issuables/markdown_references/internal_references_spec.rb" +- "./spec/features/issuables/markdown_references/jira_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/notes_on_issues_spec.rb" +- "./spec/features/issues/user_creates_branch_and_merge_request_spec.rb" +- "./spec/features/issues/user_creates_confidential_merge_request_spec.rb" +- "./spec/features/markdown/gitlab_flavored_markdown_spec.rb" +- "./spec/features/merge_request/batch_comments_spec.rb" +- "./spec/features/merge_request/close_reopen_report_toggle_spec.rb" +- "./spec/features/merge_request/maintainer_edits_fork_spec.rb" +- "./spec/features/merge_request/merge_request_discussion_lock_spec.rb" +- "./spec/features/merge_request/user_accepts_merge_request_spec.rb" +- "./spec/features/merge_request/user_allows_commits_from_memebers_who_can_merge_spec.rb" +- "./spec/features/merge_request/user_approves_spec.rb" +- "./spec/features/merge_request/user_assigns_themselves_spec.rb" +- "./spec/features/merge_request/user_awards_emoji_spec.rb" +- "./spec/features/merge_request/user_clicks_merge_request_tabs_spec.rb" +- "./spec/features/merge_request/user_comments_on_diff_spec.rb" +- "./spec/features/merge_request/user_comments_on_merge_request_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_customizes_merge_commit_message_spec.rb" +- "./spec/features/merge_request/user_edits_assignees_sidebar_spec.rb" +- "./spec/features/merge_request/user_edits_merge_request_spec.rb" +- "./spec/features/merge_request/user_edits_reviewers_sidebar_spec.rb" +- "./spec/features/merge_request/user_expands_diff_spec.rb" +- "./spec/features/merge_request/user_interacts_with_batched_mr_diffs_spec.rb" +- "./spec/features/merge_request/user_invites_from_a_comment_spec.rb" +- "./spec/features/merge_request/user_jumps_to_discussion_spec.rb" +- "./spec/features/merge_request/user_locks_discussion_spec.rb" +- "./spec/features/merge_request/user_manages_subscription_spec.rb" +- "./spec/features/merge_request/user_marks_merge_request_as_draft_spec.rb" +- "./spec/features/merge_request/user_merges_immediately_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_posts_notes_spec.rb" +- "./spec/features/merge_request/user_rebases_merge_request_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_resolves_outdated_diff_discussions_spec.rb" +- "./spec/features/merge_request/user_resolves_wip_mr_spec.rb" +- "./spec/features/merge_request/user_reverts_merge_request_spec.rb" +- "./spec/features/merge_request/user_reviews_image_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_check_out_branch_modal_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_deleted_target_branch_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_button_depending_on_unresolved_discussions_spec.rb" +- "./spec/features/merge_request/user_sees_merge_request_pipelines_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_sees_mr_with_deleted_source_branch_spec.rb" +- "./spec/features/merge_request/user_sees_notes_from_forked_project_spec.rb" +- "./spec/features/merge_request/user_sees_pipelines_from_forked_project_spec.rb" +- "./spec/features/merge_request/user_sees_pipelines_spec.rb" +- "./spec/features/merge_request/user_sees_suggest_pipeline_spec.rb" +- "./spec/features/merge_request/user_sees_system_notes_spec.rb" +- "./spec/features/merge_request/user_sees_versions_spec.rb" +- "./spec/features/merge_request/user_selects_branches_for_new_mr_spec.rb" +- "./spec/features/merge_request/user_squashes_merge_request_spec.rb" +- "./spec/features/merge_request/user_suggests_changes_on_diff_spec.rb" +- "./spec/features/merge_request/user_toggles_whitespace_changes_spec.rb" +- "./spec/features/merge_request/user_views_auto_expanding_diff_spec.rb" +- "./spec/features/merge_request/user_views_diffs_commit_spec.rb" +- "./spec/features/merge_request/user_views_diffs_file_by_file_spec.rb" +- "./spec/features/merge_request/user_views_diffs_spec.rb" +- "./spec/features/merge_request/user_views_merge_request_from_deleted_fork_spec.rb" +- "./spec/features/merge_request/user_views_open_merge_request_spec.rb" +- "./spec/features/participants_autocomplete_spec.rb" +- "./spec/features/project_group_variables_spec.rb" +- "./spec/features/projects/badges/list_spec.rb" +- "./spec/features/projects/badges/pipeline_badge_spec.rb" +- "./spec/features/projects/blobs/edit_spec.rb" +- "./spec/features/projects/environments/environment_spec.rb" +- "./spec/features/projects/environments/environments_spec.rb" +- "./spec/features/projects/environments_pod_logs_spec.rb" +- "./spec/features/projects/infrastructure_registry_spec.rb" +- "./spec/features/projects/issuable_templates_spec.rb" +- "./spec/features/projects/jobs/permissions_spec.rb" +- "./spec/features/projects/jobs_spec.rb" +- "./spec/features/projects/jobs/user_browses_job_spec.rb" +- "./spec/features/projects/jobs/user_browses_jobs_spec.rb" +- "./spec/features/projects/package_files_spec.rb" +- "./spec/features/projects/pipelines/pipeline_spec.rb" +- "./spec/features/projects/pipelines/pipelines_spec.rb" +- "./spec/features/projects/serverless/functions_spec.rb" +- "./spec/features/projects/settings/pipelines_settings_spec.rb" +- "./spec/features/projects/user_sees_user_popover_spec.rb" +- "./spec/features/projects/view_on_env_spec.rb" +- "./spec/features/project_variables_spec.rb" +- "./spec/features/runners_spec.rb" +- "./spec/features/security/project/internal_access_spec.rb" +- "./spec/features/security/project/private_access_spec.rb" +- "./spec/features/security/project/public_access_spec.rb" +- "./spec/features/task_lists_spec.rb" +- "./spec/features/triggers_spec.rb" +- "./spec/features/user_sees_revert_modal_spec.rb" +- "./spec/finders/ci/pipelines_finder_spec.rb" +- "./spec/finders/ci/pipelines_for_merge_request_finder_spec.rb" +- "./spec/finders/ci/runners_finder_spec.rb" +- "./spec/finders/clusters/knative_services_finder_spec.rb" +- "./spec/finders/projects_finder_spec.rb" +- "./spec/finders/projects/serverless/functions_finder_spec.rb" +- "./spec/frontend/fixtures/analytics.rb" +- "./spec/frontend/fixtures/jobs.rb" +- "./spec/frontend/fixtures/merge_requests.rb" +- "./spec/frontend/fixtures/pipelines.rb" +- "./spec/frontend/fixtures/runner.rb" +- "./spec/graphql/mutations/ci/runner/delete_spec.rb" +- "./spec/graphql/mutations/ci/runner/update_spec.rb" +- "./spec/graphql/resolvers/ci/group_runners_resolver_spec.rb" +- "./spec/graphql/resolvers/ci/job_token_scope_resolver_spec.rb" +- "./spec/graphql/resolvers/merge_request_pipelines_resolver_spec.rb" +- "./spec/graphql/resolvers/projects_resolver_spec.rb" +- "./spec/graphql/types/ci/job_token_scope_type_spec.rb" +- "./spec/helpers/packages_helper_spec.rb" +- "./spec/lib/api/entities/package_spec.rb" +- "./spec/lib/gitlab/background_migration/migrate_legacy_artifacts_spec.rb" +- "./spec/lib/gitlab/ci/badge/pipeline/status_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/test_gitlab_ci_yaml_spec.rb" +- "./spec/lib/gitlab/ci/templates/Verify/load_performance_testing_gitlab_ci_yaml_spec.rb" +- "./spec/lib/gitlab/prometheus/query_variables_spec.rb" +- "./spec/mailers/emails/pipelines_spec.rb" +- "./spec/migrations/cleanup_legacy_artifact_migration_spec.rb" +- "./spec/migrations/migrate_protected_attribute_to_pending_builds_spec.rb" +- "./spec/migrations/re_schedule_latest_pipeline_id_population_with_all_security_related_artifact_types_spec.rb" +- "./spec/migrations/schedule_migrate_security_scans_spec.rb" +- "./spec/models/ci/build_dependencies_spec.rb" +- "./spec/models/ci/build_spec.rb" +- "./spec/models/ci/build_trace_chunk_spec.rb" +- "./spec/models/ci/job_artifact_spec.rb" +- "./spec/models/ci/job_token/scope_spec.rb" +- "./spec/models/ci/pipeline_spec.rb" +- "./spec/models/ci/runner_spec.rb" +- "./spec/models/clusters/applications/runner_spec.rb" +- "./spec/models/concerns/chronic_duration_attribute_spec.rb" +- "./spec/models/deployment_spec.rb" +- "./spec/models/environment_spec.rb" +- "./spec/models/environment_status_spec.rb" +- "./spec/models/merge_request_spec.rb" +- "./spec/models/project_spec.rb" +- "./spec/models/user_spec.rb" +- "./spec/presenters/ci/build_runner_presenter_spec.rb" +- "./spec/presenters/ci/pipeline_presenter_spec.rb" +- "./spec/presenters/packages/detail/package_presenter_spec.rb" +- "./spec/requests/api/ci/jobs_spec.rb" +- "./spec/requests/api/ci/pipelines_spec.rb" +- "./spec/requests/api/ci/runner/jobs_put_spec.rb" +- "./spec/requests/api/ci/runner/jobs_request_post_spec.rb" +- "./spec/requests/api/ci/runner/jobs_trace_spec.rb" +- "./spec/requests/api/ci/runner/runners_post_spec.rb" +- "./spec/requests/api/ci/runners_spec.rb" +- "./spec/requests/api/commit_statuses_spec.rb" +- "./spec/requests/api/graphql/ci/groups_spec.rb" +- "./spec/requests/api/graphql/ci/job_spec.rb" +- "./spec/requests/api/graphql/ci/runner_spec.rb" +- "./spec/requests/api/graphql/group_query_spec.rb" +- "./spec/requests/api/graphql/merge_request/merge_request_spec.rb" +- "./spec/requests/api/graphql/mutations/ci/job_play_spec.rb" +- "./spec/requests/api/graphql/mutations/ci/job_retry_spec.rb" +- "./spec/requests/api/graphql/mutations/ci/job_token_scope/add_project_spec.rb" +- "./spec/requests/api/graphql/mutations/ci/job_token_scope/remove_project_spec.rb" +- "./spec/requests/api/graphql/mutations/environments/canary_ingress/update_spec.rb" +- "./spec/requests/api/graphql/mutations/merge_requests/create_spec.rb" +- "./spec/requests/api/graphql/packages/composer_spec.rb" +- "./spec/requests/api/graphql/packages/conan_spec.rb" +- "./spec/requests/api/graphql/packages/maven_spec.rb" +- "./spec/requests/api/graphql/packages/nuget_spec.rb" +- "./spec/requests/api/graphql/packages/package_spec.rb" +- "./spec/requests/api/graphql/packages/pypi_spec.rb" +- "./spec/requests/api/graphql/project/merge_request/pipelines_spec.rb" +- "./spec/requests/api/graphql/project/merge_request_spec.rb" +- "./spec/requests/api/graphql/project/merge_requests_spec.rb" +- "./spec/requests/api/graphql/project/pipeline_spec.rb" +- "./spec/requests/api/merge_requests_spec.rb" +- "./spec/requests/api/package_files_spec.rb" +- "./spec/requests/api/projects_spec.rb" +- "./spec/requests/projects/cycle_analytics_events_spec.rb" +- "./spec/serializers/build_details_entity_spec.rb" +- "./spec/serializers/ci/pipeline_entity_spec.rb" +- "./spec/serializers/merge_request_poll_widget_entity_spec.rb" +- "./spec/serializers/merge_request_serializer_spec.rb" +- "./spec/serializers/pipeline_details_entity_spec.rb" +- "./spec/serializers/pipeline_serializer_spec.rb" +- "./spec/serializers/runner_entity_spec.rb" +- "./spec/services/auto_merge/merge_when_pipeline_succeeds_service_spec.rb" +- "./spec/services/auto_merge_service_spec.rb" +- "./spec/services/ci/create_pipeline_service/cross_project_pipeline_spec.rb" +- "./spec/services/ci/create_pipeline_service/needs_spec.rb" +- "./spec/services/ci/create_pipeline_service/parent_child_pipeline_spec.rb" +- "./spec/services/ci/create_pipeline_service_spec.rb" +- "./spec/services/ci/destroy_pipeline_service_spec.rb" +- "./spec/services/ci/drop_pipeline_service_spec.rb" +- "./spec/services/ci/expire_pipeline_cache_service_spec.rb" +- "./spec/services/ci/job_artifacts/destroy_all_expired_service_spec.rb" +- "./spec/services/ci/job_artifacts/destroy_associations_service_spec.rb" +- "./spec/services/ci/job_artifacts/destroy_batch_service_spec.rb" +- "./spec/services/ci/pipeline_processing/shared_processing_service.rb" +- "./spec/services/ci/pipeline_processing/shared_processing_service_tests_with_yaml.rb" +- "./spec/services/ci/play_build_service_spec.rb" +- "./spec/services/ci/register_job_service_spec.rb" +- "./spec/services/ci/retry_build_service_spec.rb" +- "./spec/services/ci/retry_pipeline_service_spec.rb" +- "./spec/services/ci/update_build_queue_service_spec.rb" +- "./spec/services/ci/update_runner_service_spec.rb" +- "./spec/services/clusters/applications/prometheus_config_service_spec.rb" +- "./spec/services/deployments/older_deployments_drop_service_spec.rb" +- "./spec/services/environments/auto_stop_service_spec.rb" +- "./spec/services/environments/stop_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/create_from_issue_service_spec.rb" +- "./spec/services/merge_requests/create_pipeline_service_spec.rb" +- "./spec/services/merge_requests/create_service_spec.rb" +- "./spec/services/merge_requests/merge_orchestration_service_spec.rb" +- "./spec/services/merge_requests/post_merge_service_spec.rb" +- "./spec/services/merge_requests/refresh_service_spec.rb" +- "./spec/services/merge_requests/reopen_service_spec.rb" +- "./spec/services/projects/update_pages_service_spec.rb" +- "./spec/services/quick_actions/interpret_service_spec.rb" +- "./spec/support/prometheus/additional_metrics_shared_examples.rb" +- "./spec/support/shared_examples/ci/pipeline_email_shared_examples.rb" +- "./spec/support/shared_examples/controllers/unique_hll_events_examples.rb" +- "./spec/support/shared_examples/features/comments_on_merge_request_files_shared_examples.rb" +- "./spec/support/shared_examples/features/creatable_merge_request_shared_examples.rb" +- "./spec/support/shared_examples/features/discussion_comments_shared_example.rb" +- "./spec/support/shared_examples/features/editable_merge_request_shared_examples.rb" +- "./spec/support/shared_examples/features/issuable_invite_members_shared_examples.rb" +- "./spec/support/shared_examples/features/issuable_sidebar_shared_examples.rb" +- "./spec/support/shared_examples/features/multiple_assignees_mr_shared_examples.rb" +- "./spec/support/shared_examples/features/multiple_reviewers_mr_shared_examples.rb" +- "./spec/support/shared_examples/features/packages_shared_examples.rb" +- "./spec/support/shared_examples/features/page_description_shared_examples.rb" +- "./spec/support/shared_examples/features/reportable_note_shared_examples.rb" +- "./spec/support/shared_examples/features/resolving_discussions_in_issues_shared_examples.rb" +- "./spec/support/shared_examples/features/search_settings_shared_examples.rb" +- "./spec/support/shared_examples/features/showing_user_status_shared_examples.rb" +- "./spec/support/shared_examples/features/variable_list_shared_examples.rb" +- "./spec/support/shared_examples/lib/gitlab/search_results_sorted_shared_examples.rb" +- "./spec/support/shared_examples/models/cluster_application_status_shared_examples.rb" +- "./spec/support/shared_examples/models/concerns/limitable_shared_examples.rb" +- "./spec/support/shared_examples/quick_actions/issuable/close_quick_action_shared_examples.rb" +- "./spec/support/shared_examples/quick_actions/issuable/time_tracking_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/merge_request/merge_quick_action_shared_examples.rb" +- "./spec/support/shared_examples/quick_actions/merge_request/rebase_quick_action_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/packages/package_details_shared_examples.rb" +- "./spec/support/shared_examples/requests/api/logging_application_context_shared_examples.rb" +- "./spec/support/shared_examples/requests/api/status_shared_examples.rb" +- "./spec/support/shared_examples/requests/graphql_shared_examples.rb" +- "./spec/support/shared_examples/services/merge_request_shared_examples.rb" +- "./spec/support/shared_examples/services/onboarding_progress_shared_examples.rb" +- "./spec/support/shared_examples/services/packages_shared_examples.rb" +- "./spec/support/shared_examples/workers/idempotency_shared_examples.rb" +- "./spec/tasks/gitlab/generate_sample_prometheus_data_spec.rb" +- "./spec/views/projects/jobs/_build.html.haml_spec.rb" +- "./spec/workers/ci/drop_pipeline_worker_spec.rb" +- "./spec/workers/ci/initial_pipeline_process_worker_spec.rb" +- "./spec/workers/expire_job_cache_worker_spec.rb" +- "./spec/workers/expire_pipeline_cache_worker_spec.rb" +- "./spec/workers/new_merge_request_worker_spec.rb" +- "./spec/workers/pipeline_process_worker_spec.rb" +- "./spec/workers/pipeline_schedule_worker_spec.rb" +- "./spec/workers/stuck_merge_jobs_worker_spec.rb" +- "./spec/workers/update_head_pipeline_for_merge_request_worker_spec.rb" -- GitLab