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