Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2023-03-09 12:15:54 +00:00
parent a74ca2457e
commit 0c1344a7c1
214 changed files with 2425 additions and 497 deletions

View File

@ -1929,6 +1929,12 @@
changes: ["vendor/gems/bundler-checksum/**/*"]
- <<: *if-merge-request-labels-run-all-rspec
.vendor:rules:cloud_profiler_agent:
rules:
- <<: *if-merge-request
changes: ["vendor/gems/cloud_profiler_agent/**/*"]
- <<: *if-merge-request-labels-run-all-rspec
##################
# Releases rules #
##################

View File

@ -93,3 +93,11 @@ vendor gitlab_active_record:
trigger:
include: vendor/gems/gitlab_active_record/.gitlab-ci.yml
strategy: depend
vendor cloud_profiler_agent:
extends:
- .vendor:rules:cloud_profiler_agent
needs: []
trigger:
include: vendor/gems/cloud_profiler_agent/.gitlab-ci.yml
strategy: depend

View File

@ -1,7 +1,6 @@
---
RSpec/MissingFeatureCategory:
Exclude:
- 'ee/spec/components/billing/plan_component_spec.rb'
- 'ee/spec/components/namespaces/free_user_cap/enforcement_alert_component_spec.rb'
- 'ee/spec/components/namespaces/free_user_cap/enforcement_at_limit_alert_component_spec.rb'
- 'ee/spec/components/namespaces/free_user_cap/non_owner_alert_component_spec.rb'
@ -205,7 +204,6 @@ RSpec/MissingFeatureCategory:
- 'ee/spec/graphql/graphql_triggers_spec.rb'
- 'ee/spec/graphql/mutations/app_sec/fuzzing/api/ci_configuration/create_spec.rb'
- 'ee/spec/graphql/mutations/app_sec/fuzzing/coverage/corpus/create_spec.rb'
- 'ee/spec/graphql/mutations/audit_events/streaming/event_type_filters/destroy_spec.rb'
- 'ee/spec/graphql/mutations/audit_events/streaming/headers/create_spec.rb'
- 'ee/spec/graphql/mutations/audit_events/streaming/headers/destroy_spec.rb'
- 'ee/spec/graphql/mutations/boards/epic_boards/create_spec.rb'
@ -490,7 +488,6 @@ RSpec/MissingFeatureCategory:
- 'ee/spec/graphql/types/vulnerability_details/list_type_spec.rb'
- 'ee/spec/graphql/types/vulnerability_details/markdown_type_spec.rb'
- 'ee/spec/graphql/types/vulnerability_details/module_location_type_spec.rb'
- 'ee/spec/graphql/types/vulnerability_details/table_type_spec.rb'
- 'ee/spec/graphql/types/vulnerability_details/text_type_spec.rb'
- 'ee/spec/graphql/types/vulnerability_details/url_type_spec.rb'
- 'ee/spec/graphql/types/vulnerability_evidence_source_type_spec.rb'
@ -740,7 +737,6 @@ RSpec/MissingFeatureCategory:
- 'ee/spec/lib/ee/gitlab/background_migration/purge_stale_security_scans_spec.rb'
- 'ee/spec/lib/ee/gitlab/background_migration/recalculate_vulnerability_finding_signatures_for_findings_spec.rb'
- 'ee/spec/lib/ee/gitlab/background_migration/update_vulnerability_occurrences_location_spec.rb'
- 'ee/spec/lib/ee/gitlab/checks/push_rule_check_spec.rb'
- 'ee/spec/lib/ee/gitlab/checks/push_rules/branch_check_spec.rb'
- 'ee/spec/lib/ee/gitlab/checks/push_rules/commit_check_spec.rb'
- 'ee/spec/lib/ee/gitlab/checks/push_rules/file_size_check_spec.rb'
@ -824,7 +820,6 @@ RSpec/MissingFeatureCategory:
- 'ee/spec/lib/elastic/latest/config_spec.rb'
- 'ee/spec/lib/elastic/latest/custom_language_analyzers_spec.rb'
- 'ee/spec/lib/elastic/latest/git_instance_proxy_spec.rb'
- 'ee/spec/lib/elastic/latest/issue_class_proxy_spec.rb'
- 'ee/spec/lib/elastic/latest/issue_config_spec.rb'
- 'ee/spec/lib/elastic/latest/merge_request_config_spec.rb'
- 'ee/spec/lib/elastic/latest/note_config_spec.rb'
@ -1222,7 +1217,6 @@ RSpec/MissingFeatureCategory:
- 'ee/spec/models/concerns/ee/participable_spec.rb'
- 'ee/spec/models/concerns/ee/project_security_scanners_information_spec.rb'
- 'ee/spec/models/concerns/ee/weight_eventable_spec.rb'
- 'ee/spec/models/concerns/elastic/application_versioned_search_spec.rb'
- 'ee/spec/models/concerns/elastic/merge_request_spec.rb'
- 'ee/spec/models/concerns/elastic/milestone_spec.rb'
- 'ee/spec/models/concerns/elastic/project_wiki_spec.rb'
@ -1688,7 +1682,6 @@ RSpec/MissingFeatureCategory:
- 'ee/spec/services/audit_events/release_updated_audit_event_service_spec.rb'
- 'ee/spec/services/audit_events/runner_custom_audit_event_service_spec.rb'
- 'ee/spec/services/audit_events/runners_token_audit_event_service_spec.rb'
- 'ee/spec/services/audit_events/streaming/event_type_filters/destroy_service_spec.rb'
- 'ee/spec/services/audit_events/streaming/headers/base_spec.rb'
- 'ee/spec/services/audit_events/streaming/headers/create_service_spec.rb'
- 'ee/spec/services/audit_events/streaming/headers/destroy_service_spec.rb'
@ -1722,22 +1715,11 @@ RSpec/MissingFeatureCategory:
- 'ee/spec/services/ee/auto_merge_service_spec.rb'
- 'ee/spec/services/ee/event_create_service_spec.rb'
- 'ee/spec/services/ee/merge_request_metrics_service_spec.rb'
- 'ee/spec/services/ee/merge_requests/base_service_spec.rb'
- 'ee/spec/services/ee/merge_requests/create_approval_event_service_spec.rb'
- 'ee/spec/services/ee/merge_requests/create_from_vulnerability_data_service_spec.rb'
- 'ee/spec/services/ee/merge_requests/create_service_spec.rb'
- 'ee/spec/services/ee/merge_requests/execute_approval_hooks_service_spec.rb'
- 'ee/spec/services/ee/merge_requests/handle_assignees_change_service_spec.rb'
- 'ee/spec/services/ee/merge_requests/post_merge_service_spec.rb'
- 'ee/spec/services/ee/merge_requests/update_assignees_service_spec.rb'
- 'ee/spec/services/ee/merge_requests/update_reviewers_service_spec.rb'
- 'ee/spec/services/ee/namespace_settings/update_service_spec.rb'
- 'ee/spec/services/ee/notes/destroy_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/null_notification_service_spec.rb'
- 'ee/spec/services/ee/personal_access_tokens/revoke_service_spec.rb'
- 'ee/spec/services/ee/post_receive_service_spec.rb'
- 'ee/spec/services/ee/preview_markdown_service_spec.rb'
- 'ee/spec/services/ee/projects/autocomplete_service_spec.rb'
@ -1767,44 +1749,6 @@ RSpec/MissingFeatureCategory:
- 'ee/spec/services/ee/vulnerability_feedback_module/update_service_spec.rb'
- 'ee/spec/services/external_status_checks/create_service_spec.rb'
- 'ee/spec/services/ldap_group_reset_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/merge_to_ref_service_spec.rb'
- 'ee/spec/services/merge_requests/mergeability/check_approved_service_spec.rb'
- 'ee/spec/services/merge_requests/mergeability/check_blocked_by_other_mrs_service_spec.rb'
- 'ee/spec/services/merge_requests/mergeability/check_denied_policies_service_spec.rb'
- 'ee/spec/services/merge_requests/mergeability/check_external_status_checks_passed_service_spec.rb'
- 'ee/spec/services/merge_requests/push_options_handler_service_spec.rb'
- 'ee/spec/services/merge_requests/reload_merge_head_diff_service_spec.rb'
- 'ee/spec/services/merge_requests/remove_approval_service_spec.rb'
- 'ee/spec/services/merge_requests/stream_approval_audit_event_service_spec.rb'
- 'ee/spec/services/merge_requests/sync_code_owner_approval_rules_spec.rb'
- 'ee/spec/services/merge_requests/sync_report_approver_approval_rules_spec.rb'
- 'ee/spec/services/merge_requests/update_blocks_service_spec.rb'
- 'ee/spec/services/merge_trains/check_status_service_spec.rb'
- 'ee/spec/services/merge_trains/refresh_merge_request_service_spec.rb'
- 'ee/spec/services/merge_trains/refresh_service_spec.rb'
- 'ee/spec/services/milestones/destroy_service_spec.rb'
- 'ee/spec/services/milestones/promote_service_spec.rb'
- 'ee/spec/services/milestones/update_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/path_locks/lock_service_spec.rb'
- 'ee/spec/services/path_locks/unlock_service_spec.rb'
- 'ee/spec/services/personal_access_tokens/create_service_audit_log_spec.rb'
- 'ee/spec/services/personal_access_tokens/groups/update_lifetime_service_spec.rb'
- 'ee/spec/services/personal_access_tokens/instance/update_lifetime_service_spec.rb'
- 'ee/spec/services/personal_access_tokens/revoke_invalid_tokens_spec.rb'
- 'ee/spec/services/personal_access_tokens/revoke_service_audit_log_spec.rb'
- 'ee/spec/services/personal_access_tokens/rotation_verifier_service_spec.rb'
- 'ee/spec/services/phone_verification/telesign_client/base_service_spec.rb'
- 'ee/spec/services/phone_verification/telesign_client/risk_score_service_spec.rb'
- 'ee/spec/services/phone_verification/telesign_client/send_verification_code_service_spec.rb'
- 'ee/spec/services/phone_verification/telesign_client/verify_code_service_spec.rb'
- 'ee/spec/services/phone_verification/users/send_verification_code_service_spec.rb'
- 'ee/spec/services/product_analytics/initialize_stack_service_spec.rb'
- 'ee/spec/services/projects/after_rename_service_spec.rb'
- 'ee/spec/services/projects/alerting/notify_service_spec.rb'
- 'ee/spec/services/projects/cleanup_service_spec.rb'
@ -1961,7 +1905,6 @@ RSpec/MissingFeatureCategory:
- 'ee/spec/views/devise/sessions/new.html.haml_spec.rb'
- 'ee/spec/views/groups/_compliance_frameworks.html.haml_spec.rb'
- 'ee/spec/views/groups/analytics/dashboards/index.html.haml_spec.rb'
- 'ee/spec/views/groups/billings/index.html.haml_spec.rb'
- 'ee/spec/views/groups/compliance_frameworks/edit.html.haml_spec.rb'
- 'ee/spec/views/groups/compliance_frameworks/new.html.haml_spec.rb'
- 'ee/spec/views/groups/edit.html.haml_spec.rb'
@ -2956,10 +2899,8 @@ RSpec/MissingFeatureCategory:
- 'spec/graphql/types/dependency_proxy/image_ttl_group_policy_type_spec.rb'
- 'spec/graphql/types/dependency_proxy/manifest_type_spec.rb'
- 'spec/graphql/types/deployment_tier_enum_spec.rb'
- 'spec/graphql/types/design_management/design_at_version_type_spec.rb'
- 'spec/graphql/types/design_management/design_collection_copy_state_enum_spec.rb'
- 'spec/graphql/types/design_management/design_collection_type_spec.rb'
- 'spec/graphql/types/design_management/design_type_spec.rb'
- 'spec/graphql/types/design_management/design_version_event_enum_spec.rb'
- 'spec/graphql/types/design_management/version_type_spec.rb'
- 'spec/graphql/types/design_management_type_spec.rb'
@ -3219,7 +3160,6 @@ RSpec/MissingFeatureCategory:
- 'spec/helpers/numbers_helper_spec.rb'
- 'spec/helpers/one_trust_helper_spec.rb'
- 'spec/helpers/operations_helper_spec.rb'
- 'spec/helpers/packages_helper_spec.rb'
- 'spec/helpers/page_layout_helper_spec.rb'
- 'spec/helpers/pagination_helper_spec.rb'
- 'spec/helpers/preferences_helper_spec.rb'
@ -3750,9 +3690,7 @@ RSpec/MissingFeatureCategory:
- 'spec/lib/gitlab/chat_name_token_spec.rb'
- 'spec/lib/gitlab/chat_spec.rb'
- 'spec/lib/gitlab/checks/branch_check_spec.rb'
- 'spec/lib/gitlab/checks/changes_access_spec.rb'
- 'spec/lib/gitlab/checks/container_moved_spec.rb'
- 'spec/lib/gitlab/checks/diff_check_spec.rb'
- 'spec/lib/gitlab/checks/force_push_spec.rb'
- 'spec/lib/gitlab/checks/lfs_check_spec.rb'
- 'spec/lib/gitlab/checks/lfs_integrity_spec.rb'
@ -5623,7 +5561,6 @@ RSpec/MissingFeatureCategory:
- 'spec/models/error_tracking/client_key_spec.rb'
- 'spec/models/error_tracking/error_event_spec.rb'
- 'spec/models/error_tracking/error_spec.rb'
- 'spec/models/error_tracking/project_error_tracking_setting_spec.rb'
- 'spec/models/event_collection_spec.rb'
- 'spec/models/exported_protected_branch_spec.rb'
- 'spec/models/external_issue_spec.rb'
@ -5980,7 +5917,6 @@ RSpec/MissingFeatureCategory:
- 'spec/policies/deploy_key_policy_spec.rb'
- 'spec/policies/deploy_keys_project_policy_spec.rb'
- 'spec/policies/deploy_token_policy_spec.rb'
- 'spec/policies/design_management/design_policy_spec.rb'
- 'spec/policies/environment_policy_spec.rb'
- 'spec/policies/group_deploy_key_policy_spec.rb'
- 'spec/policies/group_deploy_keys_group_policy_spec.rb'
@ -6457,156 +6393,10 @@ RSpec/MissingFeatureCategory:
- 'spec/services/gravatar_service_spec.rb'
- 'spec/services/import_export_clean_up_service_spec.rb'
- 'spec/services/markdown_content_rewriter_service_spec.rb'
- 'spec/services/merge_requests/add_context_service_spec.rb'
- 'spec/services/merge_requests/add_spent_time_service_spec.rb'
- 'spec/services/merge_requests/add_todo_when_build_fails_service_spec.rb'
- 'spec/services/merge_requests/approval_service_spec.rb'
- 'spec/services/merge_requests/assign_issues_service_spec.rb'
- 'spec/services/merge_requests/cleanup_refs_service_spec.rb'
- 'spec/services/merge_requests/conflicts/list_service_spec.rb'
- 'spec/services/merge_requests/conflicts/resolve_service_spec.rb'
- 'spec/services/merge_requests/create_approval_event_service_spec.rb'
- 'spec/services/merge_requests/create_pipeline_service_spec.rb'
- 'spec/services/merge_requests/delete_non_latest_diffs_service_spec.rb'
- 'spec/services/merge_requests/execute_approval_hooks_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/handle_assignees_change_service_spec.rb'
- 'spec/services/merge_requests/mark_reviewer_reviewed_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_base_service_spec.rb'
- 'spec/services/merge_requests/mergeability/check_broken_status_service_spec.rb'
- 'spec/services/merge_requests/mergeability/check_ci_status_service_spec.rb'
- 'spec/services/merge_requests/mergeability/check_discussions_status_service_spec.rb'
- 'spec/services/merge_requests/mergeability/check_draft_status_service_spec.rb'
- 'spec/services/merge_requests/mergeability/check_open_status_service_spec.rb'
- 'spec/services/merge_requests/mergeability/detailed_merge_status_service_spec.rb'
- 'spec/services/merge_requests/mergeability/logger_spec.rb'
- 'spec/services/merge_requests/mergeability/run_checks_service_spec.rb'
- 'spec/services/merge_requests/mergeability_check_service_spec.rb'
- 'spec/services/merge_requests/migrate_external_diffs_service_spec.rb'
- 'spec/services/merge_requests/post_merge_service_spec.rb'
- 'spec/services/merge_requests/push_options_handler_service_spec.rb'
- 'spec/services/merge_requests/reload_diffs_service_spec.rb'
- 'spec/services/merge_requests/reload_merge_head_diff_service_spec.rb'
- 'spec/services/merge_requests/reopen_service_spec.rb'
- 'spec/services/merge_requests/request_review_service_spec.rb'
- 'spec/services/merge_requests/resolve_todos_service_spec.rb'
- 'spec/services/merge_requests/resolved_discussion_notification_service_spec.rb'
- 'spec/services/merge_requests/squash_service_spec.rb'
- 'spec/services/merge_requests/update_assignees_service_spec.rb'
- 'spec/services/merge_requests/update_reviewers_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/sample_metrics_service_spec.rb'
- 'spec/services/metrics/users_starred_dashboards/create_service_spec.rb'
- 'spec/services/metrics/users_starred_dashboards/delete_service_spec.rb'
- 'spec/services/milestones/close_service_spec.rb'
- 'spec/services/milestones/closed_issues_count_service_spec.rb'
- 'spec/services/milestones/create_service_spec.rb'
- 'spec/services/milestones/destroy_service_spec.rb'
- 'spec/services/milestones/find_or_create_service_spec.rb'
- 'spec/services/milestones/issues_count_service_spec.rb'
- 'spec/services/milestones/merge_requests_count_service_spec.rb'
- 'spec/services/milestones/promote_service_spec.rb'
- 'spec/services/milestones/transfer_service_spec.rb'
- 'spec/services/milestones/update_service_spec.rb'
- 'spec/services/ml/experiment_tracking/candidate_repository_spec.rb'
- 'spec/services/ml/experiment_tracking/experiment_repository_spec.rb'
- 'spec/services/namespace_settings/update_service_spec.rb'
- 'spec/services/namespaces/in_product_marketing_emails_service_spec.rb'
- 'spec/services/namespaces/package_settings/update_service_spec.rb'
- 'spec/services/namespaces/statistics_refresher_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/destroy_service_spec.rb'
- 'spec/services/notes/post_process_service_spec.rb'
- 'spec/services/notes/quick_actions_service_spec.rb'
- 'spec/services/notes/render_service_spec.rb'
- 'spec/services/notes/resolve_service_spec.rb'
- 'spec/services/notes/update_service_spec.rb'
- 'spec/services/notification_recipients/build_service_spec.rb'
- 'spec/services/notification_recipients/builder/default_spec.rb'
- 'spec/services/notification_recipients/builder/new_note_spec.rb'
- 'spec/services/onboarding/progress_service_spec.rb'
- 'spec/services/packages/cleanup/execute_policy_service_spec.rb'
- 'spec/services/packages/cleanup/update_policy_service_spec.rb'
- 'spec/services/packages/composer/composer_json_service_spec.rb'
- 'spec/services/packages/composer/create_package_service_spec.rb'
- 'spec/services/packages/composer/version_parser_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_dependency_service_spec.rb'
- 'spec/services/packages/create_event_service_spec.rb'
- 'spec/services/packages/create_package_file_service_spec.rb'
- 'spec/services/packages/create_temporary_package_service_spec.rb'
- 'spec/services/packages/generic/create_package_file_service_spec.rb'
- 'spec/services/packages/generic/find_or_create_package_service_spec.rb'
- 'spec/services/packages/go/create_package_service_spec.rb'
- 'spec/services/packages/go/sync_packages_service_spec.rb'
- 'spec/services/packages/helm/extract_file_metadata_service_spec.rb'
- 'spec/services/packages/helm/process_file_service_spec.rb'
- 'spec/services/packages/mark_package_files_for_destruction_service_spec.rb'
- 'spec/services/packages/mark_package_for_destruction_service_spec.rb'
- 'spec/services/packages/mark_packages_for_destruction_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/append_package_file_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/create_dependency_service_spec.rb'
- 'spec/services/packages/nuget/metadata_extraction_service_spec.rb'
- 'spec/services/packages/nuget/search_service_spec.rb'
- 'spec/services/packages/nuget/sync_metadatum_service_spec.rb'
- 'spec/services/packages/nuget/update_package_from_metadata_service_spec.rb'
- 'spec/services/packages/pypi/create_package_service_spec.rb'
- 'spec/services/packages/remove_tag_service_spec.rb'
- 'spec/services/packages/rpm/parse_package_service_spec.rb'
- 'spec/services/packages/rpm/repository_metadata/build_filelist_xml_service_spec.rb'
- 'spec/services/packages/rpm/repository_metadata/build_other_xml_service_spec.rb'
- 'spec/services/packages/rpm/repository_metadata/build_primary_xml_service_spec.rb'
- 'spec/services/packages/rpm/repository_metadata/build_repomd_xml_service_spec.rb'
- 'spec/services/packages/rpm/repository_metadata/update_xml_service_spec.rb'
- 'spec/services/packages/rubygems/create_dependencies_service_spec.rb'
- 'spec/services/packages/rubygems/create_gemspec_service_spec.rb'
- 'spec/services/packages/rubygems/dependency_resolver_service_spec.rb'
- 'spec/services/packages/rubygems/metadata_extraction_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_package_file_service_spec.rb'
- 'spec/services/packages/update_tags_service_spec.rb'
- 'spec/services/pages/delete_service_spec.rb'
- 'spec/services/pages/migrate_legacy_storage_to_deployment_service_spec.rb'
- 'spec/services/pages/zip_directory_service_spec.rb'
- 'spec/services/pages_domains/create_acme_order_service_spec.rb'
- 'spec/services/pages_domains/obtain_lets_encrypt_certificate_service_spec.rb'
- 'spec/services/personal_access_tokens/last_used_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/product_analytics/build_activity_graph_service_spec.rb'
- 'spec/services/product_analytics/build_graph_service_spec.rb'
- 'spec/services/projects/after_rename_service_spec.rb'
- 'spec/services/projects/alerting/notify_service_spec.rb'
- 'spec/services/projects/all_issues_count_service_spec.rb'
@ -7263,7 +7053,6 @@ RSpec/MissingFeatureCategory:
- 'spec/workers/gitlab/github_import/stage/import_pull_requests_merged_by_worker_spec.rb'
- 'spec/workers/gitlab/github_import/stage/import_pull_requests_review_requests_worker_spec.rb'
- 'spec/workers/gitlab/github_import/stage/import_pull_requests_reviews_worker_spec.rb'
- 'spec/workers/gitlab/github_import/stage/import_pull_requests_worker_spec.rb'
- 'spec/workers/gitlab/github_import/stage/import_repository_worker_spec.rb'
- 'spec/workers/gitlab/import/stuck_import_job_spec.rb'
- 'spec/workers/gitlab/import/stuck_project_import_jobs_worker_spec.rb'

