Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2023-10-30 09:11:40 +00:00
parent a59d0df85f
commit 7781771ece
89 changed files with 876 additions and 228 deletions

View File

@ -88,22 +88,6 @@ variables:
expire_in: 7 days
when: always
download-knapsack-report:
extends:
- .download-knapsack-report
- .rules:download-knapsack
cache-gems:
extends:
- .ruby-image
- .qa-cache-push
- .rules:update-cache
stage: .pre
tags:
- e2e
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.
@ -118,11 +102,33 @@ cache-gems:
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:
- .ruby-image
- .qa-cache-push
- .rules:update-cache
stage: .pre
tags:
- e2e
script:
- cd qa && bundle install
download-fast-quarantine-report:
extends:
- .download-fast-quarantine-report
- .rules:download-fast-quarantine-report
# ==========================================
# Test stage
# ==========================================
gdk-qa-smoke:
extends:
- .gdk-qa-base

View File

@ -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"

View File

@ -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">
-

View File

@ -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 }

View File

@ -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.")

View File

@ -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

View File

@ -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|

View File

@ -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

View File

@ -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,

View File

@ -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

View File

@ -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 }

View File

@ -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|

View File

@ -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 }

View File

@ -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

View File

@ -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'),

View File

@ -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

View File

@ -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'

View File

@ -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'),

View File

@ -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

View File

@ -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 }

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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?

View File

@ -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

View File

@ -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')

View File

@ -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 }

View File

@ -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 }

View File

@ -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 }

View File

@ -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'

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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'

View File

@ -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

View File

@ -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.

View File

@ -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.

View File

@ -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

View File

@ -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')

View File

@ -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')

View File

@ -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'

View File

@ -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 + "&nbsp;" + help_icon).html_safe

View File

@ -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

View File

@ -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,

View File

@ -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 } }

View File

@ -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 } }

View File

@ -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 } }

View File

@ -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')

View File

@ -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'

View File

@ -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'

View File

@ -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

View File

@ -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 }

View File

@ -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 }

View File

@ -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 }

View File

@ -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

View File

@ -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')

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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 }

View File

@ -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 }

View File

@ -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|

View File

@ -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 }

View File

@ -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

View File

@ -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…')

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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')

View File

@ -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:

View File

@ -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:`.

View File

@ -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

View File

@ -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"`
}
```

View File

@ -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
```

View File

@ -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.

View File

@ -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?

View File

@ -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

View File

@ -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])

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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')

View File

@ -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

View File

@ -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|

View File

@ -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

View File

@ -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