diff --git a/Gemfile b/Gemfile index d4fc7e03d5a..0eff5a3602e 100644 --- a/Gemfile +++ b/Gemfile @@ -194,7 +194,6 @@ gem 'rouge', '~> 3.30.0' gem 'truncato', '~> 0.7.12' gem 'bootstrap_form', '~> 4.2.0' gem 'nokogiri', '~> 1.13.8' -gem 'escape_utils', '~> 1.1' # Calendar rendering gem 'icalendar' diff --git a/Gemfile.lock b/Gemfile.lock index 550dce622a1..dee5fff36cc 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1601,7 +1601,6 @@ DEPENDENCIES email_reply_trimmer (~> 0.1) email_spec (~> 2.2.0) error_tracking_open_api! - escape_utils (~> 1.1) factory_bot_rails (~> 6.2.0) faraday (~> 1.0) faraday_middleware-aws-sigv4 (~> 0.3.0) diff --git a/app/assets/javascripts/boards/components/board_filtered_search.vue b/app/assets/javascripts/boards/components/board_filtered_search.vue index fa0c798ca9d..11a5d89cc8c 100644 --- a/app/assets/javascripts/boards/components/board_filtered_search.vue +++ b/app/assets/javascripts/boards/components/board_filtered_search.vue @@ -8,6 +8,7 @@ import { __ } from '~/locale'; import { FILTERED_SEARCH_TERM, FILTER_ANY, + TOKEN_TYPE_HEALTH, } from '~/vue_shared/components/filtered_search_bar/constants'; import FilteredSearch from '~/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue'; import { AssigneeFilterType } from '~/boards/constants'; @@ -55,6 +56,7 @@ export default { myReactionEmoji, releaseTag, confidential, + healthStatus, } = this.filterParams; const filteredSearchValue = []; @@ -154,6 +156,13 @@ export default { }); } + if (healthStatus) { + filteredSearchValue.push({ + type: TOKEN_TYPE_HEALTH, + value: { data: healthStatus, operator: '=' }, + }); + } + if (this.filterParams['not[authorUsername]']) { filteredSearchValue.push({ type: 'author', @@ -248,6 +257,7 @@ export default { iterationCadenceId, releaseTag, confidential, + healthStatus, } = this.filterParams; let iteration = iterationId; let cadence = iterationCadenceId; @@ -292,6 +302,7 @@ export default { my_reaction_emoji: myReactionEmoji, release_tag: releaseTag, confidential, + [TOKEN_TYPE_HEALTH]: healthStatus, }, (value) => { if (value || value === false) { @@ -390,6 +401,9 @@ export default { case 'filtered-search-term': if (filter.value.data) plainText.push(filter.value.data); break; + case TOKEN_TYPE_HEALTH: + filterParams.healthStatus = filter.value.data; + break; default: break; } diff --git a/app/assets/javascripts/boards/index.js b/app/assets/javascripts/boards/index.js index 854717ed4c4..a7003edba47 100644 --- a/app/assets/javascripts/boards/index.js +++ b/app/assets/javascripts/boards/index.js @@ -86,6 +86,7 @@ function mountBoardApp(el) { milestoneListsAvailable: parseBoolean(el.dataset.milestoneListsAvailable), assigneeListsAvailable: parseBoolean(el.dataset.assigneeListsAvailable), iterationListsAvailable: parseBoolean(el.dataset.iterationListsAvailable), + healthStatusFeatureAvailable: parseBoolean(el.dataset.healthStatusFeatureAvailable), allowScopedLabels: parseBoolean(el.dataset.scopedLabels), swimlanesFeatureAvailable: gon.licensed_features?.swimlanes, multipleIssueBoardsAvailable: parseBoolean(el.dataset.multipleBoardsAvailable), diff --git a/app/assets/javascripts/issues/list/constants.js b/app/assets/javascripts/issues/list/constants.js index 747a56299b1..9fe8899ab39 100644 --- a/app/assets/javascripts/issues/list/constants.js +++ b/app/assets/javascripts/issues/list/constants.js @@ -7,6 +7,7 @@ import { FILTER_UPCOMING, OPERATOR_IS, OPERATOR_IS_NOT, + TOKEN_TYPE_HEALTH, } from '~/vue_shared/components/filtered_search_bar/constants'; import { WORK_ITEM_TYPE_ENUM_INCIDENT, @@ -148,7 +149,6 @@ export const TOKEN_TYPE_EPIC = 'epic_id'; export const TOKEN_TYPE_WEIGHT = 'weight'; export const TOKEN_TYPE_CONTACT = 'crm_contact'; export const TOKEN_TYPE_ORGANIZATION = 'crm_organization'; -export const TOKEN_TYPE_HEALTH = 'health_status'; export const TYPE_TOKEN_TASK_OPTION = { icon: 'issue-type-task', title: 'task', value: 'task' }; diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js b/app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js index ffe09634a3b..4873996d357 100644 --- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js +++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js @@ -56,3 +56,9 @@ export const TOKEN_TITLE_MY_REACTION = __('My-Reaction'); export const TOKEN_TITLE_ORGANIZATION = s__('Crm|Organization'); export const TOKEN_TITLE_RELEASE = __('Release'); export const TOKEN_TITLE_TYPE = __('Type'); + +// As health status gets reused between issue lists and boards +// this is in the shared constants. Until we have not decoupled the EE filtered search bar +// from the CE component, we need to keep this in the CE code. +// https://gitlab.com/gitlab-org/gitlab/-/issues/377838 +export const TOKEN_TYPE_HEALTH = 'health_status'; diff --git a/app/models/integrations/harbor.rb b/app/models/integrations/harbor.rb index 53e53335683..01a04743d5d 100644 --- a/app/models/integrations/harbor.rb +++ b/app/models/integrations/harbor.rb @@ -3,14 +3,33 @@ require 'uri' module Integrations class Harbor < Integration - prop_accessor :url, :project_name, :username, :password - validates :url, public_url: true, presence: true, addressable_url: { allow_localhost: false, allow_local_network: false }, if: :activated? validates :project_name, presence: true, if: :activated? validates :username, presence: true, if: :activated? validates :password, format: { with: ::Ci::Maskable::REGEX }, if: :activated? - before_validation :reset_username_and_password + field :url, + title: -> { s_('HarborIntegration|Harbor URL') }, + placeholder: 'https://demo.goharbor.io', + help: -> { s_('HarborIntegration|Base URL of the Harbor instance.') }, + exposes_secrets: true, + required: true + + field :project_name, + title: -> { s_('HarborIntegration|Harbor project name') }, + help: -> { s_('HarborIntegration|The name of the project in Harbor.') } + + field :username, + title: -> { s_('HarborIntegration|Harbor username') }, + required: true + + field :password, + type: 'password', + title: -> { s_('HarborIntegration|Harbor password') }, + help: -> { s_('HarborIntegration|Password for your Harbor username.') }, + non_empty_password_title: -> { s_('HarborIntegration|Enter new Harbor password') }, + non_empty_password_help: -> { s_('HarborIntegration|Leave blank to use your current password.') }, + required: true def title 'Harbor' @@ -46,40 +65,6 @@ module Integrations client.ping end - def fields - [ - { - type: 'text', - name: 'url', - title: s_('HarborIntegration|Harbor URL'), - placeholder: 'https://demo.goharbor.io', - help: s_('HarborIntegration|Base URL of the Harbor instance.'), - required: true - }, - { - type: 'text', - name: 'project_name', - title: s_('HarborIntegration|Harbor project name'), - help: s_('HarborIntegration|The name of the project in Harbor.') - }, - { - type: 'text', - name: 'username', - title: s_('HarborIntegration|Harbor username'), - required: true - }, - { - type: 'password', - name: 'password', - title: s_('HarborIntegration|Harbor password'), - help: s_('HarborIntegration|Password for your Harbor username.'), - non_empty_password_title: s_('HarborIntegration|Enter new Harbor password'), - non_empty_password_help: s_('HarborIntegration|Leave blank to use your current password.'), - required: true - } - ] - end - def ci_variables return [] unless activated? @@ -100,15 +85,5 @@ module Integrations def client @client ||= ::Gitlab::Harbor::Client.new(self) end - - def reset_username_and_password - if url_changed? && !password_touched? - self.password = nil - end - - if url_changed? && !username_touched? - self.username = nil - end - end end end diff --git a/doc/ci/jobs/job_control.md b/doc/ci/jobs/job_control.md index ad00cad544b..39ab0998291 100644 --- a/doc/ci/jobs/job_control.md +++ b/doc/ci/jobs/job_control.md @@ -624,8 +624,9 @@ by authorized users. Use [`when: delayed`](../yaml/index.md#when) to execute scripts after a waiting period, or if you want to avoid jobs immediately entering the `pending` state. -You can set the period with `start_in` keyword. The value of `start_in` is an elapsed time in seconds, unless a unit is -provided. `start_in` must be less than or equal to one week. Examples of valid values include: +You can set the period with `start_in` keyword. The value of `start_in` is an elapsed time +in seconds, unless a unit is provided. The minimum is one second, and the maximum is one week. +Examples of valid values include: - `'5'` (a value with no unit must be surrounded by single quotes) - `5 seconds` diff --git a/doc/subscriptions/gitlab_dedicated/index.md b/doc/subscriptions/gitlab_dedicated/index.md index ae70a673349..441a4d2aa30 100644 --- a/doc/subscriptions/gitlab_dedicated/index.md +++ b/doc/subscriptions/gitlab_dedicated/index.md @@ -27,42 +27,59 @@ GitLab Dedicated enables you to offload the operational overhead of managing the - Upgrades: - Monthly upgrades tracking one release behind the latest (n-1), with the latest security release. - Out of band security patches provided for high severity releases. -- Backups: regular backups taken and tested. -- Choice of cloud region: upon onboarding, choose the cloud region where you want to deploy your instance. Some AWS regions have limited features and as a result, we are not able to deploy production instances to those regions. See below for the [full list of regions](#aws-regions-not-supported) not currently supported. +- Backups: Regular backups taken and tested. +- Choice of cloud region: Upon onboarding, choose the cloud region where you want to deploy your instance. Some AWS regions have limited features and as a result, we are not able to deploy production instances to those regions. See below for the [full list of regions](#aws-regions-not-supported) not currently supported. - Security: Data encrypted at rest and in transit using latest encryption standards. -- Application: Self-managed [Ultimate feature set](https://about.gitlab.com/pricing/self-managed/feature-comparison/) with the exception of the unsupported features [listed below](#features-not-available-at-launch). +- Application: Self-managed [Ultimate feature set](https://about.gitlab.com/pricing/self-managed/feature-comparison/) with the exception of the unsupported features [listed below](#features-that-are-not-available). -## Features not available at launch +## Features that are not available -Features that are not available but we plan to support in the future: +### GitLab application features -- LDAP, Smartcard, Kerberos authentication -- Custom domain +The following GitLab application features are not available: + +- LDAP, Smartcard, or Kerberos authentication +- Multiple login providers - Advanced Search -- Pages -- GitLab-managed runners -- FortiAuthenticator/FortiToken 2FA +- GitLab Pages +- FortiAuthenticator, or FortiToken 2FA - Reply-by email - Service Desk -- Any feature not listed [above](#available-features) which needs to be configured outside of the web interface. +- GitLab-managed runners +- Any feature [not listed above](#available-features) which must be configured outside of the GitLab user interface. -Features that we do not plan to offer at all: +The following features will not be supported: - Mattermost -- Server-side Git Hooks +- Server-side Git hooks + +### Dedicated service features + +The following operational features are not available: + +- Custom domains +- Bring Your Own Key (BYOK) encryption +- Multiple Geo secondaries (Geo replicas) beyond the secondary site included by default +- Self-serve purchasing and configuration +- Multiple login providers +- Non-AWS cloud providers, such as GCP or Azure ### AWS regions not supported -The following AWS regions are not available at launch: +The following AWS regions are not available: -- Jakarta (ap-southeast-3) -- Bahrain (me-south-1) -- Hong Kong (ap-east-1) -- Cape Town (af-south-1) -- Milan (eu-south-1) -- Paris (eu-west-3) +- Jakarta (`ap-southeast-3`) +- Bahrain (`me-south-1`) +- Hong Kong (`ap-east-1`) +- Cape Town (`af-south-1`) +- Milan (`eu-south-1`) +- Paris (`eu-west-3`) - GovCloud +## Planned features + +Learn more about the planned improvements to Dedicated on the public [direction page](https://about.gitlab.com/direction/saas-platforms/dedicated/). + ## Contact us Fill in the following form to contact us and learn more about this offering. diff --git a/glfm_specification/example_snapshots/examples_index.yml b/glfm_specification/example_snapshots/examples_index.yml index fd3e350f58a..c0739912399 100644 --- a/glfm_specification/example_snapshots/examples_index.yml +++ b/glfm_specification/example_snapshots/examples_index.yml @@ -2012,75 +2012,75 @@ 06_15_00__inlines__textual_content__003: spec_txt_example_position: 673 source_specification: commonmark -07_01_00__gitlab_specific_markdown__footnotes__001: +07_01_00__gitlab_official_specification_markdown__footnotes__001: spec_txt_example_position: 674 source_specification: gitlab -07_02_00__gitlab_specific_markdown__task_list_items__001: +07_02_00__gitlab_official_specification_markdown__task_list_items__001: spec_txt_example_position: 675 source_specification: gitlab -07_02_00__gitlab_specific_markdown__task_list_items__002: +07_02_00__gitlab_official_specification_markdown__task_list_items__002: spec_txt_example_position: 676 source_specification: gitlab -07_02_00__gitlab_specific_markdown__task_list_items__003: +07_02_00__gitlab_official_specification_markdown__task_list_items__003: spec_txt_example_position: 677 source_specification: gitlab -07_02_00__gitlab_specific_markdown__task_list_items__004: +07_02_00__gitlab_official_specification_markdown__task_list_items__004: spec_txt_example_position: 678 source_specification: gitlab -07_03_00__gitlab_specific_markdown__front_matter__001: +07_03_00__gitlab_official_specification_markdown__front_matter__001: spec_txt_example_position: 679 source_specification: gitlab -07_03_00__gitlab_specific_markdown__front_matter__002: +07_03_00__gitlab_official_specification_markdown__front_matter__002: spec_txt_example_position: 680 source_specification: gitlab -07_03_00__gitlab_specific_markdown__front_matter__003: +07_03_00__gitlab_official_specification_markdown__front_matter__003: spec_txt_example_position: 681 source_specification: gitlab -07_03_00__gitlab_specific_markdown__front_matter__004: +07_03_00__gitlab_official_specification_markdown__front_matter__004: spec_txt_example_position: 682 source_specification: gitlab -07_03_00__gitlab_specific_markdown__front_matter__005: +07_03_00__gitlab_official_specification_markdown__front_matter__005: spec_txt_example_position: 683 source_specification: gitlab -07_04_00__gitlab_specific_markdown__audio__001: +07_04_00__gitlab_official_specification_markdown__table_of_contents__001: spec_txt_example_position: 684 source_specification: gitlab -07_04_00__gitlab_specific_markdown__audio__002: +07_04_00__gitlab_official_specification_markdown__table_of_contents__002: spec_txt_example_position: 685 source_specification: gitlab -07_05_00__gitlab_specific_markdown__video__001: +07_04_00__gitlab_official_specification_markdown__table_of_contents__003: spec_txt_example_position: 686 source_specification: gitlab -07_05_00__gitlab_specific_markdown__video__002: +07_04_00__gitlab_official_specification_markdown__table_of_contents__004: spec_txt_example_position: 687 source_specification: gitlab -07_06_00__gitlab_specific_markdown__table_of_contents__001: +08_01_00__gitlab_internal_extension_markdown__audio__001: spec_txt_example_position: 688 source_specification: gitlab -07_06_00__gitlab_specific_markdown__table_of_contents__002: +08_01_00__gitlab_internal_extension_markdown__audio__002: spec_txt_example_position: 689 source_specification: gitlab -07_06_00__gitlab_specific_markdown__table_of_contents__003: +08_02_00__gitlab_internal_extension_markdown__video__001: spec_txt_example_position: 690 source_specification: gitlab -07_06_00__gitlab_specific_markdown__table_of_contents__004: +08_02_00__gitlab_internal_extension_markdown__video__002: spec_txt_example_position: 691 source_specification: gitlab -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__001: +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__001: spec_txt_example_position: 692 source_specification: gitlab -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__002: +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__002: spec_txt_example_position: 693 source_specification: gitlab -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__003: +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__003: spec_txt_example_position: 694 source_specification: gitlab -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__004: +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__004: spec_txt_example_position: 695 source_specification: gitlab -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__005: +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__005: spec_txt_example_position: 696 source_specification: gitlab -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__006: +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__006: spec_txt_example_position: 697 source_specification: gitlab diff --git a/glfm_specification/example_snapshots/html.yml b/glfm_specification/example_snapshots/html.yml index e683c37a7ac..ef2ba39f925 100644 --- a/glfm_specification/example_snapshots/html.yml +++ b/glfm_specification/example_snapshots/html.yml @@ -7638,7 +7638,7 @@