View File

@ -1 +1 @@
298f8eccf2fcb88280be3ea6ecee81842c1f77d4
affdc645175554504efdf19daad28900b5b43e87

View File

@ -358,6 +358,9 @@ gem 'batch-loader', '~> 2.0.1'
# Perf bar
gem 'peek', '~> 1.1'
# Google Cloud Profiler support
gem 'cloud_profiler_agent', '~> 0.0.0', path: 'vendor/gems/cloud_profiler_agent', require: false
# Snowplow events tracking
gem 'snowplow-tracker', '~> 0.8.0'

View File

@ -194,6 +194,7 @@
{"name":"fugit","version":"1.8.1","platform":"ruby","checksum":"18ffb26813869610f71bb0b7d568c3624d2b3025aeebb6600a18df0c77a6a2b2"},
{"name":"fuubar","version":"2.2.0","platform":"ruby","checksum":"9b0263c4074f39c68b37f1e4e69a7d3cfc7523c41bea43601235daa723179b4a"},
{"name":"fuzzyurl","version":"0.9.0","platform":"ruby","checksum":"542efa80f2bcaadbdc402c2f0b572f2e335a1d53e375aecad68bbb3d86860c0f"},
{"name":"gapic-common","version":"0.18.0","platform":"ruby","checksum":"6fd55a538ce2d63026fa05f379b1aec00788cc060f76903739516ab1ca1496ab"},
{"name":"gemoji","version":"3.0.1","platform":"ruby","checksum":"80553f2f4932a7a95fb1b3c7c63f7dd937e7c8c610164bbdea28fd06eba5f36d"},
{"name":"get_process_mem","version":"0.2.7","platform":"ruby","checksum":"4afd3c3641dd6a817c09806c7d6d509d8a9984512ac38dea8b917426bbf77eba"},
{"name":"gettext","version":"3.3.6","platform":"ruby","checksum":"ee6bbd1b2f833ee52d7797fa68acbfecc4726aec6b6280fd7eab92aa0190b413"},
@ -234,6 +235,7 @@
{"name":"google-cloud-core","version":"1.6.0","platform":"ruby","checksum":"ea1744cd5a3085d3072de3fab9106afc769cd198609ebb5c6eeb5f13da46b72a"},
{"name":"google-cloud-env","version":"1.6.0","platform":"ruby","checksum":"6179acb946975892c7908748df5722a4ebadfc8cf5bb7b0d8d933ca67183fa15"},
{"name":"google-cloud-errors","version":"1.3.0","platform":"ruby","checksum":"450b681e24c089a20721a01acc4408bb4a7b0df28c175aaab488da917480d64b"},
{"name":"google-cloud-profiler-v2","version":"0.4.0","platform":"ruby","checksum":"53fc2ab175d08f54233c644310d47798feac996220916815c4fb44c937b5d3e3"},
{"name":"google-cloud-storage","version":"1.44.0","platform":"ruby","checksum":"299a1e055c9277c8120f7c10d21d37e4d8c17c7b963350c0e0bff7e9d9a570ea"},
{"name":"google-protobuf","version":"3.22.1","platform":"arm64-darwin","checksum":"bd904af849bd1f143c4d9eb74e0622f9efca7ed20719b00baa77fcb1a5fc2aa7"},
{"name":"google-protobuf","version":"3.22.1","platform":"java","checksum":"268359af055709c5796b1c726f839ef0fe356702c7abdb136367eb37cf9662e3"},
@ -244,7 +246,8 @@
{"name":"google-protobuf","version":"3.22.1","platform":"x86-mingw32","checksum":"a8ab1fda2a208dc238f16b2796d5a3383e6a273f8ef88a23ca90e0c2846594ee"},
{"name":"google-protobuf","version":"3.22.1","platform":"x86_64-darwin","checksum":"a425ce701b8c4f9aeb7cac0e7f1b36496ff8f6bf86dc7fe9d06af534d25e45d8"},
{"name":"google-protobuf","version":"3.22.1","platform":"x86_64-linux","checksum":"a62f7d472c346cea6c6141c70b1caba5b7e75319c56cf44a24b62bad6c1adf10"},
{"name":"googleapis-common-protos-types","version":"1.3.0","platform":"ruby","checksum":"c5411f3197cc3e02547ded1858303b1f830b4dc89c588c142ad6c8a231050671"},
{"name":"googleapis-common-protos","version":"1.4.0","platform":"ruby","checksum":"da2380fb5ab1563580816c74e8d684ac17512c3654c829a3ee84f6d6139de382"},
{"name":"googleapis-common-protos-types","version":"1.5.0","platform":"ruby","checksum":"5769cf7376abc86ef7f5897a4aaca1d5c5a3c49ddabeddd2c251fcf8155f858b"},
{"name":"googleauth","version":"1.3.0","platform":"ruby","checksum":"51dd7362353cf1e90a2d01e1fb94321ae3926c776d4dc4a79db65230217ffcc2"},
{"name":"gpgme","version":"2.0.22","platform":"ruby","checksum":"7c6904952afdd0bf2c7c3ed6de98a5143f86c6b7390dbcd9d7012bddfa3ec862"},
{"name":"grape","version":"1.5.2","platform":"ruby","checksum":"1df3b734c3862e235174232bc629587eddda9ef3df648230827575186700ae29"},

