summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2023-05-09 18:09:11 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2023-05-09 18:09:11 +0000
commitd23f33082ad893fad172b17f1ce66bd847671d56 (patch)
treebdffb3f1a3f4855d2a9a7f8762f2812366c75a41
parent3670ddd229b178c0a2e09a1466ddfd7fd2f7855d (diff)
downloadgitlab-ce-d23f33082ad893fad172b17f1ce66bd847671d56.tar.gz
Add latest changes from gitlab-org/gitlab@master
-rw-r--r--.gitlab/merge_request_templates/Stable Branch.md7
-rw-r--r--.rubocop_todo/gitlab/namespaced_class.yml1
-rw-r--r--.rubocop_todo/layout/argument_alignment.yml9
-rw-r--r--.rubocop_todo/search/namespaced_class.yml1
-rw-r--r--.rubocop_todo/sidekiq_load_balancing/worker_data_consistency.yml1
-rw-r--r--app/assets/javascripts/nav/components/new_nav_toggle.vue5
-rw-r--r--app/assets/javascripts/sentry/index.js5
-rw-r--r--app/assets/javascripts/super_sidebar/components/nav_item.vue11
-rw-r--r--app/assets/javascripts/super_sidebar/components/user_menu.vue10
-rw-r--r--app/assets/javascripts/vue_shared/components/source_viewer/constants.js9
-rw-r--r--app/assets/stylesheets/framework/super_sidebar.scss7
-rw-r--r--app/controllers/profiles/chat_names_controller.rb9
-rw-r--r--app/helpers/application_settings_helper.rb5
-rw-r--r--app/helpers/auth_helper.rb2
-rw-r--r--app/helpers/sidebars_helper.rb13
-rw-r--r--app/views/admin/application_settings/_slack.html.haml33
-rw-r--r--app/views/groups/edit.html.haml3
-rw-r--r--app/views/projects/edit.html.haml2
-rw-r--r--config/feature_flags/development/ci_namespace_catalog_experimental.yml (renamed from config/feature_flags/development/ci_private_catalog_beta.yml)2
-rw-r--r--config/feature_flags/development/create_runner_workflow_for_admin.yml2
-rw-r--r--config/feature_flags/development/create_runner_workflow_for_namespace.yml2
-rw-r--r--config/feature_flags/development/fix_dora_deployment_frequency_calculation.yml2
-rw-r--r--config/feature_flags/development/vsa_group_and_project_parity.yml2
-rw-r--r--config/sidekiq_queues.yml2
-rw-r--r--data/removals/16_0/16-0-source-code-branch-push.yml16
-rw-r--r--doc/administration/auth/oidc.md45
-rw-r--r--doc/administration/packages/container_registry.md7
-rw-r--r--doc/administration/pages/source.md7
-rw-r--r--doc/administration/redis/replication_and_failover_external.md4
-rw-r--r--doc/api/branches.md2
-rw-r--r--doc/api/members.md5
-rw-r--r--doc/api/namespaces.md6
-rw-r--r--doc/api/secure_files.md4
-rw-r--r--doc/api/settings.md10
-rw-r--r--doc/ci/quick_start/tutorial.md2
-rw-r--r--doc/ci/runners/register_runner.md65
-rw-r--r--doc/development/geo.md4
-rw-r--r--doc/development/gitaly.md3
-rw-r--r--doc/development/integrations/secure.md2
-rw-r--r--doc/development/testing_guide/end_to_end/resources.md2
-rw-r--r--doc/install/aws/manual_install_aws.md10
-rw-r--r--doc/install/installation.md2
-rw-r--r--doc/operations/metrics/dashboards/panel_types.md2
-rw-r--r--doc/topics/autodevops/stages.md2
-rw-r--r--doc/update/removals.md8
-rw-r--r--doc/user/ai_features.md28
-rw-r--r--doc/user/analytics/dora_metrics.md17
-rw-r--r--doc/user/group/epics/epic_boards.md2
-rw-r--r--doc/user/group/insights/index.md2
-rw-r--r--doc/user/group/manage.md28
-rw-r--r--doc/user/group/value_stream_analytics/index.md19
-rw-r--r--doc/user/packages/container_registry/authenticate_with_container_registry.md2
-rw-r--r--doc/user/product_analytics/index.md2
-rw-r--r--doc/user/project/img/issue_board_system_notes_v13_6.pngbin8554 -> 0 bytes
-rw-r--r--doc/user/project/img/protected_tags_list_v12_3.pngbin4395 -> 0 bytes
-rw-r--r--doc/user/project/img/protected_tags_page_v12_3.pngbin10431 -> 0 bytes
-rw-r--r--doc/user/project/img/protected_tags_permissions_dropdown_v12_3.pngbin4517 -> 0 bytes
-rw-r--r--doc/user/project/issue_board.md39
-rw-r--r--doc/user/project/labels.md2
-rw-r--r--doc/user/project/protected_branches.md2
-rw-r--r--doc/user/project/protected_tags.md28
-rw-r--r--doc/user/project/releases/index.md2
-rw-r--r--doc/user/search/exact_code_search.md2
-rw-r--r--lib/api/entities/ci/secure_file.rb2
-rw-r--r--lib/gitlab/ci/secure_files/cer.rb2
-rw-r--r--lib/gitlab/ci/secure_files/p12.rb2
-rw-r--r--lib/sidebars/groups/menus/issues_menu.rb3
-rw-r--r--lib/sidebars/groups/menus/merge_requests_menu.rb3
-rw-r--r--lib/sidebars/groups/super_sidebar_menus/code_menu.rb26
-rw-r--r--lib/sidebars/groups/super_sidebar_menus/plan_menu.rb2
-rw-r--r--lib/sidebars/groups/super_sidebar_panel.rb1
-rw-r--r--lib/sidebars/projects/menus/issues_menu.rb3
-rw-r--r--lib/sidebars/projects/menus/merge_requests_menu.rb3
-rw-r--r--lib/sidebars/projects/super_sidebar_menus/code_menu.rb1
-rw-r--r--lib/sidebars/projects/super_sidebar_menus/plan_menu.rb1
-rw-r--r--locale/gitlab.pot12
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/web_ide/add_new_directory_in_web_ide_spec.rb9
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/runner/register_group_runner_spec.rb7
-rw-r--r--scripts/api/get_package_and_test_job.rb30
-rwxr-xr-xscripts/generate-failed-package-and-test-mr-message.rb16
-rw-r--r--spec/controllers/admin/application_settings_controller_spec.rb21
-rw-r--r--spec/features/admin/admin_settings_spec.rb26
-rw-r--r--spec/features/nav/pinned_nav_items_spec.rb30
-rw-r--r--spec/features/profiles/chat_names_spec.rb25
-rw-r--r--spec/frontend/ci_secure_files/components/metadata/__snapshots__/modal_spec.js.snap2
-rw-r--r--spec/frontend/ci_secure_files/mock_data.js4
-rw-r--r--spec/frontend/sentry/index_spec.js45
-rw-r--r--spec/frontend/super_sidebar/components/user_menu_spec.js2
-rw-r--r--spec/frontend/vue_shared/components/source_viewer/source_viewer_deprecated_spec.js19
-rw-r--r--spec/helpers/application_settings_helper_spec.rb6
-rw-r--r--spec/lib/gitlab/ci/secure_files/cer_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/secure_files/p12_spec.rb2
-rw-r--r--spec/lib/sidebars/groups/menus/issues_menu_spec.rb3
-rw-r--r--spec/lib/sidebars/groups/menus/merge_requests_menu_spec.rb3
-rw-r--r--spec/lib/sidebars/groups/super_sidebar_menus/plan_menu_spec.rb2
-rw-r--r--spec/lib/sidebars/groups/super_sidebar_panel_spec.rb1
-rw-r--r--spec/lib/sidebars/projects/menus/issues_menu_spec.rb3
-rw-r--r--spec/lib/sidebars/projects/menus/merge_requests_menu_spec.rb3
-rw-r--r--spec/lib/sidebars/projects/super_sidebar_menus/code_menu_spec.rb1
-rw-r--r--spec/lib/sidebars/projects/super_sidebar_menus/plan_menu_spec.rb1
-rw-r--r--spec/models/ci/secure_file_spec.rb4
-rw-r--r--spec/models/repository_spec.rb219
-rw-r--r--spec/models/resource_state_event_spec.rb14
-rw-r--r--spec/models/snippet_spec.rb24
-rw-r--r--spec/models/spam_log_spec.rb3
-rw-r--r--spec/models/upload_spec.rb8
-rw-r--r--spec/models/user_detail_spec.rb20
-rw-r--r--spec/models/user_spec.rb68
-rw-r--r--spec/models/wiki_page/meta_spec.rb10
-rw-r--r--spec/requests/api/ci/secure_files_spec.rb2
-rw-r--r--spec/requests/api/settings_spec.rb15
-rw-r--r--spec/scripts/api/get_package_and_test_job_spec.rb146
112 files changed, 967 insertions, 418 deletions
diff --git a/.gitlab/merge_request_templates/Stable Branch.md b/.gitlab/merge_request_templates/Stable Branch.md
index 949aa6386ab..b9980785d40 100644
--- a/.gitlab/merge_request_templates/Stable Branch.md
+++ b/.gitlab/merge_request_templates/Stable Branch.md
@@ -23,14 +23,13 @@ This checklist encourages us to confirm any changes have been analyzed to reduce
#### Note to the merge request author and maintainer
-The process of backporting bug fixes into stable branches is tracked as part of an
-[internal pilot]. If you have questions about this process, please:
+If you have questions about the patch release process, please:
-* Refer to the [internal pilot] issue for feedback or questions.
* Refer to the [patch release runbook for engineers and maintainers] for guidance.
+* Ask questions on the [`#releases`] Slack channel (internal only).
[severity label]: https://about.gitlab.com/handbook/engineering/quality/issue-triage/#severity
-[internal pilot]: https://gitlab.com/gitlab-com/gl-infra/delivery/-/issues/2886
[patch release runbook for engineers and maintainers]: https://gitlab.com/gitlab-org/release/docs/-/blob/master/general/patch/process_new.md
+[`#releases`]: https://gitlab.slack.com/archives/C0XM5UU6B
/assign me
diff --git a/.rubocop_todo/gitlab/namespaced_class.yml b/.rubocop_todo/gitlab/namespaced_class.yml
index cf10ee8b2dc..b7982123489 100644
--- a/.rubocop_todo/gitlab/namespaced_class.yml
+++ b/.rubocop_todo/gitlab/namespaced_class.yml
@@ -1048,6 +1048,7 @@ Gitlab/NamespacedClass:
- 'ee/app/workers/elastic_namespace_indexer_worker.rb'
- 'ee/app/workers/elastic_namespace_rollout_worker.rb'
- 'ee/app/workers/elastic_remove_expired_namespace_subscriptions_from_index_cron_worker.rb'
+ - 'ee/app/workers/elastic_wiki_indexer_worker.rb'
- 'ee/app/workers/geo_repository_destroy_worker.rb'
- 'ee/app/workers/group_saml_group_sync_worker.rb'
- 'ee/app/workers/historical_data_worker.rb'
diff --git a/.rubocop_todo/layout/argument_alignment.yml b/.rubocop_todo/layout/argument_alignment.yml
index a54bd87b1ae..b89002da1b2 100644
--- a/.rubocop_todo/layout/argument_alignment.yml
+++ b/.rubocop_todo/layout/argument_alignment.yml
@@ -2224,15 +2224,6 @@ Layout/ArgumentAlignment:
- 'spec/models/project_team_spec.rb'
- 'spec/models/release_spec.rb'
- 'spec/models/remote_mirror_spec.rb'
- - 'spec/models/repository_spec.rb'
- - 'spec/models/resource_state_event_spec.rb'
- - 'spec/models/snippet_spec.rb'
- - 'spec/models/spam_log_spec.rb'
- - 'spec/models/u2f_registration_spec.rb'
- - 'spec/models/upload_spec.rb'
- - 'spec/models/user_detail_spec.rb'
- - 'spec/models/user_spec.rb'
- - 'spec/models/wiki_page/meta_spec.rb'
- 'spec/requests/admin/applications_controller_spec.rb'
- 'spec/requests/admin/impersonation_tokens_controller_spec.rb'
- 'spec/requests/api/access_requests_spec.rb'
diff --git a/.rubocop_todo/search/namespaced_class.yml b/.rubocop_todo/search/namespaced_class.yml
index f057e2b9552..ad27603ad47 100644
--- a/.rubocop_todo/search/namespaced_class.yml
+++ b/.rubocop_todo/search/namespaced_class.yml
@@ -74,6 +74,7 @@ Search/NamespacedClass:
- 'ee/app/workers/elastic_namespace_indexer_worker.rb'
- 'ee/app/workers/elastic_namespace_rollout_worker.rb'
- 'ee/app/workers/elastic_remove_expired_namespace_subscriptions_from_index_cron_worker.rb'
+ - 'ee/app/workers/elastic_wiki_indexer_worker.rb'
- 'ee/app/workers/zoekt/indexer_worker.rb'
- 'ee/lib/api/elasticsearch_indexed_namespaces.rb'
- 'ee/lib/ee/api/helpers/search_helpers.rb'
diff --git a/.rubocop_todo/sidekiq_load_balancing/worker_data_consistency.yml b/.rubocop_todo/sidekiq_load_balancing/worker_data_consistency.yml
index 2f208c080c3..0c5bd61d580 100644
--- a/.rubocop_todo/sidekiq_load_balancing/worker_data_consistency.yml
+++ b/.rubocop_todo/sidekiq_load_balancing/worker_data_consistency.yml
@@ -353,6 +353,7 @@ SidekiqLoadBalancing/WorkerDataConsistency:
- 'ee/app/workers/elastic_namespace_indexer_worker.rb'
- 'ee/app/workers/elastic_namespace_rollout_worker.rb'
- 'ee/app/workers/elastic_remove_expired_namespace_subscriptions_from_index_cron_worker.rb'
+ - 'ee/app/workers/elastic_wiki_indexer_worker.rb'
- 'ee/app/workers/emails/abandoned_trial_emails_cron_worker.rb'
- 'ee/app/workers/epics/new_epic_issue_worker.rb'
- 'ee/app/workers/epics/update_cached_metadata_worker.rb'
diff --git a/app/assets/javascripts/nav/components/new_nav_toggle.vue b/app/assets/javascripts/nav/components/new_nav_toggle.vue
index 5eb5e5b9b90..9db123da405 100644
--- a/app/assets/javascripts/nav/components/new_nav_toggle.vue
+++ b/app/assets/javascripts/nav/components/new_nav_toggle.vue
@@ -1,5 +1,5 @@
<script>
-import { GlBadge, GlToggle, GlDisclosureDropdownItem } from '@gitlab/ui';
+import { GlToggle, GlDisclosureDropdownItem } from '@gitlab/ui';
import axios from '~/lib/utils/axios_utils';
import { createAlert } from '~/alert';
import { s__ } from '~/locale';
@@ -7,7 +7,6 @@ import Tracking from '~/tracking';
export default {
i18n: {
- badgeLabel: s__('NorthstarNavigation|Beta'),
sectionTitle: s__('NorthstarNavigation|Navigation redesign'),
toggleMenuItemLabel: s__('NorthstarNavigation|New navigation'),
toggleLabel: s__('NorthstarNavigation|Toggle new navigation'),
@@ -16,7 +15,6 @@ export default {
),
},
components: {
- GlBadge,
GlToggle,
GlDisclosureDropdownItem,
},
@@ -83,7 +81,6 @@ export default {
class="gl-px-4 gl-py-2 gl-display-flex gl-justify-content-space-between gl-align-items-center"
>
<b>{{ $options.i18n.sectionTitle }}</b>
- <gl-badge variant="info">{{ $options.i18n.badgeLabel }}</gl-badge>
</div>
<div
diff --git a/app/assets/javascripts/sentry/index.js b/app/assets/javascripts/sentry/index.js
index 5539a061726..ea835945aa9 100644
--- a/app/assets/javascripts/sentry/index.js
+++ b/app/assets/javascripts/sentry/index.js
@@ -15,8 +15,9 @@ const index = function index() {
: [gon.gitlab_url, 'webpack-internal://'],
release: gon.revision,
tags: {
- revision: gon.revision,
- feature_category: gon.feature_category,
+ revision: gon?.revision,
+ feature_category: gon?.feature_category,
+ page: document?.body?.dataset?.page,
},
});
};
diff --git a/app/assets/javascripts/super_sidebar/components/nav_item.vue b/app/assets/javascripts/super_sidebar/components/nav_item.vue
index a4bbd87b34a..9dc26ad10f5 100644
--- a/app/assets/javascripts/super_sidebar/components/nav_item.vue
+++ b/app/assets/javascripts/super_sidebar/components/nav_item.vue
@@ -136,12 +136,17 @@ export default {
</div>
</div>
<slot name="actions"></slot>
- <span v-if="hasPill || isPinnable" class="gl-flex-grow-1 gl-text-right gl-mr-3">
- <gl-badge v-if="hasPill" size="sm" variant="neutral">
+ <span v-if="hasPill || isPinnable" class="gl-flex-grow-1 gl-text-right gl-mr-3 gl-relative">
+ <gl-badge
+ v-if="hasPill"
+ size="sm"
+ variant="neutral"
+ class="count-pill gl-absolute gl-right-0"
+ >
{{ pillData }}
</gl-badge>
<gl-button
- v-else-if="isPinnable && !isPinned"
+ v-if="isPinnable && !isPinned"
size="small"
category="tertiary"
icon="thumbtack"
diff --git a/app/assets/javascripts/super_sidebar/components/user_menu.vue b/app/assets/javascripts/super_sidebar/components/user_menu.vue
index b8a654124e9..cd5a83c86cc 100644
--- a/app/assets/javascripts/super_sidebar/components/user_menu.vue
+++ b/app/assets/javascripts/super_sidebar/components/user_menu.vue
@@ -1,7 +1,6 @@
<script>
import {
GlAvatar,
- GlBadge,
GlDisclosureDropdown,
GlDisclosureDropdownGroup,
GlDisclosureDropdownItem,
@@ -19,10 +18,9 @@ import UserNameGroup from './user_name_group.vue';
const DROPDOWN_X_OFFSET = -211;
export default {
- feedbackUrl: 'https://gitlab.com/gitlab-org/gitlab/-/issues/403059',
+ feedbackUrl: 'https://gitlab.com/gitlab-org/gitlab/-/issues/409005',
i18n: {
newNavigation: {
- badgeLabel: s__('NorthstarNavigation|Beta'),
sectionTitle: s__('NorthstarNavigation|Navigation redesign'),
},
setStatus: s__('SetStatusModal|Set status'),
@@ -38,7 +36,6 @@ export default {
},
components: {
GlAvatar,
- GlBadge,
GlDisclosureDropdown,
GlDisclosureDropdownGroup,
GlDisclosureDropdownItem,
@@ -140,7 +137,7 @@ export default {
extraAttrs: {
target: '_blank',
...USER_MENU_TRACKING_DEFAULTS,
- 'data-track-label': 'provide_nav_beta_feedback',
+ 'data-track-label': 'provide_nav_feedback',
},
};
},
@@ -320,9 +317,6 @@ export default {
<gl-disclosure-dropdown-group bordered>
<template #group-label>
<span class="gl-font-sm">{{ $options.i18n.newNavigation.sectionTitle }}</span>
- <gl-badge size="sm" variant="info"
- >{{ $options.i18n.newNavigation.badgeLabel }}
- </gl-badge>
</template>
<new-nav-toggle :endpoint="toggleNewNavEndpoint" enabled new-navigation />
<gl-disclosure-dropdown-item :item="feedbackItem" data-testid="feedback-item" />
diff --git a/app/assets/javascripts/vue_shared/components/source_viewer/constants.js b/app/assets/javascripts/vue_shared/components/source_viewer/constants.js
index 514b626ed95..58db1ceda95 100644
--- a/app/assets/javascripts/vue_shared/components/source_viewer/constants.js
+++ b/app/assets/javascripts/vue_shared/components/source_viewer/constants.js
@@ -141,6 +141,9 @@ export const BIDI_CHARS_CLASS_LIST = 'unicode-bidi has-tooltip';
export const BIDI_CHAR_TOOLTIP = 'Potentially unwanted character detected: Unicode BiDi Control';
-// We fallback to highlighting these languages with Rouge, see the following issue for more detail:
-// https://gitlab.com/gitlab-org/gitlab/-/issues/384375#note_1212752013
-export const LEGACY_FALLBACKS = ['python'];
+/**
+ * We fallback to highlighting these languages with Rouge, see the following issues for more detail:
+ * Python: https://gitlab.com/gitlab-org/gitlab/-/issues/384375#note_1212752013
+ * HAML: https://github.com/highlightjs/highlight.js/issues/3783
+ * */
+export const LEGACY_FALLBACKS = ['python', 'haml'];
diff --git a/app/assets/stylesheets/framework/super_sidebar.scss b/app/assets/stylesheets/framework/super_sidebar.scss
index d58849e21af..a1e26e78fbe 100644
--- a/app/assets/stylesheets/framework/super_sidebar.scss
+++ b/app/assets/stylesheets/framework/super_sidebar.scss
@@ -189,6 +189,13 @@ $super-sidebar-transition-hint-duration: $super-sidebar-transition-duration / 4;
}
}
+ &:hover,
+ &:focus-within {
+ .count-pill {
+ display: none;
+ }
+ }
+
&:focus button,
button:focus {
opacity: 1;
diff --git a/app/controllers/profiles/chat_names_controller.rb b/app/controllers/profiles/chat_names_controller.rb
index 564a84a0829..c4384c962d2 100644
--- a/app/controllers/profiles/chat_names_controller.rb
+++ b/app/controllers/profiles/chat_names_controller.rb
@@ -68,8 +68,13 @@ class Profiles::ChatNamesController < Profiles::ApplicationController
end
def integration_name
+ return s_('Integrations|GitLab for Slack app') if slack_app_params?
+
s_('Integrations|Mattermost slash commands')
end
-end
-Profiles::ChatNamesController.prepend_mod
+ def slack_app_params?
+ chat_name_params[:team_id].start_with?('T') &&
+ chat_name_params[:chat_id].start_with?('U', 'W')
+ end
+end
diff --git a/app/helpers/application_settings_helper.rb b/app/helpers/application_settings_helper.rb
index dfb80df0882..dab682d88e0 100644
--- a/app/helpers/application_settings_helper.rb
+++ b/app/helpers/application_settings_helper.rb
@@ -358,6 +358,11 @@ module ApplicationSettingsHelper
:sign_in_text,
:signup_enabled,
:silent_mode_enabled,
+ :slack_app_enabled,
+ :slack_app_id,
+ :slack_app_secret,
+ :slack_app_signing_secret,
+ :slack_app_verification_token,
:sourcegraph_enabled,
:sourcegraph_url,
:sourcegraph_public_only,
diff --git a/app/helpers/auth_helper.rb b/app/helpers/auth_helper.rb
index 58d647c41b1..0ee08ba1820 100644
--- a/app/helpers/auth_helper.rb
+++ b/app/helpers/auth_helper.rb
@@ -21,6 +21,8 @@ module AuthHelper
LDAP_PROVIDER = /\Aldap/.freeze
POPULAR_PROVIDERS = %w(google_oauth2 github).freeze
+ delegate :slack_app_id, to: :'Gitlab::CurrentSettings.current_application_settings'
+
def ldap_enabled?
Gitlab::Auth::Ldap::Config.enabled?
end
diff --git a/app/helpers/sidebars_helper.rb b/app/helpers/sidebars_helper.rb
index 2a9701a93ed..92e589bb09e 100644
--- a/app/helpers/sidebars_helper.rb
+++ b/app/helpers/sidebars_helper.rb
@@ -84,7 +84,7 @@ module SidebarsHelper
current_context: super_sidebar_current_context(project: project, group: group),
context_switcher_links: context_switcher_links,
search: search_data,
- pinned_items: user.pinned_nav_items[panel_type] || [],
+ pinned_items: user.pinned_nav_items[panel_type] || super_sidebar_default_pins(panel_type),
panel_type: panel_type,
update_pins_url: pins_url,
is_impersonating: impersonating?,
@@ -360,6 +360,17 @@ module SidebarsHelper
shortcut_links
end
+
+ def super_sidebar_default_pins(panel_type)
+ case panel_type
+ when 'project'
+ [:project_issue_list, :project_merge_request_list]
+ when 'group'
+ [:group_issue_list, :group_merge_request_list]
+ else
+ []
+ end
+ end
end
SidebarsHelper.prepend_mod_with('SidebarsHelper')
diff --git a/app/views/admin/application_settings/_slack.html.haml b/app/views/admin/application_settings/_slack.html.haml
new file mode 100644
index 00000000000..69a5e284b4c
--- /dev/null
+++ b/app/views/admin/application_settings/_slack.html.haml
@@ -0,0 +1,33 @@
+- return unless Gitlab.dev_or_test_env? || Gitlab.com?
+
+- expanded = integration_expanded?('slack_app_')
+%section.settings.as-slack.no-animate#js-slack-settings{ class: ('expanded' if expanded) }
+ .settings-header
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
+ = _('Slack application')
+ = render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
+ = expanded ? _('Collapse') : _('Expand')
+ %p
+ = _('Slack integration allows you to interact with GitLab via slash commands in a chat window.')
+ .settings-content
+ = gitlab_ui_form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-slack-settings'), html: { class: 'fieldset-form' } do |f|
+ = form_errors(@application_setting) if expanded
+
+ %fieldset
+ .form-group
+ = f.gitlab_ui_checkbox_component :slack_app_enabled, s_('ApplicationSettings|Enable Slack application'),
+ help_text: s_('ApplicationSettings|This option is only available on GitLab.com')
+ .form-group
+ = f.label :slack_app_id, s_('SlackIntegration|Client ID'), class: 'label-bold'
+ = f.text_field :slack_app_id, class: 'form-control gl-form-input'
+ .form-group
+ = f.label :slack_app_secret, s_('SlackIntegration|Client secret'), class: 'label-bold'
+ = f.text_field :slack_app_secret, class: 'form-control gl-form-input'
+ .form-group
+ = f.label :slack_app_signing_secret, s_('SlackIntegration|Signing secret'), class: 'label-bold'
+ = f.text_field :slack_app_signing_secret, class: 'form-control gl-form-input'
+ .form-group
+ = f.label :slack_app_verification_token, s_('SlackIntegration|Verification token'), class: 'label-bold'
+ = f.text_field :slack_app_verification_token, class: 'form-control gl-form-input'
+
+ = f.submit _('Save changes'), pajamas_button: true
diff --git a/app/views/groups/edit.html.haml b/app/views/groups/edit.html.haml
index 3d7916e22dc..dedff502a87 100644
--- a/app/views/groups/edit.html.haml
+++ b/app/views/groups/edit.html.haml
@@ -30,8 +30,7 @@
= render_if_exists 'groups/merge_requests', expanded: expanded, group: @group
= render_if_exists 'groups/merge_request_approval_settings', expanded: expanded, group: @group, user: current_user
-= render_if_exists 'groups/insights', expanded: expanded
-= render_if_exists 'groups/analytics_dashboards', expanded: expanded
+= render_if_exists 'groups/analytics', expanded: expanded
%section.settings.no-animate#js-badge-settings{ class: ('expanded' if expanded) }
.settings-header
diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml
index 13d628ec9a4..79202dabff9 100644
--- a/app/views/projects/edit.html.haml
+++ b/app/views/projects/edit.html.haml
@@ -42,7 +42,7 @@
= c.body do
= _('On the left sidebar, select %{merge_requests_link} to view them.').html_safe % { merge_requests_link: link_to('Settings > Merge requests', project_settings_merge_requests_path(@project)).html_safe }
-= render_if_exists 'projects/settings/analytics_dashboards', expanded: expanded
+= render_if_exists 'projects/settings/analytics', expanded: expanded
%section.settings.no-animate{ class: ('expanded' if expanded), data: { qa_selector: 'badges_settings_content' } }
.settings-header
diff --git a/config/feature_flags/development/ci_private_catalog_beta.yml b/config/feature_flags/development/ci_namespace_catalog_experimental.yml
index 8e4cf3168b1..d15e135e383 100644
--- a/config/feature_flags/development/ci_private_catalog_beta.yml
+++ b/config/feature_flags/development/ci_namespace_catalog_experimental.yml
@@ -1,4 +1,4 @@
-name: ci_private_catalog_beta
+name: ci_namespace_catalog_experimental
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/113407
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/394772
milestone: '15.10'
diff --git a/config/feature_flags/development/create_runner_workflow_for_admin.yml b/config/feature_flags/development/create_runner_workflow_for_admin.yml
index 8fd9c350ff5..7d13be6760b 100644
--- a/config/feature_flags/development/create_runner_workflow_for_admin.yml
+++ b/config/feature_flags/development/create_runner_workflow_for_admin.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/389269
milestone: '15.9'
type: development
group: group::runner
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/create_runner_workflow_for_namespace.yml b/config/feature_flags/development/create_runner_workflow_for_namespace.yml
index 783bb9803a1..032a5b49ffd 100644
--- a/config/feature_flags/development/create_runner_workflow_for_namespace.yml
+++ b/config/feature_flags/development/create_runner_workflow_for_namespace.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/393919
milestone: '15.10'
type: development
group: group::runner
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/fix_dora_deployment_frequency_calculation.yml b/config/feature_flags/development/fix_dora_deployment_frequency_calculation.yml
index 627c42695eb..efc68c28eab 100644
--- a/config/feature_flags/development/fix_dora_deployment_frequency_calculation.yml
+++ b/config/feature_flags/development/fix_dora_deployment_frequency_calculation.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/404565
milestone: '15.11'
type: development
group: group::optimize
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/vsa_group_and_project_parity.yml b/config/feature_flags/development/vsa_group_and_project_parity.yml
index 35405dc3409..d75621a8e5d 100644
--- a/config/feature_flags/development/vsa_group_and_project_parity.yml
+++ b/config/feature_flags/development/vsa_group_and_project_parity.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/396865
milestone: '15.11'
type: development
group: group::optimize
-default_enabled: false
+default_enabled: true
diff --git a/config/sidekiq_queues.yml b/config/sidekiq_queues.yml
index 5a7e0d41e49..50511d35c0a 100644
--- a/config/sidekiq_queues.yml
+++ b/config/sidekiq_queues.yml
@@ -187,6 +187,8 @@
- 1
- - elastic_project_transfer
- 1
+- - elastic_wiki_indexer
+ - 1
- - email_receiver
- 2
- - emails_on_push
diff --git a/data/removals/16_0/16-0-source-code-branch-push.yml b/data/removals/16_0/16-0-source-code-branch-push.yml
new file mode 100644
index 00000000000..ee32a486db1
--- /dev/null
+++ b/data/removals/16_0/16-0-source-code-branch-push.yml
@@ -0,0 +1,16 @@
+- title: "GitLab administrators must have permission to modify protected branches or tags"
+ announcement_milestone: "16.0"
+ removal_milestone: "16.0"
+ breaking_change: true
+ reporter: tlinz
+ stage: Create
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/12776
+ body: | # (required) Do not modify this line, instead modify the lines below.
+ GitLab administrators can no longer perform actions on protected branches or tags unless they have been explicitly granted that permission. These actions include pushing and merging into a [protected branch](https://docs.gitlab.com/ee/user/project/protected_branches.html), unprotecting a branch, and creating [protected tags](https://docs.gitlab.com/ee/user/project/protected_tags.html).
+#
+# OPTIONAL FIELDS
+#
+ tiers: # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate]
+ documentation_url: https://docs.gitlab.com/ee/user/project/protected_branches.html
+ image_url: # (optional) This is a link to a thumbnail image depicting the feature
+ video_url: # (optional) Use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg
diff --git a/doc/administration/auth/oidc.md b/doc/administration/auth/oidc.md
index 6df721c2e09..106cc6c23eb 100644
--- a/doc/administration/auth/oidc.md
+++ b/doc/administration/auth/oidc.md
@@ -63,6 +63,51 @@ The OpenID Connect provides you with a client's details and secret for you to us
]
```
+ For Omnibus GitLab with multiple identity providers:
+
+ ```ruby
+ { 'name' => 'openid_connect',
+ 'label' => '...',
+ 'icon' => '...',
+ 'args' => {
+ 'name' => 'openid_connect',
+ 'strategy_class': 'OmniAuth::Strategies::OpenIDConnect',
+ 'scope' => ['openid', 'profile', 'email'],
+ 'discovery' => true,
+ 'response_type' => 'code',
+ 'issuer' => 'https://...',
+ 'client_auth_method' => 'query',
+ 'uid_field' => '...',
+ 'client_options' => {
+ `identifier`: "<your_oidc_client_id>",
+ `secret`: "<your_oidc_client_secret>",
+ 'redirect_uri' => 'https://.../users/auth/openid_connect/callback'
+ }
+ }
+ },
+ { 'name' => 'openid_connect_2fa',
+ 'label' => '...',
+ 'icon' => '...',
+ 'args' => {
+ 'name' => 'openid_connect_2fa',
+ 'strategy_class': 'OmniAuth::Strategies::OpenIDConnect',
+ 'scope' => ['openid', 'profile', 'email'],
+ 'discovery' => true,
+ 'response_type' => 'code',
+ 'issuer' => 'https://...',
+ 'client_auth_method' => 'query',
+ 'uid_field' => '...',
+ 'client_options' => {
+ ...
+ 'redirect_uri' => 'https://.../users/auth/openid_connect_2fa/callback'
+ }
+ }
+ }
+ ```
+
+ NOTE:
+ For more information on using multiple identity providers with OIDC, see [issue 5992](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5992).
+
For installation from source:
```yaml
diff --git a/doc/administration/packages/container_registry.md b/doc/administration/packages/container_registry.md
index f1f41e9b8b7..fd3cbb2ad05 100644
--- a/doc/administration/packages/container_registry.md
+++ b/doc/administration/packages/container_registry.md
@@ -108,11 +108,12 @@ for the first time.
### Configure Container Registry under an existing GitLab domain
-If the Registry is configured to use the existing GitLab domain, you can
-expose the Registry on a port. This way you can reuse the existing GitLab TLS
+If the Container Registry is configured to use the existing GitLab domain, you can
+expose the Container Registry on a port. This way you can reuse the existing GitLab TLS
certificate.
-If the GitLab domain is `https://gitlab.example.com` and the port to the outside world is `5050` you need to configure the Registry:
+If the GitLab domain is `https://gitlab.example.com` and the port to the outside world is `5050`,
+to configure the Container Registry:
- Edit `gitlab.rb` if you are using Omnibus GitLab.
- Edit `gitlab.yml` if you installed GitLab from source.
diff --git a/doc/administration/pages/source.md b/doc/administration/pages/source.md
index 7027feadb59..b36b87f3b1d 100644
--- a/doc/administration/pages/source.md
+++ b/doc/administration/pages/source.md
@@ -295,10 +295,9 @@ world. Custom domains are supported, but no TLS.
external_http: 192.0.2.2:80
```
-1. Edit `/etc/default/gitlab` and set `gitlab_pages_enabled` to `true` in
- order to enable the pages daemon. In `gitlab_pages_options`, the
- `-pages-domain` must match the `host` setting that you set above and
- `-listen-http` must match the `external_http` setting:
+1. To enable the daemon, edit `/etc/default/gitlab` and set `gitlab_pages_enabled` to `true`.
+ In `gitlab_pages_options`, the value for `-pages-domain` must match the `host` and `-listen-http` must match
+ the `external_http`:
```ini
gitlab_pages_enabled=true
diff --git a/doc/administration/redis/replication_and_failover_external.md b/doc/administration/redis/replication_and_failover_external.md
index 16383db6c2a..98909dfc001 100644
--- a/doc/administration/redis/replication_and_failover_external.md
+++ b/doc/administration/redis/replication_and_failover_external.md
@@ -250,8 +250,8 @@ unauthorized access from other machines, and block traffic from the
outside ([Internet](https://gitlab.com/gitlab-org/gitlab-foss/uploads/c4cc8cd353604bd80315f9384035ff9e/The_Internet_IT_Crowd.png)).
For this example, **Sentinel 1** is configured in the same machine as the
-**Redis Primary**, **Sentinel 2** and **Sentinel 3** in the same machines as the
-**Replica 1** and **Replica 2** respectively.
+**Redis Primary**, **Sentinel 2** in the same machine as **Replica 1**, and
+**Sentinel 3** in the same machine as **Replica 2**.
Here is a list and description of each **machine** and the assigned **IP**:
diff --git a/doc/api/branches.md b/doc/api/branches.md
index 9518a8d5032..fa508292e5c 100644
--- a/doc/api/branches.md
+++ b/doc/api/branches.md
@@ -27,7 +27,7 @@ Parameters:
| Attribute | Type | Required | Description |
|:----------|:---------------|:---------|:------------|
| `id` | integer/string | yes | ID or [URL-encoded path of the project](rest/index.md#namespaced-path-encoding) owned by the authenticated user.|
-| `search` | string | no | Return list of branches containing the search string. You can use `^term` and `term$` to find branches that begin and end with `term` respectively. |
+| `search` | string | no | Return list of branches containing the search string. You can use `^term` to find branches that begin with `term`, and `term$` to find branches that end with `term`. |
| `regex` | string | no | Return list of branches with names matching a [re2](https://github.com/google/re2/wiki/Syntax) regular expression. |
Example request:
diff --git a/doc/api/members.md b/doc/api/members.md
index 950289effd2..02fa4be3d64 100644
--- a/doc/api/members.md
+++ b/doc/api/members.md
@@ -316,9 +316,8 @@ This API endpoint works on top-level groups only. It does not work on subgroups.
This function takes [pagination](rest/index.md#pagination) parameters `page` and `per_page` to restrict the list of users.
-[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/262875) in GitLab 13.7, the `search` and
-`sort` parameters allow you to search for billable group members by name and sort the results,
-respectively.
+[In GitLab 13.7 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/262875), use the `search` parameter
+to search for billable group members by name and `sort` to sort the results.
```plaintext
GET /groups/:id/billable_members
diff --git a/doc/api/namespaces.md b/doc/api/namespaces.md
index 25c26ee9339..15ce73fdbc3 100644
--- a/doc/api/namespaces.md
+++ b/doc/api/namespaces.md
@@ -9,8 +9,10 @@ info: To determine the technical writer assigned to the Stage/Group associated w
Usernames and group names fall under a special category called
[namespaces](../user/namespace/index.md).
-For users and groups supported API calls see the [users](users.md) and
-[groups](groups.md) documentation respectively.
+You might also want to view documentation for:
+
+- [Users](users.md)
+- [Groups](groups.md)
[Pagination](rest/index.md#pagination) is used.
diff --git a/doc/api/secure_files.md b/doc/api/secure_files.md
index 86ed2e005a4..0b85bf05410 100644
--- a/doc/api/secure_files.md
+++ b/doc/api/secure_files.md
@@ -58,7 +58,7 @@ Example response:
"checksum": "16630b189ab34b2e3504f4758e1054d2e478deda510b2b08cc0ef38d12e80aa2",
"checksum_algorithm": "sha256",
"created_at": "2022-02-22T22:22:22.222Z",
- "expires_at": "2022-09-21T14:56:00.000Z",
+ "expires_at": "2023-09-21T14:55:59.000Z",
"metadata": {
"id":"75949910542696343243264405377658443914",
"issuer": {
@@ -74,7 +74,7 @@ Example response:
"OU":"ABC123XYZ",
"UID":"ABC123XYZ"
},
- "expires_at":"2022-09-21T14:56:00.000Z"
+ "expires_at":"2023-09-21T14:55:59.000Z"
}
}
]
diff --git a/doc/api/settings.md b/doc/api/settings.md
index a0441b6e760..c7ba93d310e 100644
--- a/doc/api/settings.md
+++ b/doc/api/settings.md
@@ -486,11 +486,11 @@ listed in the descriptions of the relevant settings.
| `signin_enabled` | string | no | (Deprecated: Use `password_authentication_enabled_for_web` instead) Flag indicating if password authentication is enabled for the web interface. |
| `signup_enabled` | boolean | no | Enable registration. Default is `true`. |
| `silent_mode_enabled` | boolean | no | Enable [Silent mode](../administration/silent_mode/index.md). Default is `false`. |
-| `slack_app_enabled` **(PREMIUM)** | boolean | no | (**If enabled, requires:** `slack_app_id`, `slack_app_secret` and `slack_app_secret`) Enable Slack app. |
-| `slack_app_id` **(PREMIUM)** | string | required by: `slack_app_enabled` | The app ID of the Slack-app. |
-| `slack_app_secret` **(PREMIUM)** | string | required by: `slack_app_enabled` | The app secret of the Slack-app. |
-| `slack_app_signing_secret` **(PREMIUM)** | string | no | The signing secret of the Slack-app. |
-| `slack_app_verification_token` **(PREMIUM)** | string | required by: `slack_app_enabled` | The verification token of the Slack-app. |
+| `slack_app_enabled` | boolean | no | (**If enabled, requires:** `slack_app_id`, `slack_app_secret` and `slack_app_secret`) Enable Slack app. |
+| `slack_app_id` | string | required by: `slack_app_enabled` | The app ID of the Slack-app. |
+| `slack_app_secret` | string | required by: `slack_app_enabled` | The app secret of the Slack-app. |
+| `slack_app_signing_secret` | string | no | The signing secret of the Slack-app. |
+| `slack_app_verification_token` | string | required by: `slack_app_enabled` | The verification token of the Slack-app. |
| `snippet_size_limit` | integer | no | Max snippet content size in **bytes**. Default: 52428800 Bytes (50 MB).|
| `snowplow_app_id` | string | no | The Snowplow site name / application ID. (for example, `gitlab`) |
| `snowplow_collector_hostname` | string | required by: `snowplow_enabled` | The Snowplow collector hostname. (for example, `snowplow.trx.gitlab.net`) |
diff --git a/doc/ci/quick_start/tutorial.md b/doc/ci/quick_start/tutorial.md
index 3e12c319069..88d35bf56b0 100644
--- a/doc/ci/quick_start/tutorial.md
+++ b/doc/ci/quick_start/tutorial.md
@@ -168,7 +168,7 @@ After verifying the Docusaurus site builds in `build-job`, you can add a job tha
This step introduces:
-- [`stage`](../yaml/index.md#stage) and [`stages](../yaml/index.md#stage): The most common
+- [`stage`](../yaml/index.md#stage) and [`stages`](../yaml/index.md#stage): The most common
pipeline configurations group jobs into stages. Jobs in the same stage can run in parallel,
while jobs in later stages wait for jobs in earlier stages to complete. If a job fails,
the whole stage is considered failed and jobs in later stages do not start running.
diff --git a/doc/ci/runners/register_runner.md b/doc/ci/runners/register_runner.md
index 21f72552ce3..f53297099d7 100644
--- a/doc/ci/runners/register_runner.md
+++ b/doc/ci/runners/register_runner.md
@@ -13,16 +13,19 @@ To register a runner, you can use either:
## Generate an authentication token
-Registration with an authentication token is only available for shared runners. Support for project and group
-runners is proposed in this [epic](https://gitlab.com/groups/gitlab-org/-/epics/7633).
+Registration with an authentication token is available for all runners.
+
+NOTE:
+The token only displays in the UI for a short period of time during registration.
### For a shared runner
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/383139) in GitLab 15.10. Deployed behind the `create_runner_workflow_for_admin` [flag](../../administration/feature_flags.md), disabled by default.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/383139) in GitLab 15.10. Deployed behind the `create_runner_workflow_for_admin` [flag](../../administration/feature_flags.md)
+> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/389269) in GitLab 16.0.
FLAG:
-On self-managed GitLab, this feature is not available. To make it available, ask an administrator to [enable the feature flag](../../administration/feature_flags.md) named `create_runner_workflow_for_admin`.
-On GitLab.com, this feature is available but can be configured by GitLab.com administrators only.
+On self-managed GitLab, by default this feature is available. To hide the feature,
+ask an administrator to [disable the feature flag](../../administration/feature_flags.md) named `create_runner_workflow_for_admin`.
Prerequisites:
@@ -34,22 +37,62 @@ To generate an authentication token for a shared runner:
1. On the left sidebar, select **CI/CD > Runners**.
1. Select **New instance runner**.
1. Select a platform.
-1. Optional. Enter a description.
-1. Optional. Enter a maintenance note.
1. Optional. Enter configurations for the runner.
1. Select **Submit**.
1. Follow the instructions to register the runner from the command line.
-NOTE:
-The token only displays in the UI for a short period of time during registration,
-and is then saved in `config.toml`.
+### For a group runner
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/383143) in GitLab 15.10. Deployed behind the `create_runner_workflow_for_namespace` [flag](../../administration/feature_flags.md). Disabled by default.
+> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/393919) in GitLab 16.0.
+
+FLAG:
+On self-managed GitLab, by default this feature is available. To hide the feature,
+ask an administrator to [disable the feature flag](../../administration/feature_flags.md) named `create_runner_workflow_for_namespace`.
+
+Prerequisites:
+
+- You must have the Owner role for the group.
+
+To generate an authentication token for a group runner:
+
+1. On the top bar, select **Main menu > Groups** and find your group.
+1. On the left sidebar, select **CI/CD > Runners**.
+1. Select **New group runner**.
+1. Select a platform.
+1. Optional. Enter configurations for the runner.
+1. Select **Submit**.
+1. Follow the instructions to register the runner from the command line.
+
+### For a project runner
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/383143) in GitLab 15.10. Deployed behind the `create_runner_workflow_for_namespace` [flag](../../administration/feature_flags.md). Disabled by default.
+> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/393919) in GitLab 16.0.
+
+FLAG:
+On self-managed GitLab, by default this feature is available. To hide the feature,
+ask an administrator to [disable the feature flag](../../administration/feature_flags.md) named `create_runner_workflow_for_namespace`.
+
+Prerequisites:
+
+- You must have the Maintainer role for the project.
+
+To generate an authentication token for a project runner:
+
+1. On the top bar, select **Main menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > CI/CD**.
+1. Select **New project runner**.
+1. Select a platform.
+1. Optional. Enter configurations for the runner.
+1. Select **Submit**.
+1. Follow the instructions to register the runner from the command line.
## Generate a registration token (deprecated)
WARNING:
The ability to pass a runner registration token, and support for certain configuration arguments was
[deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/380872) in GitLab 15.6. Authentication tokens
-will be used instead to register runners. Registration tokens, and support for certain configuration arguments
+should be used instead to register runners. Registration tokens, and support for certain configuration arguments
will be disabled behind a feature flag in GitLab 16.6 and removed in GitLab 17.0. The configuration arguments disabled for `glrt-` tokens are `--locked`, `--access-level`, `--run-untagged`, `--maximum-timeout`, `--paused`, `--tag-list`, and `--maintenance-note`. This change is a breaking
change.
diff --git a/doc/development/geo.md b/doc/development/geo.md
index 710d0eec3b0..5d09532afcb 100644
--- a/doc/development/geo.md
+++ b/doc/development/geo.md
@@ -48,8 +48,8 @@ for new events and creates background jobs for each specific event type.
For example when a repository is updated, the Geo **primary** site creates
a Geo event with an associated repository updated event. The Geo Log Cursor daemon
picks the event up and schedules a `Geo::ProjectSyncWorker` job which
-uses the `Geo::RepositorySyncService` and `Geo::WikiSyncService` classes
-to update the repository and the wiki respectively.
+uses the `Geo::RepositorySyncService` to update the repository
+and `Geo::WikiSyncService` classes to update the wiki.
The Geo Log Cursor daemon can operate in High Availability mode automatically.
The daemon tries to acquire a lock from time to time and once acquired, it
diff --git a/doc/development/gitaly.md b/doc/development/gitaly.md
index 408f3d5fa3c..d2232d750b2 100644
--- a/doc/development/gitaly.md
+++ b/doc/development/gitaly.md
@@ -168,7 +168,8 @@ can replace `tmp/tests/gitaly` with a symlink. This is much faster
because it avoids a Gitaly re-install each time you run `rspec`.
Make sure this directory contains the files `config.toml` and `praefect.config.toml`.
-You can copy them from `config.toml.example` and `config.praefect.toml.example` respectively.
+You can copy `config.toml` from `config.toml.example`, and `praefect.config.toml`
+from `config.praefect.toml.example`.
After copying, make sure to edit them so everything points to the correct paths.
```shell
diff --git a/doc/development/integrations/secure.md b/doc/development/integrations/secure.md
index bc0a490f555..55cc9ddb006 100644
--- a/doc/development/integrations/secure.md
+++ b/doc/development/integrations/secure.md
@@ -198,7 +198,7 @@ SAST and Dependency Scanning scanners must scan the files in the project directo
To be consistent with the official Container Scanning for GitLab,
scanners must scan the Docker image whose name and tag are given by
-`CI_APPLICATION_REPOSITORY` and `CI_APPLICATION_TAG`, respectively. If the `DOCKER_IMAGE`
+`CI_APPLICATION_REPOSITORY` and `CI_APPLICATION_TAG`. If the `DOCKER_IMAGE`
CI/CD variable is provided, then the `CI_APPLICATION_REPOSITORY` and `CI_APPLICATION_TAG` variables
are ignored, and the image specified in the `DOCKER_IMAGE` variable is scanned instead.
diff --git a/doc/development/testing_guide/end_to_end/resources.md b/doc/development/testing_guide/end_to_end/resources.md
index f3e072ffa21..f9e136a86df 100644
--- a/doc/development/testing_guide/end_to_end/resources.md
+++ b/doc/development/testing_guide/end_to_end/resources.md
@@ -249,7 +249,7 @@ end
```
The `populate` method iterates through its arguments and call each
-attribute respectively. Here `populate(:brand)` has the same effect as
+attribute. Here `populate(:brand)` has the same effect as
just `brand`. Using the populate method makes the intention clearer.
With this, it ensures we construct the data right after we create the
diff --git a/doc/install/aws/manual_install_aws.md b/doc/install/aws/manual_install_aws.md
index 70fd000a4a6..bd81e0583b5 100644
--- a/doc/install/aws/manual_install_aws.md
+++ b/doc/install/aws/manual_install_aws.md
@@ -237,7 +237,7 @@ Next, we must associate the **public** subnets to the route table:
We also must create two private route tables so that instances in each private subnet can reach the internet via the NAT gateway in the corresponding public subnet in the same availability zone.
-1. Follow the same steps as above to create two private route tables. Name them `gitlab-private-a` and `gitlab-private-b` respectively.
+1. Follow the same steps as above to create two private route tables. Name them `gitlab-private-a` and `gitlab-private-b`.
1. Next, add a new route to each of the private route tables where the destination is `0.0.0.0/0` and the target is one of the NAT gateways we created earlier.
1. Add the NAT gateway we created in `gitlab-public-10.0.0.0` as the target for the new route in the `gitlab-private-a` route table.
1. Similarly, add the NAT gateway in `gitlab-public-10.0.2.0` as the target for the new route in the `gitlab-private-b`.
@@ -336,7 +336,13 @@ Now, it's time to create the database:
1. Select **Standard Create** for the database creation method.
1. Select **PostgreSQL** as the database engine and select the minimum PostgreSQL version as defined for your GitLab version in our [database requirements](../../install/requirements.md#postgresql-requirements).
1. Because this is a production server, let's choose **Production** from the **Templates** section.
-1. Under **Settings**, set a DB instance identifier, a master username, and a master password. We use `gitlab-db-ha`, `gitlab`, and a very secure password respectively. Make a note of these as we need them later.
+1. Under **Settings**, use:
+ - `gitlab-db-ha` for the DB instance identifier.
+ - `gitlab` for a master username.
+ - A very secure password for the master password.
+
+ Make a note of these as we need them later.
+
1. For the DB instance size, select **Standard classes** and select an instance size that meets your requirements from the dropdown list. We use a `db.m4.large` instance.
1. Under **Storage**, configure the following:
1. Select **Provisioned IOPS (SSD)** from the storage type dropdown list. Provisioned IOPS (SSD) storage is best suited for this use (though you can choose General Purpose (SSD) to reduce the costs). Read more about it at [Storage for Amazon RDS](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Storage.html).
diff --git a/doc/install/installation.md b/doc/install/installation.md
index 61147c1e2e4..bb0bffd967a 100644
--- a/doc/install/installation.md
+++ b/doc/install/installation.md
@@ -868,7 +868,7 @@ sudo -u git -H bundle exec rake gitlab:setup RAILS_ENV=production force=yes
# When done, you see 'Administrator account created:'
```
-You can set the Administrator/root password and email by supplying them in environmental variables, `GITLAB_ROOT_PASSWORD` and `GITLAB_ROOT_EMAIL` respectively, as seen below. If you don't set the password (and it is set to the default one), wait to expose GitLab to the public internet until the installation is done and you've logged into the server the first time. During the first login, you are forced to change the default password. An Enterprise Edition subscription may also be activated at this time by supplying the activation code in the `GITLAB_ACTIVATION_CODE` environment variable.
+You can set the Administrator/root password and email by supplying them in environmental variables, `GITLAB_ROOT_PASSWORD` and `GITLAB_ROOT_EMAIL`, as seen below. If you don't set the password (and it is set to the default one), wait to expose GitLab to the public internet until the installation is done and you've logged into the server the first time. During the first login, you are forced to change the default password. An Enterprise Edition subscription may also be activated at this time by supplying the activation code in the `GITLAB_ACTIVATION_CODE` environment variable.
```shell
sudo -u git -H bundle exec rake gitlab:setup RAILS_ENV=production GITLAB_ROOT_PASSWORD=yourpassword GITLAB_ROOT_EMAIL=youremail GITLAB_ACTIVATION_CODE=yourcode
diff --git a/doc/operations/metrics/dashboards/panel_types.md b/doc/operations/metrics/dashboards/panel_types.md
index 5d52691eed8..0ab78dc0228 100644
--- a/doc/operations/metrics/dashboards/panel_types.md
+++ b/doc/operations/metrics/dashboards/panel_types.md
@@ -53,7 +53,7 @@ Starting in [version 12.8](https://gitlab.com/gitlab-org/gitlab/-/issues/202696)
To add an anomaly chart panel type to a dashboard, add a panel with *exactly* 3 metrics.
-The first metric represents the current state, and the second and third metrics represent the upper and lower limit respectively:
+The first metric represents the current state, and the second and third metrics represent the upper and lower limit:
```yaml
dashboard: 'Dashboard Title'
diff --git a/doc/topics/autodevops/stages.md b/doc/topics/autodevops/stages.md
index aca8c99b180..af0ccc514de 100644
--- a/doc/topics/autodevops/stages.md
+++ b/doc/topics/autodevops/stages.md
@@ -491,7 +491,7 @@ deletion).
You can configure database initialization and migrations for PostgreSQL to run
within the application pod by setting the project CI/CD variables `DB_INITIALIZE` and
-`DB_MIGRATE` respectively.
+`DB_MIGRATE`.
If present, `DB_INITIALIZE` is run as a shell command within an application pod
as a Helm post-install hook. As some applications can't run without a successful
diff --git a/doc/update/removals.md b/doc/update/removals.md
index ce2e80b9850..bdb68f8330c 100644
--- a/doc/update/removals.md
+++ b/doc/update/removals.md
@@ -78,6 +78,14 @@ Review the details carefully before upgrading.
The Container Registry [pull-through cache](https://docs.docker.com/registry/recipes/mirror/) was deprecated in GitLab 15.8 and removed in GitLab 16.0. This feature is part of the upstream [Docker Distribution project](https://github.com/distribution/distribution) but we are removing that code in favor of the GitLab Dependency Proxy. Use the GitLab Dependency Proxy to proxy and cache container images from Docker Hub.
+### GitLab administrators must have permission to modify protected branches or tags
+
+WARNING:
+This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+Review the details carefully before upgrading.
+
+GitLab administrators can no longer perform actions on protected branches or tags unless they have been explicitly granted that permission. These actions include pushing and merging into a [protected branch](https://docs.gitlab.com/ee/user/project/protected_branches.html), unprotecting a branch, and creating [protected tags](https://docs.gitlab.com/ee/user/project/protected_tags.html).
+
### PipelineSecurityReportFinding name GraphQL field
WARNING:
diff --git a/doc/user/ai_features.md b/doc/user/ai_features.md
index e8635fd88e9..d335cdabd56 100644
--- a/doc/user/ai_features.md
+++ b/doc/user/ai_features.md
@@ -28,11 +28,15 @@ These settings give you control over which features are enabled. These settings
When a feature is [Generally Available](../policy/alpha-beta-support.md#generally-available-ga), it does not require the [group-level Experiment features setting](group/manage.md#group-experiment-features-setting) to be enabled. Some of these features might require the [group-level third-party AI features setting](group/manage.md#group-third-party-ai-features-setting).
+The following feature is Generally Available:
+
- [Suggested Reviewers](project/merge_requests/reviews/index.md#suggested-reviewers)
## Beta AI features
-[Beta features](../policy/alpha-beta-support.md#beta) do not require the [group-level experiment features setting](group/manage.md#group-experiment-features-setting) to be enabled.
+[Beta features](../policy/alpha-beta-support.md#beta) do not require the [group-level Experiment features setting](group/manage.md#group-experiment-features-setting) to be enabled.
+
+The following feature is in Beta:
- [Code Suggestions](project/repository/code_suggestions.md)
@@ -42,13 +46,13 @@ When a feature is [Generally Available](../policy/alpha-beta-support.md#generall
## Third-party AI features
-Third-party AI features require the [group-level third-party AI features setting](group/manage.md#group-third-party-ai-features-setting) to be enabled. Experiment Third-party AI features also require the [Experiment features setting](group/manage.md#group-experiment-features-setting) to be enabled.
+Third-party AI features require the [group-level third-party AI features setting](group/manage.md#group-third-party-ai-features-setting) to be enabled. Experiment third-party AI features also require the [Experiment features setting](group/manage.md#group-experiment-features-setting) to be enabled.
### Explain Selected Code in the Web UI **(ULTIMATE SAAS)**
> Introduced in GitLab 15.11 as an [Experiment](../policy/alpha-beta-support.md#experiment) on GitLab.com.
-This feature is an [Experiment](../policy/alpha-beta-support.md) on GitLab.com that is powered by OpenAI GPT-3.
+This feature is an [Experiment](../policy/alpha-beta-support.md) on GitLab.com that is powered by OpenAI's GPT-3.
GitLab can help you get up to speed faster if you:
@@ -81,7 +85,7 @@ We cannot guarantee that the large language model produces results that are corr
> Introduced in GitLab 16.0 as an [Experiment](../policy/alpha-beta-support.md#experiment).
-This feature is an [Experiment](../policy/alpha-beta-support.md) on GitLab.com that is powered by OpenAI GPT-3. It requires the [group-level third-party AI features setting](group/manage.md#group-third-party-ai-features-setting) to be enabled.
+This feature is an [Experiment](../policy/alpha-beta-support.md) on GitLab.com that is powered by OpenAI's GPT-3. It requires the [group-level third-party AI features setting](group/manage.md#group-third-party-ai-features-setting) to be enabled.
Getting help has never been easier. If you have a question about how the GitLab product works, you can ask product how-to questions and get AI generated support from GitLab Chat.
@@ -95,20 +99,20 @@ To give feedback, select the **Give Feedback** link.
> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/10400) in GitLab 16.0 as an [Experiment](../policy/alpha-beta-support.md#experiment).
-This feature is an [Experiment](../policy/alpha-beta-support.md) on GitLab.com that is powered by OpenAI GPT-3. It requires the [group-level third-party AI features setting](group/manage.md#group-third-party-ai-features-setting) to be enabled.
+This feature is an [Experiment](../policy/alpha-beta-support.md) on GitLab.com that is powered by OpenAI's GPT-3. It requires the [group-level third-party AI features setting](group/manage.md#group-third-party-ai-features-setting) to be enabled.
You can generate a merge request summary by using the `/summarize_diff` quick action in a merge request comment. This action posts a comment from a GitLab bot. The comment provides a summary of the changes and the related SHA for when that summary was generated.
Provide feedback on this experimental feature in [issue 408726](https://gitlab.com/gitlab-org/gitlab/-/issues/408726).
**Data usage**: When you use this quick action, the diff of changes between the head of the source branch
-and the target branch is sent to the GPT-3 language model.
+and the target branch is sent to the large language model referenced above.
### Summarize my merge request review **(ULTIMATE SAAS)**
> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/10466) in GitLab 16.0 as an [Experiment](../policy/alpha-beta-support.md#experiment).
-This feature is an [Experiment](../policy/alpha-beta-support.md) on GitLab.com that is powered by OpenAI GPT-3. It requires the [group-level third-party AI features setting](group/manage.md#group-third-party-ai-features-setting) to be enabled.
+This feature is an [Experiment](../policy/alpha-beta-support.md) on GitLab.com that is powered by OpenAI's GPT-3. It requires the [group-level third-party AI features setting](group/manage.md#group-third-party-ai-features-setting) to be enabled.
When you've completed your review of a merge request and are ready to [submit your review](project/merge_requests/reviews/index.md#submit-a-review) you can choose to have summary generated for you. To generate the summary:
@@ -119,7 +123,7 @@ The summary is generated and entered in to the comment box where you can edit an
Provide feedback on this experimental feature in [issue 408991](https://gitlab.com/gitlab-org/gitlab/-/issues/408991).
-**Data usage**: When you use this feature, the following data is sent to the GPT-3 language model:
+**Data usage**: When you use this feature, the following data is sent to the large language model referenced above:
- Draft comment's text
- File path of the commented files
@@ -128,7 +132,7 @@ Provide feedback on this experimental feature in [issue 408991](https://gitlab.c
> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/10366) in GitLab 16.0 as an [Experiment](../policy/alpha-beta-support.md#experiment).
-This feature is an [Experiment](../policy/alpha-beta-support.md) on GitLab.com that is powered by OpenAI GPT-3. It requires the [group-level third-party AI features setting](group/manage.md#group-third-party-ai-features-setting) to be enabled.
+This feature is an [Experiment](../policy/alpha-beta-support.md) on GitLab.com that is powered by OpenAI's GPT-3. It requires the [group-level third-party AI features setting](group/manage.md#group-third-party-ai-features-setting) to be enabled.
When in a merge request you can choose to have GitLab suggest tests for the file you are reviewing. This can help to determine if appropriate test coverage has been provided or help with writing tests to provide more coverage for your project. To generate a test suggestion:
@@ -139,7 +143,7 @@ A sidebar opens where the test suggestion is generated. From there you can choos
Feedback on this experimental feature can be provided in [issue 408995](https://gitlab.com/gitlab-org/gitlab/-/issues/408995).
-**Data usage**: When you use this feature, the following data is sent to the GPT-3 language model:
+**Data usage**: When you use this feature, the following data is sent to the large language model referenced above:
- Contents of the file
- The file name
@@ -152,13 +156,11 @@ GitLab AI features leverage generative AI to help increase velocity and aim to h
These features are designed as a progressive enhancement to existing GitLab features across our DevSecOps platform. They are designed to fail gracefully and should not prevent the core functionality of the underlying feature. Please note each feature is subject to its expected functionality as defined by the relevant [feature support policy](../policy/alpha-beta-support.md).
-### Off by default
-
### Stability and performance
These features are in a variety of [feature support levels](../policy/alpha-beta-support.md#beta). Due to the nature of these features, there may be high demand for usage which may cause degraded performance or unexpected downtime of the feature. We have built these features to gracefully degrade and have controls in place to allow us to mitigate abuse or misuse. GitLab may disable **beta and experimental** features for any or all customers at any time at our discretion.
-## Third Party Services
+## Third party services
### Data privacy
diff --git a/doc/user/analytics/dora_metrics.md b/doc/user/analytics/dora_metrics.md
index 49006ead10f..6b7b1d87843 100644
--- a/doc/user/analytics/dora_metrics.md
+++ b/doc/user/analytics/dora_metrics.md
@@ -23,9 +23,9 @@ For software leaders, tracking velocity alongside quality metrics ensures they'r
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
For a video explanation, see [DORA metrics: User analytics](https://www.youtube.com/watch?v=lM_FbVYuN8s) and [GitLab speed run: DORA metrics](https://www.youtube.com/watch?v=1BrcMV6rCDw).
-## DORA metrics dashboard in Value Stream Analytics
+## DORA metrics in Value Stream Analytics
-The four DORA metrics are available out-of-the-box in the [Value Stream Analytics (VSA) overview dashboard](../group/value_stream_analytics/index.md#view-value-stream-analytics).
+The four DORA metrics are available out-of-the-box in the [Value Streams Dashboard](value_streams_dashboard.md).
This helps you visualize the engineering work in the context of end-to-end value delivery.
The One DevOps Platform [Value Stream Management](https://gitlab.com/gitlab-org/gitlab/-/value_stream_analytics) provides end-to-end visibility to the entire software delivery lifecycle.
@@ -133,17 +133,16 @@ The DORA metrics are displayed on the following charts:
- [Value Streams Dashboard](value_streams_dashboard.md), which helps you identify trends, patterns, and opportunities for improvement.
- [CI/CD analytics charts](ci_cd_analytics.md), which show pipeline success rates and duration, and the history of DORA metrics over time.
-- Value stream analytics for [groups](../group/value_stream_analytics/index.md) and [projects](value_stream_analytics.md), which provide metrics about each stage of your software development process
- Insights reports for [groups](../group/insights/index.md) and [projects](value_stream_analytics.md), where you can also use [DORA query parameters](../../user/project/insights/index.md#dora-query-parameters) to create custom charts.
The table below provides an overview of the DORA metrics' data aggregation in different charts.
-| Metric name | Measured values | Data aggregation in the [Value Streams Dashboard](value_streams_dashboard.md) | Data aggregation in [CI/CD analytics charts](ci_cd_analytics.md) | Data aggregation in Value stream analytics | Data aggregation in [Custom insights reporting](../../user/project/insights/index.md#dora-query-parameters) |
-|---------------------------|-------------------|-----------------------------------------------------|------------------------|-----------------------|----------|
-| Deployment frequency | Number of successful deployments | daily average per month | daily average | daily average | `day` (default) or `month` |
-| Lead time for changes | Number of seconds to successfully deliver a commit into production | daily median per month | median time | median time | `day` (default) or `month` |
-| Time to restore service | Number of seconds an incident was open for | daily median per month | daily median | median time | `day` (default) or `month` |
-| Change failure rate | percentage of deployments that cause an incident in production | daily median per month | percentage of failed deployments | percentage of failed deployments | `day` (default) or `month` |
+| Metric name | Measured values | Data aggregation in the [Value Streams Dashboard](value_streams_dashboard.md) | Data aggregation in [CI/CD analytics charts](ci_cd_analytics.md) | Data aggregation in [Custom insights reporting](../../user/project/insights/index.md#dora-query-parameters) |
+|---------------------------|-------------------|-----------------------------------------------------|------------------------|----------|
+| Deployment frequency | Number of successful deployments | daily average per month | daily average | `day` (default) or `month` |
+| Lead time for changes | Number of seconds to successfully deliver a commit into production | daily median per month | median time | `day` (default) or `month` |
+| Time to restore service | Number of seconds an incident was open for | daily median per month | daily median | `day` (default) or `month` |
+| Change failure rate | percentage of deployments that cause an incident in production | daily median per month | percentage of failed deployments | `day` (default) or `month` |
## Retrieve DORA metrics data
diff --git a/doc/user/group/epics/epic_boards.md b/doc/user/group/epics/epic_boards.md
index 897504942f7..6783e89779b 100644
--- a/doc/user/group/epics/epic_boards.md
+++ b/doc/user/group/epics/epic_boards.md
@@ -73,7 +73,7 @@ To delete the active epic board:
- [Create a new list](#create-a-new-list).
- [Remove an existing list](#remove-a-list).
- [Filter epics](#filter-epics).
-- Create workflows, like when using [issue boards](../../project/issue_board.md#create-workflows).
+- Create workflows, like when using [issue boards](../../project/issue_board.md#issue-board-workflow-between-teams).
- [Move epics and lists](#move-epics-and-lists).
- Change epic labels (by dragging an epic between lists).
- Close an epic (by dragging it to the **Closed** list).
diff --git a/doc/user/group/insights/index.md b/doc/user/group/insights/index.md
index 9eb6d4387c1..17aa6cb9655 100644
--- a/doc/user/group/insights/index.md
+++ b/doc/user/group/insights/index.md
@@ -67,7 +67,7 @@ To configure group insights:
in a project that belongs to your group.
1. On the top bar, select **Main menu > Groups** and find your group.
1. On the left sidebar, select **Settings > General**.
-1. Expand **Insights**.
+1. Expand the **Analytics** tab and find the **Insights** section.
1. Select the project that contains your `.gitlab/insights.yml` configuration file.
1. Select **Save changes**.
diff --git a/doc/user/group/manage.md b/doc/user/group/manage.md
index bb7862419f2..6edf2fef32f 100644
--- a/doc/user/group/manage.md
+++ b/doc/user/group/manage.md
@@ -685,7 +685,7 @@ Support for group-level settings for merge request approval rules is tracked in
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/408158) from GitLab Ultimate to GitLab Premium in 16.0.
WARNING:
-This feature is in [Beta](/ee/policy/alpha-beta-support.md#beta). Code Suggestions use generative AI to suggest code while you're developing. Due to high demand, this feature will have unscheduled downtime and code suggestions in VS Code may be delayed. Code Suggestions may produce [low-quality or incomplete suggestions](../project/repository/code_suggestions.md#model-accuracy-and-quality). Beta users should read about the [known limitations](../project/repository/code_suggestions.md#known-limitations). We look forward to hearing your feedback.
+This feature is in [Beta](../../policy/alpha-beta-support.md#beta). Code Suggestions use generative AI to suggest code while you're developing. Due to high demand, this feature will have unscheduled downtime and code suggestions in VS Code may be delayed. Code Suggestions may produce [low-quality or incomplete suggestions](../project/repository/code_suggestions.md#model-accuracy-and-quality). Beta users should read about the [known limitations](../project/repository/code_suggestions.md#known-limitations). We look forward to hearing your feedback.
This setting enables users in the group to access [Code Suggestions](../project/repository/code_suggestions.md).
This setting [cascades to all projects](../project/merge_requests/approvals/settings.md#settings-cascading)
@@ -703,9 +703,13 @@ To enable Code Suggestions for a group:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/404856) in GitLab 16.0.
-These are [Experiment features](/ee/policy/alpha-beta-support.md#experiment) and may produce unexpected results (e.g., low-quality, incomplete, failed pipelines, incoherent, insecure code, offensive or insensitive).
+You can give all users in the group access to Experiment features.
+
+WARNING:
+[Experiment features](../../policy/alpha-beta-support.md#experiment) may produce unexpected results
+(for example, the results might be low-quality, incomplete, incoherent, offensive, or insensitive,
+and might include insecure code or failed pipelines).
-This setting enables users in the group to access Experiment features.
This setting [cascades to all projects](../project/merge_requests/approvals/settings.md#settings-cascading)
that belong to the group.
@@ -722,9 +726,10 @@ To enable Experiment features for a group:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/404856) in GitLab 16.0.
WARNING:
-These Artifical Intelligence (AI) features use [third-party services](../../user/ai_features.md#data-usage) and require transmission of data, including personal data.
+These Artifical Intelligence (AI) features use [third-party services](../ai_features.md#data-usage)
+and require transmission of data, including personal data.
-This setting enables users in the group to access third-party AI features.
+You can give all users in the group access to third-party AI features.
This setting [cascades to all projects](../project/merge_requests/approvals/settings.md#settings-cascading)
that belong to the group.
@@ -841,3 +846,16 @@ Administrators can find a user's maximum permissions for a group or project.
group = Group.find_by_full_path 'group'
user.max_member_access_for_group group.id
```
+
+### Unable to remove billable members with badge `Project Invite/Group Invite`
+
+```plaintext
+Members who were invited via a group invitation cannot be removed. You can either remove the entire group, or ask an Owner of the invited group to remove the member.
+```
+
+This error typically occurs when the user you're trying to remove is part of an external group that has been [shared with one or more of your projects](../project/members/share_project_with_groups.md) or [groups](#share-a-group-with-another-group). To remove the user as a billable member, follow one of the options:
+
+- Remove the invited group membership from your project or group members page.
+- Recommended. Remove the user directly from the invited group, if you have access to the group.
+
+The feature request to **Update billable_members endpoint to include invited group** is currently being worked on. For more information, see [issue 386583](https://gitlab.com/gitlab-org/gitlab/-/issues/386583)
diff --git a/doc/user/group/value_stream_analytics/index.md b/doc/user/group/value_stream_analytics/index.md
index ba99fb5dec2..bc48c1050fb 100644
--- a/doc/user/group/value_stream_analytics/index.md
+++ b/doc/user/group/value_stream_analytics/index.md
@@ -250,7 +250,7 @@ For the "Tasks by type" chart, only the Date range and Project selector filters
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/210315) in GitLab 13.0.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/323982) in GitLab 13.12.
-The **Overview** page in value stream analytics displays key metrics and DORA metrics of group performance.
+The **Overview** page in value stream analytics displays key metrics of the DevSecOps lifecycle performance for projects and groups.
### Key metrics
@@ -296,22 +296,31 @@ Prerequisite:
- To view deployment metrics, you must have a
[production environment configured](#how-value-stream-analytics-identifies-the-production-environment).
-To view the DORA metrics and key metrics:
+To view key lifecycle metrics:
1. On the top bar, select **Main menu**, and:
- For a project, select **Projects** and find your project.
- For a group, select **Groups** and find your group.
1. On the left sidebar, select **Analytics > Value stream**.
- Key metrics and DORA metrics display below the **Filter results** text box.
+ Key metrics display below the **Filter results** text box.
1. Optional. Filter the results:
1. Select the **Filter results** text box.
- Based on the filter you select, the dashboard automatically aggregates DORA metrics and displays the status of the value stream.
+ Based on the filter you select, the dashboard automatically aggregates key metrics and displays the status of the value stream.
1. Select a parameter.
1. Select a value or enter text to refine the results.
1. To adjust the date range:
- In the **From** field, select a start date.
- In the **To** field, select an end date.
-1. Select a DORA metric to view its chart.
+
+To view the [Value Streams Dashboard](../../analytics/value_streams_dashboard.md) and [DORA metrics](../../analytics/dora_metrics.md):
+
+1. On the top bar, select **Main menu**, and:
+ - For a project, select **Projects** and find your project.
+ - For a group, select **Groups** and find your group.
+1. On the left sidebar, select **Analytics > Value stream**.
+1. Below the **Filter results** text box, in the **Key metrics** row, select **Value Streams Dashboard / DORA**.
+1. Optional. To open the new page, append this path `/analytics/dashboards/value_streams_dashboard` to the group URL
+ (for example, `https://gitlab.com/groups/gitlab-org/-/analytics/dashboards/value_streams_dashboard`).
## View metrics for each development stage
diff --git a/doc/user/packages/container_registry/authenticate_with_container_registry.md b/doc/user/packages/container_registry/authenticate_with_container_registry.md
index f48ba7bbf52..31337d19d59 100644
--- a/doc/user/packages/container_registry/authenticate_with_container_registry.md
+++ b/doc/user/packages/container_registry/authenticate_with_container_registry.md
@@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
<!--- start_remove The following content will be removed on remove_date: '2023-11-22' -->
WARNING:
-[External authorization](../../admin_area/settings/external_authorization.md) will be enabled by default in GitLab 16.0. External authorization prevents personal access tokens and deploy tokens from accessing container and package registries and affects all users who use these tokens to access the registries. You can disable external authorization if you want to use personal access tokens and deploy tokens with the container or package registries.
+In GitLab 16.0 and later, [external authorization](../../admin_area/settings/external_authorization.md) prevents personal access tokens and deploy tokens from accessing container and package registries and affects all users who use these tokens to access the registries. You can disable external authorization if you want to use personal access tokens and deploy tokens with the container or package registries.
<!--- end_remove -->
To authenticate with the Container Registry, you can use a:
diff --git a/doc/user/product_analytics/index.md b/doc/user/product_analytics/index.md
index f03ed9ecb90..b5f936e7848 100644
--- a/doc/user/product_analytics/index.md
+++ b/doc/user/product_analytics/index.md
@@ -71,7 +71,7 @@ Prerequisite:
1. On the top bar, select **Main menu > Admin**.
1. On the left sidebar, select **Settings > General**.
-1. Expand the **Product analytics** section.
+1. Expand the **Analytics** tab and find the **Product analytics** section.
1. Select **Enable product analytics** and enter the configuration values.
The following table shows the required configuration parameters and example values:
diff --git a/doc/user/project/img/issue_board_system_notes_v13_6.png b/doc/user/project/img/issue_board_system_notes_v13_6.png
deleted file mode 100644
index 4958f63541e..00000000000
--- a/doc/user/project/img/issue_board_system_notes_v13_6.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/img/protected_tags_list_v12_3.png b/doc/user/project/img/protected_tags_list_v12_3.png
deleted file mode 100644
index 6a30f615f2f..00000000000
--- a/doc/user/project/img/protected_tags_list_v12_3.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/img/protected_tags_page_v12_3.png b/doc/user/project/img/protected_tags_page_v12_3.png
deleted file mode 100644
index 841e19af8a7..00000000000
--- a/doc/user/project/img/protected_tags_page_v12_3.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/img/protected_tags_permissions_dropdown_v12_3.png b/doc/user/project/img/protected_tags_permissions_dropdown_v12_3.png
deleted file mode 100644
index 913d4725d53..00000000000
--- a/doc/user/project/img/protected_tags_permissions_dropdown_v12_3.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/issue_board.md b/doc/user/project/issue_board.md
index 85779ae860f..f5d0382ccd8 100644
--- a/doc/user/project/issue_board.md
+++ b/doc/user/project/issue_board.md
@@ -446,7 +446,6 @@ When you hover over the blocked icon (**{issue-block}**), a detailed information
- [Remove an existing list](#remove-a-list).
- [Remove an issue from a list](#remove-an-issue-from-a-list).
- [Filter issues](#filter-issues) that appear across your issue board.
-- [Create workflows](#create-workflows).
- [Move issues and lists](#move-issues-and-lists).
- [Multi-select issue cards](#multi-select-issue-cards).
- Drag and reorder the lists.
@@ -574,44 +573,6 @@ When [filtering issues](#filter-issues) in a **group** board, keep this behavior
When you edit issues individually using the right sidebar, you can additionally select the
milestones and labels from the **project** that the issue is from.
-### Create workflows
-
-By reordering your lists, you can create workflows. As lists in issue boards are
-based on labels, it works out of the box with your existing issues.
-
-So if you've already labeled things with **Backend** and **Frontend**, the issue appears in
-the lists as you create them. In addition, this means you can move something between lists by
-changing a label.
-
-A typical workflow of using an issue board would be:
-
-1. You [create](labels.md#create-a-label) and [prioritize](labels.md#set-label-priority)
- labels to categorize your issues.
-1. You have a bunch of issues (ideally labeled).
-1. You visit the issue board and start [creating lists](#create-a-new-list) to
- create a workflow.
-1. You move issues around in lists so that your team knows who should be working
- on what issue.
-1. When the work by one team is done, the issue can be dragged to the next list
- so someone else can pick it up.
-1. When the issue is finally resolved, the issue is moved to the **Done** list
- and gets automatically closed.
-
-For example, you can create a list based on the label of **Frontend** and one for
-**Backend**. A designer can start working on an issue by adding it to the
-**Frontend** list. That way, everyone knows that this issue is now being
-worked on by the designers.
-
-Then, when they're done, all they have to do is
-drag it to the next list, **Backend**. Then, a backend developer can
-eventually pick it up. When they're done, they move it to **Done**, to close the
-issue.
-
-This process can be seen clearly when visiting an issue. With every move
-to another list, the label changes and a [system note](system_notes.md) is recorded.
-
-![issue board system notes](img/issue_board_system_notes_v13_6.png)
-
### Move issues and lists
You can move issues and lists by dragging them.
diff --git a/doc/user/project/labels.md b/doc/user/project/labels.md
index c24526ddd86..2af15e06b98 100644
--- a/doc/user/project/labels.md
+++ b/doc/user/project/labels.md
@@ -381,7 +381,7 @@ issue is now under review, they assign the `workflow::review`, and the `workflow
is removed.
The same happens when you move issues across label lists in an
-[issue board](issue_board.md#create-workflows). With scoped labels, team members not working in an
+[issue board](issue_board.md). With scoped labels, team members not working in an
issue board can also advance workflow states consistently in issues themselves.
For a video explanation, see:
diff --git a/doc/user/project/protected_branches.md b/doc/user/project/protected_branches.md
index 8d4d16ffbc3..1d279436d2c 100644
--- a/doc/user/project/protected_branches.md
+++ b/doc/user/project/protected_branches.md
@@ -22,6 +22,8 @@ The [default branch](repository/branches/default.md) for your repository is prot
## Who can modify a protected branch
+> Branch push permission [changed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/118532) to require GitLab administrators to also have the **allowed** permission in GitLab 16.0.
+
When a branch is protected, the default behavior enforces these restrictions on the branch.
| Action | Who can do it |
diff --git a/doc/user/project/protected_tags.md b/doc/user/project/protected_tags.md
index 1256599c521..3af475afa4f 100644
--- a/doc/user/project/protected_tags.md
+++ b/doc/user/project/protected_tags.md
@@ -16,7 +16,7 @@ Each rule allows you to match either:
- An individual tag name.
- Wildcards to control multiple tags at once.
-This feature evolved out of [protected branches](protected_branches.md)
+This feature evolved out of [protected branches](protected_branches.md).
## Who can modify a protected tag
@@ -27,22 +27,22 @@ By default:
## Configuring protected tags
-To protect a tag, you must have at least the Maintainer role.
-
-1. Go to the project's **Settings > Repository**.
-
-1. From the **Tag** dropdown list, select the tag you want to protect or type and select **Create wildcard**. In the screenshot below, we chose to protect all tags matching `v*`:
-
- ![Protected tags page](img/protected_tags_page_v12_3.png)
-
-1. From the **Allowed to create** dropdown list, select users with permission to create
- matching tags, and select **Protect**:
+Prerequisites:
- ![Allowed to create tags dropdown list](img/protected_tags_permissions_dropdown_v12_3.png)
+- You must have at least the Maintainer role for the project.
-1. After done, the protected tag displays in the **Protected tags** list:
+1. On the top bar, select **Main menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > Repository**.
+1. Expand **Protected tags**.
+1. To protect a single tag, select **Tag**, then choose your tag from the dropdown list.
+1. To protect all tags with names matching a string:
+ 1. Select **Tag**.
+ 1. Enter the string to use for tag matching. Wildcards (`*`) are supported.
+ 1. Select **Create wildcard**.
+1. In **Allowed to create** , select either the users or roles that may create protected tags.
+1. Select **Protect**.
- ![Protected tags list](img/protected_tags_list_v12_3.png)
+The protected tag (or wildcard) displays in the **Protected tags** list.
## Wildcard protected tags
diff --git a/doc/user/project/releases/index.md b/doc/user/project/releases/index.md
index f15a3299108..59155f63075 100644
--- a/doc/user/project/releases/index.md
+++ b/doc/user/project/releases/index.md
@@ -249,7 +249,7 @@ section, along with statistics about the issues in the milestones.
Releases are also visible on the **Issues > Milestones** page, and when you select a milestone
on this page.
-Here is an example of milestones with no releases, one release, and two releases, respectively.
+Here is an example of milestones with no releases, one release, and two releases.
![Milestones with and without Release associations](img/milestone_list_with_releases_v12_5.png)
diff --git a/doc/user/search/exact_code_search.md b/doc/user/search/exact_code_search.md
index 674b2813985..469d91b5194 100644
--- a/doc/user/search/exact_code_search.md
+++ b/doc/user/search/exact_code_search.md
@@ -7,7 +7,7 @@ type: reference
# Exact Code Search **(PREMIUM)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/105049) in GitLab 15.9 [with a flag](../../administration/feature_flags.md) named `index_code_with_zoekt` and `search_code_with_zoekt` which enables indexing and searching respectively. Both are disabled by default.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/105049) in GitLab 15.9 [with a flag](../../administration/feature_flags.md) named `index_code_with_zoekt` for indexing and `search_code_with_zoekt` for searching. Both are disabled by default.
WARNING:
We are still actively making changes to the Exact Code Search feature. GitLab will dogfood it first, and roll it out only to specific customers on GitLab.com who request access to it. We will make an announcement when it's available for GitLab.com customers to tryout. You can follow our development progress by checking [the Exact Code Search feature roadmap](https://gitlab.com/groups/gitlab-org/-/epics/9404).
diff --git a/lib/api/entities/ci/secure_file.rb b/lib/api/entities/ci/secure_file.rb
index bf8d2776db1..614fd49aa30 100644
--- a/lib/api/entities/ci/secure_file.rb
+++ b/lib/api/entities/ci/secure_file.rb
@@ -10,7 +10,7 @@ module API
documentation: { type: 'string', example: '16630b189ab34b2e3504f4758e1054d2e478deda510b2b08cc0ef38d12e80aac' }
expose :checksum_algorithm, documentation: { type: 'string', example: 'sha256' }
expose :created_at, documentation: { type: 'dateTime', example: '2022-02-22T22:22:22.222Z' }
- expose :expires_at, documentation: { type: 'dateTime', example: '2022-09-21T14:56:00.000Z' }
+ expose :expires_at, documentation: { type: 'dateTime', example: '2023-09-21T14:55:59.000Z' }
expose :metadata, documentation: { type: 'Hash', example: { "id" => "75949910542696343243264405377658443914" } }
expose :file_extension, documentation: { type: 'string', example: 'jks' }
end
diff --git a/lib/gitlab/ci/secure_files/cer.rb b/lib/gitlab/ci/secure_files/cer.rb
index 45d2898c29b..3340afa8f2a 100644
--- a/lib/gitlab/ci/secure_files/cer.rb
+++ b/lib/gitlab/ci/secure_files/cer.rb
@@ -36,7 +36,7 @@ module Gitlab
private
def expires_at
- certificate_data.not_before
+ certificate_data.not_after
end
def id
diff --git a/lib/gitlab/ci/secure_files/p12.rb b/lib/gitlab/ci/secure_files/p12.rb
index 1006a4d05b2..04cd4243bb0 100644
--- a/lib/gitlab/ci/secure_files/p12.rb
+++ b/lib/gitlab/ci/secure_files/p12.rb
@@ -36,7 +36,7 @@ module Gitlab
private
def expires_at
- certificate_data.not_before
+ certificate_data.not_after
end
def serial
diff --git a/lib/sidebars/groups/menus/issues_menu.rb b/lib/sidebars/groups/menus/issues_menu.rb
index a09cb01ad0d..27b78d89aa1 100644
--- a/lib/sidebars/groups/menus/issues_menu.rb
+++ b/lib/sidebars/groups/menus/issues_menu.rb
@@ -53,10 +53,9 @@ module Sidebars
def serialize_as_menu_item_args
super.merge({
active_routes: list_menu_item.active_routes,
- sprite_icon: sprite_icon,
pill_count: pill_count,
has_pill: has_pill?,
- super_sidebar_parent: ::Sidebars::StaticMenu,
+ super_sidebar_parent: ::Sidebars::Groups::SuperSidebarMenus::PlanMenu,
item_id: :group_issue_list
})
end
diff --git a/lib/sidebars/groups/menus/merge_requests_menu.rb b/lib/sidebars/groups/menus/merge_requests_menu.rb
index 5e25c33167c..356c823add9 100644
--- a/lib/sidebars/groups/menus/merge_requests_menu.rb
+++ b/lib/sidebars/groups/menus/merge_requests_menu.rb
@@ -56,10 +56,9 @@ module Sidebars
override :serialize_as_menu_item_args
def serialize_as_menu_item_args
super.merge({
- sprite_icon: sprite_icon,
pill_count: pill_count,
has_pill: has_pill?,
- super_sidebar_parent: ::Sidebars::StaticMenu,
+ super_sidebar_parent: ::Sidebars::Groups::SuperSidebarMenus::CodeMenu,
item_id: :group_merge_request_list
})
end
diff --git a/lib/sidebars/groups/super_sidebar_menus/code_menu.rb b/lib/sidebars/groups/super_sidebar_menus/code_menu.rb
new file mode 100644
index 00000000000..e102066b18d
--- /dev/null
+++ b/lib/sidebars/groups/super_sidebar_menus/code_menu.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+module Sidebars
+ module Groups
+ module SuperSidebarMenus
+ class CodeMenu < ::Sidebars::Menu
+ override :title
+ def title
+ s_('Navigation|Code')
+ end
+
+ override :sprite_icon
+ def sprite_icon
+ 'code'
+ end
+
+ override :configure_menu_items
+ def configure_menu_items
+ [
+ :group_merge_request_list
+ ].each { |id| add_item(::Sidebars::NilMenuItem.new(item_id: id)) }
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sidebars/groups/super_sidebar_menus/plan_menu.rb b/lib/sidebars/groups/super_sidebar_menus/plan_menu.rb
index da357253b8f..74e7977fff5 100644
--- a/lib/sidebars/groups/super_sidebar_menus/plan_menu.rb
+++ b/lib/sidebars/groups/super_sidebar_menus/plan_menu.rb
@@ -17,6 +17,8 @@ module Sidebars
override :configure_menu_items
def configure_menu_items
[
+ :group_issue_list,
+ :group_epic_list,
:issue_boards,
:epic_boards,
:roadmap,
diff --git a/lib/sidebars/groups/super_sidebar_panel.rb b/lib/sidebars/groups/super_sidebar_panel.rb
index 3a9d8304183..03af904d99d 100644
--- a/lib/sidebars/groups/super_sidebar_panel.rb
+++ b/lib/sidebars/groups/super_sidebar_panel.rb
@@ -15,6 +15,7 @@ module Sidebars
add_menu(Sidebars::StaticMenu.new(context))
add_menu(Sidebars::Groups::SuperSidebarMenus::ManageMenu.new(context))
add_menu(Sidebars::Groups::SuperSidebarMenus::PlanMenu.new(context))
+ add_menu(Sidebars::Groups::SuperSidebarMenus::CodeMenu.new(context))
add_menu(Sidebars::Groups::SuperSidebarMenus::BuildMenu.new(context))
add_menu(Sidebars::Groups::SuperSidebarMenus::SecureMenu.new(context))
add_menu(Sidebars::Groups::SuperSidebarMenus::OperationsMenu.new(context))
diff --git a/lib/sidebars/projects/menus/issues_menu.rb b/lib/sidebars/projects/menus/issues_menu.rb
index dd5d4458fbb..070eac0ae49 100644
--- a/lib/sidebars/projects/menus/issues_menu.rb
+++ b/lib/sidebars/projects/menus/issues_menu.rb
@@ -72,10 +72,9 @@ module Sidebars
override :serialize_as_menu_item_args
def serialize_as_menu_item_args
super.merge({
- sprite_icon: sprite_icon,
pill_count: pill_count,
has_pill: has_pill?,
- super_sidebar_parent: ::Sidebars::StaticMenu,
+ super_sidebar_parent: ::Sidebars::Projects::SuperSidebarMenus::PlanMenu,
item_id: :project_issue_list
})
end
diff --git a/lib/sidebars/projects/menus/merge_requests_menu.rb b/lib/sidebars/projects/menus/merge_requests_menu.rb
index 71cc53da3ea..ae4fd6b02e7 100644
--- a/lib/sidebars/projects/menus/merge_requests_menu.rb
+++ b/lib/sidebars/projects/menus/merge_requests_menu.rb
@@ -69,10 +69,9 @@ module Sidebars
override :serialize_as_menu_item_args
def serialize_as_menu_item_args
super.merge({
- sprite_icon: sprite_icon,
pill_count: pill_count,
has_pill: has_pill?,
- super_sidebar_parent: ::Sidebars::StaticMenu,
+ super_sidebar_parent: ::Sidebars::Projects::SuperSidebarMenus::CodeMenu,
item_id: :project_merge_request_list
})
end
diff --git a/lib/sidebars/projects/super_sidebar_menus/code_menu.rb b/lib/sidebars/projects/super_sidebar_menus/code_menu.rb
index a201312f8ce..89acb92e3b8 100644
--- a/lib/sidebars/projects/super_sidebar_menus/code_menu.rb
+++ b/lib/sidebars/projects/super_sidebar_menus/code_menu.rb
@@ -17,6 +17,7 @@ module Sidebars
override :configure_menu_items
def configure_menu_items
[
+ :project_merge_request_list,
:files,
:branches,
:commits,
diff --git a/lib/sidebars/projects/super_sidebar_menus/plan_menu.rb b/lib/sidebars/projects/super_sidebar_menus/plan_menu.rb
index 38b30949bfa..bc3111cc6f4 100644
--- a/lib/sidebars/projects/super_sidebar_menus/plan_menu.rb
+++ b/lib/sidebars/projects/super_sidebar_menus/plan_menu.rb
@@ -17,6 +17,7 @@ module Sidebars
override :configure_menu_items
def configure_menu_items
[
+ :project_issue_list,
:boards,
:project_wiki,
:service_desk,
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 70764610ff7..2bfb2554b85 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -21224,6 +21224,9 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
+msgid "GroupSettings|Analytics"
+msgstr ""
+
msgid "GroupSettings|Analytics Dashboards"
msgstr ""
@@ -21260,6 +21263,9 @@ msgstr ""
msgid "GroupSettings|Compliance frameworks"
msgstr ""
+msgid "GroupSettings|Configure analytics features for this group"
+msgstr ""
+
msgid "GroupSettings|Configure compliance frameworks to make them available to projects in this group. %{linkStart}What are compliance frameworks?%{linkEnd}"
msgstr ""
@@ -30007,9 +30013,6 @@ msgstr ""
msgid "Normal text"
msgstr ""
-msgid "NorthstarNavigation|Beta"
-msgstr ""
-
msgid "NorthstarNavigation|Could not update the new navigation preference. Please try again later."
msgstr ""
@@ -35194,6 +35197,9 @@ msgstr ""
msgid "ProjectSettings|Combine git tags with release notes, release evidence, and assets to create a release."
msgstr ""
+msgid "ProjectSettings|Configure analytics features for this project"
+msgstr ""
+
msgid "ProjectSettings|Configure product analytics to track events within your project applications."
msgstr ""
diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide/add_new_directory_in_web_ide_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide/add_new_directory_in_web_ide_spec.rb
index 3341e4627b2..af3d064a37c 100644
--- a/qa/qa/specs/features/browser_ui/3_create/web_ide/add_new_directory_in_web_ide_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/add_new_directory_in_web_ide_spec.rb
@@ -1,7 +1,12 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Create', product_group: :ide do
+ RSpec.describe 'Create', product_group: :ide,
+ quarantine: {
+ only: { job: 'slow-network' },
+ issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/387609',
+ type: :flaky
+ } do
describe 'Add a directory in Web IDE' do
let(:project) do
Resource::Project.fabricate_via_api! do |project|
@@ -52,7 +57,7 @@ module QA
end
it 'shows successfully but not able to be committed',
- testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/386761' do
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/386761' do
Page::Project::WebIDE::VSCode.perform do |ide|
ide.wait_for_ide_to_load
ide.create_new_folder(directory_name)
diff --git a/qa/qa/specs/features/browser_ui/4_verify/runner/register_group_runner_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/runner/register_group_runner_spec.rb
index fba2f22b3e5..016dc9016cd 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/runner/register_group_runner_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/runner/register_group_runner_spec.rb
@@ -1,7 +1,12 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Verify', :runner, product_group: :runner do
+ RSpec.describe 'Verify', :runner, product_group: :runner,
+ quarantine: {
+ only: { job: 'airgapped' },
+ issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/390184',
+ type: :stale
+ } do
describe 'Group runner registration' do
let(:executor) { "qa-runner-#{Time.now.to_i}" }
diff --git a/scripts/api/get_package_and_test_job.rb b/scripts/api/get_package_and_test_job.rb
index dbc29f754d0..e9430c5f107 100644
--- a/scripts/api/get_package_and_test_job.rb
+++ b/scripts/api/get_package_and_test_job.rb
@@ -1,10 +1,15 @@
# frozen_string_literal: true
require 'gitlab'
-
require_relative 'default_options'
class GetPackageAndTestJob
+ FAILED_STATUS = [
+ 'failed',
+ 'passed with warnings',
+ 'canceled'
+ ].freeze
+
def initialize(options)
@project = options.fetch(:project)
@pipeline_id = options.fetch(:pipeline_id)
@@ -21,19 +26,24 @@ class GetPackageAndTestJob
end
def execute
- package_and_test_job = nil
+ package_and_test_bridge = client
+ .pipeline_bridges(project, pipeline_id, per_page: 100)
+ .auto_paginate
+ .find { |job| job.name.include?('package-and-test-ee') }
+
+ return if package_and_test_bridge&.downstream_pipeline.nil?
+
+ package_and_test_pipeline = client
+ .pipeline(project, package_and_test_bridge.downstream_pipeline.id)
+
+ return if package_and_test_pipeline.nil?
- client.pipeline_bridges(project, pipeline_id, scope: 'failed', per_page: 100).auto_paginate do |job|
- if job['name'].include?('package-and-test')
- package_and_test_job = job
- break
- end
- end
+ status = package_and_test_pipeline.detailed_status
- package_and_test_job
+ return package_and_test_pipeline if FAILED_STATUS.include?(status&.label)
end
private
- attr_reader :project, :pipeline_id, :exclude_allowed_to_fail_jobs, :client
+ attr_reader :project, :pipeline_id, :client
end
diff --git a/scripts/generate-failed-package-and-test-mr-message.rb b/scripts/generate-failed-package-and-test-mr-message.rb
index a53b393498c..c57f132d563 100755
--- a/scripts/generate-failed-package-and-test-mr-message.rb
+++ b/scripts/generate-failed-package-and-test-mr-message.rb
@@ -19,7 +19,7 @@ class GenerateFailedPackageAndTestMrMessage
end
def execute
- return unless failed_package_and_test_job
+ return unless failed_package_and_test_pipeline
add_discussion_to_mr
end
@@ -34,8 +34,8 @@ class GenerateFailedPackageAndTestMrMessage
).execute(content)
end
- def failed_package_and_test_job
- @failed_package_and_test_job ||= GetPackageAndTestJob.new(API::DEFAULT_OPTIONS).execute
+ def failed_package_and_test_pipeline
+ @failed_package_and_test_pipeline ||= GetPackageAndTestJob.new(API::DEFAULT_OPTIONS).execute
end
def merge_request
@@ -48,8 +48,10 @@ class GenerateFailedPackageAndTestMrMessage
<<~MARKDOWN
:warning: @#{author_username} The `e2e:package-and-test-ee` job has failed.
- - Pipeline: #{pipeline_link}
- - `package-and-test` pipeline: #{failed_package_and_test_job['web_url']}
+ - `e2e:package-and-test-ee` pipeline: #{failed_package_and_test_pipeline['web_url']}
+
+ `e2e:package-and-test-ee` pipeline is allowed to fail due its [flakiness](#{package_and_test_link}). Failures should be
+ investigated to guarantee this backport complies with the Quality standards.
Ping your team's associated Software Engineer in Test (SET) to confirm the failures are unrelated to the merge request.
If there's no SET assigned, ask for assistance on the `#quality` Slack channel.
@@ -60,8 +62,8 @@ class GenerateFailedPackageAndTestMrMessage
merge_request['author']['username'] if merge_request
end
- def pipeline_link
- "[##{ENV['CI_PIPELINE_ID']}](#{ENV['CI_PIPELINE_URL']})"
+ def package_and_test_link
+ "https://about.gitlab.com/handbook/engineering/quality/quality-engineering/test-metrics-dashboards/#package-and-test"
end
end
diff --git a/spec/controllers/admin/application_settings_controller_spec.rb b/spec/controllers/admin/application_settings_controller_spec.rb
index fb2c6113ca7..a721722a5c3 100644
--- a/spec/controllers/admin/application_settings_controller_spec.rb
+++ b/spec/controllers/admin/application_settings_controller_spec.rb
@@ -204,6 +204,27 @@ RSpec.describe Admin::ApplicationSettingsController, :do_not_mock_admin_mode_set
expect(ApplicationSetting.current.valid_runner_registrars).to eq(['project'])
end
+ it 'updates GitLab for Slack app settings' do
+ settings = {
+ slack_app_enabled: true,
+ slack_app_id: 'slack_app_id',
+ slack_app_secret: 'slack_app_secret',
+ slack_app_signing_secret: 'slack_app_signing_secret',
+ slack_app_verification_token: 'slack_app_verification_token'
+ }
+
+ put :update, params: { application_setting: settings }
+
+ expect(response).to redirect_to(general_admin_application_settings_path)
+ expect(ApplicationSetting.current).to have_attributes(
+ slack_app_enabled: true,
+ slack_app_id: 'slack_app_id',
+ slack_app_secret: 'slack_app_secret',
+ slack_app_signing_secret: 'slack_app_signing_secret',
+ slack_app_verification_token: 'slack_app_verification_token'
+ )
+ end
+
context 'boolean attributes' do
shared_examples_for 'updates boolean attribute' do |attribute|
specify do
diff --git a/spec/features/admin/admin_settings_spec.rb b/spec/features/admin/admin_settings_spec.rb
index 4dee97880a5..8f687332901 100644
--- a/spec/features/admin/admin_settings_spec.rb
+++ b/spec/features/admin/admin_settings_spec.rb
@@ -360,8 +360,8 @@ RSpec.describe 'Admin updates settings', feature_category: :shared do
end
end
- context 'GitLab for Jira App settings' do
- it 'changes the setting' do
+ context 'GitLab for Jira App settings', feature_category: :integrations do
+ it 'changes the settings' do
page.within('#js-jira_connect-settings') do
fill_in 'Jira Connect Application ID', with: '1234'
fill_in 'Jira Connect Proxy URL', with: 'https://example.com'
@@ -375,6 +375,28 @@ RSpec.describe 'Admin updates settings', feature_category: :shared do
expect(page).to have_content "Application settings saved successfully"
end
end
+
+ context 'GitLab for Slack app settings', feature_category: :integrations do
+ it 'changes the settings' do
+ page.within('.as-slack') do
+ check 'Enable Slack application'
+ fill_in 'Client ID', with: 'slack_app_id'
+ fill_in 'Client secret', with: 'slack_app_secret'
+ fill_in 'Signing secret', with: 'slack_app_signing_secret'
+ fill_in 'Verification token', with: 'slack_app_verification_token'
+ click_button 'Save changes'
+ end
+
+ expect(current_settings).to have_attributes(
+ slack_app_enabled: true,
+ slack_app_id: 'slack_app_id',
+ slack_app_secret: 'slack_app_secret',
+ slack_app_signing_secret: 'slack_app_signing_secret',
+ slack_app_verification_token: 'slack_app_verification_token'
+ )
+ expect(page).to have_content 'Application settings saved successfully'
+ end
+ end
end
context 'Integrations page' do
diff --git a/spec/features/nav/pinned_nav_items_spec.rb b/spec/features/nav/pinned_nav_items_spec.rb
index ea0404e7cf6..308350d5166 100644
--- a/spec/features/nav/pinned_nav_items_spec.rb
+++ b/spec/features/nav/pinned_nav_items_spec.rb
@@ -35,6 +35,12 @@ RSpec.describe 'Navigation menu item pinning', :js, feature_category: :navigatio
visit project_path(project)
end
+ it 'adds sensible defaults' do
+ within '[data-testid="pinned-nav-items"]' do
+ expect(page).to have_link 'Issues'
+ end
+ end
+
it 'shows the Pinned section' do
within '#super-sidebar' do
expect(page).to have_content 'Pinned'
@@ -49,12 +55,17 @@ RSpec.describe 'Navigation menu item pinning', :js, feature_category: :navigatio
end
within '[data-testid="pinned-nav-items"]' do
+ expect(page).to have_link 'Issues'
expect(page).to have_link 'Activity'
expect(page).to have_link 'Members'
end
end
- describe 'collapsible section' do
+ describe 'when all pins are removed' do
+ before do
+ remove_pin('Issues')
+ end
+
it 'shows the Pinned section as expanded by default' do
within '#super-sidebar' do
expect(page).to have_content 'Your pinned items appear here.'
@@ -106,14 +117,13 @@ RSpec.describe 'Navigation menu item pinning', :js, feature_category: :navigatio
it 'can be reordered' do
within '[data-testid="pinned-nav-items"]' do
pinned_items = page.find_all('a').map(&:text)
- item1 = page.find('a', text: 'Package Registry')
- item2 = page.find('a', text: 'Terraform modules')
- expect(pinned_items).to eq [item1.text, item2.text]
-
- drag_item(item2, to: item1)
+ item2 = page.find('a', text: 'Package Registry')
+ item3 = page.find('a', text: 'Terraform modules')
+ expect(pinned_items[1..2]).to eq [item2.text, item3.text]
+ drag_item(item3, to: item2)
pinned_items = page.find_all('a').map(&:text)
- expect(pinned_items).to eq [item2.text, item1.text]
+ expect(pinned_items[1..2]).to eq [item3.text, item2.text]
end
end
end
@@ -148,8 +158,10 @@ RSpec.describe 'Navigation menu item pinning', :js, feature_category: :navigatio
it 'keeps pins of non-available features' do
within '[data-testid="pinned-nav-items"]' do
- pinned_items = page.find_all('a').map(&:text)
- expect(pinned_items).to eq %w[Commits Members Activity]
+ pinned_items = page.find_all('a')
+ .map(&:text)
+ .map { |text| text.split("\n").first } # to drop the counter badge text from "Issues\n0"
+ expect(pinned_items).to eq ["Issues", "Merge requests", "Commits", "Members", "Activity"]
end
end
end
diff --git a/spec/features/profiles/chat_names_spec.rb b/spec/features/profiles/chat_names_spec.rb
index 105d7d4ec16..aa3f4a90298 100644
--- a/spec/features/profiles/chat_names_spec.rb
+++ b/spec/features/profiles/chat_names_spec.rb
@@ -26,13 +26,36 @@ RSpec.describe 'Profile > Chat', feature_category: :integrations do
visit authorize_path
end
- it 'names the integration correctly' do
+ it 'names the Mattermost integration correctly' do
expect(page).to have_content(
'An application called Mattermost slash commands is requesting access to your GitLab account'
)
expect(page).to have_content('Authorize Mattermost slash commands')
end
+ context 'when params are of the GitLab for Slack app' do
+ let(:params) do
+ { team_id: 'T00', team_domain: 'my_chat_team', user_id: 'U01', user_name: 'my_chat_user' }
+ end
+
+ shared_examples 'names the GitLab for Slack app integration correctly' do
+ specify do
+ expect(page).to have_content(
+ 'An application called GitLab for Slack app is requesting access to your GitLab account'
+ )
+ expect(page).to have_content('Authorize GitLab for Slack app')
+ end
+ end
+
+ include_examples 'names the GitLab for Slack app integration correctly'
+
+ context 'with a Slack enterprise-enabled team' do
+ let(:params) { super().merge(user_id: 'W01') }
+
+ include_examples 'names the GitLab for Slack app integration correctly'
+ end
+ end
+
context 'clicks authorize' do
before do
click_button 'Authorize'
diff --git a/spec/frontend/ci_secure_files/components/metadata/__snapshots__/modal_spec.js.snap b/spec/frontend/ci_secure_files/components/metadata/__snapshots__/modal_spec.js.snap
index 1be89ae832d..79194c20ff5 100644
--- a/spec/frontend/ci_secure_files/components/metadata/__snapshots__/modal_spec.js.snap
+++ b/spec/frontend/ci_secure_files/components/metadata/__snapshots__/modal_spec.js.snap
@@ -168,7 +168,7 @@ exports[`Secure File Metadata Modal when a .cer file is supplied matches cer the
role="cell"
>
- April 26, 2022 at 7:20:40 PM GMT
+ April 26, 2023 at 7:20:39 PM GMT
</td>
</tr>
diff --git a/spec/frontend/ci_secure_files/mock_data.js b/spec/frontend/ci_secure_files/mock_data.js
index f532b468fb9..b3db0f7dd64 100644
--- a/spec/frontend/ci_secure_files/mock_data.js
+++ b/spec/frontend/ci_secure_files/mock_data.js
@@ -24,7 +24,7 @@ export const secureFiles = [
checksum_algorithm: 'sha256',
created_at: '2022-02-22T22:22:22.222Z',
file_extension: 'cer',
- expires_at: '2022-04-26T19:20:40.000Z',
+ expires_at: '2023-04-26T19:20:39.000Z',
metadata: {
id: '33669367788748363528491290218354043267',
issuer: {
@@ -40,7 +40,7 @@ export const secureFiles = [
OU: 'ABC123XYZ',
UID: 'ABC123XYZ',
},
- expires_at: '2022-04-26T19:20:40.000Z',
+ expires_at: '2023-04-26T19:20:39.000Z',
},
},
{
diff --git a/spec/frontend/sentry/index_spec.js b/spec/frontend/sentry/index_spec.js
index 83195e9d306..aa19bb03cda 100644
--- a/spec/frontend/sentry/index_spec.js
+++ b/spec/frontend/sentry/index_spec.js
@@ -54,4 +54,49 @@ describe('Sentry init', () => {
expect(LegacySentryConfig.init).not.toHaveBeenCalled();
});
});
+
+ describe('with "data-page" attr in body', () => {
+ const mockPage = 'projects:show';
+
+ beforeEach(() => {
+ document.body.dataset.page = mockPage;
+
+ index();
+ });
+
+ afterEach(() => {
+ delete document.body.dataset.page;
+ });
+
+ it('configures sentry with a "page" tag', () => {
+ expect(SentryConfig.init).toHaveBeenCalledTimes(1);
+ expect(SentryConfig.init).toHaveBeenCalledWith(
+ expect.objectContaining({
+ tags: {
+ revision,
+ page: mockPage,
+ feature_category: featureCategory,
+ },
+ }),
+ );
+ });
+ });
+
+ describe('with no tags configuration', () => {
+ beforeEach(() => {
+ window.gon.revision = undefined;
+ window.gon.feature_category = undefined;
+
+ index();
+ });
+
+ it('configures sentry with no tags', () => {
+ expect(SentryConfig.init).toHaveBeenCalledTimes(1);
+ expect(SentryConfig.init).toHaveBeenCalledWith(
+ expect.objectContaining({
+ tags: {},
+ }),
+ );
+ });
+ });
});
diff --git a/spec/frontend/super_sidebar/components/user_menu_spec.js b/spec/frontend/super_sidebar/components/user_menu_spec.js
index 565b7d477f0..cf8f650ec8f 100644
--- a/spec/frontend/super_sidebar/components/user_menu_spec.js
+++ b/spec/frontend/super_sidebar/components/user_menu_spec.js
@@ -460,7 +460,7 @@ describe('UserMenu component', () => {
expect(item.find('a').attributes()).toMatchObject({
'data-track-property': 'nav_user_menu',
'data-track-action': 'click_link',
- 'data-track-label': 'provide_nav_beta_feedback',
+ 'data-track-label': 'provide_nav_feedback',
});
});
});
diff --git a/spec/frontend/vue_shared/components/source_viewer/source_viewer_deprecated_spec.js b/spec/frontend/vue_shared/components/source_viewer/source_viewer_deprecated_spec.js
index 4cec129b6e4..8419a0c5ddf 100644
--- a/spec/frontend/vue_shared/components/source_viewer/source_viewer_deprecated_spec.js
+++ b/spec/frontend/vue_shared/components/source_viewer/source_viewer_deprecated_spec.js
@@ -11,6 +11,7 @@ import {
EVENT_LABEL_FALLBACK,
ROUGE_TO_HLJS_LANGUAGE_MAP,
LINES_PER_CHUNK,
+ LEGACY_FALLBACKS,
} from '~/vue_shared/components/source_viewer/constants';
import waitForPromises from 'helpers/wait_for_promises';
import LineHighlighter from '~/blob/line_highlighter';
@@ -89,14 +90,16 @@ describe('Source Viewer component', () => {
});
describe('legacy fallbacks', () => {
- it('tracks a fallback event and emits an error when viewing python files', () => {
- const fallbackLanguage = 'python';
- const eventData = { label: EVENT_LABEL_FALLBACK, property: fallbackLanguage };
- createComponent({ language: fallbackLanguage });
-
- expect(Tracking.event).toHaveBeenCalledWith(undefined, EVENT_ACTION, eventData);
- expect(wrapper.emitted('error')).toHaveLength(1);
- });
+ it.each(LEGACY_FALLBACKS)(
+ 'tracks a fallback event and emits an error when viewing %s files',
+ (fallbackLanguage) => {
+ const eventData = { label: EVENT_LABEL_FALLBACK, property: fallbackLanguage };
+ createComponent({ language: fallbackLanguage });
+
+ expect(Tracking.event).toHaveBeenCalledWith(undefined, EVENT_ACTION, eventData);
+ expect(wrapper.emitted('error')).toHaveLength(1);
+ },
+ );
});
describe('highlight.js', () => {
diff --git a/spec/helpers/application_settings_helper_spec.rb b/spec/helpers/application_settings_helper_spec.rb
index 91be16b6aea..f924704ab54 100644
--- a/spec/helpers/application_settings_helper_spec.rb
+++ b/spec/helpers/application_settings_helper_spec.rb
@@ -68,6 +68,12 @@ RSpec.describe ApplicationSettingsHelper do
))
end
+ it 'contains GitLab for Slack app parameters' do
+ params = %i(slack_app_enabled slack_app_id slack_app_secret slack_app_signing_secret slack_app_verification_token)
+
+ expect(helper.visible_attributes).to include(*params)
+ end
+
context 'when on SaaS', :saas do
it 'does not contain :deactivate_dormant_users' do
expect(helper.visible_attributes).not_to include(:deactivate_dormant_users)
diff --git a/spec/lib/gitlab/ci/secure_files/cer_spec.rb b/spec/lib/gitlab/ci/secure_files/cer_spec.rb
index 1393e8d2efd..76ce1785368 100644
--- a/spec/lib/gitlab/ci/secure_files/cer_spec.rb
+++ b/spec/lib/gitlab/ci/secure_files/cer_spec.rb
@@ -50,7 +50,7 @@ RSpec.describe Gitlab::Ci::SecureFiles::Cer do
describe '#expires_at' do
it 'returns the certificate expiration timestamp' do
- expect(subject.metadata[:expires_at]).to eq('2022-04-26 19:20:40 UTC')
+ expect(subject.metadata[:expires_at]).to eq('2023-04-26 19:20:39 UTC')
end
end
diff --git a/spec/lib/gitlab/ci/secure_files/p12_spec.rb b/spec/lib/gitlab/ci/secure_files/p12_spec.rb
index beabf4b4856..7a855868ce8 100644
--- a/spec/lib/gitlab/ci/secure_files/p12_spec.rb
+++ b/spec/lib/gitlab/ci/secure_files/p12_spec.rb
@@ -62,7 +62,7 @@ RSpec.describe Gitlab::Ci::SecureFiles::P12 do
describe '#expires_at' do
it 'returns the certificate expiration timestamp' do
- expect(subject.metadata[:expires_at]).to eq('2022-09-21 14:56:00 UTC')
+ expect(subject.metadata[:expires_at]).to eq('2023-09-21 14:55:59 UTC')
end
end
diff --git a/spec/lib/sidebars/groups/menus/issues_menu_spec.rb b/spec/lib/sidebars/groups/menus/issues_menu_spec.rb
index ceeda4a7ac3..415011e0027 100644
--- a/spec/lib/sidebars/groups/menus/issues_menu_spec.rb
+++ b/spec/lib/sidebars/groups/menus/issues_menu_spec.rb
@@ -57,10 +57,9 @@ RSpec.describe Sidebars::Groups::Menus::IssuesMenu, feature_category: :navigatio
{
item_id: :group_issue_list,
active_routes: { path: 'groups#issues' },
- sprite_icon: 'issues',
pill_count: menu.pill_count,
has_pill: menu.has_pill?,
- super_sidebar_parent: ::Sidebars::StaticMenu
+ super_sidebar_parent: Sidebars::Groups::SuperSidebarMenus::PlanMenu
}
end
end
diff --git a/spec/lib/sidebars/groups/menus/merge_requests_menu_spec.rb b/spec/lib/sidebars/groups/menus/merge_requests_menu_spec.rb
index 72f85f7930a..a4421226eeb 100644
--- a/spec/lib/sidebars/groups/menus/merge_requests_menu_spec.rb
+++ b/spec/lib/sidebars/groups/menus/merge_requests_menu_spec.rb
@@ -38,10 +38,9 @@ RSpec.describe Sidebars::Groups::Menus::MergeRequestsMenu, feature_category: :na
let(:extra_attrs) do
{
item_id: :group_merge_request_list,
- sprite_icon: 'git-merge',
pill_count: menu.pill_count,
has_pill: menu.has_pill?,
- super_sidebar_parent: ::Sidebars::StaticMenu
+ super_sidebar_parent: Sidebars::Groups::SuperSidebarMenus::CodeMenu
}
end
end
diff --git a/spec/lib/sidebars/groups/super_sidebar_menus/plan_menu_spec.rb b/spec/lib/sidebars/groups/super_sidebar_menus/plan_menu_spec.rb
index d289295d119..1d228a455ec 100644
--- a/spec/lib/sidebars/groups/super_sidebar_menus/plan_menu_spec.rb
+++ b/spec/lib/sidebars/groups/super_sidebar_menus/plan_menu_spec.rb
@@ -15,6 +15,8 @@ RSpec.describe Sidebars::Groups::SuperSidebarMenus::PlanMenu, feature_category:
it 'defines list of NilMenuItem placeholders' do
expect(items.map(&:class).uniq).to eq([Sidebars::NilMenuItem])
expect(items.map(&:item_id)).to eq([
+ :group_issue_list,
+ :group_epic_list,
:issue_boards,
:epic_boards,
:roadmap,
diff --git a/spec/lib/sidebars/groups/super_sidebar_panel_spec.rb b/spec/lib/sidebars/groups/super_sidebar_panel_spec.rb
index 7362f88ab3c..5035da9c488 100644
--- a/spec/lib/sidebars/groups/super_sidebar_panel_spec.rb
+++ b/spec/lib/sidebars/groups/super_sidebar_panel_spec.rb
@@ -34,6 +34,7 @@ RSpec.describe Sidebars::Groups::SuperSidebarPanel, feature_category: :navigatio
Sidebars::StaticMenu,
Sidebars::Groups::SuperSidebarMenus::ManageMenu,
Sidebars::Groups::SuperSidebarMenus::PlanMenu,
+ Sidebars::Groups::SuperSidebarMenus::CodeMenu,
Sidebars::Groups::SuperSidebarMenus::BuildMenu,
Sidebars::Groups::SuperSidebarMenus::SecureMenu,
Sidebars::Groups::SuperSidebarMenus::OperationsMenu,
diff --git a/spec/lib/sidebars/projects/menus/issues_menu_spec.rb b/spec/lib/sidebars/projects/menus/issues_menu_spec.rb
index f783e7fcff2..544cbcb956d 100644
--- a/spec/lib/sidebars/projects/menus/issues_menu_spec.rb
+++ b/spec/lib/sidebars/projects/menus/issues_menu_spec.rb
@@ -14,10 +14,9 @@ RSpec.describe Sidebars::Projects::Menus::IssuesMenu, feature_category: :navigat
let(:extra_attrs) do
{
item_id: :project_issue_list,
- sprite_icon: 'issues',
pill_count: menu.pill_count,
has_pill: menu.has_pill?,
- super_sidebar_parent: ::Sidebars::StaticMenu
+ super_sidebar_parent: Sidebars::Projects::SuperSidebarMenus::PlanMenu
}
end
end
diff --git a/spec/lib/sidebars/projects/menus/merge_requests_menu_spec.rb b/spec/lib/sidebars/projects/menus/merge_requests_menu_spec.rb
index 697f8a6d7c7..08f35b6acd0 100644
--- a/spec/lib/sidebars/projects/menus/merge_requests_menu_spec.rb
+++ b/spec/lib/sidebars/projects/menus/merge_requests_menu_spec.rb
@@ -15,10 +15,9 @@ RSpec.describe Sidebars::Projects::Menus::MergeRequestsMenu, feature_category: :
let(:extra_attrs) do
{
item_id: :project_merge_request_list,
- sprite_icon: 'git-merge',
pill_count: menu.pill_count,
has_pill: menu.has_pill?,
- super_sidebar_parent: ::Sidebars::StaticMenu
+ super_sidebar_parent: Sidebars::Projects::SuperSidebarMenus::CodeMenu
}
end
end
diff --git a/spec/lib/sidebars/projects/super_sidebar_menus/code_menu_spec.rb b/spec/lib/sidebars/projects/super_sidebar_menus/code_menu_spec.rb
index e307ff91234..8f69717eb29 100644
--- a/spec/lib/sidebars/projects/super_sidebar_menus/code_menu_spec.rb
+++ b/spec/lib/sidebars/projects/super_sidebar_menus/code_menu_spec.rb
@@ -15,6 +15,7 @@ RSpec.describe Sidebars::Projects::SuperSidebarMenus::CodeMenu, feature_category
it 'defines list of NilMenuItem placeholders' do
expect(items.map(&:class).uniq).to eq([Sidebars::NilMenuItem])
expect(items.map(&:item_id)).to eq([
+ :project_merge_request_list,
:files,
:branches,
:commits,
diff --git a/spec/lib/sidebars/projects/super_sidebar_menus/plan_menu_spec.rb b/spec/lib/sidebars/projects/super_sidebar_menus/plan_menu_spec.rb
index 9f3aa62a364..57e6950dd69 100644
--- a/spec/lib/sidebars/projects/super_sidebar_menus/plan_menu_spec.rb
+++ b/spec/lib/sidebars/projects/super_sidebar_menus/plan_menu_spec.rb
@@ -15,6 +15,7 @@ RSpec.describe Sidebars::Projects::SuperSidebarMenus::PlanMenu, feature_category
it 'defines list of NilMenuItem placeholders' do
expect(items.map(&:class).uniq).to eq([Sidebars::NilMenuItem])
expect(items.map(&:item_id)).to eq([
+ :project_issue_list,
:boards,
:project_wiki,
:service_desk,
diff --git a/spec/models/ci/secure_file_spec.rb b/spec/models/ci/secure_file_spec.rb
index 478af41266d..1043da33022 100644
--- a/spec/models/ci/secure_file_spec.rb
+++ b/spec/models/ci/secure_file_spec.rb
@@ -153,7 +153,7 @@ RSpec.describe Ci::SecureFile do
file.reload
- expect(file.expires_at).to eq(DateTime.parse('2022-04-26 19:20:40'))
+ expect(file.expires_at).to eq(DateTime.parse('2023-04-26 19:20:39'))
expect(file.metadata['id']).to eq('33669367788748363528491290218354043267')
expect(file.metadata['issuer']['CN']).to eq('Apple Worldwide Developer Relations Certification Authority')
expect(file.metadata['subject']['OU']).to eq('N7SYAN8PX8')
@@ -169,7 +169,7 @@ RSpec.describe Ci::SecureFile do
file.reload
- expect(file.expires_at).to eq(DateTime.parse('2022-09-21 14:56:00'))
+ expect(file.expires_at).to eq(DateTime.parse('2023-09-21 14:55:59'))
expect(file.metadata['id']).to eq('75949910542696343243264405377658443914')
expect(file.metadata['issuer']['CN']).to eq('Apple Worldwide Developer Relations Certification Authority')
expect(file.metadata['subject']['OU']).to eq('N7SYAN8PX8')
diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb
index ea237768333..aa2ac52a9ab 100644
--- a/spec/models/repository_spec.rb
+++ b/spec/models/repository_spec.rb
@@ -20,10 +20,12 @@ RSpec.describe Repository, feature_category: :source_code_management do
let(:merge_commit) do
merge_request = create(:merge_request, source_branch: 'feature', target_branch: 'master', source_project: project)
- merge_commit_id = repository.merge(user,
- merge_request.diff_head_sha,
- merge_request,
- message)
+ merge_commit_id = repository.merge(
+ user,
+ merge_request.diff_head_sha,
+ merge_request,
+ message
+ )
repository.commit(merge_commit_id)
end
@@ -963,9 +965,11 @@ RSpec.describe Repository, feature_category: :source_code_management do
describe "#create_file" do
it 'commits new file successfully' do
expect do
- repository.create_file(user, 'NEWCHANGELOG', 'Changelog!',
- message: 'Create changelog',
- branch_name: 'master')
+ repository.create_file(
+ user, 'NEWCHANGELOG', 'Changelog!',
+ message: 'Create changelog',
+ branch_name: 'master'
+ )
end.to change { repository.count_commits(ref: 'master') }.by(1)
blob = repository.blob_at('master', 'NEWCHANGELOG')
@@ -975,9 +979,11 @@ RSpec.describe Repository, feature_category: :source_code_management do
it 'creates new file and dir when file_path has a forward slash' do
expect do
- repository.create_file(user, 'new_dir/new_file.txt', 'File!',
- message: 'Create new_file with new_dir',
- branch_name: 'master')
+ repository.create_file(
+ user, 'new_dir/new_file.txt', 'File!',
+ message: 'Create new_file with new_dir',
+ branch_name: 'master'
+ )
end.to change { repository.count_commits(ref: 'master') }.by(1)
expect(repository.tree('master', 'new_dir').path).to eq('new_dir')
@@ -985,9 +991,11 @@ RSpec.describe Repository, feature_category: :source_code_management do
end
it 'respects the autocrlf setting' do
- repository.create_file(user, 'hello.txt', "Hello,\r\nWorld",
- message: 'Add hello world',
- branch_name: 'master')
+ repository.create_file(
+ user, 'hello.txt', "Hello,\r\nWorld",
+ message: 'Add hello world',
+ branch_name: 'master'
+ )
blob = repository.blob_at('master', 'hello.txt')
@@ -997,11 +1005,13 @@ RSpec.describe Repository, feature_category: :source_code_management do
context "when an author is specified" do
it "uses the given email/name to set the commit's author" do
expect do
- repository.create_file(user, 'NEWREADME', 'README!',
- message: 'Add README',
- branch_name: 'master',
- author_email: author_email,
- author_name: author_name)
+ repository.create_file(
+ user, 'NEWREADME', 'README!',
+ message: 'Add README',
+ branch_name: 'master',
+ author_email: author_email,
+ author_name: author_name
+ )
end.to change { repository.count_commits(ref: 'master') }.by(1)
last_commit = repository.commit
@@ -1015,9 +1025,11 @@ RSpec.describe Repository, feature_category: :source_code_management do
describe "#update_file" do
it 'updates file successfully' do
expect do
- repository.update_file(user, 'CHANGELOG', 'Changelog!',
- message: 'Update changelog',
- branch_name: 'master')
+ repository.update_file(
+ user, 'CHANGELOG', 'Changelog!',
+ message: 'Update changelog',
+ branch_name: 'master'
+ )
end.to change { repository.count_commits(ref: 'master') }.by(1)
blob = repository.blob_at('master', 'CHANGELOG')
@@ -1027,10 +1039,12 @@ RSpec.describe Repository, feature_category: :source_code_management do
it 'updates filename successfully' do
expect do
- repository.update_file(user, 'NEWLICENSE', 'Copyright!',
- branch_name: 'master',
- previous_path: 'LICENSE',
- message: 'Changes filename')
+ repository.update_file(
+ user, 'NEWLICENSE', 'Copyright!',
+ branch_name: 'master',
+ previous_path: 'LICENSE',
+ message: 'Changes filename'
+ )
end.to change { repository.count_commits(ref: 'master') }.by(1)
files = repository.ls_files('master')
@@ -1042,12 +1056,14 @@ RSpec.describe Repository, feature_category: :source_code_management do
context "when an author is specified" do
it "uses the given email/name to set the commit's author" do
expect do
- repository.update_file(user, 'README', 'Updated README!',
- branch_name: 'master',
- previous_path: 'README',
- message: 'Update README',
- author_email: author_email,
- author_name: author_name)
+ repository.update_file(
+ user, 'README', 'Updated README!',
+ branch_name: 'master',
+ previous_path: 'README',
+ message: 'Update README',
+ author_email: author_email,
+ author_name: author_name
+ )
end.to change { repository.count_commits(ref: 'master') }.by(1)
last_commit = repository.commit
@@ -1061,11 +1077,13 @@ RSpec.describe Repository, feature_category: :source_code_management do
describe "#move_dir_files" do
it 'move directory files successfully' do
expect do
- repository.move_dir_files(user, 'files/new_js', 'files/js',
- branch_name: 'master',
- message: 'move directory images to new_images',
- author_email: author_email,
- author_name: author_name)
+ repository.move_dir_files(
+ user, 'files/new_js', 'files/js',
+ branch_name: 'master',
+ message: 'move directory images to new_images',
+ author_email: author_email,
+ author_name: author_name
+ )
end.to change { repository.count_commits(ref: 'master') }.by(1)
files = repository.ls_files('master')
@@ -1075,11 +1093,13 @@ RSpec.describe Repository, feature_category: :source_code_management do
it 'skips commit with same path' do
expect do
- repository.move_dir_files(user, 'files/js', 'files/js',
- branch_name: 'master',
- message: 'no commit',
- author_email: author_email,
- author_name: author_name)
+ repository.move_dir_files(
+ user, 'files/js', 'files/js',
+ branch_name: 'master',
+ message: 'no commit',
+ author_email: author_email,
+ author_name: author_name
+ )
end.to change { repository.count_commits(ref: 'master') }.by(0)
end
end
@@ -1089,8 +1109,10 @@ RSpec.describe Repository, feature_category: :source_code_management do
it 'removes file successfully' do
expect do
- repository.delete_file(user, 'README',
- message: 'Remove README', branch_name: 'master')
+ repository.delete_file(
+ user, 'README',
+ message: 'Remove README', branch_name: 'master'
+ )
end.to change { repository.count_commits(ref: 'master') }.by(1)
expect(repository.blob_at('master', 'README')).to be_nil
@@ -1099,9 +1121,11 @@ RSpec.describe Repository, feature_category: :source_code_management do
context "when an author is specified" do
it "uses the given email/name to set the commit's author" do
expect do
- repository.delete_file(user, 'README',
+ repository.delete_file(
+ user, 'README',
message: 'Remove README', branch_name: 'master',
- author_email: author_email, author_name: author_name)
+ author_email: author_email, author_name: author_name
+ )
end.to change { repository.count_commits(ref: 'master') }.by(1)
last_commit = repository.commit
@@ -1219,10 +1243,12 @@ RSpec.describe Repository, feature_category: :source_code_management do
let(:path) { '*.md' }
it 'returns files matching the path in the root folder' do
- expect(result).to contain_exactly('CONTRIBUTING.md',
- 'MAINTENANCE.md',
- 'PROCESS.md',
- 'README.md')
+ expect(result).to contain_exactly(
+ 'CONTRIBUTING.md',
+ 'MAINTENANCE.md',
+ 'PROCESS.md',
+ 'README.md'
+ )
end
end
@@ -1230,12 +1256,14 @@ RSpec.describe Repository, feature_category: :source_code_management do
let(:path) { '**.md' }
it 'returns all matching files in all folders' do
- expect(result).to contain_exactly('CONTRIBUTING.md',
- 'MAINTENANCE.md',
- 'PROCESS.md',
- 'README.md',
- 'files/markdown/ruby-style-guide.md',
- 'with space/README.md')
+ expect(result).to contain_exactly(
+ 'CONTRIBUTING.md',
+ 'MAINTENANCE.md',
+ 'PROCESS.md',
+ 'README.md',
+ 'files/markdown/ruby-style-guide.md',
+ 'with space/README.md'
+ )
end
end
@@ -1267,10 +1295,12 @@ RSpec.describe Repository, feature_category: :source_code_management do
let(:path) { '**/*.rb' }
it 'returns all matched files in all subfolders' do
- expect(result).to contain_exactly('encoding/russian.rb',
- 'files/ruby/popen.rb',
- 'files/ruby/regex.rb',
- 'files/ruby/version_info.rb')
+ expect(result).to contain_exactly(
+ 'encoding/russian.rb',
+ 'files/ruby/popen.rb',
+ 'files/ruby/regex.rb',
+ 'files/ruby/version_info.rb'
+ )
end
end
@@ -1490,8 +1520,11 @@ RSpec.describe Repository, feature_category: :source_code_management do
let(:project) { create(:project, :repository) }
before do
- repository.delete_file(user, 'LICENSE',
- message: 'Remove LICENSE', branch_name: 'master')
+ repository.delete_file(
+ user, 'LICENSE',
+ message: 'Remove LICENSE',
+ branch_name: 'master'
+ )
end
it 'returns nil when no license is detected' do
@@ -1505,17 +1538,23 @@ RSpec.describe Repository, feature_category: :source_code_management do
end
it 'returns other when the content is not recognizable' do
- repository.create_file(user, 'LICENSE', 'Gitlab B.V.',
- message: 'Add LICENSE', branch_name: 'master')
+ repository.create_file(
+ user, 'LICENSE', 'Gitlab B.V.',
+ message: 'Add LICENSE',
+ branch_name: 'master'
+ )
expect(repository.license_key).to eq('other')
end
it 'returns the license' do
license = Licensee::License.new('mit')
- repository.create_file(user, 'LICENSE',
- license.content,
- message: 'Add LICENSE', branch_name: 'master')
+ repository.create_file(
+ user, 'LICENSE',
+ license.content,
+ message: 'Add LICENSE',
+ branch_name: 'master'
+ )
expect(repository.license_key).to eq(license.key)
end
@@ -2043,19 +2082,23 @@ RSpec.describe Repository, feature_category: :source_code_management do
describe '#merge_to_ref' do
let(:merge_request) do
- create(:merge_request, source_branch: 'feature',
- target_branch: 'master',
- source_project: project)
+ create(
+ :merge_request,
+ source_branch: 'feature',
+ target_branch: 'master',
+ source_project: project
+ )
end
it 'writes merge of source SHA and first parent ref to MR merge_ref_path' do
- merge_commit_id =
- repository.merge_to_ref(user,
- source_sha: merge_request.diff_head_sha,
- branch: merge_request.target_branch,
- target_ref: merge_request.merge_ref_path,
- message: 'Custom message',
- first_parent_ref: merge_request.target_branch_ref)
+ merge_commit_id = repository.merge_to_ref(
+ user,
+ source_sha: merge_request.diff_head_sha,
+ branch: merge_request.target_branch,
+ target_ref: merge_request.merge_ref_path,
+ message: 'Custom message',
+ first_parent_ref: merge_request.target_branch_ref
+ )
merge_commit = repository.commit(merge_commit_id)
@@ -2077,11 +2120,13 @@ RSpec.describe Repository, feature_category: :source_code_management do
end
it 'merges the code and return the commit id' do
- merge_commit_id = repository.ff_merge(user,
- merge_request.diff_head_sha,
- merge_request.target_branch,
- target_sha: repository.commit(merge_request.target_branch).sha,
- merge_request: merge_request)
+ merge_commit_id = repository.ff_merge(
+ user,
+ merge_request.diff_head_sha,
+ merge_request.target_branch,
+ target_sha: repository.commit(merge_request.target_branch).sha,
+ merge_request: merge_request
+ )
merge_commit = repository.commit(merge_commit_id)
expect(merge_commit).to be_present
@@ -2089,11 +2134,13 @@ RSpec.describe Repository, feature_category: :source_code_management do
end
it 'sets the `in_progress_merge_commit_sha` flag for the given merge request' do
- merge_commit_id = repository.ff_merge(user,
- merge_request.diff_head_sha,
- merge_request.target_branch,
- target_sha: repository.commit(merge_request.target_branch).sha,
- merge_request: merge_request)
+ merge_commit_id = repository.ff_merge(
+ user,
+ merge_request.diff_head_sha,
+ merge_request.target_branch,
+ target_sha: repository.commit(merge_request.target_branch).sha,
+ merge_request: merge_request
+ )
expect(merge_request.in_progress_merge_commit_sha).to eq(merge_commit_id)
end
diff --git a/spec/models/resource_state_event_spec.rb b/spec/models/resource_state_event_spec.rb
index a6d6b507b69..de101107268 100644
--- a/spec/models/resource_state_event_spec.rb
+++ b/spec/models/resource_state_event_spec.rb
@@ -45,8 +45,11 @@ RSpec.describe ResourceStateEvent, feature_category: :team_planning, type: :mode
describe '#issue_usage_metrics' do
describe 'when an issue is closed' do
subject(:close_issue) do
- create(described_class.name.underscore.to_sym, issue: issue,
- state: described_class.states[:closed])
+ create(
+ described_class.name.underscore.to_sym,
+ issue: issue,
+ state: described_class.states[:closed]
+ )
end
it 'tracks closed issues' do
@@ -65,8 +68,11 @@ RSpec.describe ResourceStateEvent, feature_category: :team_planning, type: :mode
describe 'when an issue is reopened' do
subject(:reopen_issue) do
- create(described_class.name.underscore.to_sym, issue: issue,
- state: described_class.states[:reopened])
+ create(
+ described_class.name.underscore.to_sym,
+ issue: issue,
+ state: described_class.states[:reopened]
+ )
end
it 'tracks reopened issues' do
diff --git a/spec/models/snippet_spec.rb b/spec/models/snippet_spec.rb
index 495c409f7b5..6a5456fce3f 100644
--- a/spec/models/snippet_spec.rb
+++ b/spec/models/snippet_spec.rb
@@ -41,8 +41,8 @@ RSpec.describe Snippet do
is_expected
.to validate_length_of(:content)
- .is_at_most(Gitlab::CurrentSettings.snippet_size_limit)
- .with_message("is too long (2 Bytes). The maximum size is 1 Byte.")
+ .is_at_most(Gitlab::CurrentSettings.snippet_size_limit)
+ .with_message("is too long (2 Bytes). The maximum size is 1 Byte.")
end
context 'content validations' do
@@ -492,17 +492,21 @@ RSpec.describe Snippet do
let_it_be(:snippet) { create(:snippet, content: 'foo', project: project) }
let_it_be(:note1) do
- create(:note_on_project_snippet,
- noteable: snippet,
- project: project,
- note: 'a')
+ create(
+ :note_on_project_snippet,
+ noteable: snippet,
+ project: project,
+ note: 'a'
+ )
end
let_it_be(:note2) do
- create(:note_on_project_snippet,
- noteable: snippet,
- project: project,
- note: 'b')
+ create(
+ :note_on_project_snippet,
+ noteable: snippet,
+ project: project,
+ note: 'b'
+ )
end
it 'includes the snippet author and note authors' do
diff --git a/spec/models/spam_log_spec.rb b/spec/models/spam_log_spec.rb
index 564710b31d0..549a4e92ce0 100644
--- a/spec/models/spam_log_spec.rb
+++ b/spec/models/spam_log_spec.rb
@@ -30,8 +30,7 @@ RSpec.describe SpamLog do
end
expect(
- Users::GhostUserMigration.where(user: user,
- initiator_user: admin)
+ Users::GhostUserMigration.where(user: user, initiator_user: admin)
).to be_exists
end
end
diff --git a/spec/models/upload_spec.rb b/spec/models/upload_spec.rb
index cdf73b203af..27e2060a94b 100644
--- a/spec/models/upload_spec.rb
+++ b/spec/models/upload_spec.rb
@@ -96,9 +96,11 @@ RSpec.describe Upload do
describe '#calculate_checksum!' do
let(:upload) do
- described_class.new(path: __FILE__,
- size: described_class::CHECKSUM_THRESHOLD - 1.megabyte,
- store: ObjectStorage::Store::LOCAL)
+ described_class.new(
+ path: __FILE__,
+ size: described_class::CHECKSUM_THRESHOLD - 1.megabyte,
+ store: ObjectStorage::Store::LOCAL
+ )
end
it 'sets `checksum` to SHA256 sum of the file' do
diff --git a/spec/models/user_detail_spec.rb b/spec/models/user_detail_spec.rb
index 7d433896cf8..428fd5470c3 100644
--- a/spec/models/user_detail_spec.rb
+++ b/spec/models/user_detail_spec.rb
@@ -91,15 +91,17 @@ RSpec.describe UserDetail do
describe '#save' do
let(:user_detail) do
- create(:user_detail,
- bio: 'bio',
- discord: '1234567890123456789',
- linkedin: 'linkedin',
- location: 'location',
- organization: 'organization',
- skype: 'skype',
- twitter: 'twitter',
- website_url: 'https://example.com')
+ create(
+ :user_detail,
+ bio: 'bio',
+ discord: '1234567890123456789',
+ linkedin: 'linkedin',
+ location: 'location',
+ organization: 'organization',
+ skype: 'skype',
+ twitter: 'twitter',
+ website_url: 'https://example.com'
+ )
end
shared_examples 'prevents `nil` value' do |attr|
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index eb2b079ad3f..8b6e3199529 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -2461,9 +2461,11 @@ RSpec.describe User, feature_category: :user_profile do
it 'includes groups where the user has access via group shares to create projects' do
shared_group = create(:group)
- create(:group_group_link, :maintainer,
- shared_with_group: group,
- shared_group: shared_group
+ create(
+ :group_group_link,
+ :maintainer,
+ shared_with_group: group,
+ shared_group: shared_group
)
expect(user.forkable_namespaces).to contain_exactly(
@@ -5968,8 +5970,10 @@ RSpec.describe User, feature_category: :user_profile do
all_projects = projects + [second_maintainer_project.id, second_developer_project.id]
- expected_all = expected.merge(second_maintainer_project.id => Gitlab::Access::MAINTAINER,
- second_developer_project.id => Gitlab::Access::DEVELOPER)
+ expected_all = expected.merge(
+ second_maintainer_project.id => Gitlab::Access::MAINTAINER,
+ second_developer_project.id => Gitlab::Access::DEVELOPER
+ )
access_levels(projects)
@@ -6047,8 +6051,10 @@ RSpec.describe User, feature_category: :user_profile do
all_groups = groups + [second_maintainer_group.id, second_developer_group.id]
- expected_all = expected.merge(second_maintainer_group.id => Gitlab::Access::MAINTAINER,
- second_developer_group.id => Gitlab::Access::DEVELOPER)
+ expected_all = expected.merge(
+ second_maintainer_group.id => Gitlab::Access::MAINTAINER,
+ second_developer_group.id => Gitlab::Access::DEVELOPER
+ )
access_levels(groups)
@@ -6757,11 +6763,13 @@ RSpec.describe User, feature_category: :user_profile do
context 'when dismissed callout exists' do
before_all do
- create(:group_callout,
- user: user,
- group_id: group.id,
- feature_name: feature_name,
- dismissed_at: 4.months.ago)
+ create(
+ :group_callout,
+ user: user,
+ group_id: group.id,
+ feature_name: feature_name,
+ dismissed_at: 4.months.ago
+ )
end
it 'returns true when no ignore_dismissal_earlier_than provided' do
@@ -6791,11 +6799,13 @@ RSpec.describe User, feature_category: :user_profile do
context 'when dismissed callout exists' do
before_all do
- create(:project_callout,
- user: user,
- project_id: project.id,
- feature_name: feature_name,
- dismissed_at: 4.months.ago)
+ create(
+ :project_callout,
+ user: user,
+ project_id: project.id,
+ feature_name: feature_name,
+ dismissed_at: 4.months.ago
+ )
end
it 'returns true when no ignore_dismissal_earlier_than provided' do
@@ -7694,9 +7704,11 @@ RSpec.describe User, feature_category: :user_profile do
context 'with a defined project namespace_commit_email' do
it 'returns the defined namespace_commit_email' do
- project_commit_email = create(:namespace_commit_email,
- user: user,
- namespace: project.project_namespace)
+ project_commit_email = create(
+ :namespace_commit_email,
+ user: user,
+ namespace: project.project_namespace
+ )
expect(emails).to eq(project_commit_email)
end
@@ -7716,9 +7728,11 @@ RSpec.describe User, feature_category: :user_profile do
context 'with a defined project namespace_commit_email' do
it 'returns the defined namespace_commit_email' do
- project_commit_email = create(:namespace_commit_email,
- user: user,
- namespace: project.project_namespace)
+ project_commit_email = create(
+ :namespace_commit_email,
+ user: user,
+ namespace: project.project_namespace
+ )
expect(emails).to eq(project_commit_email)
end
@@ -7737,9 +7751,11 @@ RSpec.describe User, feature_category: :user_profile do
context 'with a defined project namespace_commit_email' do
it 'returns the defined namespace_commit_email' do
- project_commit_email = create(:namespace_commit_email,
- user: user,
- namespace: project.project_namespace)
+ project_commit_email = create(
+ :namespace_commit_email,
+ user: user,
+ namespace: project.project_namespace
+ )
expect(emails).to eq(project_commit_email)
end
diff --git a/spec/models/wiki_page/meta_spec.rb b/spec/models/wiki_page/meta_spec.rb
index 4d1a2dc1c98..5808be128e0 100644
--- a/spec/models/wiki_page/meta_spec.rb
+++ b/spec/models/wiki_page/meta_spec.rb
@@ -167,10 +167,12 @@ RSpec.describe WikiPage::Meta do
end
def create_previous_version(title: old_title, slug: last_known_slug, date: wiki_page.version.commit.committed_date)
- create(:wiki_page_meta,
- title: title, project: project,
- created_at: date, updated_at: date,
- canonical_slug: slug)
+ create(
+ :wiki_page_meta,
+ title: title, project: project,
+ created_at: date, updated_at: date,
+ canonical_slug: slug
+ )
end
def create_context
diff --git a/spec/requests/api/ci/secure_files_spec.rb b/spec/requests/api/ci/secure_files_spec.rb
index fc988800b56..db12576154e 100644
--- a/spec/requests/api/ci/secure_files_spec.rb
+++ b/spec/requests/api/ci/secure_files_spec.rb
@@ -136,7 +136,7 @@ RSpec.describe API::Ci::SecureFiles, feature_category: :mobile_devops do
expect(response).to have_gitlab_http_status(:ok)
expect(json_response['name']).to eq(secure_file_with_metadata.name)
- expect(json_response['expires_at']).to eq('2022-04-26T19:20:40.000Z')
+ expect(json_response['expires_at']).to eq('2023-04-26T19:20:39.000Z')
expect(json_response['metadata'].keys).to match_array(%w[id issuer subject expires_at])
expect(json_response['file_extension']).to eq('cer')
end
diff --git a/spec/requests/api/settings_spec.rb b/spec/requests/api/settings_spec.rb
index 8decb8cdf90..3f66cbaf2b7 100644
--- a/spec/requests/api/settings_spec.rb
+++ b/spec/requests/api/settings_spec.rb
@@ -69,6 +69,11 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting, featu
expect(json_response['default_syntax_highlighting_theme']).to eq(1)
expect(json_response['projects_api_rate_limit_unauthenticated']).to eq(400)
expect(json_response['silent_mode_enabled']).to be(false)
+ expect(json_response['slack_app_enabled']).to be(false)
+ expect(json_response['slack_app_id']).to be_nil
+ expect(json_response['slack_app_secret']).to be_nil
+ expect(json_response['slack_app_signing_secret']).to be_nil
+ expect(json_response['slack_app_verification_token']).to be_nil
expect(json_response['valid_runner_registrars']).to match_array(%w(project group))
expect(json_response['ci_max_includes']).to eq(150)
end
@@ -178,6 +183,11 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting, featu
default_syntax_highlighting_theme: 2,
projects_api_rate_limit_unauthenticated: 100,
silent_mode_enabled: true,
+ slack_app_enabled: true,
+ slack_app_id: 'SLACK_APP_ID',
+ slack_app_secret: 'SLACK_APP_SECRET',
+ slack_app_signing_secret: 'SLACK_APP_SIGNING_SECRET',
+ slack_app_verification_token: 'SLACK_APP_VERIFICATION_TOKEN',
valid_runner_registrars: ['group']
}
@@ -249,6 +259,11 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting, featu
expect(json_response['default_syntax_highlighting_theme']).to eq(2)
expect(json_response['projects_api_rate_limit_unauthenticated']).to be(100)
expect(json_response['silent_mode_enabled']).to be(true)
+ expect(json_response['slack_app_enabled']).to be(true)
+ expect(json_response['slack_app_id']).to eq('SLACK_APP_ID')
+ expect(json_response['slack_app_secret']).to eq('SLACK_APP_SECRET')
+ expect(json_response['slack_app_signing_secret']).to eq('SLACK_APP_SIGNING_SECRET')
+ expect(json_response['slack_app_verification_token']).to eq('SLACK_APP_VERIFICATION_TOKEN')
expect(json_response['valid_runner_registrars']).to eq(['group'])
end
end
diff --git a/spec/scripts/api/get_package_and_test_job_spec.rb b/spec/scripts/api/get_package_and_test_job_spec.rb
index 60bb26cbcaf..aa8f288c255 100644
--- a/spec/scripts/api/get_package_and_test_job_spec.rb
+++ b/spec/scripts/api/get_package_and_test_job_spec.rb
@@ -1,47 +1,147 @@
# frozen_string_literal: true
+# rubocop:disable RSpec/VerifiedDoubles
+
require 'fast_spec_helper'
require_relative '../../../scripts/api/get_package_and_test_job'
RSpec.describe GetPackageAndTestJob, feature_category: :tooling do
describe '#execute' do
- let(:project) { 12345 }
- let(:pipeline_id) { 1 }
-
let(:options) do
{
api_token: 'token',
endpoint: 'https://example.gitlab.com',
- project: project,
- pipeline_id: pipeline_id
+ project: 12345,
+ pipeline_id: 1
}
end
- subject { described_class.new(options).execute }
+ let(:client) { double('Gitlab::Client') }
+ let(:client_response) { double('Gitlab::ClientResponse') }
+ let(:bridge_status) { 'success' }
- it 'requests commit_merge_requests from the gitlab client' do
- client_result = [
- { 'name' => 'foo' },
- { 'name' => 'e2e:package-and-test-ee' },
- { 'name' => 'bar' }
+ let(:bridges_response) do
+ [
+ double(:bridge, id: 1, name: 'foo'),
+ double(:bridge, id: 2, name: 'bar'),
+ double(
+ :bridge,
+ id: 3,
+ name: 'e2e:package-and-test-ee',
+ downstream_pipeline: double(:downstream_pipeline, id: 1),
+ status: bridge_status
+ )
]
- client = double('Gitlab::Client') # rubocop:disable RSpec/VerifiedDoubles
- client_response = double('Gitlab::ClientResponse') # rubocop:disable RSpec/VerifiedDoubles
+ end
- expect(Gitlab).to receive(:client)
- .with(endpoint: options[:endpoint], private_token: options[:api_token])
+ let(:detailed_status_label) { 'passed with warnings' }
+
+ let(:package_and_test_pipeline) do
+ double(
+ :pipeline,
+ id: 1,
+ name: 'e2e:package-and-test-ee',
+ detailed_status: double(
+ :detailed_status,
+ text: 'passed',
+ label: detailed_status_label
+ )
+ )
+ end
+
+ before do
+ allow(Gitlab)
+ .to receive(:client)
.and_return(client)
- expect(client).to receive(:pipeline_bridges).with(
- project, pipeline_id, scope: 'failed', per_page: 100
- ).and_return(client_response)
+ allow(client)
+ .to receive(:pipeline_bridges)
+ .and_return(double(auto_paginate: bridges_response))
+
+ allow(client)
+ .to receive(:pipeline)
+ .and_return(package_and_test_pipeline)
+ end
+
+ subject { described_class.new(options).execute }
+
+ it 'returns a package-and-test pipeline that passed with warnings' do
+ expect(subject).to eq(package_and_test_pipeline)
+ end
+
+ context 'when the bridge can not be found' do
+ let(:bridges_response) { [] }
+
+ it 'returns nothing' do
+ expect(subject).to be_nil
+ end
+ end
+
+ context 'when the downstream pipeline can not be found' do
+ let(:bridges_response) do
+ [
+ double(:bridge, id: 1, name: 'foo'),
+ double(:bridge, id: 2, name: 'bar'),
+ double(
+ :bridge,
+ id: 3,
+ name: 'e2e:package-and-test-ee',
+ downstream_pipeline: nil
+ )
+ ]
+ end
+
+ it 'returns nothing' do
+ expect(subject).to be_nil
+ end
+ end
+
+ context 'when the bridge fails' do
+ let(:bridge_status) { 'failed' }
+
+ it 'returns the downstream_pipeline' do
+ expect(subject).to eq(package_and_test_pipeline)
+ end
+ end
+
+ context 'when the package-and-test can not be found' do
+ let(:package_and_test_pipeline) { nil }
+
+ it 'returns nothing' do
+ expect(subject).to be_nil
+ end
+ end
+
+ context 'when the package-and-test does not include a detailed status' do
+ let(:package_and_test_pipeline) do
+ double(
+ :pipeline,
+ name: 'e2e:package-and-test-ee',
+ detailed_status: nil
+ )
+ end
+
+ it 'returns nothing' do
+ expect(subject).to be_nil
+ end
+ end
- expect(client_response).to receive(:auto_paginate)
- .and_yield(client_result[0])
- .and_yield(client_result[1])
- .and_yield(client_result[2])
+ context 'when the package-and-test succeeds' do
+ let(:detailed_status_label) { 'passed' }
- expect(subject).to eq(client_result[1])
+ it 'returns nothing' do
+ expect(subject).to be_nil
+ end
+ end
+
+ context 'when the package-and-test is canceled' do
+ let(:detailed_status_label) { 'canceled' }
+
+ it 'returns a failed package-and-test pipeline' do
+ expect(subject).to eq(package_and_test_pipeline)
+ end
end
end
end
+
+# rubocop:enable RSpec/VerifiedDoubles