Multiple spaces

wysiwyg: |-

Multiple spaces

-07_01_00__gitlab_specific_markdown__footnotes__001: +07_01_00__gitlab_official_specification_markdown__footnotes__001: canonical: |

footnote reference tag @@ -7671,7 +7671,7 @@ wysiwyg: |-

footnote reference tag fortytwo

footnote text

-07_02_00__gitlab_specific_markdown__task_list_items__001: +07_02_00__gitlab_official_specification_markdown__task_list_items__001: canonical: | wysiwyg: |- -07_02_00__gitlab_specific_markdown__task_list_items__002: +07_02_00__gitlab_official_specification_markdown__task_list_items__002: canonical: | wysiwyg: |- -07_02_00__gitlab_specific_markdown__task_list_items__003: +07_02_00__gitlab_official_specification_markdown__task_list_items__003: canonical: | - wysiwyg: |- - -07_02_00__gitlab_specific_markdown__task_list_items__004: +07_02_00__gitlab_official_specification_markdown__task_list_items__004: canonical: | - wysiwyg: |- - Inapplicable task list items not yet implemented for WYSYWIG -07_03_00__gitlab_specific_markdown__front_matter__001: +07_03_00__gitlab_official_specification_markdown__front_matter__001: canonical: |
     
@@ -7761,7 +7757,7 @@
     
   wysiwyg: |-
     