View File

@ -10,6 +10,15 @@ PATH
bundler-checksum (0.1.0)
bundler
PATH
remote: vendor/gems/cloud_profiler_agent
specs:
cloud_profiler_agent (0.0.1.pre)
google-cloud-profiler-v2 (~> 0.3)
google-protobuf (~> 3.13)
googleauth (>= 0.14)
stackprof (~> 0.2)
PATH
remote: vendor/gems/devise-pbkdf2-encryptable
specs:
@ -544,6 +553,14 @@ GEM
rspec-core (~> 3.0)
ruby-progressbar (~> 1.4)
fuzzyurl (0.9.0)
gapic-common (0.18.0)
faraday (>= 1.9, < 3.a)
faraday-retry (>= 1.0, < 3.a)
google-protobuf (~> 3.14)
googleapis-common-protos (>= 1.3.12, < 2.a)
googleapis-common-protos-types (>= 1.3.1, < 2.a)
googleauth (~> 1.0)
grpc (~> 1.36)
gemoji (3.0.1)
get_process_mem (0.2.7)
ffi (~> 1.0)
@ -656,6 +673,9 @@ GEM
google-cloud-env (1.6.0)
faraday (>= 0.17.3, < 3.0)
google-cloud-errors (1.3.0)
google-cloud-profiler-v2 (0.4.0)
gapic-common (>= 0.18.0, < 2.a)
google-cloud-errors (~> 1.0)
google-cloud-storage (1.44.0)
addressable (~> 2.8)
digest-crc (~> 0.4)
@ -665,7 +685,11 @@ GEM
googleauth (>= 0.16.2, < 2.a)
mini_mime (~> 1.0)
google-protobuf (3.22.1)
googleapis-common-protos-types (1.3.0)
googleapis-common-protos (1.4.0)
google-protobuf (~> 3.14)
googleapis-common-protos-types (~> 1.2)
grpc (~> 1.27)
googleapis-common-protos-types (1.5.0)
google-protobuf (~> 3.14)
googleauth (1.3.0)
faraday (>= 0.17.3, < 3.a)
@ -1633,6 +1657,7 @@ DEPENDENCIES
capybara-screenshot (~> 1.0.22)
carrierwave (~> 1.3)
charlock_holmes (~> 0.7.7)
cloud_profiler_agent (~> 0.0.0)!
commonmarker (~> 0.23.6)
concurrent-ruby (~> 1.1)
connection_pool (~> 2.0)

View File

