Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
a59d0df85f
commit
7781771ece
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
-
|
||||
|
|
|
|||
|
|
@ -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 }
|
||||
|
||||
|
|
|
|||
|
|
@ -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.")
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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|
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 }
|
||||
|
|
|
|||
|
|
@ -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|
|
||||
|
|
|
|||
|
|
@ -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 }
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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'),
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
||||
|
|
|
|||
|
|
@ -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'),
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 }
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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?
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
|
|
|
|||
|
|
@ -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 }
|
||||
|
||||
|
|
|
|||
|
|
@ -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 }
|
||||
|
|
|
|||
|
|
@ -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 }
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
|
||||
.form-group
|
||||
- help_text = _("When merge requests and commits in the default branch close, any issues they reference also close.")
|
||||
- help_icon = link_to sprite_icon('question-o'), help_page_path('user/project/issues/managing_issues.md', anchor: 'closing-issues-automatically'), target: '_blank', rel: 'noopener noreferrer'
|
||||
- help_icon = link_to sprite_icon('question-o'), help_page_path('user/project/issues/managing_issues', anchor: 'closing-issues-automatically'), target: '_blank', rel: 'noopener noreferrer'
|
||||
= f.gitlab_ui_checkbox_component :autoclose_referenced_issues,
|
||||
s_('ProjectSettings|Auto-close referenced issues on default branch'),
|
||||
help_text: (help_text + " " + help_icon).html_safe
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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 } }
|
||||
|
|
|
|||
|
|
@ -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 } }
|
||||
|
|
|
|||
|
|
@ -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 } }
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 }
|
||||
|
|
|
|||
|
|
@ -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 }
|
||||
|
|
|
|||
|
|
@ -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 }
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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 }
|
||||
|
|
|
|||
|
|
@ -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 }
|
||||
|
|
|
|||
|
|
@ -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|
|
||||
|
|
|
|||
|
|
@ -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 }
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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…')
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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:`.
|
||||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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"`
|
||||
}
|
||||
```
|
||||
|
|
@ -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
|
||||
```
|
||||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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?
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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])
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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|
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue