diff options
89 files changed, 874 insertions, 226 deletions
diff --git a/.gitlab/ci/test-on-gdk/main.gitlab-ci.yml b/.gitlab/ci/test-on-gdk/main.gitlab-ci.yml index a64dd450c82..aa24eafda66 100644 --- a/.gitlab/ci/test-on-gdk/main.gitlab-ci.yml +++ b/.gitlab/ci/test-on-gdk/main.gitlab-ci.yml @@ -88,10 +88,27 @@ variables: expire_in: 7 days when: always +# Take the existing GDK docker image and reconfigure it with Postgres load +# balancing. Adding 5s lag to 1 of the replicas to validate robustness of +# the load balancer. +.gdk-with-load-balancer-setup: + before_script: + - !reference [".gdk-qa-base", "before_script"] + - | + docker exec gdk bash -c " + gdk config set postgresql.replica.enabled true &&\ + gdk config set postgresql.replica_2.enabled true &&\ + gdk config set load_balancing.enabled true &&\ + gdk reconfigure &&\ + gdk restart" + download-knapsack-report: extends: - .download-knapsack-report - .rules:download-knapsack + needs: + - pipeline: $PARENT_PIPELINE_ID + job: build-qa-image cache-gems: extends: @@ -104,25 +121,14 @@ cache-gems: script: - cd qa && bundle install -# Take the existing GDK docker image and reconfigure it with Postgres load -# balancing. Adding 5s lag to 1 of the replicas to validate robustness of -# the load balancer. -.gdk-with-load-balancer-setup: - before_script: - - !reference [".gdk-qa-base", "before_script"] - - | - docker exec gdk bash -c " - gdk config set postgresql.replica.enabled true &&\ - gdk config set postgresql.replica_2.enabled true &&\ - gdk config set load_balancing.enabled true &&\ - gdk reconfigure &&\ - gdk restart" - download-fast-quarantine-report: extends: - .download-fast-quarantine-report - .rules:download-fast-quarantine-report +# ========================================== +# Test stage +# ========================================== gdk-qa-smoke: extends: - .gdk-qa-base diff --git a/.haml-lint_todo.yml b/.haml-lint_todo.yml index a08ab491470..c9b6930bc2b 100644 --- a/.haml-lint_todo.yml +++ b/.haml-lint_todo.yml @@ -1,6 +1,6 @@ # This configuration was generated by # `haml-lint --auto-gen-config` -# on 2023-10-11 14:54:51 +0200 using Haml-Lint version 0.40.1. +# on 2023-10-26 11:21:24 +0200 using Haml-Lint version 0.40.1. # The point is for the user to remove these configuration records # one by one as the lints are removed from the code base. # Note that changes in the inspected code, or installation of new @@ -8,154 +8,55 @@ linters: - # Offense count: 201 + # Offense count: 49 DocumentationLinks: exclude: - - "app/views/admin/application_settings/_account_and_limit.html.haml" - - "app/views/admin/application_settings/_ci_cd.html.haml" - - "app/views/admin/application_settings/_diagramsnet.html.haml" - "app/views/admin/application_settings/_email.html.haml" - "app/views/admin/application_settings/_error_tracking.html.haml" - "app/views/admin/application_settings/_floc.html.haml" - "app/views/admin/application_settings/_gitlab_shell_operation_limits.html.haml" - - "app/views/admin/application_settings/_gitpod.html.haml" - - "app/views/admin/application_settings/_kroki.html.haml" - "app/views/admin/application_settings/_localization.html.haml" - - "app/views/admin/application_settings/_outbound.html.haml" - - "app/views/admin/application_settings/_plantuml.html.haml" - "app/views/admin/application_settings/_projects_api_limits.html.haml" - - "app/views/admin/application_settings/_repository_check.html.haml" - - "app/views/admin/application_settings/_repository_storage.html.haml" - "app/views/admin/application_settings/_runner_registrars_form.html.haml" - - "app/views/admin/application_settings/_signin.html.haml" - - "app/views/admin/application_settings/_sourcegraph.html.haml" - - "app/views/admin/application_settings/_spam.html.haml" - - "app/views/admin/application_settings/_terms.html.haml" - "app/views/admin/application_settings/general.html.haml" - - "app/views/admin/application_settings/metrics_and_profiling.html.haml" - "app/views/admin/application_settings/network.html.haml" - "app/views/admin/application_settings/preferences.html.haml" - "app/views/admin/application_settings/reporting.html.haml" - "app/views/admin/application_settings/repository.html.haml" - - "app/views/admin/dashboard/index.html.haml" - "app/views/admin/dev_ops_report/_score.html.haml" - - "app/views/clusters/clusters/_advanced_settings.html.haml" - - "app/views/clusters/clusters/_deprecation_alert.html.haml" - - "app/views/clusters/clusters/_multiple_clusters_message.html.haml" - - "app/views/clusters/clusters/_namespace.html.haml" - - "app/views/clusters/clusters/_provider_details_form.html.haml" - - "app/views/clusters/clusters/cloud_providers/_cloud_provider_selector.html.haml" - - "app/views/clusters/clusters/show.html.haml" - - "app/views/clusters/clusters/user/_form.html.haml" - "app/views/groups/_import_group_from_another_instance_panel.html.haml" - - "app/views/groups/_import_group_from_file_panel.html.haml" - - "app/views/groups/settings/ci_cd/_auto_devops_form.html.haml" - - "app/views/notify/github_gists_import_errors_email.html.haml" - - "app/views/notify/pages_domain_auto_ssl_failed_email.html.haml" - - "app/views/notify/pages_domain_auto_ssl_failed_email.text.haml" - - "app/views/notify/pages_domain_disabled_email.html.haml" - - "app/views/notify/pages_domain_enabled_email.html.haml" - - "app/views/notify/pages_domain_verification_failed_email.html.haml" - - "app/views/notify/pages_domain_verification_succeeded_email.html.haml" - "app/views/profiles/gpg_keys/index.html.haml" - "app/views/profiles/keys/_key.html.haml" - "app/views/profiles/keys/index.html.haml" - "app/views/profiles/personal_access_tokens/index.html.haml" - - "app/views/profiles/show.html.haml" - "app/views/profiles/two_factor_auths/show.html.haml" - "app/views/projects/blob/_pipeline_tour_success.html.haml" - - "app/views/projects/blob/viewers/_route_map.html.haml" - - "app/views/projects/blob/viewers/_route_map_loading.html.haml" - - "app/views/projects/branch_defaults/_branch_names_fields.html.haml" - - "app/views/projects/branch_defaults/_default_branch_fields.html.haml" - - "app/views/projects/cleanup/_show.html.haml" - "app/views/projects/commit/_signature_badge.html.haml" - - "app/views/projects/environments/index.html.haml" - - "app/views/projects/feature_flags/new.html.haml" - - "app/views/projects/feature_flags_user_lists/edit.html.haml" - - "app/views/projects/feature_flags_user_lists/new.html.haml" - - "app/views/projects/issues/_new_branch.html.haml" - - "app/views/projects/merge_requests/_page.html.haml" - - "app/views/projects/mirrors/_branch_filter.html.haml" - - "app/views/projects/mirrors/_mirror_repos.html.haml" - - "app/views/projects/mirrors/_mirror_repos_push.html.haml" - - "app/views/projects/pages_domains/_certificate.html.haml" - - "app/views/projects/pages_domains/_dns.html.haml" - - "app/views/projects/pages_domains/_helper_text.html.haml" - - "app/views/projects/runners/_group_runners.html.haml" - - "app/views/projects/settings/ci_cd/_autodevops_form.html.haml" - "app/views/projects/settings/merge_requests/_merge_request_merge_commit_template.html.haml" - - "app/views/projects/settings/merge_requests/_merge_request_merge_method_settings.html.haml" - "app/views/projects/settings/merge_requests/_merge_request_merge_suggestions_settings.html.haml" - "app/views/projects/settings/merge_requests/_merge_request_squash_commit_template.html.haml" - - "app/views/projects/settings/merge_requests/_merge_request_squash_options_settings.html.haml" - - "app/views/projects/settings/operations/_alert_management.html.haml" - "app/views/projects/usage_quotas/index.html.haml" - - "app/views/shared/_auto_devops_callout.html.haml" - "app/views/shared/_auto_devops_implicitly_enabled_banner.html.haml" - - "app/views/shared/_custom_attributes.html.haml" - "app/views/shared/_registration_features_discovery_message.html.haml" - "app/views/shared/_service_ping_consent.html.haml" - "app/views/shared/deploy_tokens/_form.html.haml" - - "app/views/shared/deploy_tokens/_new_deploy_token.html.haml" - "app/views/shared/deploy_tokens/_table.html.haml" - "app/views/shared/empty_states/_snippets.html.haml" - - "app/views/shared/integrations/gitlab_slack_application/_help.html.haml" - - "app/views/shared/integrations/gitlab_slack_application/_slack_integration_form.html.haml" - - "app/views/shared/integrations/mattermost_slash_commands/_help.html.haml" - - "app/views/shared/integrations/slack_slash_commands/_help.html.haml" - - "app/views/shared/issuable/form/_type_selector.html.haml" - - "app/views/shared/runners/_shared_runners_description.html.haml" - "app/views/shared/web_hooks/_form.html.haml" - "ee/app/views/admin/application_settings/_custom_templates_form.html.haml" - - "ee/app/views/admin/application_settings/_ee_network_settings.haml" - "ee/app/views/admin/application_settings/_elasticsearch_form.html.haml" - - "ee/app/views/admin/application_settings/_ldap_access_setting.html.haml" - "ee/app/views/admin/application_settings/_microsoft_application.haml" - - "ee/app/views/admin/application_settings/_saml_group_locks_setting.html.haml" - "ee/app/views/admin/application_settings/_templates.html.haml" - - "ee/app/views/admin/dashboard/_elastic_and_geo.html.haml" - - "ee/app/views/admin/geo/shared/_hashed_storage_alerts.html.haml" - "ee/app/views/admin/push_rules/_merge_request_approvals.html.haml" - "ee/app/views/admin/push_rules/_merge_request_approvals_fields.html.haml" - "ee/app/views/compliance_management/compliance_framework/_project_settings.html.haml" - - "ee/app/views/groups/_analytics_dashboards.html.haml" - - "ee/app/views/groups/_compliance_frameworks.html.haml" - "ee/app/views/groups/_custom_project_templates_setting.html.haml" - - "ee/app/views/groups/_insights.html.haml" - "ee/app/views/groups/_templates_setting.html.haml" - - "ee/app/views/groups/saml_providers/_info.html.haml" - - "ee/app/views/groups/security/policies/index.html.haml" - - "ee/app/views/groups/settings/_ip_restriction.html.haml" - - "ee/app/views/groups/settings/domain_verification/_certificate.html.haml" - - "ee/app/views/groups/settings/domain_verification/_dns.html.haml" - - "ee/app/views/groups/settings/domain_verification/_helper_text.html.haml" - - "ee/app/views/groups/settings/domain_verification/index.html.haml" - - "ee/app/views/notify/import_requirements_csv_email.html.haml" - "ee/app/views/profiles/preferences/_code_suggestions_settings_self_assignment.html.haml" - - "ee/app/views/projects/merge_requests/_code_owner_approval_rules.html.haml" - - "ee/app/views/projects/mirrors/_branch_filter.html.haml" - - "ee/app/views/projects/mirrors/_mirror_repos_form.html.haml" - - "ee/app/views/projects/protected_environments/_group_environments_list.html.haml" - - "ee/app/views/projects/security/policies/index.html.haml" - "ee/app/views/projects/settings/ci_cd/_auto_rollback.html.haml" - "ee/app/views/projects/settings/ci_cd/_pipeline_subscriptions.html.haml" - "ee/app/views/projects/settings/ci_cd/_protected_environments.html.haml" - - "ee/app/views/projects/settings/merge_requests/_merge_pipelines_settings.html.haml" - "ee/app/views/projects/settings/merge_requests/_merge_request_approvals_settings.html.haml" - - "ee/app/views/projects/settings/merge_requests/_merge_trains_settings.html.haml" - - "ee/app/views/projects/settings/merge_requests/_suggested_reviewers_settings.html.haml" - "ee/app/views/projects/settings/merge_requests/_target_branch_rules_settings.html.haml" - - "ee/app/views/search/results/_error.html.haml" - - "ee/app/views/shared/_ci_cd_only_link.html.haml" - - "ee/app/views/shared/_mirror_trigger_builds_setting.html.haml" - "ee/app/views/shared/_new_user_signups_cap_reached_alert.html.haml" - - "ee/app/views/shared/empty_states/_geo_replication.html.haml" - - "ee/app/views/shared/issuable/form/_merge_request_blocks.html.haml" - - "ee/app/views/shared/labels/_create_label_help_text.html.haml" - - "ee/app/views/shared/promotions/_promote_advanced_search.html.haml" - - "ee/app/views/shared/promotions/_promote_burndown_charts.html.haml" - - "ee/app/views/shared/promotions/_promote_group_webhooks.html.haml" - "ee/app/views/shared/promotions/_promote_mobile_devops.html.haml" - - "ee/app/views/shared/promotions/_promote_mr_features.html.haml" - - "ee/app/views/shared/promotions/_promote_repository_features.html.haml" diff --git a/app/assets/javascripts/sidebar/components/reviewers/reviewers.vue b/app/assets/javascripts/sidebar/components/reviewers/reviewers.vue index 49598c53bfd..1bcbf2167e9 100644 --- a/app/assets/javascripts/sidebar/components/reviewers/reviewers.vue +++ b/app/assets/javascripts/sidebar/components/reviewers/reviewers.vue @@ -62,7 +62,11 @@ export default { <collapsed-reviewer-list :users="sortedReviewers" :issuable-type="issuableType" /> <div class="value hide-collapsed"> - <span v-if="hasNoUsers" class="no-value" data-testid="no-value"> + <span + v-if="hasNoUsers" + class="no-value gl-display-flex gl-font-base gl-line-height-normal" + data-testid="no-value" + > {{ __('None') }} <template v-if="editable"> - diff --git a/app/views/admin/application_settings/_account_and_limit.html.haml b/app/views/admin/application_settings/_account_and_limit.html.haml index 4e55c99e445..52f7fa3bc12 100644 --- a/app/views/admin/application_settings/_account_and_limit.html.haml +++ b/app/views/admin/application_settings/_account_and_limit.html.haml @@ -24,7 +24,7 @@ %span.form-text.text-muted#session_expire_delay_help_block= _('Restart GitLab to apply changes.') .form-group = f.label :remember_me_enabled, _('Remember me'), class: 'label-light' - - remember_me_help_link = help_page_path('user/profile/index.md', anchor: 'stay-signed-in-for-two-weeks') + - remember_me_help_link = help_page_path('user/profile/index', anchor: 'stay-signed-in-for-two-weeks') - remember_me_help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: remember_me_help_link } = f.gitlab_ui_checkbox_component :remember_me_enabled, _('Allow users to extend their session'), help_text: _("Users can select 'Remember me' on sign-in to keep their session active beyond the session duration. %{link_start}Learn more.%{link_end}").html_safe % { link_start: remember_me_help_link_start, link_end: '</a>'.html_safe } diff --git a/app/views/admin/application_settings/_ci_cd.html.haml b/app/views/admin/application_settings/_ci_cd.html.haml index c08270a8522..83f9ccdfad6 100644 --- a/app/views/admin/application_settings/_ci_cd.html.haml +++ b/app/views/admin/application_settings/_ci_cd.html.haml @@ -4,7 +4,7 @@ %fieldset .form-group - - devops_help_link_url = help_page_path('topics/autodevops/index.md') + - devops_help_link_url = help_page_path('topics/autodevops/index') - devops_help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: devops_help_link_url } = f.gitlab_ui_checkbox_component :auto_devops_enabled, s_('CICD|Default to Auto DevOps pipeline for all projects'), help_text: s_('CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file. %{link_start}What is Auto DevOps?%{link_end}').html_safe % { link_start: devops_help_link_start, link_end: '</a>'.html_safe } .form-group @@ -12,7 +12,7 @@ = f.text_field :auto_devops_domain, class: 'form-control gl-form-input', placeholder: 'example.com' .form-text.text-muted = s_("AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects.") - = link_to _('Learn more.'), help_page_path('topics/autodevops/stages.md', anchor: 'auto-review-apps'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('topics/autodevops/stages', anchor: 'auto-review-apps'), target: '_blank', rel: 'noopener noreferrer' .form-group = f.gitlab_ui_checkbox_component :shared_runners_enabled, s_("AdminSettings|Enable shared runners for new projects"), help_text: s_("AdminSettings|All new projects can use the instance's shared runners by default.") diff --git a/app/views/admin/application_settings/_diagramsnet.html.haml b/app/views/admin/application_settings/_diagramsnet.html.haml index 0cf44938881..0d44b38b0e0 100644 --- a/app/views/admin/application_settings/_diagramsnet.html.haml +++ b/app/views/admin/application_settings/_diagramsnet.html.haml @@ -7,7 +7,7 @@ = expanded ? _('Collapse') : _('Expand') %p.gl-text-secondary = _('Render diagrams in your documents using diagrams.net.') - = link_to _('Learn more.'), help_page_path('administration/integration/diagrams_net.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('administration/integration/diagrams_net'), target: '_blank', rel: 'noopener noreferrer' .settings-content = gitlab_ui_form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-diagramsnet-settings'), html: { class: 'fieldset-form', id: 'diagramsnet-settings' } do |f| = form_errors(@application_setting) if expanded diff --git a/app/views/admin/application_settings/_gitpod.html.haml b/app/views/admin/application_settings/_gitpod.html.haml index 1f56487cea4..ce8c390baa5 100644 --- a/app/views/admin/application_settings/_gitpod.html.haml +++ b/app/views/admin/application_settings/_gitpod.html.haml @@ -8,7 +8,7 @@ = expanded ? _('Collapse') : _('Expand') .gl-text-secondary.gl-mb-5 #js-gitpod-settings-help-text{ data: {"message" => gitpod_enable_description, "message-url" => "https://gitpod.io/" } } - = link_to sprite_icon('question-o'), help_page_path('integration/gitpod.md'), target: '_blank', class: 'has-tooltip', title: _('More information') + = link_to sprite_icon('question-o'), help_page_path('integration/gitpod'), target: '_blank', class: 'has-tooltip', title: _('More information') .settings-content = gitlab_ui_form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-gitpod-settings'), html: { class: 'fieldset-form', id: 'gitpod-settings' } do |f| diff --git a/app/views/admin/application_settings/_kroki.html.haml b/app/views/admin/application_settings/_kroki.html.haml index 4dbca235a73..0f1316996fa 100644 --- a/app/views/admin/application_settings/_kroki.html.haml +++ b/app/views/admin/application_settings/_kroki.html.haml @@ -7,7 +7,7 @@ = expanded ? _('Collapse') : _('Expand') %p.gl-text-secondary = _('Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki.') - = link_to _('Learn more.'), help_page_path('administration/integration/kroki.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('administration/integration/kroki'), target: '_blank', rel: 'noopener noreferrer' .settings-content = gitlab_ui_form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-kroki-settings'), html: { class: 'fieldset-form', id: 'kroki-settings' } do |f| = form_errors(@application_setting) if expanded diff --git a/app/views/admin/application_settings/_outbound.html.haml b/app/views/admin/application_settings/_outbound.html.haml index f36fbd8d68c..a4ec3a31584 100644 --- a/app/views/admin/application_settings/_outbound.html.haml +++ b/app/views/admin/application_settings/_outbound.html.haml @@ -26,7 +26,7 @@ = f.text_area :outbound_local_requests_allowlist_raw, placeholder: "example.com, 192.168.1.1, xn--itlab-j1a.com", class: 'form-control gl-form-input', rows: 8 %span.form-text.text-muted = s_('OutboundRequests|Requests can be made to these IP addresses and domains even when local requests are not allowed. IP ranges such as %{code_start}1:0:0:0:0:0:0:0/124%{code_end} and %{code_start}127.0.0.0/28%{code_end} are supported. Domain wildcards are not supported. To separate entries, use commas, semicolons, or newlines. The allowlist can have a maximum of 1000 entries. Domains must be IDNA-encoded.').html_safe % { code_start: '<code>'.html_safe, code_end: '</code>'.html_safe } - = link_to _('Learn more.'), help_page_path('security/webhooks.md', anchor: 'allow-outbound-requests-to-certain-ip-addresses-and-domains'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('security/webhooks', anchor: 'allow-outbound-requests-to-certain-ip-addresses-and-domains'), target: '_blank', rel: 'noopener noreferrer' .form-group = f.gitlab_ui_checkbox_component :dns_rebinding_protection_enabled, diff --git a/app/views/admin/application_settings/_plantuml.html.haml b/app/views/admin/application_settings/_plantuml.html.haml index a8b758f7324..c673bf72397 100644 --- a/app/views/admin/application_settings/_plantuml.html.haml +++ b/app/views/admin/application_settings/_plantuml.html.haml @@ -7,7 +7,7 @@ = expanded ? _('Collapse') : _('Expand') %p.gl-text-secondary = _('Render diagrams in your documents using PlantUML.') - = link_to _('Learn more.'), help_page_path('administration/integration/plantuml.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('administration/integration/plantuml'), target: '_blank', rel: 'noopener noreferrer' .settings-content = gitlab_ui_form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-plantuml-settings'), html: { class: 'fieldset-form', id: 'plantuml-settings' } do |f| = form_errors(@application_setting) if expanded diff --git a/app/views/admin/application_settings/_repository_check.html.haml b/app/views/admin/application_settings/_repository_check.html.haml index 5751ae9059a..cb1a0a40566 100644 --- a/app/views/admin/application_settings/_repository_check.html.haml +++ b/app/views/admin/application_settings/_repository_check.html.haml @@ -21,7 +21,7 @@ %h4= _("Housekeeping") .form-group - help_text = _("Run housekeeping tasks to automatically optimize Git repositories. Disabling this option will cause performance to degenerate over time.") - - help_link = link_to _('Learn more.'), help_page_path('administration/housekeeping.md', anchor: 'heuristical-housekeeping'), target: '_blank', rel: 'noopener noreferrer' + - help_link = link_to _('Learn more.'), help_page_path('administration/housekeeping', anchor: 'heuristical-housekeeping'), target: '_blank', rel: 'noopener noreferrer' = f.gitlab_ui_checkbox_component :housekeeping_enabled, _("Enable automatic repository housekeeping"), help_text: '%{help_text} %{help_link}'.html_safe % { help_text: help_text, help_link: help_link } diff --git a/app/views/admin/application_settings/_repository_storage.html.haml b/app/views/admin/application_settings/_repository_storage.html.haml index 066d77c792b..412098cfae4 100644 --- a/app/views/admin/application_settings/_repository_storage.html.haml +++ b/app/views/admin/application_settings/_repository_storage.html.haml @@ -5,7 +5,7 @@ .sub-section %h4= _('Hashed repository storage paths') .form-group - - repository_storage_help_link_url = help_page_path('administration/repository_storage_types.md') + - repository_storage_help_link_url = help_page_path('administration/repository_storage_types') - repository_storage_help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: repository_storage_help_link_url } = f.gitlab_ui_checkbox_component :hashed_storage_enabled, _('Use hashed storage'), @@ -17,10 +17,10 @@ .form-group .form-text %p.text-secondary - - weights_link_url = help_page_path('administration/repository_storage_paths.md', anchor: 'configure-where-new-repositories-are-stored') + - weights_link_url = help_page_path('administration/repository_storage_paths', anchor: 'configure-where-new-repositories-are-stored') - weights_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: weights_link_url } = html_escape(s_('Enter %{weights_link_start}weights%{weights_link_end} for storages for new repositories. Configured storages appear below.')) % { weights_link_start: weights_link_start, weights_link_end: '</a>'.html_safe } - = link_to _('Learn more.'), help_page_path('administration/repository_storage_paths.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('administration/repository_storage_paths'), target: '_blank', rel: 'noopener noreferrer' .form-check = f.fields_for :repository_storages_weighted, storage_weights do |storage_form| - Gitlab.config.repositories.storages.each_key do |storage| diff --git a/app/views/admin/application_settings/_signin.html.haml b/app/views/admin/application_settings/_signin.html.haml index 5518122b5cf..0f20864fc68 100644 --- a/app/views/admin/application_settings/_signin.html.haml +++ b/app/views/admin/application_settings/_signin.html.haml @@ -19,7 +19,7 @@ .form-group = f.label :two_factor_authentication, _('Two-factor authentication'), class: 'label-bold' - help_text = _('Enforce two-factor authentication for all user sign-ins.') - - help_link = link_to _('Learn more.'), help_page_path('security/two_factor_authentication.md'), target: '_blank', rel: 'noopener noreferrer' + - help_link = link_to _('Learn more.'), help_page_path('security/two_factor_authentication'), target: '_blank', rel: 'noopener noreferrer' = f.gitlab_ui_checkbox_component :require_two_factor_authentication, _('Enforce two-factor authentication'), help_text: '%{help_text} %{help_link}'.html_safe % { help_text: help_text, help_link: help_link } @@ -39,7 +39,7 @@ .form-group = f.label :unknown_sign_in, _('Email notification for unknown sign-ins'), class: 'label-bold' - help_text = _('Notify users by email when sign-in location is not recognized.') - - help_link = link_to _('Learn more.'), help_page_path('user/profile/notifications.md', anchor: 'notifications-for-unknown-sign-ins'), target: '_blank', rel: 'noopener noreferrer' + - help_link = link_to _('Learn more.'), help_page_path('user/profile/notifications', anchor: 'notifications-for-unknown-sign-ins'), target: '_blank', rel: 'noopener noreferrer' = f.gitlab_ui_checkbox_component :notify_on_unknown_sign_in, _('Enable email notification'), help_text: '%{help_text} %{help_link}'.html_safe % { help_text: help_text, help_link: help_link } diff --git a/app/views/admin/application_settings/_sourcegraph.html.haml b/app/views/admin/application_settings/_sourcegraph.html.haml index 61ec841bb83..e61947e3cff 100644 --- a/app/views/admin/application_settings/_sourcegraph.html.haml +++ b/app/views/admin/application_settings/_sourcegraph.html.haml @@ -12,7 +12,7 @@ - link_end = "#{sprite_icon('external-link', size: 12, css_class: 'ml-1 vertical-align-center')}</a>".html_safe = s_('SourcegraphAdmin|Enable code intelligence powered by %{link_start}Sourcegraph%{link_end} on your GitLab instance\'s code views and merge requests.').html_safe % { link_start: link_start, link_end: link_end } %span - = link_to s_('SourcegraphAdmin|Learn more.'), help_page_path('integration/sourcegraph.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to s_('SourcegraphAdmin|Learn more.'), help_page_path('integration/sourcegraph'), target: '_blank', rel: 'noopener noreferrer' .settings-content diff --git a/app/views/admin/application_settings/_spam.html.haml b/app/views/admin/application_settings/_spam.html.haml index abc7abe92ad..4e21717a4e6 100644 --- a/app/views/admin/application_settings/_spam.html.haml +++ b/app/views/admin/application_settings/_spam.html.haml @@ -8,7 +8,7 @@ = _('reCAPTCHA helps prevent credential stuffing.') = link_to _('Only reCAPTCHA v2 is supported:'), 'https://developers.google.com/recaptcha/docs/versions', target: '_blank', rel: 'noopener noreferrer' .form-group - - spam_help_link_url = help_page_path('integration/recaptcha.md') + - spam_help_link_url = help_page_path('integration/recaptcha') - spam_help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: spam_help_link_url } = f.gitlab_ui_checkbox_component :recaptcha_enabled, _("Enable reCAPTCHA"), help_text: _('Helps prevent bots from creating accounts. %{link_start}How do I configure it?%{link_end}').html_safe % { link_start: spam_help_link_start, link_end: '</a>'.html_safe } @@ -40,7 +40,7 @@ = _('Akismet') %p = _('Akismet helps prevent the creation of spam issues in public projects.') - = link_to _('How do I configure Akismet?'), help_page_path('integration/akismet.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('How do I configure Akismet?'), help_page_path('integration/akismet'), target: '_blank', rel: 'noopener noreferrer' .form-group = f.gitlab_ui_checkbox_component :akismet_enabled, _('Enable Akismet'), diff --git a/app/views/admin/application_settings/_terms.html.haml b/app/views/admin/application_settings/_terms.html.haml index 8da441d5245..2afcb26b43b 100644 --- a/app/views/admin/application_settings/_terms.html.haml +++ b/app/views/admin/application_settings/_terms.html.haml @@ -10,5 +10,5 @@ = f.text_area :terms, class: 'form-control gl-form-input', rows: 8 .form-text.text-muted = _("Markdown supported.") - = link_to _('What is Markdown?'), help_page_path('user/markdown.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('What is Markdown?'), help_page_path('user/markdown'), target: '_blank', rel: 'noopener noreferrer' = f.submit _("Save changes"), pajamas_button: true diff --git a/app/views/admin/application_settings/metrics_and_profiling.html.haml b/app/views/admin/application_settings/metrics_and_profiling.html.haml index 12b9df6719d..23f536bd6d4 100644 --- a/app/views/admin/application_settings/metrics_and_profiling.html.haml +++ b/app/views/admin/application_settings/metrics_and_profiling.html.haml @@ -24,7 +24,7 @@ = expanded_by_default? ? _('Collapse') : _('Expand') %p.gl-text-secondary = _('Link to your Grafana instance.') - = link_to _('Learn more.'), help_page_path('administration/monitoring/performance/grafana_configuration.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('administration/monitoring/performance/grafana_configuration'), target: '_blank', rel: 'noopener noreferrer' .settings-content = render 'grafana' @@ -37,7 +37,7 @@ = expanded_by_default? ? _('Collapse') : _('Expand') %p.gl-text-secondary = _('Enable access to the performance bar for non-administrators in a given group.') - = link_to _('Learn more.'), help_page_path('administration/monitoring/performance/performance_bar.md', anchor: 'enable-the-performance-bar-for-non-administrators'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('administration/monitoring/performance/performance_bar', anchor: 'enable-the-performance-bar-for-non-administrators'), target: '_blank', rel: 'noopener noreferrer' .settings-content = render 'performance_bar' diff --git a/app/views/admin/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml index 4973c0f985c..bf00fbfd81d 100644 --- a/app/views/admin/dashboard/index.html.haml +++ b/app/views/admin/dashboard/index.html.haml @@ -89,7 +89,7 @@ = feature_entry(_('LDAP'), enabled: Gitlab.config.ldap.enabled, - doc_href: help_page_path('administration/auth/ldap/index.md')) + doc_href: help_page_path('administration/auth/ldap/index')) = feature_entry(_('Gravatar'), href: general_admin_application_settings_path(anchor: 'js-account-settings'), diff --git a/app/views/clusters/clusters/_advanced_settings.html.haml b/app/views/clusters/clusters/_advanced_settings.html.haml index a818f8a5c26..57111dd6232 100644 --- a/app/views/clusters/clusters/_advanced_settings.html.haml +++ b/app/views/clusters/clusters/_advanced_settings.html.haml @@ -30,7 +30,7 @@ selected: @cluster.management_project_id } } %p.text-muted.gl-mt-n5 = html_escape(s_('ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe } - = link_to _('More information'), help_page_path('user/clusters/management_project.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('More information'), help_page_path('user/clusters/management_project'), target: '_blank', rel: 'noopener noreferrer' = field.submit _('Save changes'), pajamas_button: true .sub-section.form-group diff --git a/app/views/clusters/clusters/_deprecation_alert.html.haml b/app/views/clusters/clusters/_deprecation_alert.html.haml index 4f35ba78cc6..cfc3418b1b5 100644 --- a/app/views/clusters/clusters/_deprecation_alert.html.haml +++ b/app/views/clusters/clusters/_deprecation_alert.html.haml @@ -2,6 +2,6 @@ - c.with_body do - link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe - issue_link_start = link_start % { url: 'https://gitlab.com/gitlab-org/configure/general/-/issues/199' } - - docs_link_start = link_start % { url: help_page_path('user/clusters/agent/index.md') } + - docs_link_start = link_start % { url: help_page_path('user/clusters/agent/index') } - link_end = '</a>'.html_safe = s_('ClusterIntegration|This process is %{issue_link_start}deprecated%{issue_link_end}. Use the %{docs_link_start}the GitLab agent for Kubernetes%{docs_link_end} instead.').html_safe % { docs_link_start: docs_link_start, docs_link_end: link_end, issue_link_start: issue_link_start, issue_link_end: link_end } diff --git a/app/views/clusters/clusters/_multiple_clusters_message.html.haml b/app/views/clusters/clusters/_multiple_clusters_message.html.haml index 04c1f9b6e7a..2878bb1371c 100644 --- a/app/views/clusters/clusters/_multiple_clusters_message.html.haml +++ b/app/views/clusters/clusters/_multiple_clusters_message.html.haml @@ -1,4 +1,4 @@ -- autodevops_help_url = help_page_path('topics/autodevops/multiple_clusters_auto_devops.md') +- autodevops_help_url = help_page_path('topics/autodevops/multiple_clusters_auto_devops') - help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe - help_link_end = '</a>'.html_safe diff --git a/app/views/clusters/clusters/_namespace.html.haml b/app/views/clusters/clusters/_namespace.html.haml index 34576b6e5af..9c20a409b18 100644 --- a/app/views/clusters/clusters/_namespace.html.haml +++ b/app/views/clusters/clusters/_namespace.html.haml @@ -1,6 +1,6 @@ - managed_namespace_help_text = s_('ClusterIntegration|Set a prefix for your namespaces. If not set, defaults to your project path. If modified, existing environments will use their current namespaces until the cluster cache is cleared.') - non_managed_namespace_help_text = s_('ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals.') -- managed_namespace_help_link = link_to _('More information'), help_page_path('user/project/clusters/gitlab_managed_clusters.md'), target: '_blank', rel: 'noopener noreferrer' +- managed_namespace_help_link = link_to _('More information'), help_page_path('user/project/clusters/gitlab_managed_clusters'), target: '_blank', rel: 'noopener noreferrer' .js-namespace-prefixed .form-group diff --git a/app/views/clusters/clusters/_provider_details_form.html.haml b/app/views/clusters/clusters/_provider_details_form.html.haml index dfb97263c54..f675ea5865e 100644 --- a/app/views/clusters/clusters/_provider_details_form.html.haml +++ b/app/views/clusters/clusters/_provider_details_form.html.haml @@ -51,7 +51,7 @@ = field.label :managed, s_('ClusterIntegration|GitLab-managed cluster'), class: 'form-check-label label-bold' .form-text.text-muted = s_('ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster.') - = link_to _('More information'), help_page_path('user/project/clusters/gitlab_managed_clusters.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('More information'), help_page_path('user/project/clusters/gitlab_managed_clusters'), target: '_blank', rel: 'noopener noreferrer' .form-group .form-check @@ -59,7 +59,7 @@ = field.label :namespace_per_environment, s_('ClusterIntegration|Namespace per environment'), class: 'form-check-label label-bold' .form-text.text-muted = s_('ClusterIntegration|Deploy each environment to its own namespace. Otherwise, environments within a project share a project-wide namespace. Note that anyone who can trigger a deployment of a namespace can read its secrets. If modified, existing environments will use their current namespaces until the cluster cache is cleared.') - = link_to _('More information'), help_page_path('user/project/clusters/deploy_to_cluster.md', anchor: 'custom-namespace'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('More information'), help_page_path('user/project/clusters/deploy_to_cluster', anchor: 'custom-namespace'), target: '_blank', rel: 'noopener noreferrer' - if cluster.allow_user_defined_namespace? = render('clusters/clusters/namespace', platform_field: platform_field, field: field) diff --git a/app/views/clusters/clusters/cloud_providers/_cloud_provider_selector.html.haml b/app/views/clusters/clusters/cloud_providers/_cloud_provider_selector.html.haml index 49dab193da8..8ac232ac7ca 100644 --- a/app/views/clusters/clusters/cloud_providers/_cloud_provider_selector.html.haml +++ b/app/views/clusters/clusters/cloud_providers/_cloud_provider_selector.html.haml @@ -2,9 +2,9 @@ - eks_label = s_('ClusterIntegration|Amazon EKS') - civo_label = s_('ClusterIntegration|Civo Kubernetes') - create_cluster_label = s_('ClusterIntegration|Where do you want to create a cluster?') -- eks_help_path = help_page_path('user/infrastructure/clusters/connect/new_eks_cluster.md') -- gke_help_path = help_page_path('user/infrastructure/clusters/connect/new_gke_cluster.md') -- civo_help_path = help_page_path('user/infrastructure/clusters/connect/new_civo_cluster.md') +- eks_help_path = help_page_path('user/infrastructure/clusters/connect/new_eks_cluster') +- gke_help_path = help_page_path('user/infrastructure/clusters/connect/new_gke_cluster') +- civo_help_path = help_page_path('user/infrastructure/clusters/connect/new_civo_cluster') .gl-py-5.gl-md-pl-5.gl-md-pr-5 %h4.gl-mb-5 diff --git a/app/views/clusters/clusters/show.html.haml b/app/views/clusters/clusters/show.html.haml index 1287f4e689f..22dee5876c2 100644 --- a/app/views/clusters/clusters/show.html.haml +++ b/app/views/clusters/clusters/show.html.haml @@ -12,10 +12,10 @@ cluster_status: @cluster.status_name, cluster_status_reason: @cluster.status_reason, provider_type: @cluster.provider_type, - help_path: help_page_path('user/infrastructure/clusters/index.md'), - environments_help_path: help_page_path('ci/environments/index.md', anchor: 'create-a-static-environment'), - clusters_help_path: help_page_path('user/project/clusters/deploy_to_cluster.md'), - deploy_boards_help_path: help_page_path('user/project/deploy_boards.md', anchor: 'enabling-deploy-boards'), + help_path: help_page_path('user/infrastructure/clusters/index'), + environments_help_path: help_page_path('ci/environments/index', anchor: 'create-a-static-environment'), + clusters_help_path: help_page_path('user/project/clusters/deploy_to_cluster'), + deploy_boards_help_path: help_page_path('user/project/deploy_boards', anchor: 'enabling-deploy-boards'), cluster_id: @cluster.id } } .js-cluster-application-notice diff --git a/app/views/clusters/clusters/user/_form.html.haml b/app/views/clusters/clusters/user/_form.html.haml index 4ecef4b76ce..6a5acf4f507 100644 --- a/app/views/clusters/clusters/user/_form.html.haml +++ b/app/views/clusters/clusters/user/_form.html.haml @@ -58,7 +58,7 @@ = field.label :managed, s_('ClusterIntegration|GitLab-managed cluster'), class: 'form-check-label label-bold' .form-text.text-muted = s_('ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster.') - = link_to _('Learn more.'), help_page_path('user/project/clusters/gitlab_managed_clusters.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('user/project/clusters/gitlab_managed_clusters'), target: '_blank', rel: 'noopener noreferrer' .form-group .form-check @@ -66,7 +66,7 @@ = field.label :namespace_per_environment, s_('ClusterIntegration|Namespace per environment'), class: 'form-check-label label-bold' .form-text.text-muted = s_('ClusterIntegration|Deploy each environment to its own namespace. Otherwise, environments within a project share a project-wide namespace. Note that anyone who can trigger a deployment of a namespace can read its secrets. If modified, existing environments will use their current namespaces until the cluster cache is cleared.') - = link_to _('Learn more.'), help_page_path('user/project/clusters/deploy_to_cluster.md', anchor: 'custom-namespace'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('user/project/clusters/deploy_to_cluster', anchor: 'custom-namespace'), target: '_blank', rel: 'noopener noreferrer' = field.fields_for :platform_kubernetes, @user_cluster.platform_kubernetes do |platform_kubernetes_field| - if @user_cluster.allow_user_defined_namespace? diff --git a/app/views/groups/_import_group_from_file_panel.html.haml b/app/views/groups/_import_group_from_file_panel.html.haml index e3d54e52aab..c39f5cf87c7 100644 --- a/app/views/groups/_import_group_from_file_panel.html.haml +++ b/app/views/groups/_import_group_from_file_panel.html.haml @@ -10,7 +10,7 @@ alert_options: { class: 'gl-mb-5' }, dismissible: false) do |c| - c.with_body do - - docs_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/group/import/index.md', anchor: 'migrate-groups-by-direct-transfer-recommended') } + - docs_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/group/import/index', anchor: 'migrate-groups-by-direct-transfer-recommended') } - link_end = '</a>'.html_safe = s_('GroupsNew|This feature is deprecated and replaced by group migration by direct transfer. %{docs_link_start}Learn more%{docs_link_end}.').html_safe % { docs_link_start: docs_link_start, docs_link_end: link_end } = render 'shared/groups/group_name_and_path_fields', f: f diff --git a/app/views/groups/settings/ci_cd/_auto_devops_form.html.haml b/app/views/groups/settings/ci_cd/_auto_devops_form.html.haml index b0a5d0bd4fa..705a9704fc2 100644 --- a/app/views/groups/settings/ci_cd/_auto_devops_form.html.haml +++ b/app/views/groups/settings/ci_cd/_auto_devops_form.html.haml @@ -4,7 +4,7 @@ .form-group = render Pajamas::CardComponent.new(card_options: { class: 'gl-mb-3' }) do |c| - c.with_body do - - learn_more_link = link_to _('Learn more.'), help_page_path('topics/autodevops/index.md'), target: '_blank', rel: 'noopener noreferrer' + - learn_more_link = link_to _('Learn more.'), help_page_path('topics/autodevops/index'), target: '_blank', rel: 'noopener noreferrer' - help_text = s_('GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found.') - badge = gl_badge_tag badge_for_auto_devops_scope(group), variant: :info - label = s_('GroupSettings|Default to Auto DevOps pipeline for all projects within this group') diff --git a/app/views/notify/github_gists_import_errors_email.html.haml b/app/views/notify/github_gists_import_errors_email.html.haml index 07b4cfca77e..903f4bf1466 100644 --- a/app/views/notify/github_gists_import_errors_email.html.haml +++ b/app/views/notify/github_gists_import_errors_email.html.haml @@ -11,7 +11,7 @@ %li = s_("GithubImporter|Gist with id %{gist_id} failed due to error: %{error}.") % { gist_id: gist_id, error: error } - if error == Gitlab::GithubGistsImport::Importer::GistImporter::FILE_COUNT_LIMIT_MESSAGE - - import_snippets_url = help_page_url('api/import.md', anchor: 'import-github-gists-into-gitlab-snippets') + - import_snippets_url = help_page_url('api/import', anchor: 'import-github-gists-into-gitlab-snippets') - import_snippets_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: import_snippets_url } = html_escape(s_("GithubImporter|Please follow %{import_snippets_link_start}Import GitHub gists into GitLab snippets%{import_snippets_link_end} for more details.")) % { import_snippets_link_start: import_snippets_link_start, import_snippets_link_end: '</a>'.html_safe } diff --git a/app/views/notify/pages_domain_auto_ssl_failed_email.html.haml b/app/views/notify/pages_domain_auto_ssl_failed_email.html.haml index c0b334fba94..d053fdff624 100644 --- a/app/views/notify/pages_domain_auto_ssl_failed_email.html.haml +++ b/app/views/notify/pages_domain_auto_ssl_failed_email.html.haml @@ -5,7 +5,7 @@ %p #{_('Domain')}: #{link_to @domain.domain, project_pages_domain_url(@project, @domain)} %p - - docs_url = help_page_url('user/project/pages/custom_domains_ssl_tls_certification/lets_encrypt_integration.md', anchor: 'troubleshooting') + - docs_url = help_page_url('user/project/pages/custom_domains_ssl_tls_certification/lets_encrypt_integration', anchor: 'troubleshooting') - link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: docs_url } - link_end = '</a>'.html_safe = _("Please follow the %{link_start}Let's Encrypt troubleshooting instructions%{link_end} to re-obtain your Let's Encrypt certificate.").html_safe % { link_start: link_start, link_end: link_end } diff --git a/app/views/notify/pages_domain_auto_ssl_failed_email.text.haml b/app/views/notify/pages_domain_auto_ssl_failed_email.text.haml index feb88d2df39..ecc466d3e74 100644 --- a/app/views/notify/pages_domain_auto_ssl_failed_email.text.haml +++ b/app/views/notify/pages_domain_auto_ssl_failed_email.text.haml @@ -3,5 +3,5 @@ #{_('Project')}: #{project_url(@project)} #{_('Domain')}: #{project_pages_domain_url(@project, @domain)} -- docs_url = help_page_url('user/project/pages/custom_domains_ssl_tls_certification/lets_encrypt_integration.md', anchor: 'troubleshooting') +- docs_url = help_page_url('user/project/pages/custom_domains_ssl_tls_certification/lets_encrypt_integration', anchor: 'troubleshooting') = _("Please follow the Let's Encrypt troubleshooting instructions to re-obtain your Let's Encrypt certificate: %{docs_url}.").html_safe % { docs_url: docs_url } diff --git a/app/views/notify/pages_domain_disabled_email.html.haml b/app/views/notify/pages_domain_disabled_email.html.haml index 44f85df97b9..6b4e40780aa 100644 --- a/app/views/notify/pages_domain_disabled_email.html.haml +++ b/app/views/notify/pages_domain_disabled_email.html.haml @@ -8,6 +8,6 @@ Domain: #{link_to @domain.domain, project_pages_domain_url(@project, @domain)} %p If this domain has been disabled in error, please follow - = link_to 'these instructions', help_page_url('user/project/pages/custom_domains_ssl_tls_certification/index.md', anchor: '4-verify-the-domains-ownership') + = link_to 'these instructions', help_page_url('user/project/pages/custom_domains_ssl_tls_certification/index', anchor: '4-verify-the-domains-ownership') to verify and re-enable your domain. = render 'removal_notification' diff --git a/app/views/notify/pages_domain_disabled_email.text.haml b/app/views/notify/pages_domain_disabled_email.text.haml index 5a0fcab72d4..12295f9aa18 100644 --- a/app/views/notify/pages_domain_disabled_email.text.haml +++ b/app/views/notify/pages_domain_disabled_email.text.haml @@ -7,7 +7,7 @@ Domain: #{@domain.domain} (#{project_pages_domain_url(@project, @domain)}) If this domain has been disabled in error, please follow these instructions to verify and re-enable your domain: -= help_page_url('user/project/pages/custom_domains_ssl_tls_certification/index.md', anchor: 'steps') += help_page_url('user/project/pages/custom_domains_ssl_tls_certification/index', anchor: 'steps') If you no longer wish to use this domain with GitLab Pages, please remove it from your GitLab project and delete any related DNS records. diff --git a/app/views/notify/pages_domain_enabled_email.html.haml b/app/views/notify/pages_domain_enabled_email.html.haml index 103b17a87df..64155e888b7 100644 --- a/app/views/notify/pages_domain_enabled_email.html.haml +++ b/app/views/notify/pages_domain_enabled_email.html.haml @@ -7,5 +7,5 @@ Domain: #{link_to @domain.domain, project_pages_domain_url(@project, @domain)} %p Please visit - = link_to 'these instructions', help_page_url('user/project/pages/custom_domains_ssl_tls_certification/index.md', anchor: 'steps') + = link_to 'these instructions', help_page_url('user/project/pages/custom_domains_ssl_tls_certification/index', anchor: 'steps') for more information about custom domain verification. diff --git a/app/views/notify/pages_domain_enabled_email.text.haml b/app/views/notify/pages_domain_enabled_email.text.haml index bf8d2ac767a..df56dacf52c 100644 --- a/app/views/notify/pages_domain_enabled_email.text.haml +++ b/app/views/notify/pages_domain_enabled_email.text.haml @@ -5,5 +5,5 @@ Project: #{@project.human_name} (#{project_url(@project)}) Domain: #{@domain.domain} (#{project_pages_domain_url(@project, @domain)}) Please visit -= help_page_url('user/project/pages/custom_domains_ssl_tls_certification/index.md', anchor: 'steps') += help_page_url('user/project/pages/custom_domains_ssl_tls_certification/index', anchor: 'steps') for more information about custom domain verification. diff --git a/app/views/notify/pages_domain_verification_failed_email.html.haml b/app/views/notify/pages_domain_verification_failed_email.html.haml index a819b66f18e..4d92d8d1088 100644 --- a/app/views/notify/pages_domain_verification_failed_email.html.haml +++ b/app/views/notify/pages_domain_verification_failed_email.html.haml @@ -10,6 +10,6 @@ Until then, you can view your content at #{link_to @domain.url, @domain.url} %p Please visit - = link_to 'these instructions', help_page_url('user/project/pages/custom_domains_ssl_tls_certification/index.md', anchor: 'steps') + = link_to 'these instructions', help_page_url('user/project/pages/custom_domains_ssl_tls_certification/index', anchor: 'steps') for more information about custom domain verification. = render 'removal_notification' diff --git a/app/views/notify/pages_domain_verification_failed_email.text.haml b/app/views/notify/pages_domain_verification_failed_email.text.haml index 85aa2d7a503..045fd5483b2 100644 --- a/app/views/notify/pages_domain_verification_failed_email.text.haml +++ b/app/views/notify/pages_domain_verification_failed_email.text.haml @@ -7,7 +7,7 @@ Unless you take action, it will be disabled on *#{@domain.enabled_until.strftime Until then, you can view your content at #{@domain.url} Please visit -= help_page_url('user/project/pages/custom_domains_ssl_tls_certification/index.md', anchor: 'steps') += help_page_url('user/project/pages/custom_domains_ssl_tls_certification/index', anchor: 'steps') for more information about custom domain verification. If you no longer wish to use this domain with GitLab Pages, please remove it diff --git a/app/views/notify/pages_domain_verification_succeeded_email.html.haml b/app/views/notify/pages_domain_verification_succeeded_email.html.haml index 808b12948f9..aaf0dae597f 100644 --- a/app/views/notify/pages_domain_verification_succeeded_email.html.haml +++ b/app/views/notify/pages_domain_verification_succeeded_email.html.haml @@ -9,5 +9,5 @@ content at #{link_to @domain.url, @domain.url} %p Please visit - = link_to 'these instructions', help_page_url('user/project/pages/custom_domains_ssl_tls_certification/index.md', anchor: 'steps') + = link_to 'these instructions', help_page_url('user/project/pages/custom_domains_ssl_tls_certification/index', anchor: 'steps') for more information about custom domain verification. diff --git a/app/views/notify/pages_domain_verification_succeeded_email.text.haml b/app/views/notify/pages_domain_verification_succeeded_email.text.haml index 8d0694ef613..15cf9823a08 100644 --- a/app/views/notify/pages_domain_verification_succeeded_email.text.haml +++ b/app/views/notify/pages_domain_verification_succeeded_email.text.haml @@ -6,5 +6,5 @@ Domain: #{@domain.domain} (#{project_pages_domain_url(@project, @domain)}) No action is required on your part. You can view your content at #{@domain.url} Please visit -= help_page_url('user/project/pages/custom_domains_ssl_tls_certification/index.md', anchor: 'steps') += help_page_url('user/project/pages/custom_domains_ssl_tls_certification/index', anchor: 'steps') for more information about custom domain verification. diff --git a/app/views/profiles/show.html.haml b/app/views/profiles/show.html.haml index 002953b1658..405364b6792 100644 --- a/app/views/profiles/show.html.haml +++ b/app/views/profiles/show.html.haml @@ -156,7 +156,7 @@ %legend.col-form-label = _('Private profile') - private_profile_label = s_("Profiles|Don't display activity-related personal information on your profile.") - - private_profile_help_link = link_to sprite_icon('question-o'), help_page_path('user/profile/index.md', anchor: 'make-your-user-profile-page-private') + - private_profile_help_link = link_to sprite_icon('question-o'), help_page_path('user/profile/index', anchor: 'make-your-user-profile-page-private') = f.gitlab_ui_checkbox_component :private_profile, '%{private_profile_label} %{private_profile_help_link}'.html_safe % { private_profile_label: private_profile_label, private_profile_help_link: private_profile_help_link.html_safe } %fieldset.form-group.gl-form-group %legend.col-form-label diff --git a/app/views/projects/blob/viewers/_route_map.html.haml b/app/views/projects/blob/viewers/_route_map.html.haml index 30182c100d5..64122b4dcd4 100644 --- a/app/views/projects/blob/viewers/_route_map.html.haml +++ b/app/views/projects/blob/viewers/_route_map.html.haml @@ -6,4 +6,4 @@ This Route Map is invalid: = viewer.validation_message -= link_to 'Learn more', help_page_path('ci/environments/index.md', anchor: 'go-from-source-files-to-public-pages') += link_to 'Learn more', help_page_path('ci/environments/index', anchor: 'go-from-source-files-to-public-pages') diff --git a/app/views/projects/blob/viewers/_route_map_loading.html.haml b/app/views/projects/blob/viewers/_route_map_loading.html.haml index d9e965246a8..0e5816a56af 100644 --- a/app/views/projects/blob/viewers/_route_map_loading.html.haml +++ b/app/views/projects/blob/viewers/_route_map_loading.html.haml @@ -1,4 +1,4 @@ = gl_loading_icon(inline: true, css_class: "gl-mr-1") Validating Route Map… -= link_to 'Learn more', help_page_path('ci/environments/index.md', anchor: 'go-from-source-files-to-public-pages') += link_to 'Learn more', help_page_path('ci/environments/index', anchor: 'go-from-source-files-to-public-pages') diff --git a/app/views/projects/branch_defaults/_branch_names_fields.html.haml b/app/views/projects/branch_defaults/_branch_names_fields.html.haml index 3e77cb51a85..982280120fa 100644 --- a/app/views/projects/branch_defaults/_branch_names_fields.html.haml +++ b/app/views/projects/branch_defaults/_branch_names_fields.html.haml @@ -10,6 +10,6 @@ %p.form-text.text-muted = s_('ProjectSettings|Leave empty to use default template.') = sprintf(s_('ProjectSettings|Maximum %{maxLength} characters.'), { maxLength: Issue::MAX_BRANCH_TEMPLATE }) - - branch_name_help_link = help_page_path('user/project/repository/branches/index.md', anchor: 'name-your-branch') + - branch_name_help_link = help_page_path('user/project/repository/branches/index', anchor: 'name-your-branch') = link_to _('What variables can I use?'), branch_name_help_link, target: "_blank" = render_if_exists 'projects/branch_defaults/branch_names_help' diff --git a/app/views/projects/branch_defaults/_default_branch_fields.html.haml b/app/views/projects/branch_defaults/_default_branch_fields.html.haml index 2c59e187d30..78ce43ca8c9 100644 --- a/app/views/projects/branch_defaults/_default_branch_fields.html.haml +++ b/app/views/projects/branch_defaults/_default_branch_fields.html.haml @@ -11,7 +11,7 @@ .form-group - help_text = _("When merge requests and commits in the default branch close, any issues they reference also close.") - - help_icon = link_to sprite_icon('question-o'), help_page_path('user/project/issues/managing_issues.md', anchor: 'closing-issues-automatically'), target: '_blank', rel: 'noopener noreferrer' + - help_icon = link_to sprite_icon('question-o'), help_page_path('user/project/issues/managing_issues', anchor: 'closing-issues-automatically'), target: '_blank', rel: 'noopener noreferrer' = f.gitlab_ui_checkbox_component :autoclose_referenced_issues, s_('ProjectSettings|Auto-close referenced issues on default branch'), help_text: (help_text + " " + help_icon).html_safe diff --git a/app/views/projects/cleanup/_show.html.haml b/app/views/projects/cleanup/_show.html.haml index fffa1ff36b9..1d365dbceb8 100644 --- a/app/views/projects/cleanup/_show.html.haml +++ b/app/views/projects/cleanup/_show.html.haml @@ -11,7 +11,7 @@ - link_end = '</a>'.html_safe = _("Clean up after running %{link_start}git filter-repo%{link_end} on the repository.").html_safe % { link_start: link_start, link_end: link_end } = link_to sprite_icon('question-o'), - help_page_path('user/project/repository/reducing_the_repo_size_using_git.md'), + help_page_path('user/project/repository/reducing_the_repo_size_using_git'), target: '_blank', rel: 'noopener noreferrer' .settings-content diff --git a/app/views/projects/environments/index.html.haml b/app/views/projects/environments/index.html.haml index 7ddaf868a35..c2bea4bf43c 100644 --- a/app/views/projects/environments/index.html.haml +++ b/app/views/projects/environments/index.html.haml @@ -5,7 +5,7 @@ "can-read-environment" => can?(current_user, :read_environment, @project).to_s, "can-create-environment" => can?(current_user, :create_environment, @project).to_s, "new-environment-path" => new_project_environment_path(@project), - "help-page-path" => help_page_path("ci/environments/index.md"), + "help-page-path" => help_page_path("ci/environments/index"), "project-path" => @project.full_path, "project-id" => @project.id, "default-branch-name" => @project.default_branch_or_main, diff --git a/app/views/projects/feature_flags/new.html.haml b/app/views/projects/feature_flags/new.html.haml index 3a32a249d1e..1f723cb96b0 100644 --- a/app/views/projects/feature_flags/new.html.haml +++ b/app/views/projects/feature_flags/new.html.haml @@ -10,5 +10,5 @@ user_callout_id: Users::CalloutsHelper::FEATURE_FLAGS_NEW_VERSION, show_user_callout: show_feature_flags_new_version?.to_s, strategy_type_docs_page_path: help_page_path('operations/feature_flags', anchor: 'feature-flag-strategies'), - environments_scope_docs_path: help_page_path('ci/environments/index.md', anchor: 'limit-the-environment-scope-of-a-cicd-variable'), + environments_scope_docs_path: help_page_path('ci/environments/index', anchor: 'limit-the-environment-scope-of-a-cicd-variable'), project_id: @project.id } } diff --git a/app/views/projects/feature_flags_user_lists/edit.html.haml b/app/views/projects/feature_flags_user_lists/edit.html.haml index 417b6354ec0..70d614fc327 100644 --- a/app/views/projects/feature_flags_user_lists/edit.html.haml +++ b/app/views/projects/feature_flags_user_lists/edit.html.haml @@ -3,6 +3,6 @@ - breadcrumb_title s_('FeatureFlags|Edit User List') - page_title s_('FeatureFlags|Edit User List') -#js-edit-user-list{ data: { 'user-lists-docs-path' => help_page_path('operations/feature_flags.md', anchor: 'user-list'), +#js-edit-user-list{ data: { 'user-lists-docs-path' => help_page_path('operations/feature_flags', anchor: 'user-list'), 'user-list-iid' => @user_list.iid, 'project-id' => @project.id } } diff --git a/app/views/projects/feature_flags_user_lists/new.html.haml b/app/views/projects/feature_flags_user_lists/new.html.haml index cea55c0ca2a..7f20fc4a9ec 100644 --- a/app/views/projects/feature_flags_user_lists/new.html.haml +++ b/app/views/projects/feature_flags_user_lists/new.html.haml @@ -4,6 +4,6 @@ - breadcrumb_title s_('FeatureFlags|New User List') - page_title s_('FeatureFlags|New User List') -#js-new-user-list{ data: { 'user-lists-docs-path' => help_page_path('operations/feature_flags.md', anchor: 'user-list'), +#js-new-user-list{ data: { 'user-lists-docs-path' => help_page_path('operations/feature_flags', anchor: 'user-list'), 'feature-flags-path' => project_feature_flags_path(@project), 'project-id' => @project.id } } diff --git a/app/views/projects/issues/_new_branch.html.haml b/app/views/projects/issues/_new_branch.html.haml index 90d99d51d29..68de9c44e38 100644 --- a/app/views/projects/issues/_new_branch.html.haml +++ b/app/views/projects/issues/_new_branch.html.haml @@ -43,7 +43,7 @@ %li.droplab-item-ignore.gl-ml-3.gl-mr-3.gl-mt-5 - if can_create_confidential_merge_request? - #js-forked-project{ data: { namespace_path: @project.namespace.full_path, project_path: @project.full_path, new_fork_path: new_project_fork_path(@project), help_page_path: help_page_path('user/project/merge_requests/index.md') } } + #js-forked-project{ data: { namespace_path: @project.namespace.full_path, project_path: @project.full_path, new_fork_path: new_project_fork_path(@project), help_page_path: help_page_path('user/project/merge_requests/index') } } .form-group %label{ for: 'new-branch-name' } = _('Branch name') diff --git a/app/views/projects/merge_requests/_page.html.haml b/app/views/projects/merge_requests/_page.html.haml index 637980bd2f8..03a1f2f3179 100644 --- a/app/views/projects/merge_requests/_page.html.haml +++ b/app/views/projects/merge_requests/_page.html.haml @@ -6,7 +6,7 @@ - page_title "#{@merge_request.title} (#{@merge_request.to_reference})", _("Merge requests") - page_description @merge_request.description_html - page_card_attributes @merge_request.card_attributes -- suggest_changes_help_path = help_page_path('user/project/merge_requests/reviews/suggestions.md') +- suggest_changes_help_path = help_page_path('user/project/merge_requests/reviews/suggestions') - mr_action = j(params[:tab].presence || 'show') - add_page_specific_style 'page_bundles/issuable' - add_page_specific_style 'page_bundles/design_management' diff --git a/app/views/projects/mirrors/_branch_filter.html.haml b/app/views/projects/mirrors/_branch_filter.html.haml index 7d90906bfe8..39e82fd5711 100644 --- a/app/views/projects/mirrors/_branch_filter.html.haml +++ b/app/views/projects/mirrors/_branch_filter.html.haml @@ -6,4 +6,4 @@ = _('Mirror only protected branches') - c.with_help_text do = _('If enabled, only protected branches will be mirrored.') - = link_to _('Learn more.'), help_page_path('user/project/repository/mirror/index.md', anchor: 'mirror-only-protected-branches'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('user/project/repository/mirror/index', anchor: 'mirror-only-protected-branches'), target: '_blank', rel: 'noopener noreferrer' diff --git a/app/views/projects/mirrors/_mirror_repos.html.haml b/app/views/projects/mirrors/_mirror_repos.html.haml index 1083da5402b..a7ebafed1a9 100644 --- a/app/views/projects/mirrors/_mirror_repos.html.haml +++ b/app/views/projects/mirrors/_mirror_repos.html.haml @@ -10,7 +10,7 @@ = expanded ? _('Collapse') : _('Expand') %p.gl-text-secondary = _('Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically.') - = link_to _('How do I mirror repositories?'), help_page_path('user/project/repository/mirror/index.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('How do I mirror repositories?'), help_page_path('user/project/repository/mirror/index'), target: '_blank', rel: 'noopener noreferrer' .settings-content diff --git a/app/views/projects/mirrors/_mirror_repos_push.html.haml b/app/views/projects/mirrors/_mirror_repos_push.html.haml index 5b02d650989..7f0298191cd 100644 --- a/app/views/projects/mirrors/_mirror_repos_push.html.haml +++ b/app/views/projects/mirrors/_mirror_repos_push.html.haml @@ -16,4 +16,4 @@ = _('Keep divergent refs') - c.with_help_text do - link_opening_tag = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe - = html_escape(_('Do not force push over diverged refs. After the mirror is created, this setting can only be modified using the API. %{mirroring_docs_link_start}Learn more about this option%{link_closing_tag} and %{mirroring_api_docs_link_start}the API.%{link_closing_tag}')) % { mirroring_docs_link_start: link_opening_tag % {url: help_page_path('user/project/repository/mirror/push.md', anchor: 'keep-divergent-refs')}, mirroring_api_docs_link_start: link_opening_tag % {url: help_page_path('api/remote_mirrors')}, link_closing_tag: '</a>'.html_safe } + = html_escape(_('Do not force push over diverged refs. After the mirror is created, this setting can only be modified using the API. %{mirroring_docs_link_start}Learn more about this option%{link_closing_tag} and %{mirroring_api_docs_link_start}the API.%{link_closing_tag}')) % { mirroring_docs_link_start: link_opening_tag % {url: help_page_path('user/project/repository/mirror/push', anchor: 'keep-divergent-refs')}, mirroring_api_docs_link_start: link_opening_tag % {url: help_page_path('api/remote_mirrors')}, link_closing_tag: '</a>'.html_safe } diff --git a/app/views/projects/pages_domains/_certificate.html.haml b/app/views/projects/pages_domains/_certificate.html.haml index f80fd495695..1136abe9884 100644 --- a/app/views/projects/pages_domains/_certificate.html.haml +++ b/app/views/projects/pages_domains/_certificate.html.haml @@ -21,7 +21,7 @@ label_position: :hidden) = f.hidden_field :auto_ssl_enabled?, class: "js-project-feature-toggle-input" %p.gl-text-secondary.gl-mt-1 - - docs_link_url = help_page_path("user/project/pages/custom_domains_ssl_tls_certification/lets_encrypt_integration.md") + - docs_link_url = help_page_path("user/project/pages/custom_domains_ssl_tls_certification/lets_encrypt_integration") - docs_link_start = "<a href=\"%{docs_link_url}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-nowrap\">".html_safe % { docs_link_url: docs_link_url } - docs_link_end = "</a>".html_safe = _("Let's Encrypt is a free, automated, and open certificate authority (CA) that gives digital certificates in order to enable HTTPS (SSL/TLS) for websites. Learn more about Let's Encrypt configuration by following the %{docs_link_start}documentation on GitLab Pages%{docs_link_end}.").html_safe % { docs_link_url: docs_link_url, docs_link_start: docs_link_start, docs_link_end: docs_link_end } diff --git a/app/views/projects/pages_domains/_dns.html.haml b/app/views/projects/pages_domains/_dns.html.haml index 9ca9360199d..bec35dba147 100644 --- a/app/views/projects/pages_domains/_dns.html.haml +++ b/app/views/projects/pages_domains/_dns.html.haml @@ -27,5 +27,5 @@ .input-group-append = deprecated_clipboard_button(target: '#domain_verification', class: 'btn-default d-none d-sm-block') %p.form-text.text-muted - - link_to_help = link_to(_('verify ownership'), help_page_path('user/project/pages/custom_domains_ssl_tls_certification/index.md', anchor: '4-verify-the-domains-ownership')) + - link_to_help = link_to(_('verify ownership'), help_page_path('user/project/pages/custom_domains_ssl_tls_certification/index', anchor: '4-verify-the-domains-ownership')) = _("To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days.").html_safe % { link_to_help: link_to_help } diff --git a/app/views/projects/pages_domains/_helper_text.html.haml b/app/views/projects/pages_domains/_helper_text.html.haml index f29cb0609e6..4ad341c1394 100644 --- a/app/views/projects/pages_domains/_helper_text.html.haml +++ b/app/views/projects/pages_domains/_helper_text.html.haml @@ -1,4 +1,4 @@ -- docs_link_url = help_page_path("user/project/pages/custom_domains_ssl_tls_certification/index.md", anchor: "adding-an-ssltls-certificate-to-pages") +- docs_link_url = help_page_path("user/project/pages/custom_domains_ssl_tls_certification/index", anchor: "adding-an-ssltls-certificate-to-pages") - docs_link_start = "<a href=\"%{docs_link_url}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-nowrap\">".html_safe % { docs_link_url: docs_link_url } - docs_link_end = "</a>".html_safe diff --git a/app/views/projects/runners/_group_runners.html.haml b/app/views/projects/runners/_group_runners.html.haml index 2d435a7ce9d..a79b73f6f61 100644 --- a/app/views/projects/runners/_group_runners.html.haml +++ b/app/views/projects/runners/_group_runners.html.haml @@ -1,4 +1,4 @@ -- link = link_to _('Runner API'), help_page_path('api/runners.md') +- link = link_to _('Runner API'), help_page_path('api/runners') %h4 = _('Group runners') diff --git a/app/views/projects/settings/ci_cd/_autodevops_form.html.haml b/app/views/projects/settings/ci_cd/_autodevops_form.html.haml index fd27b125602..7011595e075 100644 --- a/app/views/projects/settings/ci_cd/_autodevops_form.html.haml +++ b/app/views/projects/settings/ci_cd/_autodevops_form.html.haml @@ -9,9 +9,9 @@ - base_domain_path = help_page_path('user/project/clusters/gitlab_managed_clusters', anchor: 'base-domain') - base_domain_link_start = link_start % { url: base_domain_path } -- help_link_continouos = link_to sprite_icon('question-o'), help_page_path('topics/autodevops/stages.md', anchor: 'auto-deploy'), target: '_blank', rel: 'noopener noreferrer' -- help_link_timed = link_to sprite_icon('question-o'), help_page_path('topics/autodevops/cicd_variables.md', anchor: 'timed-incremental-rollout-to-production'), target: '_blank', rel: 'noopener noreferrer' -- help_link_incremental = link_to sprite_icon('question-o'), help_page_path('topics/autodevops/cicd_variables.md', anchor: 'incremental-rollout-to-production'), target: '_blank', rel: 'noopener noreferrer' +- help_link_continouos = link_to sprite_icon('question-o'), help_page_path('topics/autodevops/stages', anchor: 'auto-deploy'), target: '_blank', rel: 'noopener noreferrer' +- help_link_timed = link_to sprite_icon('question-o'), help_page_path('topics/autodevops/cicd_variables', anchor: 'timed-incremental-rollout-to-production'), target: '_blank', rel: 'noopener noreferrer' +- help_link_incremental = link_to sprite_icon('question-o'), help_page_path('topics/autodevops/cicd_variables', anchor: 'incremental-rollout-to-production'), target: '_blank', rel: 'noopener noreferrer' .row .col-lg-12 @@ -22,7 +22,7 @@ = f.fields_for :auto_devops_attributes, @auto_devops do |form| = render Pajamas::CardComponent.new(card_options: { class: 'gl-mb-3' }, footer_options: { class: "js-extra-settings #{auto_devops_enabled || 'hidden'}", data: { testid: 'extra-auto-devops-settings' } }) do |c| - c.with_body do - - autodevops_help_link = link_to _('Learn more.'), help_page_path('topics/autodevops/index.md'), target: '_blank', rel: 'noopener noreferrer' + - autodevops_help_link = link_to _('Learn more.'), help_page_path('topics/autodevops/index'), target: '_blank', rel: 'noopener noreferrer' - auto_devops_badge = auto_devops_enabled ? (gl_badge_tag badge_for_auto_devops_scope(@project), { variant: :info }, { class: 'js-instance-default-badge gl-ml-3 gl-mt-n1'}) : '' = form.gitlab_ui_checkbox_component :enabled, (s_('CICD|Default to Auto DevOps pipeline') + auto_devops_badge).html_safe, diff --git a/app/views/projects/settings/merge_requests/_merge_request_merge_method_settings.html.haml b/app/views/projects/settings/merge_requests/_merge_request_merge_method_settings.html.haml index 849f5ca13e7..891bd62c0a4 100644 --- a/app/views/projects/settings/merge_requests/_merge_request_merge_method_settings.html.haml +++ b/app/views/projects/settings/merge_requests/_merge_request_merge_method_settings.html.haml @@ -12,7 +12,7 @@ - ffOnly = s_('ProjectSettings|Fast-forward merges only.') - ffConflictRebase = s_('ProjectSettings|When there is a merge conflict, the user is given the option to rebase.') - ffTrains = s_('ProjectSettings|If merge trains are enabled, merging is only possible if the branch can be rebased without conflicts.') -- ffTrainsHelp = link_to s_('ProjectSettings|What are merge trains?'), help_page_path('ci/pipelines/merge_trains.md', anchor: 'enable-merge-trains'), target: '_blank', rel: 'noopener noreferrer' +- ffTrainsHelp = link_to s_('ProjectSettings|What are merge trains?'), help_page_path('ci/pipelines/merge_trains', anchor: 'enable-merge-trains'), target: '_blank', rel: 'noopener noreferrer' - ffTrainsWithFastForward = (noMergeCommit + "<br />" + ffOnly + "<br />" + ffConflictRebase + "<br />" + ffTrains + " " + ffTrainsHelp).html_safe - ffTrainsWithoutFastForward = (noMergeCommit + "<br />" + ffOnly + "<br />" + ffConflictRebase).html_safe @@ -22,7 +22,7 @@ %b= s_('ProjectSettings|Merge method') %p.text-secondary = s_('ProjectSettings|Determine what happens to the commit history when you merge a merge request.') - = link_to s_('ProjectSettings|How do they differ?'), help_page_path('user/project/merge_requests/methods/index.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to s_('ProjectSettings|How do they differ?'), help_page_path('user/project/merge_requests/methods/index'), target: '_blank', rel: 'noopener noreferrer' = form.gitlab_ui_radio_component :merge_method, :merge, labelMerge, diff --git a/app/views/projects/settings/merge_requests/_merge_request_squash_options_settings.html.haml b/app/views/projects/settings/merge_requests/_merge_request_squash_options_settings.html.haml index 372c0723600..120b183bf51 100644 --- a/app/views/projects/settings/merge_requests/_merge_request_squash_options_settings.html.haml +++ b/app/views/projects/settings/merge_requests/_merge_request_squash_options_settings.html.haml @@ -5,7 +5,7 @@ %b= s_('ProjectSettings|Squash commits when merging') %p.text-secondary = s_('ProjectSettings|Set the default behavior of this option in merge requests. Changes to this are also applied to existing merge requests.') - = link_to s_('ProjectSettings|What is squashing?'), help_page_path('user/project/merge_requests/squash_and_merge.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to s_('ProjectSettings|What is squashing?'), help_page_path('user/project/merge_requests/squash_and_merge'), target: '_blank', rel: 'noopener noreferrer' = settings.gitlab_ui_radio_component :squash_option, :never, diff --git a/app/views/projects/settings/operations/_alert_management.html.haml b/app/views/projects/settings/operations/_alert_management.html.haml index c29cedd8250..849597f6e65 100644 --- a/app/views/projects/settings/operations/_alert_management.html.haml +++ b/app/views/projects/settings/operations/_alert_management.html.haml @@ -11,6 +11,6 @@ = _('Expand') %p.gl-text-secondary = _('Display alerts from all configured monitoring tools.') - = link_to _('Learn more.'), help_page_path('operations/incident_management/integrations.md'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('operations/incident_management/integrations'), target: '_blank', rel: 'noopener noreferrer' .settings-content .js-alerts-settings{ data: alerts_settings_data } diff --git a/app/views/shared/_auto_devops_callout.html.haml b/app/views/shared/_auto_devops_callout.html.haml index 6d8d4f4cab9..3f613a1b383 100644 --- a/app/views/shared/_auto_devops_callout.html.haml +++ b/app/views/shared/_auto_devops_callout.html.haml @@ -12,5 +12,5 @@ %p= s_('AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration.') %p - - link = link_to(s_('AutoDevOps|Auto DevOps documentation'), help_page_path('topics/autodevops/index.md'), target: '_blank', rel: 'noopener noreferrer') + - link = link_to(s_('AutoDevOps|Auto DevOps documentation'), help_page_path('topics/autodevops/index'), target: '_blank', rel: 'noopener noreferrer') = s_('AutoDevOps|Learn more in the %{link_to_documentation}').html_safe % { link_to_documentation: link } diff --git a/app/views/shared/_custom_attributes.html.haml b/app/views/shared/_custom_attributes.html.haml index be96e77dbd4..33f3ca93b9c 100644 --- a/app/views/shared/_custom_attributes.html.haml +++ b/app/views/shared/_custom_attributes.html.haml @@ -2,7 +2,7 @@ = render Pajamas::CardComponent.new(body_options: { class: 'gl-py-0' }) do |c| - c.with_header do - = link_to(_('Custom Attributes'), help_page_path('api/custom_attributes.md')) + = link_to(_('Custom Attributes'), help_page_path('api/custom_attributes')) - c.with_body do %ul.content-list - custom_attributes.each do |custom_attribute| diff --git a/app/views/shared/deploy_tokens/_new_deploy_token.html.haml b/app/views/shared/deploy_tokens/_new_deploy_token.html.haml index 25c277ea0ea..30917ee6fff 100644 --- a/app/views/shared/deploy_tokens/_new_deploy_token.html.haml +++ b/app/views/shared/deploy_tokens/_new_deploy_token.html.haml @@ -9,7 +9,7 @@ .input-group-append = deprecated_clipboard_button(text: deploy_token.username, title: s_('DeployTokens|Copy username'), placement: 'left') %span.deploy-token-help-block.gl-mt-2.text-success - - link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/project/deploy_tokens/index.md') } + - link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/project/deploy_tokens/index') } - link_end = "</a>".html_safe = s_("DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}").html_safe % { link_start: link_start, link_end: link_end } diff --git a/app/views/shared/integrations/gitlab_slack_application/_help.html.haml b/app/views/shared/integrations/gitlab_slack_application/_help.html.haml index 0956f1183cb..2e7768e54f4 100644 --- a/app/views/shared/integrations/gitlab_slack_application/_help.html.haml +++ b/app/views/shared/integrations/gitlab_slack_application/_help.html.haml @@ -2,7 +2,7 @@ .well-segment %p = s_("SlackIntegration|This integration allows users to perform common operations on this project by entering slash commands in Slack.") - = link_to _('Learn more'), help_page_path('user/project/integrations/gitlab_slack_application.md') + = link_to _('Learn more'), help_page_path('user/project/integrations/gitlab_slack_application') %p = s_("SlackIntegration|See the list of available commands in Slack after setting up this integration by entering") %kbd.inline /gitlab help diff --git a/app/views/shared/integrations/gitlab_slack_application/_slack_integration_form.html.haml b/app/views/shared/integrations/gitlab_slack_application/_slack_integration_form.html.haml index e5d05a8a83d..57d172b41f4 100644 --- a/app/views/shared/integrations/gitlab_slack_application/_slack_integration_form.html.haml +++ b/app/views/shared/integrations/gitlab_slack_application/_slack_integration_form.html.haml @@ -29,7 +29,7 @@ = render Pajamas::ButtonComponent.new(href: add_to_slack_link(@project, slack_app_id)) do = s_('SlackIntegration|Reinstall GitLab for Slack app…') %p - = html_escape(s_('SlackIntegration|You may need to reinstall the GitLab for Slack app when we %{linkStart}make updates or change permissions%{linkEnd}.')) % { linkStart: %(<a href="#{help_page_path('user/project/integrations/gitlab_slack_application.md', anchor: 'update-the-gitlab-for-slack-app')}">).html_safe, linkEnd: '</a>'.html_safe} + = html_escape(s_('SlackIntegration|You may need to reinstall the GitLab for Slack app when we %{linkStart}make updates or change permissions%{linkEnd}.')) % { linkStart: %(<a href="#{help_page_path('user/project/integrations/gitlab_slack_application', anchor: 'update-the-gitlab-for-slack-app')}">).html_safe, linkEnd: '</a>'.html_safe} - else = render Pajamas::ButtonComponent.new(href: add_to_slack_link(@project, slack_app_id)) do = s_('SlackIntegration|Install GitLab for Slack app…') diff --git a/app/views/shared/integrations/mattermost_slash_commands/_help.html.haml b/app/views/shared/integrations/mattermost_slash_commands/_help.html.haml index 6ce1c65a8dc..e01999c2279 100644 --- a/app/views/shared/integrations/mattermost_slash_commands/_help.html.haml +++ b/app/views/shared/integrations/mattermost_slash_commands/_help.html.haml @@ -4,7 +4,7 @@ .well-segment %p = s_("MattermostService|Use this service to perform common tasks in your project by entering slash commands in Mattermost.") - = link_to help_page_path('user/project/integrations/mattermost_slash_commands.md'), target: '_blank' do + = link_to help_page_path('user/project/integrations/mattermost_slash_commands'), target: '_blank' do = _("How do I configure this integration?") = sprite_icon('external-link') %p.inline diff --git a/app/views/shared/integrations/slack_slash_commands/_help.html.haml b/app/views/shared/integrations/slack_slash_commands/_help.html.haml index d3c74a80a1a..0440bb13797 100644 --- a/app/views/shared/integrations/slack_slash_commands/_help.html.haml +++ b/app/views/shared/integrations/slack_slash_commands/_help.html.haml @@ -5,7 +5,7 @@ .well-segment %p = s_("SlackService|Perform common operations in this project by entering slash commands in Slack.") - = link_to help_page_path('user/project/integrations/slack_slash_commands.md'), target: '_blank' do + = link_to help_page_path('user/project/integrations/slack_slash_commands'), target: '_blank' do = _("Learn more.") = sprite_icon('external-link') %p.inline diff --git a/app/views/shared/issuable/form/_type_selector.html.haml b/app/views/shared/issuable/form/_type_selector.html.haml index 0bcdcb9e963..89a07444d9f 100644 --- a/app/views/shared/issuable/form/_type_selector.html.haml +++ b/app/views/shared/issuable/form/_type_selector.html.haml @@ -10,6 +10,6 @@ - if issuable.incident_type_issue? %p.form-text.text-muted - - incident_docs_url = help_page_path('operations/incident_management/incidents.md') + - incident_docs_url = help_page_path('operations/incident_management/incidents') - incident_docs_start = format('<a href="%{url}" target="_blank" rel="noopener noreferrer">', url: incident_docs_url) = format(_('A %{incident_docs_start}modified issue%{incident_docs_end} to guide the resolution of incidents.'), incident_docs_start: incident_docs_start, incident_docs_end: '</a>').html_safe diff --git a/app/views/shared/runners/_shared_runners_description.html.haml b/app/views/shared/runners/_shared_runners_description.html.haml index c8ddb5d5176..89da1a6fa09 100644 --- a/app/views/shared/runners/_shared_runners_description.html.haml +++ b/app/views/shared/runners/_shared_runners_description.html.haml @@ -1,4 +1,4 @@ -- shared_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('ci/runners/runners_scope.md', anchor: 'shared-runners') } +- shared_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('ci/runners/runners_scope', anchor: 'shared-runners') } %h4 = _('Shared runners') diff --git a/doc/administration/dedicated/index.md b/doc/administration/dedicated/index.md index 2889fb9b389..a517823c0cc 100644 --- a/doc/administration/dedicated/index.md +++ b/doc/administration/dedicated/index.md @@ -278,10 +278,22 @@ To enable an Outbound Private Link: GitLab then configures the tenant instance to create the necessary Endpoint Interfaces based on the service names you provided. Any matching outbound connections made from the tenant GitLab instance are directed through the PrivateLink into your VPC. -#### Custom certificates +### Custom certificates In some cases, the GitLab Dedicated instance can't reach an internal service you own because it exposes a certificate that can't be validated using a public Certification Authority (CA). In these cases, custom certificates are required. +#### Add a custom certificate with Switchboard + +1. Log in to [Switchboard](https://console.gitlab-dedicated.com/). +1. At the top of the page, select **Configuration**. +1. Expand **Custom Certificate Authorities**. +1. Select **+ Add Certificate**. +1. Paste the certificate into the text box. +1. Select **Save**. +1. Scroll up to the top of the page and select whether to apply the changes immediately or during the next maintenance window. + +#### Add a custom certificate with a Support Request + To request that GitLab add custom certificates when communicating with your services over PrivateLink, attach the custom public certificate files to your [support ticket](https://support.gitlab.com/hc/en-us/requests/new?ticket_form_id=4414917877650). #### Maximum number of reverse PrivateLink connections @@ -292,6 +304,19 @@ GitLab Dedicated limits the number of reverse PrivateLink connections to 10. GitLab Dedicated allows you to control which IP addresses can access your instance through an IP allowlist. +#### Add an IP to the allowlist with Switchboard + +1. Log in to [Switchboard](https://console.gitlab-dedicated.com/). +1. At the top of the page, select **Configuration**. +1. Expand **Allowed Source List Config / IP allowlist**. +1. Turn on the **Enable** toggle. +1. Select **Add Item**. +1. Enter the IP address and description. To add another IP address, repeat steps 5 and 6. +1. Select **Save**. +1. Scroll up to the top of the page and select whether to apply the changes immediately or during the next maintenance window. + +#### Add an IP to the allowlist with a Support Request + Specify a comma separated list of IP addresses that can access your GitLab Dedicated instance in your [support ticket](https://support.gitlab.com/hc/en-us/requests/new?ticket_form_id=4414917877650). After the configuration has been applied, when an IP not on the allowlist tries to access your instance, the connection is refused. ### SAML @@ -303,6 +328,23 @@ Prerequisites: - You must configure the identity provider before sending the required data to GitLab. +#### Activate SAML with Switchboard + +To activate SAML for your GitLab Dedicated instance: + +1. Log in to [Switchboard](https://console.gitlab-dedicated.com/). +1. At the top of the page, select **Configuration**. +1. Expand **SAML Config**. +1. Turn on the **Enable** toggle. +1. Complete the fields. +1. Select **Save**. +1. Scroll up to the top of the page and select whether to apply the changes immediately or during the next maintenance window. +1. To verify the SAML configuration is successful: + - Check that the SSO button description is displayed on your instance's sign-in page. + - Go to the metadata URL of your instance (`https://INSTANCE-URL/users/auth/saml/metadata`). This page can be used to simplify much of the configuration of the identity provider, and manually validate the settings. + +#### Activate SAML with a Support Request + To activate SAML for your GitLab Dedicated instance: 1. To make the necessary changes, include the desired [SAML configuration block](../../integration/saml.md#configure-saml-support-in-gitlab) for your GitLab application in your [support ticket](https://support.gitlab.com/hc/en-us/requests/new?ticket_form_id=4414917877650). At a minimum, GitLab needs the following information to enable SAML for your instance: diff --git a/doc/architecture/blueprints/gitlab_steps/gitlab-ci.md b/doc/architecture/blueprints/gitlab_steps/gitlab-ci.md new file mode 100644 index 00000000000..8f97c307b37 --- /dev/null +++ b/doc/architecture/blueprints/gitlab_steps/gitlab-ci.md @@ -0,0 +1,247 @@ +--- +owning-stage: "~devops::verify" +description: Usage of the [GitLab Steps](index.md) with [`.gitlab-ci.yml`](../../../ci/yaml/index.md). +--- + +# Usage of the [GitLab Steps](index.md) with [`.gitlab-ci.yml`](../../../ci/yaml/index.md) + +This document describes how [GitLab Steps](index.md) are integrated into the `.gitlab-ci.yml`. + +GitLab Steps will be integrated using a three-stage execution cycle +and replace `before_script:`, `script:` and `after_script:`. + +- `setup:`: Execution stage responsible for provisioning the environment, + including cloning the repository, restoring artifacts, or installing all dependencies. + This stage will replace implicitly cloning, restoring artifacts, and cache download. +- `run:`: Execution stage responsible for running a test, build, + or any other main command required by that job. +- `teardown:`: Execution stage responsible for cleaning the environment, + uploading artifacts, or storing cache. This stage will replace implicit + artifacts and cache uploads. + +Before we can achieve three-stage execution we will ship minimal initial support +that does not require any prior GitLab integration. + +## Phase 1: Initial support + +Initially the Step Runner will be used externally, without any prior dependencies +to GitLab: + +- The `step-runner` will be provided as part of a container image. +- The `step-runner` will be explicitly run in the `script:` section. +- The `$STEPS` environment variable will be executed as [`type: steps`](step-definition.md#the-steps-step-type). + +```yaml +hello-world: + image: registry.gitlab.com/gitlab-org/step-runner + variables: + STEPS: | + - step: gitlab.com/josephburnett/component-hello-steppy@master + inputs: + greeting: "hello world" + script: + - /step-runner ci +``` + +## Phase 2: The addition of `run:` to `.gitlab-ci.yml` + +In Phase 2 we will add `run:` as a first class way to use GitLab Steps: + +- `run:` will use a [`type: steps`](step-definition.md#the-steps-step-type) syntax. +- `run:` will replace usage of `before_script`, `script` and `after_script`. +- All existing functions to support Git cloning, artifacts, and cache would continue to be supported. +- It is yet to be defined how we would support `after_script`, which is executed unconditionally + or when the job is canceled. +- `run:` will not be allowed to be combined with `before_script:`, `script:` or `after_script:`. +- GitLab Rails would not parse `run:`, instead it would only perform static validation + with a JSON schema provided by the Step Runner. + +```yaml +hello-world: + image: registry.gitlab.com/gitlab-org/step-runner + run: + - step: gitlab.com/josephburnett/component-hello-steppy@master + inputs: + greeting: "hello world" +``` + +The following example would **fail** syntax validation: + +```yaml +hello-world: + image: registry.gitlab.com/gitlab-org/step-runner + run: + - step: gitlab.com/josephburnett/component-hello-steppy@master + inputs: + greeting: "hello world" + script: echo "This is ambiguous and invalid example" +``` + +### Transitioning from `before_script:`, `script:` and `after_script:` + +GitLab Rails would automatically convert the `*script:` syntax into relevant `run:` specification: + +- Today `before_script:` and `script:` are joined together as a single script for execution. +- The `after_script:` section is always executed in a separate context, representing a separate step to be executed. +- It is yet to be defined how we would retain the existing behavior of `after_script`, which is always executed + regardless of the job status or timeout, and uses a separate timeout. +- We would retain all implicit behavior which defines all environment variables when translating `script:` + into step-based execution. + +For example, this CI/CD configuration: + +```yaml +hello-world: + before_script: + - echo "Run before_script" + script: + - echo "Run script" + after_script: + - echo "Run after_script" +``` + +Could be translated into this equivalent specification: + +```yaml +hello-world: + run: + - step: gitlab.com/gitlab-org/components/steps/legacy/script@v1.0 + inputs: + script: + - echo "Run before_script" + - echo "Run script" + - step: gitlab.com/gitlab-org/components/steps/legacy/script@v1.0 + inputs: + script: + - echo "Run after_script" + when: always +``` + +## Phase 3: The addition of `setup:` and `teardown:` to `.gitlab-ci.yml` + +The addition of `setup:` and `teardown:` will replace the implicit functions +provided by GitLab Runner: Git clone, artifacts and cache handling: + +- The usage of `setup:` would stop GitLab Runner from implicitly cloning the repository. +- `artifacts:` and `cache:`, when specified, would be translated and appended to `setup:` and `teardown:` + to provide backward compatibility for the old syntax. +- `release:`, when specified, would be translated and appended to `teardown:` + to provide backward compatibility for the old syntax. +- `setup:` and `teardown:` could be used in `default:` to simplify support + of common workflows like where the repository is cloned, or how the artifacts are handled. +- The split into 3-stage execution additionally improves composability of steps with `extends:`. +- The `hooks:pre_get_sources_script` would be implemented similar to [`script:`](#transitioning-from-before_script-script-and-after_script) + and be prepended to `setup:`. + +For example, this CI/CD configuration: + +```yaml +rspec: + script: + - echo "This job uses a cache." + artifacts: + paths: [binaries/, .config] + cache: + key: binaries-cache + paths: [binaries/*.apk, .config] +``` + +Could be translated into this equivalent specification executed by a step runner: + +```yaml +rspec: + setup: + - step: gitlab.com/gitlab-org/components/git/clone@v1.0 + - step: gitlab.com/gitlab-org/components/artifacts/download@v1.0 + - step: gitlab.com/gitlab-org/components/cache/restore@v1.0 + inputs: + key: binaries-cache + run: + - step: gitlab.com/gitlab-org/components/steps/legacy/script@v1.0 + inputs: + script: + - echo "This job uses a cache." + teardown: + - step: gitlab.com/gitlab-org/components/artifacts/upload@v1.0 + inputs: + paths: [binaries/, .config] + - step: gitlab.com/gitlab-org/components/cache/restore@v1.0 + inputs: + key: binaries-cache + paths: [binaries/*.apk, .config] +``` + +### Inheriting common operations with `default:` + +`setup:` and `teardown:` are likely to become very verbose over time. One way to simplify them +is to allow inheriting the common `setup:` and `teardown:` operations +with `default:`. + +The previous example could be simplified to: + +```yaml +default: + setup: + - step: gitlab.com/gitlab-org/components/git/clone@v1.0 + - step: gitlab.com/gitlab-org/components/artifacts/download@v1.0 + - step: gitlab.com/gitlab-org/components/cache/restore@v1.0 + inputs: + key: binaries-cache + teardown: + - step: gitlab.com/gitlab-org/components/artifacts/upload@v1.0 + inputs: + paths: [binaries/, .config] + - step: gitlab.com/gitlab-org/components/cache/restore@v1.0 + inputs: + key: binaries-cache + paths: [binaries/*.apk, .config] + +rspec: + run: + - step: gitlab.com/gitlab-org/components/steps/legacy/script@v1.0 + inputs: + script: + - echo "This job uses a cache." + +linter: + run: + - step: gitlab.com/gitlab-org/components/steps/legacy/script@v1.0 + inputs: + script: + - echo "Run linting" +``` + +### Parallel jobs and `setup:` + +With the introduction of `setup:` at some point in the future we will introduce +an efficient way to parallelize the jobs: + +- `setup:` would define all steps required to provision the environment. +- The result of `setup:` would be snapshot and distributed as the base + for all parallel jobs, if `parallel: N` is used. +- The `run:` and `teardown:` would be run on top of cloned job, and all its services. +- The runner would control and intelligently distribute all parallel + jobs, significantly cutting the resource requirements for fixed + parts of the job (Git clone, artifacts, installing dependencies.) + +```yaml +rspec-parallel: + image: ruby:3.2 + services: [postgres, redis] + parallel: 10 + setup: + - step: gitlab.com/gitlab-org/components/git/clone@v1.0 + - step: gitlab.com/gitlab-org/components/artifacts/download@v1.0 + inputs: + jobs: [setup-all] + - script: bundle install --without production + run: + - script: bundle exec knapsack +``` + +Potential GitLab Runner flow: + +1. Runner receives the `rspec-parallel` job with `setup:` and `parallel:` configured. +1. Runner executes a job on top of Kubernetes cluster using block volumes up to the `setup`. +1. Runner then runs 10 parallel jobs in Kubernetes, overlaying the block volume from 2 + and continue execution of `run:` and `teardown:`. diff --git a/doc/architecture/blueprints/gitlab_steps/index.md b/doc/architecture/blueprints/gitlab_steps/index.md index 74c9ba1498d..f4715fc27d4 100644 --- a/doc/architecture/blueprints/gitlab_steps/index.md +++ b/doc/architecture/blueprints/gitlab_steps/index.md @@ -131,7 +131,14 @@ TBD ## Proposal -TBD +### GitLab Steps definition and syntax + +- [Step Definition](step-definition.md). +- [Syntactic Sugar extensions](steps-syntactic-sugar.md). + +### Integration of GitLab Steps in `.gitlab-ci.yml` + +- [Usage of the GitLab Steps with `.gitlab-ci.yml`](gitlab-ci.md). ## Design and implementation details diff --git a/doc/architecture/blueprints/gitlab_steps/step-definition.md b/doc/architecture/blueprints/gitlab_steps/step-definition.md new file mode 100644 index 00000000000..08ca1ab7c31 --- /dev/null +++ b/doc/architecture/blueprints/gitlab_steps/step-definition.md @@ -0,0 +1,368 @@ +--- +owning-stage: "~devops::verify" +description: The Step Definition for [GitLab Steps](index.md). +--- + +# The Step definition + +A step is the minimum executable unit that user can provide and is defined in a `step.yml` file. + +The following step definition describes the minimal syntax supported. +The syntax is extended with [syntactic sugar](steps-syntactic-sugar.md). + +A step definition consists of two documents. The purpose of the document split is +to distinguish between the declaration and implementation: + +1. [Specification / Declaration](#step-specification): + + Provides the specification which describes step inputs and outputs, + as well any other metadata that might be needed by the step in the future (license, author, etc.). + In programming language terms, this is similar to a function declaration with arguments and return values. + +1. [Implementation](#step-implementation): + + The implementation part of the document describes how to execute the step, including how the environment + has to be configured, or how actions can be configured. + +## Example step that prints a message to stdout + +In the following step example: + +1. The declaration specifies that the step accepts a single input named `message`. + The `message` is a required argument that needs to be provided when running the step + because it does not define `default:`. +1. The implementation section specifies that the step is of type `exec`. When run, the step + will execute an `echo` command with a single argument (the `message` value). + +```yaml +# .gitlab/ci/steps/exec-echo.yaml +spec: + inputs: + message: +--- +type: exec +exec: + command: [echo, "${{inputs.message}}"] +``` + +## Step specification + +The step specification currently only defines inputs and outputs: + +- Inputs: + - Can be required or optional. + - Have a name and can have a description. + - Can contain a list of accepted options. Options limit what value can be provided for the input. + - Can define matching regexp. The matching regexp limits what value can be provided for the input. + - Can be expanded with the usage of syntax `${{ inputs.input_name }}`. +- All **input values** can be accessed when `type: exec` is used, + by decoding the `$STEP_JSON` file that does provide information about the context of the execution. +- Outputs: + - Have a name and can have a description. + - Can be set by writing to a special [dotenv](https://github.com/bkeepers/dotenv) file named: + `$OUTPUT_FILE` with a format of `output_name=VALUE` per output. + +For example: + +```yaml +spec: + inputs: + message_with_default: + default: "Hello World" + message_that_is_required: + description: "This description explains that the input is required, because it does not specify a default:" + type_with_limited_options: + options: [bash, powershell, detect] + type_with_default_and_limited_options: + default: bash + options: [bash, powershell, detect] + description: "Since the options are provided, the default: needs to be one of the options" + version_with_matching_regexp: + match: ^v\d+\.\d+$ + description: "The match pattern only allows values similar to `v1.2`" + outputs: + code_coverage: + description: "Measured code coverage that was calculated as part of the step" +--- +type: steps +steps: + - step: ./bash-script.yaml + inputs: + script: "echo Code Coverage = 95.4% >> $OUTPUT_FILE" +``` + +## Step Implementation + +The step definition can use the following types to implement the step: + +- `type: exec`: Run a binary command, using STDOUT/STDERR for tracing the executed process. +- `type: steps`: Run a sequence of steps. +- `type: parallel` (Planned): Run all steps in parallel, waiting for all of them to finish. +- `type: grpc` (Planned): Run a binary command but use gRPC for intra-process communication. +- `type: container` (Planned): Run a nested Step Runner in a container image of choice, + transferring all execution flow. + +### The `exec` step type + +The ability to run binary commands is one of the primitive functions: + +- The command to execute is defined by the `exec:` section. +- The result of the execution is the exit code of the command to be executed, unless the default behavior is overwritten. +- The default working directory in which the command is executed is the directory in which the + step is located. +- By default, the command is not time-limited, but can be time-limited during job execution with `timeout:`. + +For example, an `exec` step with no inputs: + +```yaml +spec: +--- +type: exec +exec: + command: [/bin/bash, ./my-script.sh] + timeout: 30m + workdir: /tmp +``` + +#### Example step that executes user-defined command + +The following example is a minimal step definition that executes a user-provided command: + +- The declaration section specifies that the step accepts a single input named `script`. +- The `script` input is a required argument that needs to be provided when running the step + because no `default:` is defined. +- The implementation section specifies that the step is of type `exec`. When run, the step + will execute in `bash` passing the user command with `-c` argument. +- The command to be executed will be prefixed with `set -veo pipefail` to print the execution + to the job log and exit on the first failure. + +```yaml +# .gitlab/ci/steps/exec-script.yaml + +spec: + inputs: + script: + description: 'Run user script.' +--- +type: exec +exec: + command: [/usr/bin/env, bash, -c, "set -veo pipefail; ${{inputs.script}}"] +``` + +### The `steps` step type + +The ability to run multiple steps in sequence is one of the primitive functions: + +- A sequence of steps is defined by an array of step references: `steps: []`. +- The next step is run only if previous step succeeded, unless the default behavior is overwritten. +- The result of the execution is either: + - A failure at the first failed step. + - Success if all steps in sequence succeed. + +#### Steps that use other steps + +The `steps` type depends extensively on being able to use other steps. +Each item in a sequence can reference other external steps, for example: + +```yaml +spec: +--- +type: steps +steps: + - step: ./.gitlab/ci/steps/ruby/install.yml + inputs: + version: 3.1 + env: + HTTP_TIMEOUT: 10s + - step: gitlab.com/gitlab-org/components/bash/script@v1.0 + inputs: + script: echo Hello World +``` + +The `step:` value is a string that describes where the step definition is located: + +- **Local**: The definition can be retrieved from a local source with `step: ./path/to/local/step.yml`. + A local reference is used when the path starts with `./` or `../`. + The resolved path to another local step is always **relative** to the location of the current step. + There is no limitation where the step is located in the repository. +- **Remote**: The definition can also be retrieved from a remote source with `step: gitlab.com/gitlab-org/components/bash/script@v1.0`. + Using a FQDN makes the Step Runner pull the repository or archive containing + the step, using the version provided after the `@`. + +The `inputs:` section is a list of key-value pairs. The `inputs:` specify values +that are passed and matched against the [step specification](#step-specification). + +The `env:` section is a list of key-value pairs. `env:` exposes the given environment +variables to all children steps, including [`type: exec`](#the-exec-step-type) or [`type: steps`](#the-steps-step-type). + +#### Remote Steps + +To use remote steps with `step: gitlab.com/gitlab-org/components/bash/script@v1.0` +the step definitions must be stored in a structured-way. The step definitions: + +- Must be stored in the `steps/` folder. +- Can be nested in sub-directories. +- Can be referenced by the directory name alone if the step definition + is stored in a `step.yml` file. + +For example, the file structure for a repository hosted in `git clone https://gitlab.com/gitlab-org/components.git`: + +```plaintext +├── steps/ +├── ├── secret_detection.yml +| ├── sast/ +│ | └── step.yml +│ └── dast +│ ├── java.yml +│ └── ruby.yml +``` + +This structure exposes the following steps: + +- `step: gitlab.com/gitlab-org/components/secret_detection@v1.0`: From the definition stored at `steps/secret_detection.yml`. +- `step: gitlab.com/gitlab-org/components/sast@v1.0`: From the definition stored at `steps/sast/step.yml`. +- `step: gitlab.com/gitlab-org/components/dast/java@v1.0`: From the definition stored at `steps/dast/java.yml`. +- `step: gitlab.com/gitlab-org/components/dast/ruby@v1.0`: From the definition stored at `steps/dast/ruby.yml`. + +#### Example step that runs other steps + +The following example is a minimal step definition that +runs other steps that are local to the current step. + +- The declaration specifies that the step accepts two inputs, each with + a default value. +- The implementation section specifies that the step is of type `steps`, meaning + the step will execute the listed steps in sequence. The usage of a top-level + `env:` makes the `HTTP_TIMEOUT` variable available in all executed steps. + +```yaml +spec: + inputs: + ruby_version: + default: 3.1 + http_timeout: + default: 10s +--- +type: steps +env: + HTTP_TIMEOUT: ${{inputs.http_timeout}} +steps: + - step: ./.gitlab/ci/steps/exec-echo.yaml + inputs: + message: "Installing Ruby ${{inputs.ruby_version}}..." + - step: ./.gitlab/ci/ruby/install.yaml + inputs: + version: ${{inputs.ruby_version}} +``` + +## Context and interpolation + +Every step definition is executed in a context object which +stores the following information that can be used by the step definition: + +- `inputs`: The list of inputs, including user-provided or default. +- `outputs`: The list of expected outputs. +- `env`: The current environment variable values. +- `job`: The metadata about the current job being executed. + - `job.project`: Information about the project, for example ID, name, or full path. + - `job.variables`: All [CI/CD Variables](../../../ci/variables/predefined_variables.md) as provided by the CI/CD execution, + including project variables, predefined variables, etc. + - `job.pipeline`: Information about the current executed pipeline, like the ID, name, full path +- `step`: Information about the current executed step, like the location of the step, the version used, or the [specification](#step-specification). +- `steps` (only for `type: exec`): - Information about each step in sequence to be run, containing information about the + result of the step execution, like status or trace log. + - `steps.<name-of-the-step>.status`: The status of the step, like `success` or `failed`. + - `steps.<name-of-the-step>.outputs.<output-name>`: To fetch the output provided by the step + +The context object is used to enable support for the interpolation in the form of `${{ <value> }}`. + +Interpolation: + +- Is forbidden in the [step specification](#step-specification) section. + The specification is static configuration that should not affected by the runtime environment. +- Can be used in the [step implementation](#step-implementation) section. The implementation + describes the runtime set of instructions for how step should be executed. +- Is applied to every value of the hash of each data structure. +- Of the *values* of each hash is possible (for now). The interpolation of *keys* is forbidden. +- Is done when executing and passing control to a given step, instead of running + it once when the configuration is loaded. This enables chaining outputs to inputs, or making steps depend on the execution + of earlier steps. + +For example: + +```yaml +# .gitlab/ci/steps/exec-echo.yaml +spec: + inputs: + timeout: + default: 10s + bash_support_version: +--- +type: steps +env: + HTTP_TIMEOUT: ${{inputs.timeout}} + PROJECT_ID: ${{job.project.id}} +steps: + - step: ./my/local/step/to/echo.yml + inputs: + message: "I'm currently building a project: ${{job.project.full_path}}" + - step: gitlab.com/gitlab-org/components/bash/script@v${{inputs.bash_support_version}} +``` + +## Reference data structures describing YAML document + +```go +package main + +type StepEnvironment map[string]string + +type StepSpecInput struct { + Default *string `yaml:"default"` + Description string `yaml:"description"` + Options *[]string `yaml:"options"` + Match *string `yaml:"match"` +} + +type StepSpecOutput struct { +} + +type StepSpecInputs map[string]StepSpecInput +type StepSpecOutputs map[string]StepSpecOutput + +type StepSpec struct { + Inputs StepSpecInput `yaml:"inputs"` + Outputs StepSpecOutputs `yaml:"outputs"` +} + +type StepSpecDoc struct { + Spec StepSpec `yaml:"spec"` +} + +type StepType string + +const StepTypeExec StepType = "exec" +const StepTypeSteps StepType = "steps" + +type StepDefinition struct { + Def StepSpecDoc `yaml:"-"` + Env StepEnvironment `yaml:"env"` + Steps *StepDefinitionSequence `yaml:"steps"` + Exec *StepDefinitionExec `yaml:"exec"` +} + +type StepDefinitionExec struct { + Command []string `yaml:"command"` + WorkingDir *string `yaml:"working_dir"` + Timeout *time.Duration `yaml:"timeout"` +} + +type StepDefinitionSequence []StepReference + +type StepReferenceInputs map[string]string + +type StepReference struct { + Step string `yaml:"step"` + Inputs StepReferenceInputs `yaml:"inputs"` + Env StepEnvironment `yaml:"env"` +} +``` diff --git a/doc/architecture/blueprints/gitlab_steps/steps-syntactic-sugar.md b/doc/architecture/blueprints/gitlab_steps/steps-syntactic-sugar.md new file mode 100644 index 00000000000..3ca54a45477 --- /dev/null +++ b/doc/architecture/blueprints/gitlab_steps/steps-syntactic-sugar.md @@ -0,0 +1,66 @@ +--- +owning-stage: "~devops::verify" +description: The Syntactic Sugar extensions to the Step Definition +--- + +# The Syntactic Sugar extensions to the Step Definition + +[The Step Definition](step-definition.md) describes a minimal required syntax +to be supported. To aid common workflows the following syntactic sugar is used +to extend different parts of that document. + +## Syntactic Sugar for Step Reference + +Each of syntactic sugar extensions is converted into the simple +[step reference](step-definition.md#steps-that-use-other-steps). + +### Easily execute scripts in a target environment + +`script:` is a shorthand syntax to aid execution of simple scripts, which cannot be used with `step:` +and is run by an externally stored step component provided by GitLab. + +The GitLab-provided step component performs shell auto-detection unless overwritten, +similar to how GitLab Runner does that now: based on a running system. + +`inputs:` and `env:` can be used for additional control of some aspects of that step component. + +For example: + +```yaml +spec: +--- +type: steps +steps: + - script: bundle exec rspec + - script: bundle exec rspec + inputs: + shell: sh # Force runner to use `sh` shell, instead of performing auto-detection +``` + +This syntax example translates into the following equivalent syntax for +execution by the Step Runner: + +```yaml +spec: +--- +type: steps +steps: + - step: gitlab.com/gitlab-org/components/steps/script@v1.0 + inputs: + script: bundle exec rspec + - step: gitlab.com/gitlab-org/components/steps/script@v1.0 + inputs: + script: bundle exec rspec + shell: sh # Force runner to use `sh` shell, instead of performing auto-detection +``` + +This syntax example is **invalid** (and ambiguous) because the `script:` and `step:` cannot be used together: + +```yaml +spec: +--- +type: steps +steps: + - step: gitlab.com/my-component/ruby/install@v1.0 + script: bundle exec rspec +``` diff --git a/doc/ci/yaml/index.md b/doc/ci/yaml/index.md index 1dcbe6880e3..1b6769a58f1 100644 --- a/doc/ci/yaml/index.md +++ b/doc/ci/yaml/index.md @@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w type: reference --- -# `.gitlab-ci.yml` keyword reference **(FREE ALL)** +# CI/CD YAML syntax reference **(FREE ALL)** This document lists the configuration options for the GitLab `.gitlab-ci.yml` file. This file is where you define the CI/CD jobs that make up your pipeline. diff --git a/lib/api/concerns/packages/npm_endpoints.rb b/lib/api/concerns/packages/npm_endpoints.rb index bfaba5c4d7a..19d63a39242 100644 --- a/lib/api/concerns/packages/npm_endpoints.rb +++ b/lib/api/concerns/packages/npm_endpoints.rb @@ -202,7 +202,8 @@ module API get '*package_name', format: false, requirements: ::API::Helpers::Packages::Npm::NPM_ENDPOINT_REQUIREMENTS do package_name = params[:package_name] available_packages = - if Feature.enabled?(:npm_allow_packages_in_multiple_projects) + if endpoint_scope != :project && + Feature.enabled?(:npm_allow_packages_in_multiple_projects, group_or_namespace) finder_for_endpoint_scope(package_name).execute else ::Packages::Npm::PackageFinder.new(package_name, project: project_or_nil) @@ -218,9 +219,8 @@ module API target: project_or_nil, package_name: package_name ) do - if endpoint_scope == :project || Feature.disabled?(:npm_allow_packages_in_multiple_projects) - authorize_read_package!(project) - elsif Feature.enabled?(:npm_allow_packages_in_multiple_projects) + if endpoint_scope != :project && + Feature.enabled?(:npm_allow_packages_in_multiple_projects, group_or_namespace) available_packages_to_user = ::Packages::Npm::PackagesForUserFinder.new( current_user, group_or_namespace, @@ -232,6 +232,8 @@ module API end available_packages = available_packages_to_user + else + authorize_read_package!(project) end not_found!('Packages') if available_packages.empty? diff --git a/lib/api/helpers/packages/npm.rb b/lib/api/helpers/packages/npm.rb index ef3da055b19..c91eef0c4b0 100644 --- a/lib/api/helpers/packages/npm.rb +++ b/lib/api/helpers/packages/npm.rb @@ -64,7 +64,7 @@ module API package_name = params[:package_name] namespace = - if Feature.enabled?(:npm_allow_packages_in_multiple_projects) + if Feature.enabled?(:npm_allow_packages_in_multiple_projects, top_namespace_from(package_name)) top_namespace_from(package_name) else namespace_path = ::Packages::Npm.scope_of(package_name) @@ -94,10 +94,12 @@ module API private def top_namespace_from(package_name) - namespace_path = ::Packages::Npm.scope_of(package_name) - return unless namespace_path + strong_memoize_with(:top_namespace_from, package_name) do + namespace_path = ::Packages::Npm.scope_of(package_name) + next unless namespace_path - Namespace.top_most.by_path(namespace_path) + Namespace.top_most.by_path(namespace_path) + end end def group diff --git a/qa/qa/specs/features/api/4_verify/file_variable_spec.rb b/qa/qa/specs/features/api/4_verify/file_variable_spec.rb index 820505a4610..f0f7bb3f500 100644 --- a/qa/qa/specs/features/api/4_verify/file_variable_spec.rb +++ b/qa/qa/specs/features/api/4_verify/file_variable_spec.rb @@ -66,7 +66,7 @@ module QA end it( - 'does not expose file variable content with echo', + 'does not expose file variable content with echo', :reliable, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/370791' ) do job = create(:job, project: project, id: project.job_by_name('job_echo')[:id]) @@ -81,7 +81,7 @@ module QA end it( - 'can read file variable content with cat', + 'can read file variable content with cat', :reliable, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/386409' ) do job = job = create(:job, project: project, id: project.job_by_name('job_cat')[:id]) diff --git a/qa/qa/specs/features/api/4_verify/job_downloads_artifacts_spec.rb b/qa/qa/specs/features/api/4_verify/job_downloads_artifacts_spec.rb index e15a32084de..ecb7d94d56e 100644 --- a/qa/qa/specs/features/api/4_verify/job_downloads_artifacts_spec.rb +++ b/qa/qa/specs/features/api/4_verify/job_downloads_artifacts_spec.rb @@ -65,7 +65,7 @@ module QA runner.remove_via_api! end - it 'are not downloaded when dependencies array is set to empty', + it 'are not downloaded when dependencies array is set to empty', :reliable, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/424958' do # If this job fails, the 'failed' status of pipeline is no longer helpful # We should exit the test case here diff --git a/qa/qa/specs/features/browser_ui/4_verify/ci_variable/pipeline_with_protected_variable_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/ci_variable/pipeline_with_protected_variable_spec.rb index 2c18d288ccb..d24485280c1 100644 --- a/qa/qa/specs/features/browser_ui/4_verify/ci_variable/pipeline_with_protected_variable_spec.rb +++ b/qa/qa/specs/features/browser_ui/4_verify/ci_variable/pipeline_with_protected_variable_spec.rb @@ -50,7 +50,8 @@ module QA runner.remove_via_api! end - it 'exposes variable on protected branch', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348005' do + it 'exposes variable on protected branch', :reliable, + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348005' do create_protected_branch [developer, maintainer].each do |user| @@ -63,7 +64,8 @@ module QA end end - it 'does not expose variable on unprotected branch', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347664' do + it 'does not expose variable on unprotected branch', :reliable, + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347664' do [developer, maintainer].each do |user| create_merge_request(Runtime::API::Client.new(:gitlab, user: user)) go_to_pipeline_job(user) diff --git a/qa/qa/specs/features/browser_ui/4_verify/ci_variable/prefill_variables_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/ci_variable/prefill_variables_spec.rb index 31b95cb97ae..e80c969a68d 100644 --- a/qa/qa/specs/features/browser_ui/4_verify/ci_variable/prefill_variables_spec.rb +++ b/qa/qa/specs/features/browser_ui/4_verify/ci_variable/prefill_variables_spec.rb @@ -46,7 +46,7 @@ module QA Page::Project::Pipeline::Index.perform(&:click_run_pipeline_button) end - it 'shows only variables with description as prefill variables on the run pipeline page', + it 'shows only variables with description as prefill variables on the run pipeline page', :reliable, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/378977' do Page::Project::Pipeline::New.perform do |new| aggregate_failures do @@ -67,7 +67,7 @@ module QA end end - it 'shows dropdown for variables with description, value, and options defined', + it 'shows dropdown for variables with description, value, and options defined', :reliable, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/383820' do Page::Project::Pipeline::New.perform do |new| aggregate_failures do diff --git a/qa/qa/specs/features/browser_ui/4_verify/ci_variable/raw_variables_defined_in_yaml_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/ci_variable/raw_variables_defined_in_yaml_spec.rb index e5e5852b5f2..c6d9fdb08b3 100644 --- a/qa/qa/specs/features/browser_ui/4_verify/ci_variable/raw_variables_defined_in_yaml_spec.rb +++ b/qa/qa/specs/features/browser_ui/4_verify/ci_variable/raw_variables_defined_in_yaml_spec.rb @@ -77,7 +77,7 @@ module QA end it( - 'expands variables according to expand: true/false', + 'expands variables according to expand: true/false', :reliable, :aggregate_failures, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/381487' ) do diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_a_project_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_a_project_spec.rb index adf397907da..74fed9b6df2 100644 --- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_a_project_spec.rb +++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_a_project_spec.rb @@ -30,7 +30,8 @@ module QA runner.remove_via_api! end - it 'runs the pipeline with composed config', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348087' do + it 'runs the pipeline with composed config', :reliable, + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348087' do Page::Project::Pipeline::Show.perform do |pipeline| aggregate_failures 'pipeline has all expected jobs' do expect(pipeline).to have_job('build') diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_with_image_pull_policy_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_with_image_pull_policy_spec.rb index 126c0bd5d9c..776a2605674 100644 --- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_with_image_pull_policy_spec.rb +++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_with_image_pull_policy_spec.rb @@ -84,7 +84,7 @@ module QA let(:text2) { 'is not one of the allowed_pull_policies ([never])' } it( - 'fails job with policy not allowed message', + 'fails job with policy not allowed message', :reliable, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/368853' ) do visit_job diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_with_manual_jobs_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_with_manual_jobs_spec.rb index b5ebcb9e48a..afb3ae3cbfd 100644 --- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_with_manual_jobs_spec.rb +++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_with_manual_jobs_spec.rb @@ -70,7 +70,7 @@ module QA end it( - 'does not leave any job in skipped state', + 'does not leave any job in skipped state', :reliable, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/349158' ) do Page::Project::Pipeline::Show.perform do |show| diff --git a/qa/qa/specs/features/browser_ui/4_verify/runner/fleet_management/group_runner_counts_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/runner/fleet_management/group_runner_counts_spec.rb index 0173f8bd132..97869f26f36 100644 --- a/qa/qa/specs/features/browser_ui/4_verify/runner/fleet_management/group_runner_counts_spec.rb +++ b/qa/qa/specs/features/browser_ui/4_verify/runner/fleet_management/group_runner_counts_spec.rb @@ -18,7 +18,7 @@ module QA end it( - 'shows group runner counts', + 'shows group runner counts', :reliable, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/421256' ) do Flow::Login.sign_in diff --git a/spec/mailers/emails/pages_domains_spec.rb b/spec/mailers/emails/pages_domains_spec.rb index ff446b83412..88e5d60d6d3 100644 --- a/spec/mailers/emails/pages_domains_spec.rb +++ b/spec/mailers/emails/pages_domains_spec.rb @@ -33,7 +33,7 @@ RSpec.describe Emails::PagesDomains do it 'has the expected content' do is_expected.to have_body_text domain.url - is_expected.to have_body_text help_page_url('user/project/pages/custom_domains_ssl_tls_certification/index.md', anchor: link_anchor) + is_expected.to have_body_text help_page_url('user/project/pages/custom_domains_ssl_tls_certification/index', anchor: link_anchor) end end @@ -112,7 +112,7 @@ RSpec.describe Emails::PagesDomains do it 'says that we failed to obtain certificate' do is_expected.to have_body_text "Something went wrong while obtaining the Let's Encrypt certificate." - is_expected.to have_body_text help_page_url('user/project/pages/custom_domains_ssl_tls_certification/lets_encrypt_integration.md', anchor: 'troubleshooting') + is_expected.to have_body_text help_page_url('user/project/pages/custom_domains_ssl_tls_certification/lets_encrypt_integration', anchor: 'troubleshooting') end end end |