@ -100,7 +100,7 @@ export default {
{{ __('Duration') }}
</div>
<div role="rowheader" class="table-section section-10">
{{ __('Details'), }}
{{ __('Details') }}
</div>
</div>
@ -162,7 +162,7 @@ export default {
</div>
<div class="table-section section-10 section-wrap">
<div role="rowheader" class="table-mobile-header">{{ __('Details'), }}</div>
<div role="rowheader" class="table-mobile-header">{{ __('Details') }}</div>
<div class="table-mobile-content">
<gl-button v-gl-modal-directive="`test-case-details-${index}`">{{
__('View details')

View File

@ -50,13 +50,13 @@ export default {
{{ __('Failed') }}
</div>
<div role="rowheader" class="table-section section-10 gl-text-center">
{{ __('Errors'), }}
{{ __('Errors') }}
</div>
<div role="rowheader" class="table-section section-10 gl-text-center">
{{ __('Skipped'), }}
{{ __('Skipped') }}
</div>
<div role="rowheader" class="table-section section-10 gl-text-center">
{{ __('Passed'), }}
{{ __('Passed') }}
</div>
<div role="rowheader" class="table-section section-10 gl-pr-5 gl-text-right">
{{ __('Total') }}

View File

@ -80,9 +80,7 @@ module MarkupHelper
)
)
# since <img> tags are stripped, this can leave empty <a> tags hanging around
# (as our markdown wraps images in links)
strip_empty_link_tags(text).html_safe
render_links(text)
end
def markdown(text, context = {})
@ -171,9 +169,22 @@ module MarkupHelper
{ project: wiki.container }
end
def strip_empty_link_tags(text)
# Sanitize and style user references links
#
# @param String text the string to be sanitized
#
# 1. Remove empty <a> tags which are caused by the <img> tags being stripped
# (as our markdown wraps images in links)
# 2. Strip all link tags, except user references, leaving just the link text
# 3. Add a highlight class for current user's references
#
# @return sanitized HTML string
def render_links(text)
scrubber = Loofah::Scrubber.new do |node|
node.remove if node.name == 'a' && node.children.empty?
next unless node.name == 'a'
next node.remove if node.children.empty?
next node.replace(node.children) if node['data-reference-type'] != 'user'
next node.append_class('current-user') if node['data-user'] == current_user.id.to_s
end
sanitize text, scrubber: scrubber

View File

@ -0,0 +1,25 @@
# frozen_string_literal: true
return unless Gitlab::Utils.to_boolean(ENV['GITLAB_GOOGLE_CLOUD_PROFILER_ENABLED'])
return unless ENV['GITLAB_GOOGLE_CLOUD_PROFILER_PROJECT_ID']
# For the initial iteration, we enable it only for `web`.
# This is because we have global service accounts configured this way, details:
# https://gitlab.com/gitlab-com/gl-infra/reliability/-/issues/17492#note_1303914983
return unless Gitlab::Runtime.puma?
Gitlab::Cluster::LifecycleEvents.on_worker_start do
require 'cloud_profiler_agent'
agent = CloudProfilerAgent::Agent.new(
service: 'gitlab-web',
project_id: ENV['GITLAB_GOOGLE_CLOUD_PROFILER_PROJECT_ID'],
logger: ::Gitlab::AppJsonLogger.build,
log_labels: {
message: 'Google Cloud Profiler Ruby',
pid: $$,
worker_id: ::Prometheus::PidProvider.worker_id
}
)
agent.start
end

View File

@ -0,0 +1,25 @@
# frozen_string_literal: true
class MigrateEvidencesFromRawMetadata < Gitlab::Database::Migration[2.1]
restrict_gitlab_migration gitlab_schema: :gitlab_main
MIGRATION = 'MigrateEvidencesForVulnerabilityFindings'
DELAY_INTERVAL = 2.minutes
SUB_BATCH_SIZE = 500
BATCH_SIZE = 10000
def up
queue_batched_background_migration(
MIGRATION,
:vulnerability_occurrences,
:id,
job_interval: DELAY_INTERVAL,
batch_size: BATCH_SIZE,
sub_batch_size: SUB_BATCH_SIZE
)
end
def down
delete_batched_background_migration(MIGRATION, :vulnerability_occurrences, :id, [])
end
end

View File

@ -0,0 +1 @@
ec6c176dc707bcaa39747fb23add886c711e075b22823174bc9f0ebee2ec224e

View File

@ -270,7 +270,7 @@ These LDAP sync configuration settings are available:
| Setting | Description | Required | Examples |
|-------------------|-------------|----------|----------|
| `group_base` | Base used to search for groups. | **{dotted-circle}** No | `'ou=groups,dc=gitlab,dc=example'` |
| `group_base` | Base used to search for groups. | **{dotted-circle}** No (required when `external_groups` is configured) | `'ou=groups,dc=gitlab,dc=example'` |
| `admin_group` | The CN of a group containing GitLab administrators. Not `cn=administrators` or the full DN. | **{dotted-circle}** No | `'administrators'` |
| `external_groups` | An array of CNs of groups containing users that should be considered external. Not `cn=interns` or the full DN. | **{dotted-circle}** No | `['interns', 'contractors']` |
| `sync_ssh_keys` | The LDAP attribute containing a user's public SSH key. | **{dotted-circle}** No | `'sshPublicKey'` or false if not set |

View File

@ -101,8 +101,8 @@ parameter:
| `metric` query parameter | Description of `value` in response |
|:---------------------------|:-----------------------------------|
| `deployment_frequency` | The API returns the total number of successful deployments during the time period. [Issue 371271](https://gitlab.com/gitlab-org/gitlab/-/issues/371271) proposes to update the API to return the daily average instead of the total number. |
| `change_failure_rate` | The number of incidents divided by the number of deployments during the time period. Available only for production environment. |
| `deployment_frequency` | The number of successful deployments during the time period. |
| `lead_time_for_changes` | The median number of seconds between the merge of the merge request (MR) and the deployment of the MR commits for all MRs deployed during the time period. |
| `time_to_restore_service` | The median number of seconds an incident was open during the time period. Available only for production environment. |

View File

@ -39,6 +39,45 @@ Example response:
}
```
### Create Error Tracking settings
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/393035/) in GitLab 15.10.
The API allows you to create Error Tracking settings for a project. Only for users with Maintainer role for
the project.
NOTE:
This API is only available when used with [integrated error tracking](../operations/error_tracking.md#integrated-error-tracking).
```plaintext
PUT /projects/:id/error_tracking/settings
```
Supported attributes:
| Attribute | Type | Required | Description |
| ------------ | ------- |----------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `id` | integer | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user. |
| `active` | boolean | yes | Pass `true` to enable the error tracking setting configuration or `false` to disable it. |
| `integrated` | boolean | yes | Pass `true` to enable the integrated error tracking backend. [Available in](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68260) GitLab 14.2 and later. |
Example request:
```shell
curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/error_tracking/settings?active=true&integrated=true"
```
Example response:
```json
{
"active": true,
"project_name": null,
"sentry_external_url": null,
"api_url": null,
"integrated": true
}
```
### Enable or disable the Error Tracking project settings
The API allows you to enable or disable the Error Tracking settings for a project. Only for users with the
@ -55,7 +94,7 @@ PATCH /projects/:id/error_tracking/settings
| `integrated` | boolean | no | Pass `true` to enable the integrated error tracking backend. [Available in](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68260) GitLab 14.2 and later. |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/error_tracking/settings?active=true"
curl --request PATCH --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/error_tracking/settings?active=true"
```
Example response:

View File

@ -6227,6 +6227,7 @@ Input type: `VulnerabilityConfirmInput`
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="mutationvulnerabilityconfirmclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationvulnerabilityconfirmcomment"></a>`comment` | [`String`](#string) | Comment why vulnerability was marked as confirmed (max. 50 000 characters). |
| <a id="mutationvulnerabilityconfirmid"></a>`id` | [`VulnerabilityID!`](#vulnerabilityid) | ID of the vulnerability to be confirmed. |
#### Fields

View File

@ -4,12 +4,12 @@ group: Import
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
# Group import/export API **(FREE)**
# Group import and export API **(FREE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20353) in GitLab 12.8.
Group Import/Export allows you to export group structure and import it to a new location.
When used with [Project Import/Export](project_import_export.md), you can preserve connections with
Use the group import and export API to export a group structure and import it to a new location.
When you use the group import and export API with the [project import and export API](project_import_export.md), you can preserve connections with
group-level relationships, such as connections between project issues and group epics.
Group exports include the following:
@ -22,6 +22,13 @@ Group exports include the following:
- Subgroups. Each subgroup includes all data above
- Group wikis **(PREMIUM SELF)**
To preserve group-level relationships from imported projects, you should run group import and export first. This way, you can import project exports into the desired group structure.
Imported groups have a `private` visibility level unless you import them into a parent group.
If you import groups into a parent group, the subgroups inherit by default a similar level of visibility.
To preserve the member list and their respective permissions on imported groups, review the users in these groups. Make sure these users exist before importing the desired groups.
## Schedule new export
Start a new group export.
@ -103,14 +110,3 @@ curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
NOTE:
The maximum import file size can be set by the Administrator, default is `0` (unlimited).
As an administrator, you can modify the maximum import file size. To do so, use the `max_import_size` option in the [Application settings API](settings.md#change-application-settings) or the [Admin Area](../user/admin_area/settings/account_and_limit_settings.md). Default [modified](https://gitlab.com/gitlab-org/gitlab/-/issues/251106) from 50 MB to 0 in GitLab 13.8.
## Important notes
Note the following:
- To preserve group-level relationships from imported projects, run Group Import/Export first,
to allow project imports into the desired group structure.
- Imported groups are given a `private` visibility level, unless imported into a parent group.
- If imported into a parent group, subgroups inherit a similar level of visibility, unless otherwise restricted.
- To preserve the member list and their respective permissions on imported groups,
review the users in these groups. Make sure these users exist before importing the desired groups.

View File

@ -8,6 +8,19 @@ info: To determine the technical writer assigned to the Stage/Group associated w
Use the Import API to import repositories from GitHub or Bitbucket Server.
Related APIs include:
- [Group migration by direct transfer API](bulk_imports.md)
- [Group import and export API](group_import_export.md)
- [Project import and export API](project_import_export.md)
## Prerequisites
For information on prerequisites for using the Import API, see:
- [Prerequisites for GitHub importer](../user/project/import/github.md#prerequisites)
- [Prerequisites for Bitbucket Server importer](../user/project/import/bitbucket_server.md#import-your-bitbucket-repositories)
## Import repository from GitHub
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/381902) in GitLab 15.8, GitLab no longer automatically creates namespaces or groups if the namespace or group name specified in `target_namespace` doesn't exist. GitLab also no longer falls back to using the user's personal namespace if the namespace or group name is taken or `target_namespace` is blank.

View File

@ -4,12 +4,17 @@ group: Source Code
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
# Project import/export API **(FREE)**
# Project import and export API **(FREE)**
See also:
Use the project import and export API to import and export projects using file transfers.
- [Project import/export documentation](../user/project/settings/import_export.md).
- [Project import/export administration Rake tasks](../administration/raketasks/project_import_export.md). **(FREE SELF)**
For more information, see:
- [Migrating projects using file exports](../user/project/settings/import_export.md)
- [Project import and export Rake tasks](../administration/raketasks/project_import_export.md)
Before using the project import and export API, you might want to use the
[group import and export API](group_import_export.md).
## Schedule an export

View File

@ -0,0 +1,43 @@
---
info: For assistance with this Style Guide page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments-to-other-projects-and-subjects
stage: none
group: unassigned
---
# Document Alpha, Beta, LA features
Some features are not generally available and are instead considered
[Alpha, Beta, or Limited Availability](../../policy/alpha-beta-support.md).
When you document a feature in one of these three statuses:
- Add `(Alpha)`, `(Beta)`, or `(Limited Availability)` in parentheses after the page or topic title.
- Do not include `(Alpha)`, `(Beta)`, or `(Limited Availability)` in the left nav.
- Ensure the version history lists the feature's status.
These features are usually behind a feature flag, which follow [these documentation guidelines](feature_flags.md).
If you add details of how users should enroll, or how to contact the team with issues,
the `FLAG:` note should be above these details. For example:
```markdown
## Great new feature (Alpha)
FLAG:
On self-managed GitLab, by default this feature is not available.
To make it available, ask an administrator to enable the feature flag named example_flag.
On GitLab.com, this feature is not available. This feature is not ready for production use.
Use this great new feature when you need to do this new thing.
This feature is in Alpha. To join the list of users testing this feature,
do this thing. If you find a bug, [open an issue](link).
```
When the feature is released, remove:
- The text in parentheses.
- Any language about the feature not being ready for production.
- The feature flag information.
Ensure the version history is up-to-date.

View File

@ -111,7 +111,7 @@ To remove a metric:
can be safely removed from Service Ping. Use this
[example issue](https://gitlab.com/gitlab-data/analytics/-/issues/15266) for guidance.
1. Notify the Customer Success Ops team (`@csops-team`), Analytics Engineers (`@gitlab-data/analytics-engineers`), and Product Analysts (`@gitlab-data/product-analysts`) by `@` mentioning those groups in a comment in the issue regarding the deletion of the metric.
1. Notify the Customer Success Ops team (`@csops-team`), Analytics Engineers (`@gitlab-data/analytics-engineers`), and Product Analysts (`@gitlab-data/product-analysts`) by `@` mentioning those groups in a comment in the issue from step 1 regarding the deletion of the metric.
Many Service Ping metrics are relied upon for health score and XMAU reporting and unexpected changes to those metrics could break reporting.
1. After you verify the metric can be safely removed,

View File

@ -6,12 +6,14 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Value Streams Dashboard **(ULTIMATE)**
> Introduced in GitLab 15.8 as a Closed [Beta](../../policy/alpha-beta-support.md#beta-features) feature.
> Introduced in GitLab 15.8 as a Closed [Beta](../../policy/alpha-beta-support.md#beta-features) feature [with a flag](../../administration/feature_flags.md) named `group_analytics_dashboards_page`. 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](../../administration/feature_flags.md) named `group_analytics_dashboards_page`.
On GitLab.com, this feature is not available. This feature is not ready for production use.
You can leave feedback on dashboard bugs or functionality in [issue 381787](https://gitlab.com/gitlab-org/gitlab/-/issues/381787).
This feature is not ready for production use.
The Value Streams Dashboard is a customizable dashboard that enables decision-makers to identify trends, patterns, and opportunities for digital transformation improvements.
This page is a work in progress, and we're updating the information as we add more features.
For more information, see the [Value Stream Management category direction page](https://about.gitlab.com/direction/plan/value_stream_management/).

View File

@ -23,8 +23,6 @@ module API
resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
before do
authorize! :admin_operations, user_project
not_found!('Error Tracking Setting') unless project_setting
end
desc 'Get Error Tracking settings' do
@ -34,6 +32,7 @@ module API
end
get ':id/error_tracking/settings' do
not_found!('Error Tracking Setting') unless project_setting
present project_setting, with: Entities::ErrorTracking::ProjectSetting
end
@ -59,6 +58,7 @@ module API
end
patch ':id/error_tracking/settings/' do
not_found!('Error Tracking Setting') unless project_setting
update_params = {
error_tracking_setting_attributes: { enabled: params[:active] }
}
@ -75,6 +75,42 @@ module API
result
end
end
desc 'Update Error Tracking project settings. Available in GitLab 15.10 and later.' do
detail 'Update Error Tracking settings for a project. ' \
'Only for users with Maintainer role for the project.'
success Entities::ErrorTracking::ProjectSetting
failure [
{ code: 400, message: 'Bad request' },
{ code: 401, message: 'Unauthorized' },
{ code: 404, message: 'Not found' }
]
tags ERROR_TRACKING_PROJECT_SETTINGS_TAGS
end
params do
requires :active, type: Boolean,
desc: 'Pass true to enable the configured Error Tracking settings or false to disable it.',
allow_blank: false
requires :integrated,
type: Boolean,
desc: 'Pass true to enable the integrated Error Tracking backend.'
end
put ':id/error_tracking/settings' do
not_found! unless Feature.enabled?(:integrated_error_tracking, user_project)
update_params = {
error_tracking_setting_attributes: { enabled: params[:active] }
}
update_params[:error_tracking_setting_attributes][:integrated] = params[:integrated]
result = ::Projects::Operations::UpdateService.new(user_project, current_user, update_params).execute
if result[:status] == :success
present project_setting, with: Entities::ErrorTracking::ProjectSetting
else
result
end
end
end
end
end

View File

@ -0,0 +1,81 @@
# frozen_string_literal: true
module Gitlab
module BackgroundMigration
# The class to migrate the evidence data into their own records from the json attribute
class MigrateEvidencesForVulnerabilityFindings < BatchedMigrationJob
feature_category :vulnerability_management
operation_name :migrate_evidences_for_vulnerability_findings
# The class is mimicking Vulnerabilites::Finding
class Finding < ApplicationRecord
self.table_name = 'vulnerability_occurrences'
validates :details, json_schema: { filename: 'vulnerability_finding_details', draft: 7 }, if: false
end
# The class is mimicking Vulnerabilites::Finding::Evidence
class Evidence < ApplicationRecord
self.table_name = 'vulnerability_finding_evidences'
# This data has been already validated when parsed into vulnerability_occurrences.raw_metadata
# Having this validation is a requerment from:
# https://gitlab.com/gitlab-org/gitlab/-/blob/dc3262f850cbd0ac14171d3c389b1258b4749cda/spec/db/schema_spec.rb#L253-265
validates :data, json_schema: { filename: "filename" }, if: false
end
def perform
each_sub_batch do |sub_batch|
migrate_evidences(sub_batch)
end
end
private
def migrate_evidences(sub_batch)
attrs = sub_batch.filter_map do |finding|
evidence = extract_evidence(finding.raw_metadata)
next unless evidence
build_evidence(finding, evidence)
end.compact
begin
create_evidences(attrs) if attrs.present?
rescue StandardError => e
logger.error(
message: e.message,
class: self.class.name
)
end
end
def build_evidence(finding, evidence)
current_time = Time.current
{
vulnerability_occurrence_id: finding.id,
data: evidence,
created_at: current_time,
updated_at: current_time
}
end
def create_evidences(evidences)
Evidence.upsert_all(evidences, returning: false, unique_by: %i[vulnerability_occurrence_id])
end
def extract_evidence(metadata)
parsed_metadata = Gitlab::Json.parse(metadata)
parsed_metadata['evidence']
rescue JSON::ParserError
nil
end
def logger
@logger ||= ::Gitlab::AppLogger
end
end
end
end

View File

@ -12,6 +12,7 @@ module Gitlab
# For now, these migrations are not considered ready for general use, for more information see the tracking epic:
# https://gitlab.com/groups/gitlab-org/-/epics/6751
module BatchedBackgroundMigrationHelpers
NonExistentMigrationError = Class.new(StandardError)
BATCH_SIZE = 1_000 # Number of rows to process per job
SUB_BATCH_SIZE = 100 # Number of rows to process per sub-batch
BATCH_CLASS_NAME = 'PrimaryKeyBatchingStrategy' # Default batch class for batched migrations
@ -213,6 +214,10 @@ module Gitlab
job_arguments: job_arguments
}
if ENV['DBLAB_ENVIRONMENT'] && migration.nil?
raise NonExistentMigrationError, 'called ensure_batched_background_migration_is_finished with non-existent migration name'
end
return Gitlab::AppLogger.warn "Could not find batched background migration for the given configuration: #{configuration}" if migration.nil?
return if migration.finished?

View File

@ -6470,6 +6470,9 @@ msgstr ""
msgid "BillingPlans|Faster code reviews"
msgstr ""
msgid "BillingPlans|Free"
msgstr ""
msgid "BillingPlans|Free forever features for individual users"
msgstr ""
@ -18156,9 +18159,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
msgid "Free"
msgstr ""
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@ -47804,6 +47804,54 @@ msgstr ""
msgid "VulnerabilityDismissalReasons|Used in tests"
msgstr ""
msgid "VulnerabilityExport|Activity"
msgstr ""
msgid "VulnerabilityExport|Additional Info"
msgstr ""
msgid "VulnerabilityExport|CVE"
msgstr ""
msgid "VulnerabilityExport|CWE"
msgstr ""
msgid "VulnerabilityExport|Comments"
msgstr ""
msgid "VulnerabilityExport|Details"
msgstr ""
msgid "VulnerabilityExport|Detected At"
msgstr ""
msgid "VulnerabilityExport|Group Name"
msgstr ""
msgid "VulnerabilityExport|Location"
msgstr ""
msgid "VulnerabilityExport|Other Identifiers"
msgstr ""
msgid "VulnerabilityExport|Project Name"
msgstr ""
msgid "VulnerabilityExport|Scanner Name"
msgstr ""
msgid "VulnerabilityExport|Severity"
msgstr ""
msgid "VulnerabilityExport|Status"
msgstr ""
msgid "VulnerabilityExport|Tool"
msgstr ""
msgid "VulnerabilityExport|Vulnerability"
msgstr ""
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
msgstr ""

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe Projects::HooksController do
RSpec.describe Projects::HooksController, feature_category: :integrations do
include AfterNextHelpers
let_it_be(:project) { create(:project) }

View File

@ -16,7 +16,12 @@ FactoryBot.define do
end
trait :integrated do
api_url { nil }
integrated { true }
token { nil }
project_name { nil }
organization_name { nil }
sentry_project_id { nil }
end
end
end

View File

@ -43,3 +43,212 @@ exports[`Remove cluster confirmation modal renders buttons with modal included 1
<!---->
</div>
`;
exports[`Remove cluster confirmation modal two buttons open modal with "cleanup" option 1`] = `
<div
class="gl-display-flex"
>
<button
class="btn gl-mr-3 btn-danger btn-md gl-button"
data-testid="remove-integration-and-resources-button"
type="button"
>
<!---->
<!---->
<span
class="gl-button-text"
>
Remove integration and resources
</span>
</button>
<button
class="btn btn-danger btn-md gl-button btn-danger-secondary"
data-testid="remove-integration-button"
type="button"
>
<!---->
<!---->
<span
class="gl-button-text"
>
Remove integration
</span>
</button>
<div
kind="danger"
>
<p>
You are about to remove your cluster integration and all GitLab-created resources associated with this cluster.
</p>
<div>
This will permanently delete the following resources:
<ul>
<li>
Any project namespaces
</li>
<li>
<code>
clusterroles
</code>
</li>
<li>
<code>
clusterrolebindings
</code>
</li>
</ul>
</div>
<strong>
To remove your integration and resources, type
<code>
my-test-cluster
</code>
to confirm:
</strong>
<form
action="clusterPath"
class="gl-mb-5"
method="post"
>
<input
name="_method"
type="hidden"
value="delete"
/>
<input
name="authenticity_token"
type="hidden"
/>
<input
name="cleanup"
type="hidden"
value="true"
/>
<input
autocomplete="off"
class="gl-form-input form-control"
id="__BVID__14"
name="confirm_cluster_name_input"
type="text"
/>
</form>
<span>
If you do not wish to delete all associated GitLab resources, you can simply remove the integration.
</span>
</div>
</div>
`;
exports[`Remove cluster confirmation modal two buttons open modal without "cleanup" option 1`] = `
<div
class="gl-display-flex"
>
<button
class="btn gl-mr-3 btn-danger btn-md gl-button"
data-testid="remove-integration-and-resources-button"
type="button"
>
<!---->
<!---->
<span
class="gl-button-text"
>
Remove integration and resources
</span>
</button>
<button
class="btn btn-danger btn-md gl-button btn-danger-secondary"
data-testid="remove-integration-button"
type="button"
>
<!---->
<!---->
<span
class="gl-button-text"
>
Remove integration
</span>
</button>
<div
kind="danger"
>
<p>
You are about to remove your cluster integration.
</p>
<!---->
<strong>
To remove your integration, type
<code>
my-test-cluster
</code>
to confirm:
</strong>
<form
action="clusterPath"
class="gl-mb-5"
method="post"
>
<input
name="_method"
type="hidden"
value="delete"
/>
<input
name="authenticity_token"
type="hidden"
/>
<input
name="cleanup"
type="hidden"
value="true"
/>
<input
autocomplete="off"
class="gl-form-input form-control"
id="__BVID__21"
name="confirm_cluster_name_input"
type="text"
/>
</form>
<!---->
</div>
</div>
`;

View File

@ -6,6 +6,7 @@ import RemoveClusterConfirmation from '~/clusters/components/remove_cluster_conf
describe('Remove cluster confirmation modal', () => {
let wrapper;
const showMock = jest.fn();
const createComponent = ({ props = {}, stubs = {} } = {}) => {
wrapper = mount(RemoveClusterConfirmation, {
@ -33,9 +34,13 @@ describe('Remove cluster confirmation modal', () => {
beforeEach(() => {
createComponent({
props: { clusterName: 'my-test-cluster' },
stubs: { GlSprintf, GlModal: stubComponent(GlModal) },
stubs: {
GlSprintf,
GlModal: stubComponent(GlModal, {
methods: { show: showMock },
}),
},
});
jest.spyOn(findModal().vm, 'show').mockReturnValue();
});
it('open modal with "cleanup" option', async () => {
@ -43,8 +48,8 @@ describe('Remove cluster confirmation modal', () => {
await nextTick();
expect(findModal().vm.show).toHaveBeenCalled();
expect(wrapper.vm.confirmCleanup).toEqual(true);
expect(showMock).toHaveBeenCalled();
expect(wrapper.element).toMatchSnapshot();
expect(findModal().html()).toContain(
'<strong>To remove your integration and resources, type <code>my-test-cluster</code> to confirm:</strong>',
);
@ -55,8 +60,8 @@ describe('Remove cluster confirmation modal', () => {
await nextTick();
expect(findModal().vm.show).toHaveBeenCalled();
expect(wrapper.vm.confirmCleanup).toEqual(false);
expect(showMock).toHaveBeenCalled();
expect(wrapper.element).toMatchSnapshot();
expect(findModal().html()).toContain(
'<strong>To remove your integration, type <code>my-test-cluster</code> to confirm:</strong>',
);

View File

@ -3,14 +3,14 @@ import { shallowMount } from '@vue/test-utils';
import Visibility from 'visibilityjs';
import { nextTick } from 'vue';
import fixture from 'test_fixtures/pipelines/pipelines.json';
import { createAlert } from '~/flash';
import { createAlert } from '~/alert';
import Poll from '~/lib/utils/poll';
import CommitPipelineStatus from '~/projects/tree/components/commit_pipeline_status_component.vue';
import CiIcon from '~/vue_shared/components/ci_icon.vue';
jest.mock('~/lib/utils/poll');
jest.mock('visibilityjs');
jest.mock('~/flash');
jest.mock('~/alert');
const mockFetchData = jest.fn();
jest.mock('~/projects/tree/services/commit_pipeline_service', () =>
@ -164,7 +164,7 @@ describe('Commit pipeline status component', () => {
});
});
it('displays flash error message', () => {
it('displays alert error message', () => {
expect(createAlert).toHaveBeenCalled();
});
});

View File

@ -14,7 +14,7 @@ import {
HTTP_STATUS_OK,
HTTP_STATUS_UNAUTHORIZED,
} from '~/lib/utils/http_status';
import { createAlert } from '~/flash';
import { createAlert } from '~/alert';
import { TOAST_MESSAGE } from '~/pipelines/constants';
import axios from '~/lib/utils/axios_utils';
@ -22,7 +22,7 @@ const $toast = {
show: jest.fn(),
};
jest.mock('~/flash');
jest.mock('~/alert');
describe('Pipelines table in Commits and Merge requests', () => {
let wrapper;

View File

@ -1,13 +1,13 @@
import { GlButton, GlModal } from '@gitlab/ui';
import { nextTick } from 'vue';
import { createAlert } from '~/flash';
import { createAlert } from '~/alert';
import Modal from '~/ide/components/new_dropdown/modal.vue';
import { createStore } from '~/ide/stores';
import { stubComponent } from 'helpers/stub_component';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import { createEntriesFromPaths } from '../../helpers';
jest.mock('~/flash');
jest.mock('~/alert');
const NEW_NAME = 'babar';
@ -339,7 +339,7 @@ describe('new file modal component', () => {
});
});
it('does not trigger flash', () => {
it('does not trigger alert', () => {
expect(createAlert).not.toHaveBeenCalled();
});
});
@ -358,7 +358,7 @@ describe('new file modal component', () => {
});
});
it('does not trigger flash', () => {
it('does not trigger alert', () => {
expect(createAlert).not.toHaveBeenCalled();
});
});
@ -378,7 +378,7 @@ describe('new file modal component', () => {
triggerSubmitModal();
});
it('creates flash', () => {
it('creates alert', () => {
expect(createAlert).toHaveBeenCalledWith({
message: 'The name "src" is already taken in this directory.',
fadeTransition: false,
@ -403,7 +403,7 @@ describe('new file modal component', () => {
triggerSubmitModal();
});
it('does not create flash', () => {
it('does not create alert', () => {
expect(createAlert).not.toHaveBeenCalled();
});

View File

@ -3,7 +3,7 @@ import { range } from 'lodash';
import { stubPerformanceWebAPI } from 'helpers/performance';
import { TEST_HOST } from 'helpers/test_constants';
import testAction from 'helpers/vuex_action_helper';
import { createAlert } from '~/flash';
import { createAlert } from '~/alert';
import { leftSidebarViews, PERMISSION_READ_MR, MAX_MR_FILES_AUTO_OPEN } from '~/ide/constants';
import service from '~/ide/services';
import { createStore } from '~/ide/stores';
@ -30,7 +30,7 @@ const createMergeRequestChangesCount = (n) =>
const testGetUrlForPath = (path) => `${TEST_HOST}/test/${path}`;
jest.mock('~/flash');
jest.mock('~/alert');
describe('IDE store merge request actions', () => {
let store;
@ -135,7 +135,7 @@ describe('IDE store merge request actions', () => {
mock.onGet(/api\/(.*)\/projects\/abcproject\/merge_requests/).networkError();
});
it('flashes message, if error', () => {
it('alerts message, if error', () => {
return store
.dispatch('getMergeRequestsForBranch', {
projectId: TEST_PROJECT,
@ -519,7 +519,7 @@ describe('IDE store merge request actions', () => {
);
});
it('flashes message, if error', () => {
it('alerts message, if error', () => {
store.dispatch.mockRejectedValue();
return openMergeRequest(store, mr).catch(() => {

View File

@ -2,7 +2,7 @@ import MockAdapter from 'axios-mock-adapter';
import { useMockLocationHelper } from 'helpers/mock_window_location_helper';
import testAction from 'helpers/vuex_action_helper';
import api from '~/api';
import { createAlert } from '~/flash';
import { createAlert } from '~/alert';
import service from '~/ide/services';
import { createStore } from '~/ide/stores';
import {
@ -19,7 +19,7 @@ import {
import { logError } from '~/lib/logger';
import axios from '~/lib/utils/axios_utils';
jest.mock('~/flash');
jest.mock('~/alert');
jest.mock('~/lib/logger');
const TEST_PROJECT_ID = 'abc/def';
@ -104,7 +104,7 @@ describe('IDE store project actions', () => {
desc | projectPath | responseSuccess | expectedMutations
${'does not fetch permissions if project does not exist'} | ${undefined} | ${true} | ${[]}
${'fetches permission when project is specified'} | ${TEST_PROJECT_ID} | ${true} | ${[...permissionsMutations]}
${'flashes an error if the request fails'} | ${TEST_PROJECT_ID} | ${false} | ${[]}
${'alerts an error if the request fails'} | ${TEST_PROJECT_ID} | ${false} | ${[]}
`('$desc', async ({ projectPath, expectedMutations, responseSuccess } = {}) => {
store.state.currentProjectId = projectPath;
if (responseSuccess) {

View File

@ -4,7 +4,7 @@ import testAction from 'helpers/vuex_action_helper';
import eventHub from '~/ide/eventhub';
import { createRouter } from '~/ide/ide_router';
import { createStore } from '~/ide/stores';
import { createAlert } from '~/flash';
import { createAlert } from '~/alert';
import {
init,
stageAllChanges,
@ -31,7 +31,7 @@ jest.mock('~/lib/utils/url_utility', () => ({
visitUrl: jest.fn(),
joinPaths: jest.requireActual('~/lib/utils/url_utility').joinPaths,
}));
jest.mock('~/flash');
jest.mock('~/alert');
describe('Multi-file store actions', () => {
let store;
@ -210,7 +210,7 @@ describe('Multi-file store actions', () => {
expect(store.dispatch).toHaveBeenCalledWith('setFileActive', 'test');
});
it('creates flash message if file already exists', async () => {
it('creates alert message if file already exists', async () => {
const f = file('test', '1', 'blob');
store.state.trees['abcproject/mybranch'].tree = [f];
store.state.entries[f.path] = f;
@ -927,7 +927,7 @@ describe('Multi-file store actions', () => {
expect(document.querySelector('.flash-alert')).toBeNull();
});
it('does not pass the error further and flashes an alert if error is not 404', async () => {
it('does not pass the error further and creates an alert if error is not 404', async () => {
mock.onGet(/(.*)/).replyOnce(HTTP_STATUS_IM_A_TEAPOT);
await expect(getBranchData(...callParams)).rejects.toEqual(

View File

@ -1,6 +1,6 @@
import MockAdapter from 'axios-mock-adapter';
import testAction from 'helpers/vuex_action_helper';
import { createAlert } from '~/flash';
import { createAlert } from '~/alert';
import * as actions from '~/ide/stores/modules/terminal/actions/session_controls';
import { STARTING, PENDING, STOPPING, STOPPED } from '~/ide/stores/modules/terminal/constants';
import * as messages from '~/ide/stores/modules/terminal/messages';
@ -13,7 +13,7 @@ import {
HTTP_STATUS_UNPROCESSABLE_ENTITY,
} from '~/lib/utils/http_status';
jest.mock('~/flash');
jest.mock('~/alert');
const TEST_PROJECT_PATH = 'lorem/root';
const TEST_BRANCH_ID = 'main';
@ -91,7 +91,7 @@ describe('IDE store terminal session controls actions', () => {
});
describe('receiveStartSessionError', () => {
it('flashes message', () => {
it('alerts message', () => {
actions.receiveStartSessionError({ dispatch });
expect(createAlert).toHaveBeenCalledWith({
@ -165,7 +165,7 @@ describe('IDE store terminal session controls actions', () => {
});
describe('receiveStopSessionError', () => {
it('flashes message', () => {
it('alerts message', () => {
actions.receiveStopSessionError({ dispatch });
expect(createAlert).toHaveBeenCalledWith({

View File

@ -1,6 +1,6 @@
import MockAdapter from 'axios-mock-adapter';
import testAction from 'helpers/vuex_action_helper';
import { createAlert } from '~/flash';
import { createAlert } from '~/alert';
import * as actions from '~/ide/stores/modules/terminal/actions/session_status';
import { PENDING, RUNNING, STOPPING, STOPPED } from '~/ide/stores/modules/terminal/constants';
import * as messages from '~/ide/stores/modules/terminal/messages';
@ -8,7 +8,7 @@ import * as mutationTypes from '~/ide/stores/modules/terminal/mutation_types';
import axios from '~/lib/utils/axios_utils';
import { HTTP_STATUS_BAD_REQUEST, HTTP_STATUS_OK } from '~/lib/utils/http_status';
jest.mock('~/flash');
jest.mock('~/alert');
const TEST_SESSION = {
id: 7,
@ -113,7 +113,7 @@ describe('IDE store terminal session controls actions', () => {
});
describe('receiveSessionStatusError', () => {
it('flashes message', () => {
it('alerts message', () => {
actions.receiveSessionStatusError({ dispatch });
expect(createAlert).toHaveBeenCalledWith({

View File

@ -1,18 +1,16 @@
import { mount } from '@vue/test-utils';
import katex from 'katex';
import Vue, { nextTick } from 'vue';
import { nextTick } from 'vue';
import markdownTableJson from 'test_fixtures/blob/notebook/markdown-table.json';
import basicJson from 'test_fixtures/blob/notebook/basic.json';
import mathJson from 'test_fixtures/blob/notebook/math.json';
import MarkdownComponent from '~/notebook/cells/markdown.vue';
import Prompt from '~/notebook/cells/prompt.vue';
const Component = Vue.extend(MarkdownComponent);
window.katex = katex;
function buildCellComponent(cell, relativePath = '', hidePrompt) {
return mount(Component, {
return mount(MarkdownComponent, {
propsData: {
cell,
hidePrompt,

View File

@ -2,12 +2,12 @@ import MockAdapter from 'axios-mock-adapter';
import $ from 'jquery';
import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { TEST_HOST } from 'helpers/test_constants';
import { createAlert } from '~/flash';
import { createAlert } from '~/alert';
import axios from '~/lib/utils/axios_utils';
import { HTTP_STATUS_INTERNAL_SERVER_ERROR, HTTP_STATUS_OK } from '~/lib/utils/http_status';
import ProtectedBranchEdit from '~/protected_branches/protected_branch_edit';
jest.mock('~/flash');
jest.mock('~/alert');
const TEST_URL = `${TEST_HOST}/url`;
const FORCE_PUSH_TOGGLE_TESTID = 'force-push-toggle';
@ -149,7 +149,7 @@ describe('ProtectedBranchEdit', () => {
toggle.click();
});
it('flashes error', async () => {
it('alerts error', async () => {
await axios.waitForAll();
expect(createAlert).toHaveBeenCalled();

View File

@ -534,6 +534,27 @@ RSpec.describe MarkupHelper do
helper.first_line_in_markdown(object, attribute, 100, is_todo: true, project: project)
end.not_to change { Gitlab::GitalyClient.get_request_count }
end
it 'strips non-user links' do
html = 'This a cool [website](https://gitlab.com/).'
object = create_object(html)
result = helper.first_line_in_markdown(object, attribute, 100, is_todo: true, project: project)
expect(result).to include('This a cool website.')
end
it 'styles the current user link', :aggregate_failures do
another_user = create(:user)
html = "Please have a look, @#{user.username} @#{another_user.username}!"
object = create_object(html)
result = helper.first_line_in_markdown(object, attribute, 100, is_todo: true, project: project)
links = Nokogiri::HTML.parse(result).css('//a')
expect(links[0].classes).to include('current-user')
expect(links[1].classes).not_to include('current-user')
end
end
context 'when the asked attribute can be redacted' do

View File

@ -0,0 +1,87 @@
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'google cloud profiler', :aggregate_failures, feature_category: :application_performance do
subject(:load_initializer) do
load rails_root_join('config/initializers/google_cloud_profiler.rb')
end
shared_examples 'does not call profiler agent' do
it do
expect(CloudProfilerAgent::Agent).not_to receive(:new)
load_initializer
end
end
context 'when GITLAB_GOOGLE_CLOUD_PROFILER_ENABLED is set to true' do
before do
stub_env('GITLAB_GOOGLE_CLOUD_PROFILER_ENABLED', true)
end
context 'when GITLAB_GOOGLE_CLOUD_PROFILER_PROJECT_ID is not set' do
include_examples 'does not call profiler agent'
end
context 'when GITLAB_GOOGLE_CLOUD_PROFILER_PROJECT_ID is set' do
let(:project_id) { 'gitlab-staging-1' }
let(:agent) { instance_double(CloudProfilerAgent::Agent) }
before do
stub_env('GITLAB_GOOGLE_CLOUD_PROFILER_PROJECT_ID', project_id)
end
context 'when run in Puma context' do
before do
allow(::Gitlab::Runtime).to receive(:puma?).and_return(true)
allow(::Gitlab::Runtime).to receive(:sidekiq?).and_return(false)
end
it 'calls the agent' do
expect(CloudProfilerAgent::Agent)
.to receive(:new).with(service: 'gitlab-web', project_id: project_id,
logger: an_instance_of(::Gitlab::AppJsonLogger),
log_labels: hash_including(
message: 'Google Cloud Profiler Ruby',
pid: be_a(Integer),
worker_id: be_a(String)
)).and_return(agent)
expect(agent).to receive(:start)
load_initializer
end
end
context 'when run in Sidekiq context' do
before do
allow(::Gitlab::Runtime).to receive(:puma?).and_return(false)
allow(::Gitlab::Runtime).to receive(:sidekiq?).and_return(true)
end
include_examples 'does not call profiler agent'
end
context 'when run in another context' do
before do
allow(::Gitlab::Runtime).to receive(:puma?).and_return(false)
allow(::Gitlab::Runtime).to receive(:sidekiq?).and_return(false)
end
include_examples 'does not call profiler agent'
end
end
end
context 'when GITLAB_GOOGLE_CLOUD_PROFILER_ENABLED is not set' do
include_examples 'does not call profiler agent'
end
context 'when GITLAB_GOOGLE_CLOUD_PROFILER_ENABLED is set to false' do
before do
stub_env('GITLAB_GOOGLE_CLOUD_PROFILER_ENABLED', false)
end
include_examples 'does not call profiler agent'
end
end

View File

@ -0,0 +1,136 @@
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe Gitlab::BackgroundMigration::MigrateEvidencesForVulnerabilityFindings,
feature_category: :vulnerability_management do
let(:vulnerability_occurrences) { table(:vulnerability_occurrences) }
let(:vulnerability_finding_evidences) { table(:vulnerability_finding_evidences) }
let(:evidence_hash) { { url: 'http://test.com' } }
let(:namespace1) { table(:namespaces).create!(name: 'namespace 1', path: 'namespace1') }
let(:project1) { table(:projects).create!(namespace_id: namespace1.id, project_namespace_id: namespace1.id) }
let(:user) { table(:users).create!(email: 'test1@example.com', projects_limit: 5) }
let(:scanner1) do
table(:vulnerability_scanners).create!(project_id: project1.id, external_id: 'test 1', name: 'test scanner 1')
end
let(:stating_id) { vulnerability_occurrences.pluck(:id).min }
let(:end_id) { vulnerability_occurrences.pluck(:id).max }
let(:migration) do
described_class.new(
start_id: stating_id,
end_id: end_id,
batch_table: :vulnerability_occurrences,
batch_column: :id,
sub_batch_size: 2,
pause_ms: 2,
connection: ApplicationRecord.connection
)
end
subject(:perform_migration) { migration.perform }
context 'without the presence of evidence key' do
before do
create_finding!(project1.id, scanner1.id, { other_keys: 'test' })
end
it 'does not create any evidence' do
expect(Gitlab::AppLogger).not_to receive(:error)
expect { perform_migration }.not_to change { vulnerability_finding_evidences.count }
end
end
context 'with evidence equals to nil' do
before do
create_finding!(project1.id, scanner1.id, { evidence: nil })
end
it 'does not create any evidence' do
expect(Gitlab::AppLogger).not_to receive(:error)
expect { perform_migration }.not_to change { vulnerability_finding_evidences.count }
end
end
context 'with existing evidence within raw_metadata' do
let!(:finding1) { create_finding!(project1.id, scanner1.id, { evidence: evidence_hash }) }
let!(:finding2) { create_finding!(project1.id, scanner1.id, { evidence: evidence_hash }) }
it 'creates new evidence for each finding' do
expect(Gitlab::AppLogger).not_to receive(:error)
expect { perform_migration }.to change { vulnerability_finding_evidences.count }.by(2)
end
context 'when create throws exception StandardError' do
before do
allow(migration).to receive(:create_evidences).and_raise(StandardError)
end
it 'logs StandardError' do
expect(Gitlab::AppLogger).to receive(:error).with({
class: described_class.name, message: StandardError.to_s
})
expect { perform_migration }.not_to change { vulnerability_finding_evidences.count }
end
end
context 'when parse throws exception JSON::ParserError' do
before do
allow(Gitlab::Json).to receive(:parse).and_raise(JSON::ParserError)
end
it 'does not log this error nor create new records' do
expect(Gitlab::AppLogger).not_to receive(:error)
expect { perform_migration }.not_to change { vulnerability_finding_evidences.count }
end
end
end
context 'with existing evidence records' do
let!(:finding) { create_finding!(project1.id, scanner1.id, { evidence: evidence_hash }) }
before do
vulnerability_finding_evidences.create!(vulnerability_occurrence_id: finding.id, data: evidence_hash)
end
it 'does not create new evidence' do
expect(Gitlab::AppLogger).not_to receive(:error)
expect { perform_migration }.not_to change { vulnerability_finding_evidences.count }
end
context 'with non-existing evidence' do
let!(:finding3) { create_finding!(project1.id, scanner1.id, { evidence: { url: 'http://secondary.com' } }) }
it 'creates a new evidence only to the non-existing evidence' do
expect(Gitlab::AppLogger).not_to receive(:error)
expect { perform_migration }.to change { vulnerability_finding_evidences.count }.by(1)
end
end
end
private
def create_finding!(project_id, scanner_id, raw_metadata)
vulnerability = table(:vulnerabilities).create!(project_id: project_id, author_id: user.id, title: 'test',
severity: 4, confidence: 4, report_type: 0)
identifier = table(:vulnerability_identifiers).create!(project_id: project_id, external_type: 'uuid-v5',
external_id: 'uuid-v5', fingerprint: OpenSSL::Digest::SHA256.hexdigest(vulnerability.id.to_s),
name: 'Identifier for UUIDv5 2 2')
table(:vulnerability_occurrences).create!(
vulnerability_id: vulnerability.id, project_id: project_id, scanner_id: scanner_id,
primary_identifier_id: identifier.id, name: 'test', severity: 4, confidence: 4, report_type: 0,
uuid: SecureRandom.uuid, project_fingerprint: '123qweasdzxc', location: { "image" => "alpine:3.4" },
location_fingerprint: 'test', metadata_version: 'test',
raw_metadata: raw_metadata.to_json)
end
end

View File

@ -482,16 +482,35 @@ RSpec.describe Gitlab::Database::Migrations::BatchedBackgroundMigrationHelpers d
.not_to raise_error
end
it 'logs a warning when migration does not exist' do
expect(Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas).to receive(:require_dml_mode!)
context 'when specified migration does not exist' do
let(:lab_key) { 'DBLAB_ENVIRONMENT' }
create(:batched_background_migration, :active, migration_attributes.merge(gitlab_schema: :gitlab_something_else))
context 'when DBLAB_ENVIRONMENT is not set' do
it 'logs a warning' do
stub_env(lab_key, nil)
expect(Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas).to receive(:require_dml_mode!)
expect(Gitlab::AppLogger).to receive(:warn)
.with("Could not find batched background migration for the given configuration: #{configuration}")
create(:batched_background_migration, :active, migration_attributes.merge(gitlab_schema: :gitlab_something_else))
expect { ensure_batched_background_migration_is_finished }
.not_to raise_error
expect(Gitlab::AppLogger).to receive(:warn)
.with("Could not find batched background migration for the given configuration: #{configuration}")
expect { ensure_batched_background_migration_is_finished }
.not_to raise_error
end
end
context 'when DBLAB_ENVIRONMENT is set' do
it 'raises an error' do
stub_env(lab_key, 'foo')
expect(Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas).to receive(:require_dml_mode!)
create(:batched_background_migration, :active, migration_attributes.merge(gitlab_schema: :gitlab_something_else))
expect { ensure_batched_background_migration_is_finished }
.to raise_error(Gitlab::Database::Migrations::BatchedBackgroundMigrationHelpers::NonExistentMigrationError)
end
end
end
it 'finalizes the migration' do

View File

@ -0,0 +1,31 @@
# frozen_string_literal: true
require 'spec_helper'
require_migration!
RSpec.describe MigrateEvidencesFromRawMetadata, :migration, feature_category: :vulnerability_management do
let(:migration) { described_class::MIGRATION }
describe '#up' do
it 'schedules a batched background migration' do
migrate!
expect(migration).to have_scheduled_batched_migration(
table_name: :vulnerability_occurrences,
column_name: :id,
interval: described_class::DELAY_INTERVAL,
batch_size: described_class::BATCH_SIZE,
sub_batch_size: described_class::SUB_BATCH_SIZE
)
end
end
describe '#down' do
it 'deletes all batched migration records' do
migrate!
schema_migrate_down!
expect(migration).not_to have_scheduled_batched_migration
end
end
end

View File

@ -93,9 +93,7 @@ RSpec.describe ErrorTracking::ProjectErrorTrackingSetting, feature_category: :er
end
context 'with sentry backend' do
before do
subject.integrated = false
end
subject { build(:project_error_tracking_setting, project: project) }
it 'does not create a new client key' do
expect { subject.save! }.not_to change { ErrorTracking::ClientKey.count }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe ProjectHookPolicy do
RSpec.describe ProjectHookPolicy, feature_category: :integrations do
let_it_be(:user) { create(:user) }
let(:hook) { create(:project_hook) }

View File

@ -38,7 +38,7 @@ RSpec.describe API::ErrorTracking::ProjectSettings, feature_category: :error_tra
end
end
shared_examples 'returns 404' do
shared_examples 'returns no project settings' do
it 'returns no project settings' do
make_request
@ -48,6 +48,57 @@ RSpec.describe API::ErrorTracking::ProjectSettings, feature_category: :error_tra
end
end
shared_examples 'returns 400' do
it 'rejects request' do
make_request
expect(response).to have_gitlab_http_status(:bad_request)
end
end
shared_examples 'returns 401' do
it 'rejects request' do
make_request
expect(response).to have_gitlab_http_status(:unauthorized)
end
end
shared_examples 'returns 403' do
it 'rejects request' do
make_request
expect(response).to have_gitlab_http_status(:forbidden)
end
end
shared_examples 'returns 404' do
it 'rejects request' do
make_request
expect(response).to have_gitlab_http_status(:not_found)
end
end
shared_examples 'returns 400 with `integrated` param required or invalid' do |error|
it 'returns 400' do
make_request
expect(response).to have_gitlab_http_status(:bad_request)
expect(json_response['error'])
.to eq(error)
end
end
shared_examples "returns error from UpdateService" do
it "returns errors" do
make_request
expect(json_response['http_status']).to eq('forbidden')
expect(json_response['message']).to eq('An error occurred')
end
end
describe "PATCH /projects/:id/error_tracking/settings" do
let(:params) { { active: false } }
@ -127,14 +178,34 @@ RSpec.describe API::ErrorTracking::ProjectSettings, feature_category: :error_tra
end
context 'without a project setting' do
let(:project) { create(:project) }
let_it_be(:project) { create(:project) }
before do
project.add_maintainer(user)
end
context 'patch settings' do
it_behaves_like 'returns 404'
it_behaves_like 'returns no project settings'
end
end
context "when ::Projects::Operations::UpdateService responds with an error" do
before do
allow_next_instance_of(::Projects::Operations::UpdateService) do |service|
allow(service)
.to receive(:execute)
.and_return({ status: :error, message: 'An error occurred', http_status: :forbidden })
end
end
context "when integrated" do
let(:integrated) { true }
it_behaves_like 'returns error from UpdateService'
end
context "without integrated" do
it_behaves_like 'returns error from UpdateService'
end
end
end
@ -145,11 +216,7 @@ RSpec.describe API::ErrorTracking::ProjectSettings, feature_category: :error_tra
end
context 'patch request' do
it 'returns 403' do
make_request
expect(response).to have_gitlab_http_status(:forbidden)
end
it_behaves_like 'returns 403'
end
end
@ -159,21 +226,13 @@ RSpec.describe API::ErrorTracking::ProjectSettings, feature_category: :error_tra
end
context 'patch request' do
it 'returns 403' do
make_request
expect(response).to have_gitlab_http_status(:forbidden)
end
it_behaves_like 'returns 403'
end
end
context 'when authenticated as non-member' do
context 'patch request' do
it 'returns 404' do
make_request
expect(response).to have_gitlab_http_status(:not_found)
end
it_behaves_like 'returns 404'
end
end
@ -181,11 +240,7 @@ RSpec.describe API::ErrorTracking::ProjectSettings, feature_category: :error_tra
let(:user) { nil }
context 'patch request' do
it 'returns 401 for update request' do
make_request
expect(response).to have_gitlab_http_status(:unauthorized)
end
it_behaves_like 'returns 401'
end
end
end
@ -227,7 +282,7 @@ RSpec.describe API::ErrorTracking::ProjectSettings, feature_category: :error_tra
end
context 'get settings' do
it_behaves_like 'returns 404'
it_behaves_like 'returns no project settings'
end
end
@ -236,11 +291,7 @@ RSpec.describe API::ErrorTracking::ProjectSettings, feature_category: :error_tra
project.add_reporter(user)
end
it 'returns 403' do
make_request
expect(response).to have_gitlab_http_status(:forbidden)
end
it_behaves_like 'returns 403'
end
context 'when authenticated as developer' do
@ -248,29 +299,138 @@ RSpec.describe API::ErrorTracking::ProjectSettings, feature_category: :error_tra
project.add_developer(user)
end
it 'returns 403' do
make_request
expect(response).to have_gitlab_http_status(:forbidden)
end
it_behaves_like 'returns 403'
end
context 'when authenticated as non-member' do
it 'returns 404' do
make_request
expect(response).to have_gitlab_http_status(:not_found)
end
it_behaves_like 'returns 404'
end
context 'when unauthenticated' do
let(:user) { nil }
it 'returns 401' do
make_request
it_behaves_like 'returns 401'
end
end
expect(response).to have_gitlab_http_status(:unauthorized)
describe "PUT /projects/:id/error_tracking/settings" do
let(:params) { { active: active, integrated: integrated } }
let(:active) { true }
let(:integrated) { true }
def make_request
put api("/projects/#{project.id}/error_tracking/settings", user), params: params
end
context 'when authenticated' do
context 'as maintainer' do
before do
project.add_maintainer(user)
end
context "when integrated" do
let(:integrated) { true }
context "with existing setting" do
let(:setting) { create(:project_error_tracking_setting, :integrated) }
let(:active) { false }
it "updates a setting" do
expect { make_request }.not_to change { ErrorTracking::ProjectErrorTrackingSetting.count }
expect(response).to have_gitlab_http_status(:ok)
expect(json_response).to eq(
"active" => false,
"api_url" => nil,
"integrated" => integrated,
"project_name" => nil,
"sentry_external_url" => nil
)
end
end
context "without setting" do
let(:active) { true }
let_it_be(:project) { create(:project) }
it "creates a setting" do
expect { make_request }.to change { ErrorTracking::ProjectErrorTrackingSetting.count }
expect(response).to have_gitlab_http_status(:ok)
expect(json_response).to eq(
"active" => true,
"api_url" => nil,
"integrated" => integrated,
"project_name" => nil,
"sentry_external_url" => nil
)
end
end
context "when ::Projects::Operations::UpdateService responds with an error" do
before do
allow_next_instance_of(::Projects::Operations::UpdateService) do |service|
allow(service)
.to receive(:execute)
.and_return({ status: :error, message: 'An error occurred', http_status: :forbidden })
end
end
it_behaves_like 'returns error from UpdateService'
end
end
context "integrated_error_tracking feature disabled" do
let(:integrated) { true }
before do
stub_feature_flags(integrated_error_tracking: false)
end
it_behaves_like 'returns 404'
end
context "when integrated param is invalid" do
let(:params) { { active: active, integrated: 'invalid_string' } }
it_behaves_like 'returns 400 with `integrated` param required or invalid', 'integrated is invalid'
end
context "when integrated param is missing" do
let(:params) { { active: active } }
it_behaves_like 'returns 400 with `integrated` param required or invalid', 'integrated is missing'
end
end
context 'as reporter' do
before do
project.add_reporter(user)
end
it_behaves_like 'returns 403'
end
context "as developer" do
before do
project.add_developer(user)
end
it_behaves_like 'returns 403'
end
context 'as non-member' do
it_behaves_like 'returns 404'
end
end
context "when unauthorized" do
let(:user) { nil }
let(:integrated) { true }
it_behaves_like 'returns 401'
end
end
end

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::AddContextService do
RSpec.describe MergeRequests::AddContextService, feature_category: :code_review_workflow do
let(:project) { create(:project, :repository) }
let(:admin) { create(:admin) }
let(:merge_request) { create(:merge_request, source_project: project, target_project: project, author: admin) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::AddSpentTimeService do
RSpec.describe MergeRequests::AddSpentTimeService, feature_category: :code_review_workflow do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project, :public, :repository) }
let_it_be_with_reload(:merge_request) { create(:merge_request, :simple, :unique_branches, source_project: project) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe ::MergeRequests::AddTodoWhenBuildFailsService do
RSpec.describe ::MergeRequests::AddTodoWhenBuildFailsService, feature_category: :code_review_workflow do
let(:user) { create(:user) }
let(:project) { create(:project, :repository) }
let(:sha) { '1234567890abcdef1234567890abcdef12345678' }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::ApprovalService do
RSpec.describe MergeRequests::ApprovalService, feature_category: :code_review_workflow do
describe '#execute' do
let(:user) { create(:user) }
let(:merge_request) { create(:merge_request, reviewers: [user]) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::AssignIssuesService do
RSpec.describe MergeRequests::AssignIssuesService, feature_category: :code_review_workflow do
let(:user) { create(:user) }
let(:project) { create(:project, :public, :repository) }
let(:issue) { create(:issue, project: project) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::CleanupRefsService do
RSpec.describe MergeRequests::CleanupRefsService, feature_category: :code_review_workflow do
describe '.schedule' do
let(:merge_request) { create(:merge_request) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::Conflicts::ListService do
RSpec.describe MergeRequests::Conflicts::ListService, feature_category: :code_review_workflow do
describe '#can_be_resolved_in_ui?' do
def create_merge_request(source_branch, target_branch = 'conflict-start')
create(:merge_request, source_branch: source_branch, target_branch: target_branch, merge_status: :unchecked) do |mr|

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::Conflicts::ResolveService do
RSpec.describe MergeRequests::Conflicts::ResolveService, feature_category: :code_review_workflow do
include ProjectForksHelper
let(:user) { create(:user) }
let(:project) { create(:project, :public, :repository) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::CreateApprovalEventService do
RSpec.describe MergeRequests::CreateApprovalEventService, feature_category: :code_review_workflow do
let(:user) { create(:user) }
let(:merge_request) { create(:merge_request) }
let(:project) { merge_request.project }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::CreatePipelineService, :clean_gitlab_redis_cache do
RSpec.describe MergeRequests::CreatePipelineService, :clean_gitlab_redis_cache, feature_category: :code_review_workflow do
include ProjectForksHelper
let_it_be(:project, refind: true) { create(:project, :repository) }

View File

@ -2,7 +2,8 @@
require 'spec_helper'
RSpec.describe MergeRequests::DeleteNonLatestDiffsService, :clean_gitlab_redis_shared_state do
RSpec.describe MergeRequests::DeleteNonLatestDiffsService, :clean_gitlab_redis_shared_state,
feature_category: :code_review_workflow do
let(:merge_request) { create(:merge_request) }
let!(:subject) { described_class.new(merge_request) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::ExecuteApprovalHooksService do
RSpec.describe MergeRequests::ExecuteApprovalHooksService, feature_category: :code_review_workflow do
let(:user) { create(:user) }
let(:merge_request) { create(:merge_request) }
let(:project) { merge_request.project }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::FfMergeService do
RSpec.describe MergeRequests::FfMergeService, feature_category: :code_review_workflow do
let(:user) { create(:user) }
let(:user2) { create(:user) }
let(:merge_request) do

View File

@ -2,7 +2,7 @@
require "spec_helper"
RSpec.describe MergeRequests::GetUrlsService do
RSpec.describe MergeRequests::GetUrlsService, feature_category: :code_review_workflow do
include ProjectForksHelper
let(:project) { create(:project, :public, :repository) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::HandleAssigneesChangeService do
RSpec.describe MergeRequests::HandleAssigneesChangeService, feature_category: :code_review_workflow do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { create(:user) }
let_it_be(:assignee) { create(:user) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::MarkReviewerReviewedService do
RSpec.describe MergeRequests::MarkReviewerReviewedService, feature_category: :code_review_workflow do
let(:current_user) { create(:user) }
let(:merge_request) { create(:merge_request, reviewers: [current_user]) }
let(:reviewer) { merge_request.merge_request_reviewers.find_by(user_id: current_user.id) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::MergeOrchestrationService do
RSpec.describe MergeRequests::MergeOrchestrationService, feature_category: :code_review_workflow do
let_it_be(:maintainer) { create(:user) }
let(:merge_params) { { sha: merge_request.diff_head_sha } }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::MergeService do
RSpec.describe MergeRequests::MergeService, feature_category: :code_review_workflow do
include ExclusiveLeaseHelpers
let_it_be(:user) { create(:user) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::MergeToRefService do
RSpec.describe MergeRequests::MergeToRefService, feature_category: :code_review_workflow do
shared_examples_for 'MergeService for target ref' do
it 'target_ref has the same state of target branch' do
repo = merge_request.target_project.repository

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::Mergeability::CheckBaseService do
RSpec.describe MergeRequests::Mergeability::CheckBaseService, feature_category: :code_review_workflow do
subject(:check_base_service) { described_class.new(merge_request: merge_request, params: params) }
let(:merge_request) { double }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::Mergeability::CheckBrokenStatusService do
RSpec.describe MergeRequests::Mergeability::CheckBrokenStatusService, feature_category: :code_review_workflow do
subject(:check_broken_status) { described_class.new(merge_request: merge_request, params: {}) }
let(:merge_request) { build(:merge_request) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::Mergeability::CheckCiStatusService do
RSpec.describe MergeRequests::Mergeability::CheckCiStatusService, feature_category: :code_review_workflow do
subject(:check_ci_status) { described_class.new(merge_request: merge_request, params: params) }
let(:merge_request) { build(:merge_request) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::Mergeability::CheckDiscussionsStatusService do
RSpec.describe MergeRequests::Mergeability::CheckDiscussionsStatusService, feature_category: :code_review_workflow do
subject(:check_discussions_status) { described_class.new(merge_request: merge_request, params: params) }
let(:merge_request) { build(:merge_request) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::Mergeability::CheckDraftStatusService do
RSpec.describe MergeRequests::Mergeability::CheckDraftStatusService, feature_category: :code_review_workflow do
subject(:check_draft_status) { described_class.new(merge_request: merge_request, params: {}) }
let(:merge_request) { build(:merge_request) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::Mergeability::CheckOpenStatusService do
RSpec.describe MergeRequests::Mergeability::CheckOpenStatusService, feature_category: :code_review_workflow do
subject(:check_open_status) { described_class.new(merge_request: merge_request, params: {}) }
let(:merge_request) { build(:merge_request) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe ::MergeRequests::Mergeability::DetailedMergeStatusService do
RSpec.describe ::MergeRequests::Mergeability::DetailedMergeStatusService, feature_category: :code_review_workflow do
subject(:detailed_merge_status) { described_class.new(merge_request: merge_request).execute }
context 'when merge status is cannot_be_merged_rechecking' do

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::Mergeability::Logger, :request_store do
RSpec.describe MergeRequests::Mergeability::Logger, :request_store, feature_category: :code_review_workflow do
let_it_be(:merge_request) { create(:merge_request) }
subject(:logger) { described_class.new(merge_request: merge_request) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::Mergeability::RunChecksService, :clean_gitlab_redis_cache do
RSpec.describe MergeRequests::Mergeability::RunChecksService, :clean_gitlab_redis_cache, feature_category: :code_review_workflow do
subject(:run_checks) { described_class.new(merge_request: merge_request, params: {}) }
describe '#execute' do

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::MergeabilityCheckService, :clean_gitlab_redis_shared_state do
RSpec.describe MergeRequests::MergeabilityCheckService, :clean_gitlab_redis_shared_state, feature_category: :code_review_workflow do
shared_examples_for 'unmergeable merge request' do
it 'updates or keeps merge status as cannot_be_merged' do
subject

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::MigrateExternalDiffsService do
RSpec.describe MergeRequests::MigrateExternalDiffsService, feature_category: :code_review_workflow do
let(:merge_request) { create(:merge_request) }
let(:diff) { merge_request.merge_request_diff }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::PostMergeService do
RSpec.describe MergeRequests::PostMergeService, feature_category: :code_review_workflow do
include ProjectForksHelper
let_it_be(:user) { create(:user) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::PushOptionsHandlerService do
RSpec.describe MergeRequests::PushOptionsHandlerService, feature_category: :source_code_management do
include ProjectForksHelper
let_it_be(:parent_group) { create(:group, :public) }

View File

@ -2,7 +2,8 @@
require 'spec_helper'
RSpec.describe MergeRequests::ReloadDiffsService, :use_clean_rails_memory_store_caching do
RSpec.describe MergeRequests::ReloadDiffsService, :use_clean_rails_memory_store_caching,
feature_category: :code_review_workflow do
let(:current_user) { create(:user) }
let(:merge_request) { create(:merge_request) }
let(:subject) { described_class.new(merge_request, current_user) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::ReloadMergeHeadDiffService do
RSpec.describe MergeRequests::ReloadMergeHeadDiffService, feature_category: :code_review_workflow do
let(:merge_request) { create(:merge_request) }
subject { described_class.new(merge_request).execute }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::ReopenService do
RSpec.describe MergeRequests::ReopenService, feature_category: :code_review_workflow do
let(:user) { create(:user) }
let(:user2) { create(:user) }
let(:guest) { create(:user) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::RequestReviewService do
RSpec.describe MergeRequests::RequestReviewService, feature_category: :code_review_workflow do
let(:current_user) { create(:user) }
let(:user) { create(:user) }
let(:merge_request) { create(:merge_request, reviewers: [user]) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::ResolveTodosService do
RSpec.describe MergeRequests::ResolveTodosService, feature_category: :code_review_workflow do
let_it_be(:merge_request) { create(:merge_request) }
let_it_be(:user) { create(:user) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::ResolvedDiscussionNotificationService do
RSpec.describe MergeRequests::ResolvedDiscussionNotificationService, feature_category: :code_review_workflow do
let(:merge_request) { create(:merge_request) }
let(:user) { create(:user) }
let(:project) { merge_request.project }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::SquashService do
RSpec.describe MergeRequests::SquashService, feature_category: :source_code_management do
let(:service) { described_class.new(project: project, current_user: user, params: { merge_request: merge_request }) }
let(:user) { project.first_owner }
let(:project) { create(:project, :repository) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::UpdateAssigneesService do
RSpec.describe MergeRequests::UpdateAssigneesService, feature_category: :code_review_workflow do
include AfterNextHelpers
let_it_be(:group) { create(:group, :public) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe MergeRequests::UpdateReviewersService do
RSpec.describe MergeRequests::UpdateReviewersService, feature_category: :code_review_workflow do
include AfterNextHelpers
let_it_be(:group) { create(:group, :public) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe Metrics::Dashboard::Annotations::CreateService do
RSpec.describe Metrics::Dashboard::Annotations::CreateService, feature_category: :metrics do
let_it_be(:user) { create(:user) }
let(:description) { 'test annotation' }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe Metrics::Dashboard::Annotations::DeleteService do
RSpec.describe Metrics::Dashboard::Annotations::DeleteService, feature_category: :metrics do
let(:user) { create(:user) }
let(:service_instance) { described_class.new(user, annotation) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe Metrics::Dashboard::CloneDashboardService, :use_clean_rails_memory_store_caching do
RSpec.describe Metrics::Dashboard::CloneDashboardService, :use_clean_rails_memory_store_caching, feature_category: :metrics do
include MetricsDashboardHelpers
let_it_be(:user) { create(:user) }

View File

@ -2,7 +2,8 @@
require 'spec_helper'
RSpec.describe Metrics::Dashboard::ClusterDashboardService, :use_clean_rails_memory_store_caching do
RSpec.describe Metrics::Dashboard::ClusterDashboardService, :use_clean_rails_memory_store_caching,
feature_category: :metrics do
include MetricsDashboardHelpers
let_it_be(:user) { create(:user) }

View File

@ -2,7 +2,8 @@
require 'spec_helper'
RSpec.describe Metrics::Dashboard::ClusterMetricsEmbedService, :use_clean_rails_memory_store_caching do
RSpec.describe Metrics::Dashboard::ClusterMetricsEmbedService, :use_clean_rails_memory_store_caching,
feature_category: :metrics do
include MetricsDashboardHelpers
using RSpec::Parameterized::TableSyntax

View File

@ -2,7 +2,8 @@
require 'spec_helper'
RSpec.describe Metrics::Dashboard::CustomDashboardService, :use_clean_rails_memory_store_caching do
RSpec.describe Metrics::Dashboard::CustomDashboardService, :use_clean_rails_memory_store_caching,
feature_category: :metrics do
include MetricsDashboardHelpers
let_it_be(:user) { create(:user) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe Metrics::Dashboard::CustomMetricEmbedService do
RSpec.describe Metrics::Dashboard::CustomMetricEmbedService, feature_category: :metrics do
include MetricsDashboardHelpers
let_it_be(:project, reload: true) { build(:project) }

View File

@ -2,7 +2,8 @@
require 'spec_helper'
RSpec.describe Metrics::Dashboard::DefaultEmbedService, :use_clean_rails_memory_store_caching do
RSpec.describe Metrics::Dashboard::DefaultEmbedService, :use_clean_rails_memory_store_caching,
feature_category: :metrics do
include MetricsDashboardHelpers
let_it_be(:project) { build(:project) }

View File

@ -2,7 +2,8 @@
require 'spec_helper'
RSpec.describe Metrics::Dashboard::DynamicEmbedService, :use_clean_rails_memory_store_caching do
RSpec.describe Metrics::Dashboard::DynamicEmbedService, :use_clean_rails_memory_store_caching,
feature_category: :metrics do
include MetricsDashboardHelpers
let_it_be(:project) { build(:project) }

View File

@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe Metrics::Dashboard::GitlabAlertEmbedService do
RSpec.describe Metrics::Dashboard::GitlabAlertEmbedService, feature_category: :metrics do
include MetricsDashboardHelpers
let_it_be(:alert) { create(:prometheus_alert) }

Some files were not shown because too many files have changed in this diff Show More