title: YAML front matter
-07_03_00__gitlab_specific_markdown__front_matter__002: +07_03_00__gitlab_official_specification_markdown__front_matter__002: canonical: |
     
@@ -7775,7 +7771,7 @@
     
   wysiwyg: |-
     
title: TOML front matter
-07_03_00__gitlab_specific_markdown__front_matter__003: +07_03_00__gitlab_official_specification_markdown__front_matter__003: canonical: |
     
@@ -7795,7 +7791,7 @@
     
{
       "title": "JSON front matter"
     }
-07_03_00__gitlab_specific_markdown__front_matter__004: +07_03_00__gitlab_official_specification_markdown__front_matter__004: canonical: |

text


@@ -7809,7 +7805,7 @@

text


title: YAML front matter

-07_03_00__gitlab_specific_markdown__front_matter__005: +07_03_00__gitlab_official_specification_markdown__front_matter__005: canonical: |

title: YAML front matter

@@ -7820,37 +7816,7 @@ wysiwyg: |-

title: YAML front matter

-07_04_00__gitlab_specific_markdown__audio__001: - canonical: | -

- static: |- -

audio title

- wysiwyg: |- -

audio

-07_04_00__gitlab_specific_markdown__audio__002: - canonical: | -

- static: |- -

audio title

- wysiwyg: |- -
[audio]: audio.oga "audio title"
-

audio

-07_05_00__gitlab_specific_markdown__video__001: - canonical: | -

- static: |- -

video title

- wysiwyg: |- -

video

-07_05_00__gitlab_specific_markdown__video__002: - canonical: | -

- static: |- -

video title

- wysiwyg: |- -
[video]: video.mov "video title"
-

video

-07_06_00__gitlab_specific_markdown__table_of_contents__001: +07_04_00__gitlab_official_specification_markdown__table_of_contents__001: canonical: |