Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
e3e9a778f9
commit
4a0777f245
|
|
@ -2,20 +2,6 @@
|
|||
# Cop supports --autocorrect.
|
||||
Layout/ArrayAlignment:
|
||||
Exclude:
|
||||
- 'app/controllers/admin/application_settings_controller.rb'
|
||||
- 'app/controllers/profiles_controller.rb'
|
||||
- 'app/controllers/projects/labels_controller.rb'
|
||||
- 'app/controllers/projects/protected_branches_controller.rb'
|
||||
- 'app/controllers/projects/settings/ci_cd_controller.rb'
|
||||
- 'app/controllers/projects_controller.rb'
|
||||
- 'app/controllers/users_controller.rb'
|
||||
- 'app/graphql/resolvers/concerns/issues/sort_arguments.rb'
|
||||
- 'app/graphql/types/permission_types/merge_request.rb'
|
||||
- 'app/helpers/merge_requests_helper.rb'
|
||||
- 'app/helpers/submodule_helper.rb'
|
||||
- 'app/models/ci/bridge.rb'
|
||||
- 'app/models/ci/build.rb'
|
||||
- 'app/models/concerns/ci/partitionable/switch.rb'
|
||||
- 'app/models/deploy_token.rb'
|
||||
- 'app/models/dev_ops_report/metric.rb'
|
||||
- 'app/models/integrations/microsoft_teams.rb'
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ import {
|
|||
OPERATOR_AFTER,
|
||||
OPERATOR_BEFORE,
|
||||
TOKEN_TYPE_ASSIGNEE,
|
||||
TOKEN_TYPE_REVIEWER,
|
||||
TOKEN_TYPE_AUTHOR,
|
||||
TOKEN_TYPE_CONFIDENTIAL,
|
||||
TOKEN_TYPE_CONTACT,
|
||||
|
|
@ -234,6 +235,23 @@ export const filtersMap = {
|
|||
},
|
||||
},
|
||||
},
|
||||
[TOKEN_TYPE_REVIEWER]: {
|
||||
[API_PARAM]: {
|
||||
[NORMAL_FILTER]: 'reviewerUsername',
|
||||
[SPECIAL_FILTER]: 'reviewerWildcardId',
|
||||
[ALTERNATIVE_FILTER]: 'reviewerId',
|
||||
},
|
||||
[URL_PARAM]: {
|
||||
[OPERATOR_IS]: {
|
||||
[NORMAL_FILTER]: 'reviewer_username',
|
||||
[SPECIAL_FILTER]: 'reviewer_id',
|
||||
[ALTERNATIVE_FILTER]: 'reviewer_username',
|
||||
},
|
||||
[OPERATOR_NOT]: {
|
||||
[NORMAL_FILTER]: 'not[reviewer_username]',
|
||||
},
|
||||
},
|
||||
},
|
||||
[TOKEN_TYPE_MILESTONE]: {
|
||||
[API_PARAM]: {
|
||||
[NORMAL_FILTER]: 'milestoneTitle',
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ import {
|
|||
OPERATOR_AFTER,
|
||||
OPERATORS_TO_GROUP,
|
||||
TOKEN_TYPE_ASSIGNEE,
|
||||
TOKEN_TYPE_REVIEWER,
|
||||
TOKEN_TYPE_AUTHOR,
|
||||
TOKEN_TYPE_DRAFT,
|
||||
TOKEN_TYPE_CONFIDENTIAL,
|
||||
|
|
@ -326,6 +327,7 @@ const wildcardTokens = [
|
|||
TOKEN_TYPE_RELEASE,
|
||||
TOKEN_TYPE_EPIC,
|
||||
TOKEN_TYPE_ASSIGNEE,
|
||||
TOKEN_TYPE_REVIEWER,
|
||||
TOKEN_TYPE_WEIGHT,
|
||||
];
|
||||
|
||||
|
|
|
|||
|
|
@ -25,6 +25,8 @@ import {
|
|||
TOKEN_TYPE_SOURCE_BRANCH,
|
||||
TOKEN_TITLE_ASSIGNEE,
|
||||
TOKEN_TYPE_ASSIGNEE,
|
||||
TOKEN_TITLE_REVIEWER,
|
||||
TOKEN_TYPE_REVIEWER,
|
||||
TOKEN_TITLE_MILESTONE,
|
||||
TOKEN_TYPE_MILESTONE,
|
||||
} from '~/vue_shared/components/filtered_search_bar/constants';
|
||||
|
|
@ -191,6 +193,20 @@ export default {
|
|||
multiSelect: false,
|
||||
unique: true,
|
||||
},
|
||||
{
|
||||
type: TOKEN_TYPE_REVIEWER,
|
||||
title: TOKEN_TITLE_REVIEWER,
|
||||
icon: 'user',
|
||||
token: UserToken,
|
||||
dataType: 'user',
|
||||
operators: OPERATORS_IS,
|
||||
fullPath: this.fullPath,
|
||||
isProject: true,
|
||||
recentSuggestionsStorageKey: `${this.fullPath}-merge-requests-recent-tokens-reviewer`,
|
||||
preloadedUsers,
|
||||
multiSelect: false,
|
||||
unique: true,
|
||||
},
|
||||
{
|
||||
type: TOKEN_TYPE_AUTHOR,
|
||||
title: TOKEN_TITLE_AUTHOR,
|
||||
|
|
|
|||
|
|
@ -9,6 +9,8 @@ query getMergeRequests(
|
|||
$state: MergeRequestState
|
||||
$assigneeUsernames: String
|
||||
$assigneeWildcardId: AssigneeWildcardId
|
||||
$reviewerUsername: String
|
||||
$reviewerWildcardId: ReviewerWildcardId
|
||||
$authorUsername: String
|
||||
$draft: Boolean
|
||||
$milestoneTitle: String
|
||||
|
|
@ -27,6 +29,8 @@ query getMergeRequests(
|
|||
state: $state
|
||||
assigneeUsername: $assigneeUsernames
|
||||
assigneeWildcardId: $assigneeWildcardId
|
||||
reviewerUsername: $reviewerUsername
|
||||
reviewerWildcardId: $reviewerWildcardId
|
||||
authorUsername: $authorUsername
|
||||
draft: $draft
|
||||
milestoneTitle: $milestoneTitle
|
||||
|
|
|
|||
|
|
@ -125,7 +125,7 @@ export default {
|
|||
return this.workItem?.author;
|
||||
},
|
||||
workItemDevelopment() {
|
||||
return this.isWidgetPresent(WIDGET_TYPE_DEVELOPMENT) && this.glFeatures.workItemsMvc2;
|
||||
return this.isWidgetPresent(WIDGET_TYPE_DEVELOPMENT) && this.glFeatures.workItemsAlpha;
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
|
|
|
|||
|
|
@ -197,8 +197,8 @@ export default {
|
|||
isDiscussionLocked() {
|
||||
return this.workItemNotes?.discussionLocked;
|
||||
},
|
||||
workItemsMvc2Enabled() {
|
||||
return this.glFeatures.workItemsMvc2;
|
||||
workItemsAlphaEnabled() {
|
||||
return this.glFeatures.workItemsAlpha;
|
||||
},
|
||||
newTodoAndNotificationsEnabled() {
|
||||
return this.glFeatures.notificationsTodosButtons;
|
||||
|
|
@ -279,7 +279,7 @@ export default {
|
|||
return {
|
||||
'sm:!gl-block': !this.parentWorkItem,
|
||||
'gl-hidden sm:!gl-block gl-mt-3': this.parentWorkItem,
|
||||
'editable-wi-title': this.workItemsMvc2Enabled,
|
||||
'editable-wi-title': this.workItemsAlphaEnabled,
|
||||
};
|
||||
},
|
||||
shouldShowEditButton() {
|
||||
|
|
@ -356,7 +356,7 @@ export default {
|
|||
});
|
||||
},
|
||||
openInModal({ event, modalWorkItem, context }) {
|
||||
if (!this.workItemsMvc2Enabled || context === LINKED_ITEMS_ANCHOR) {
|
||||
if (!this.workItemsAlphaEnabled || context === LINKED_ITEMS_ANCHOR) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ function getRoutes() {
|
|||
},
|
||||
];
|
||||
|
||||
if (gon.features?.workItemsMvc2) {
|
||||
if (gon.features?.workItemsAlpha) {
|
||||
routes.unshift({
|
||||
path: '/new',
|
||||
name: 'createWorkItem',
|
||||
|
|
|
|||
|
|
@ -331,6 +331,7 @@ $white-gc-bg: #eaf2f5;
|
|||
.ge { font-style: italic; }
|
||||
.gr { color: $white-gr; }
|
||||
|
||||
.hljs-section,
|
||||
.gh { color: $white-gh;
|
||||
font-weight: $gl-font-weight-bold; }
|
||||
|
||||
|
|
@ -344,12 +345,15 @@ $white-gc-bg: #eaf2f5;
|
|||
}
|
||||
}
|
||||
|
||||
.hljs-quote,
|
||||
.go { color: $white-go; }
|
||||
.gp { color: $white-gp; }
|
||||
.gs { font-weight: $gl-font-weight-bold; }
|
||||
|
||||
.gu { color: $white-gu;
|
||||
font-weight: $gl-font-weight-bold; }
|
||||
|
||||
.hljs-quote,
|
||||
.gt { color: $white-gt; }
|
||||
.kc { font-weight: $gl-font-weight-bold; }
|
||||
|
||||
|
|
@ -371,8 +375,13 @@ $white-gc-bg: #eaf2f5;
|
|||
.na,
|
||||
.hljs-attr,
|
||||
.hljs-property,
|
||||
.hljs-symbol,
|
||||
.hljs-bullet,
|
||||
.hljs-title.function_ { color: $white-na; }
|
||||
|
||||
.hljs-symbol,
|
||||
.hljs-link { text-decoration: underline; }
|
||||
|
||||
.nb,
|
||||
.hljs-title.class_,
|
||||
.hljs-literal { color: $white-nb; }
|
||||
|
|
@ -402,6 +411,8 @@ $white-gc-bg: #eaf2f5;
|
|||
.mi,
|
||||
.hljs-number { color: $white-mi; }
|
||||
.mo { color: $white-mo; }
|
||||
|
||||
.hljs-code,
|
||||
.sb { color: $white-sb; }
|
||||
.sc { color: $white-sc; }
|
||||
.sd { color: $white-sd; }
|
||||
|
|
@ -409,6 +420,8 @@ $white-gc-bg: #eaf2f5;
|
|||
.se { color: $white-se; }
|
||||
.sh { color: $white-sh; }
|
||||
.si { color: $white-si; }
|
||||
|
||||
.hljs-link,
|
||||
.sx { color: $white-sx; }
|
||||
.sr { color: $white-sr; }
|
||||
|
||||
|
|
@ -423,4 +436,8 @@ $white-gc-bg: #eaf2f5;
|
|||
|
||||
.gc { color: $white-gc-color;
|
||||
background-color: $white-gc-bg; }
|
||||
|
||||
.hljs-strong { font-weight: bold; }
|
||||
|
||||
.hljs-emphasis { font-style: italic; }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -37,8 +37,8 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController
|
|||
feature_category :error_tracking, [:reset_error_tracking_access_token]
|
||||
|
||||
VALID_SETTING_PANELS = %w[general repository
|
||||
ci_cd reporting metrics_and_profiling
|
||||
network preferences].freeze
|
||||
ci_cd reporting metrics_and_profiling
|
||||
network preferences].freeze
|
||||
|
||||
# The current size of a sidekiq job's jid is 24 characters. The size of the
|
||||
# jid is an internal detail of Sidekiq, and they do not guarantee that it'll
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ module Groups
|
|||
push_frontend_feature_flag(:notifications_todos_buttons)
|
||||
push_force_frontend_feature_flag(:work_items, group&.work_items_feature_flag_enabled?)
|
||||
push_force_frontend_feature_flag(:work_items_beta, group&.work_items_beta_feature_flag_enabled?)
|
||||
push_force_frontend_feature_flag(:work_items_mvc_2, group&.work_items_mvc_2_feature_flag_enabled?)
|
||||
push_force_frontend_feature_flag(:work_items_alpha, group&.work_items_alpha_feature_flag_enabled?)
|
||||
end
|
||||
|
||||
def index
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ class GroupsController < Groups::ApplicationController
|
|||
push_frontend_feature_flag(:frontend_caching, group)
|
||||
push_force_frontend_feature_flag(:work_items, group.work_items_feature_flag_enabled?)
|
||||
push_force_frontend_feature_flag(:work_items_beta, group.work_items_beta_feature_flag_enabled?)
|
||||
push_force_frontend_feature_flag(:work_items_mvc_2, group.work_items_mvc_2_feature_flag_enabled?)
|
||||
push_force_frontend_feature_flag(:work_items_alpha, group.work_items_alpha_feature_flag_enabled?)
|
||||
push_frontend_feature_flag(:issues_grid_view)
|
||||
push_frontend_feature_flag(:group_multi_select_tokens, group)
|
||||
end
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ class ProfilesController < Profiles::ApplicationController
|
|||
end
|
||||
|
||||
feature_category :user_profile, [:reset_incoming_email_token, :reset_feed_token,
|
||||
:reset_static_object_token, :update_username]
|
||||
:reset_static_object_token, :update_username]
|
||||
|
||||
def reset_incoming_email_token
|
||||
Users::UpdateService.new(current_user, user: @user).execute! do |user|
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ class Projects::IncidentsController < Projects::ApplicationController
|
|||
before_action do
|
||||
push_force_frontend_feature_flag(:work_items, @project&.work_items_feature_flag_enabled?)
|
||||
push_force_frontend_feature_flag(:work_items_beta, @project&.work_items_beta_feature_flag_enabled?)
|
||||
push_force_frontend_feature_flag(:work_items_mvc_2, @project&.work_items_mvc_2_feature_flag_enabled?)
|
||||
push_force_frontend_feature_flag(:work_items_alpha, @project&.work_items_alpha_feature_flag_enabled?)
|
||||
push_frontend_feature_flag(:notifications_todos_buttons, current_user)
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ class Projects::IssuesController < Projects::ApplicationController
|
|||
before_action only: :show do
|
||||
push_frontend_feature_flag(:work_items_beta, project&.group)
|
||||
push_force_frontend_feature_flag(:work_items_beta, project&.work_items_beta_feature_flag_enabled?)
|
||||
push_force_frontend_feature_flag(:work_items_mvc_2, project&.work_items_mvc_2_feature_flag_enabled?)
|
||||
push_force_frontend_feature_flag(:work_items_alpha, project&.work_items_alpha_feature_flag_enabled?)
|
||||
push_frontend_feature_flag(:epic_widget_edit_confirmation, project)
|
||||
push_frontend_feature_flag(:display_work_item_epic_issue_sidebar, project)
|
||||
end
|
||||
|
|
|
|||
|
|
@ -8,8 +8,8 @@ class Projects::LabelsController < Projects::ApplicationController
|
|||
before_action :find_labels, only: [:index, :set_priorities, :remove_priority, :toggle_subscription]
|
||||
before_action :authorize_read_label!
|
||||
before_action :authorize_admin_labels!, only: [:new, :create, :edit, :update,
|
||||
:generate, :destroy, :remove_priority,
|
||||
:set_priorities]
|
||||
:generate, :destroy, :remove_priority,
|
||||
:set_priorities]
|
||||
before_action :authorize_admin_group_labels!, only: [:promote]
|
||||
|
||||
respond_to :js, :html
|
||||
|
|
|
|||
|
|
@ -27,9 +27,9 @@ class Projects::ProtectedBranchesController < Projects::ProtectedRefsController
|
|||
|
||||
def protected_ref_params(*attrs)
|
||||
attrs = ([:name,
|
||||
:allow_force_push,
|
||||
{ merge_access_levels_attributes: access_level_attributes,
|
||||
push_access_levels_attributes: access_level_attributes }] + attrs).uniq
|
||||
:allow_force_push,
|
||||
{ merge_access_levels_attributes: access_level_attributes,
|
||||
push_access_levels_attributes: access_level_attributes }] + attrs).uniq
|
||||
|
||||
params.require(:protected_branch).permit(attrs)
|
||||
end
|
||||
|
|
|
|||
|
|
@ -165,7 +165,7 @@ module Projects
|
|||
@ref = params[:ref] || @project.default_branch_or_main
|
||||
|
||||
@badges = [Gitlab::Ci::Badge::Pipeline::Status,
|
||||
Gitlab::Ci::Badge::Coverage::Report]
|
||||
Gitlab::Ci::Badge::Coverage::Report]
|
||||
|
||||
@badges.map! do |badge|
|
||||
badge.new(@project, @ref).metadata
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ class Projects::WorkItemsController < Projects::ApplicationController
|
|||
push_frontend_feature_flag(:notifications_todos_buttons)
|
||||
push_force_frontend_feature_flag(:work_items, project&.work_items_feature_flag_enabled?)
|
||||
push_force_frontend_feature_flag(:work_items_beta, project&.work_items_beta_feature_flag_enabled?)
|
||||
push_force_frontend_feature_flag(:work_items_mvc_2, project&.work_items_mvc_2_feature_flag_enabled?)
|
||||
push_force_frontend_feature_flag(:work_items_alpha, project&.work_items_alpha_feature_flag_enabled?)
|
||||
end
|
||||
|
||||
feature_category :team_planning
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ class ProjectsController < Projects::ApplicationController
|
|||
|
||||
push_force_frontend_feature_flag(:work_items, @project&.work_items_feature_flag_enabled?)
|
||||
push_force_frontend_feature_flag(:work_items_beta, @project&.work_items_beta_feature_flag_enabled?)
|
||||
push_force_frontend_feature_flag(:work_items_mvc_2, @project&.work_items_mvc_2_feature_flag_enabled?)
|
||||
push_force_frontend_feature_flag(:work_items_alpha, @project&.work_items_alpha_feature_flag_enabled?)
|
||||
end
|
||||
|
||||
layout :determine_layout
|
||||
|
|
@ -73,7 +73,7 @@ class ProjectsController < Projects::ApplicationController
|
|||
# TODO: Set high urgency for #show https://gitlab.com/gitlab-org/gitlab/-/issues/334444
|
||||
|
||||
urgency :low, [:refs, :show, :toggle_star, :transfer, :archive, :destroy, :update, :create,
|
||||
:activity, :edit, :new, :export, :remove_export, :generate_new_export, :download_export]
|
||||
:activity, :edit, :new, :export, :remove_export, :generate_new_export, :download_export]
|
||||
|
||||
urgency :high, [:unfoldered_environment_names]
|
||||
|
||||
|
|
|
|||
|
|
@ -32,8 +32,8 @@ class UsersController < ApplicationController
|
|||
end
|
||||
|
||||
feature_category :user_profile, [:show, :activity, :groups, :projects, :contributed, :starred,
|
||||
:followers, :following, :calendar, :calendar_activities,
|
||||
:exists, :activity, :follow, :unfollow, :ssh_keys]
|
||||
:followers, :following, :calendar, :calendar_activities,
|
||||
:exists, :activity, :follow, :unfollow, :ssh_keys]
|
||||
|
||||
feature_category :source_code_management, [:snippets, :gpg_keys]
|
||||
|
||||
|
|
|
|||
|
|
@ -5,10 +5,10 @@ module Issues
|
|||
extend ActiveSupport::Concern
|
||||
|
||||
NON_STABLE_CURSOR_SORTS = %i[priority_asc priority_desc
|
||||
popularity_asc popularity_desc
|
||||
label_priority_asc label_priority_desc
|
||||
milestone_due_asc milestone_due_desc
|
||||
escalation_status_asc escalation_status_desc].freeze
|
||||
popularity_asc popularity_desc
|
||||
label_priority_asc label_priority_desc
|
||||
milestone_due_asc milestone_due_desc
|
||||
escalation_status_asc escalation_status_desc].freeze
|
||||
|
||||
included do
|
||||
argument :sort, Types::IssueSortEnum,
|
||||
|
|
|
|||
|
|
@ -9,9 +9,9 @@ module Types
|
|||
present_using MergeRequestPresenter
|
||||
|
||||
PERMISSION_FIELDS = %i[push_to_source_branch
|
||||
remove_source_branch
|
||||
cherry_pick_on_current_merge_request
|
||||
revert_on_current_merge_request].freeze
|
||||
remove_source_branch
|
||||
cherry_pick_on_current_merge_request
|
||||
revert_on_current_merge_request].freeze
|
||||
|
||||
abilities :read_merge_request, :admin_merge_request,
|
||||
:update_merge_request, :create_note
|
||||
|
|
|
|||
|
|
@ -124,7 +124,7 @@ module MergeRequestsHelper
|
|||
return if merge_request.can_allow_collaboration?(current_user)
|
||||
|
||||
minimum_visibility = [merge_request.target_project.visibility_level,
|
||||
merge_request.source_project.visibility_level].min
|
||||
merge_request.source_project.visibility_level].min
|
||||
|
||||
if minimum_visibility < Gitlab::VisibilityLevel::INTERNAL
|
||||
_('Not available for private projects')
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ module SubmoduleHelper
|
|||
return [nil, nil] unless project.present? && namespace.present?
|
||||
|
||||
gitlab_hosts = [Gitlab.config.gitlab.url,
|
||||
Gitlab.config.gitlab_shell.ssh_path_prefix]
|
||||
Gitlab.config.gitlab_shell.ssh_path_prefix]
|
||||
|
||||
matching_host = gitlab_hosts.find do |host|
|
||||
url.start_with?(host)
|
||||
|
|
@ -83,7 +83,7 @@ module SubmoduleHelper
|
|||
def self_url?(url, namespace, project)
|
||||
url_no_dotgit = url.chomp('.git')
|
||||
return true if url_no_dotgit == [Gitlab.config.gitlab.url, '/', namespace, '/',
|
||||
project].join('')
|
||||
project].join('')
|
||||
|
||||
url_with_dotgit = "#{url_no_dotgit}.git"
|
||||
url_with_dotgit == Gitlab::RepositoryUrlBuilder.build([namespace, '/', project].join(''))
|
||||
|
|
|
|||
|
|
@ -78,9 +78,9 @@ module Ci
|
|||
|
||||
def self.clone_accessors
|
||||
%i[pipeline project ref tag options name
|
||||
allow_failure stage stage_idx
|
||||
yaml_variables when environment description needs_attributes
|
||||
scheduling_type ci_stage partition_id].freeze
|
||||
allow_failure stage stage_idx
|
||||
yaml_variables when environment description needs_attributes
|
||||
scheduling_type ci_stage partition_id].freeze
|
||||
end
|
||||
|
||||
def inherit_status_from_downstream!(pipeline)
|
||||
|
|
|
|||
|
|
@ -229,11 +229,11 @@ module Ci
|
|||
|
||||
def clone_accessors
|
||||
%i[pipeline project ref tag options name
|
||||
allow_failure stage stage_idx trigger_request
|
||||
yaml_variables when environment coverage_regex
|
||||
description tag_list protected needs_attributes
|
||||
job_variables_attributes resource_group scheduling_type
|
||||
ci_stage partition_id id_tokens interruptible].freeze
|
||||
allow_failure stage stage_idx trigger_request
|
||||
yaml_variables when environment coverage_regex
|
||||
description tag_list protected needs_attributes
|
||||
job_variables_attributes resource_group scheduling_type
|
||||
ci_stage partition_id id_tokens interruptible].freeze
|
||||
end
|
||||
|
||||
def supported_keyset_orderings
|
||||
|
|
@ -839,8 +839,8 @@ module Ci
|
|||
|
||||
def steps
|
||||
[Gitlab::Ci::Build::Step.from_commands(self),
|
||||
Gitlab::Ci::Build::Step.from_release(self),
|
||||
Gitlab::Ci::Build::Step.from_after_script(self)].compact
|
||||
Gitlab::Ci::Build::Step.from_release(self),
|
||||
Gitlab::Ci::Build::Step.from_after_script(self)].compact
|
||||
end
|
||||
|
||||
def runtime_hooks
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ module Ci
|
|||
# include the table name.
|
||||
#
|
||||
SWAPABLE_METHODS = %i[table_name quoted_table_name arel_table
|
||||
predicate_builder cached_find_by_statement].freeze
|
||||
predicate_builder cached_find_by_statement].freeze
|
||||
|
||||
included do |base|
|
||||
partitioned = Class.new(base) do
|
||||
|
|
|
|||
|
|
@ -927,8 +927,8 @@ class Group < Namespace
|
|||
feature_flag_enabled_for_self_or_ancestor?(:work_items_beta, type: :beta)
|
||||
end
|
||||
|
||||
def work_items_mvc_2_feature_flag_enabled?
|
||||
feature_flag_enabled_for_self_or_ancestor?(:work_items_mvc_2)
|
||||
def work_items_alpha_feature_flag_enabled?
|
||||
feature_flag_enabled_for_self_or_ancestor?(:work_items_alpha)
|
||||
end
|
||||
|
||||
def work_items_rolledup_dates_feature_flag_enabled?
|
||||
|
|
|
|||
|
|
@ -3229,8 +3229,8 @@ class Project < ApplicationRecord
|
|||
group&.work_items_beta_feature_flag_enabled? || Feature.enabled?(:work_items_beta, type: :beta)
|
||||
end
|
||||
|
||||
def work_items_mvc_2_feature_flag_enabled?
|
||||
group&.work_items_mvc_2_feature_flag_enabled? || Feature.enabled?(:work_items_mvc_2)
|
||||
def work_items_alpha_feature_flag_enabled?
|
||||
group&.work_items_alpha_feature_flag_enabled? || Feature.enabled?(:work_items_alpha)
|
||||
end
|
||||
|
||||
def enqueue_record_project_target_platforms
|
||||
|
|
|
|||
|
|
@ -102,6 +102,10 @@ module WorkItems
|
|||
Gitlab::EventStore.publish(event)
|
||||
end
|
||||
end
|
||||
|
||||
def parent
|
||||
container
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
---
|
||||
name: work_items_mvc_2
|
||||
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/89028
|
||||
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/363030
|
||||
milestone: '15.1'
|
||||
name: work_items_alpha
|
||||
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/155990
|
||||
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/360927
|
||||
milestone: '17.2'
|
||||
type: development
|
||||
group: group::project management
|
||||
default_enabled: false
|
||||
default_enabled: false
|
||||
|
|
@ -22910,7 +22910,7 @@ Returns [`WorkItemStateCountsType`](#workitemstatecountstype).
|
|||
| <a id="groupworkitemstatecountssearch"></a>`search` | [`String`](#string) | Search query for title or description. |
|
||||
| <a id="groupworkitemstatecountssort"></a>`sort` | [`WorkItemSort`](#workitemsort) | Sort work items by criteria. |
|
||||
| <a id="groupworkitemstatecountsstate"></a>`state` | [`IssuableState`](#issuablestate) | Current state of the work item. |
|
||||
| <a id="groupworkitemstatecountsstatuswidget"></a>`statusWidget` | [`StatusFilterInput`](#statusfilterinput) | Input for status widget filter. Ignored if `work_items_mvc_2` is disabled. |
|
||||
| <a id="groupworkitemstatecountsstatuswidget"></a>`statusWidget` | [`StatusFilterInput`](#statusfilterinput) | Input for status widget filter. Ignored if `work_items_alpha` is disabled. |
|
||||
| <a id="groupworkitemstatecountstypes"></a>`types` | [`[IssueType!]`](#issuetype) | Filter work items by the given work item types. |
|
||||
|
||||
##### `Group.workItemTypes`
|
||||
|
|
@ -22957,7 +22957,7 @@ four standard [pagination arguments](#pagination-arguments):
|
|||
| <a id="groupworkitemssearch"></a>`search` | [`String`](#string) | Search query for title or description. |
|
||||
| <a id="groupworkitemssort"></a>`sort` | [`WorkItemSort`](#workitemsort) | Sort work items by criteria. |
|
||||
| <a id="groupworkitemsstate"></a>`state` | [`IssuableState`](#issuablestate) | Current state of the work item. |
|
||||
| <a id="groupworkitemsstatuswidget"></a>`statusWidget` | [`StatusFilterInput`](#statusfilterinput) | Input for status widget filter. Ignored if `work_items_mvc_2` is disabled. |
|
||||
| <a id="groupworkitemsstatuswidget"></a>`statusWidget` | [`StatusFilterInput`](#statusfilterinput) | Input for status widget filter. Ignored if `work_items_alpha` is disabled. |
|
||||
| <a id="groupworkitemstypes"></a>`types` | [`[IssueType!]`](#issuetype) | Filter work items by the given work item types. |
|
||||
|
||||
### `GroupAuditEventNamespaceFilter`
|
||||
|
|
@ -29225,7 +29225,7 @@ Returns [`WorkItemStateCountsType`](#workitemstatecountstype).
|
|||
| <a id="projectworkitemstatecountssearch"></a>`search` | [`String`](#string) | Search query for title or description. |
|
||||
| <a id="projectworkitemstatecountssort"></a>`sort` | [`WorkItemSort`](#workitemsort) | Sort work items by criteria. |
|
||||
| <a id="projectworkitemstatecountsstate"></a>`state` | [`IssuableState`](#issuablestate) | Current state of the work item. |
|
||||
| <a id="projectworkitemstatecountsstatuswidget"></a>`statusWidget` | [`StatusFilterInput`](#statusfilterinput) | Input for status widget filter. Ignored if `work_items_mvc_2` is disabled. |
|
||||
| <a id="projectworkitemstatecountsstatuswidget"></a>`statusWidget` | [`StatusFilterInput`](#statusfilterinput) | Input for status widget filter. Ignored if `work_items_alpha` is disabled. |
|
||||
| <a id="projectworkitemstatecountstypes"></a>`types` | [`[IssueType!]`](#issuetype) | Filter work items by the given work item types. |
|
||||
|
||||
##### `Project.workItemTypes`
|
||||
|
|
@ -29270,7 +29270,7 @@ four standard [pagination arguments](#pagination-arguments):
|
|||
| <a id="projectworkitemssearch"></a>`search` | [`String`](#string) | Search query for title or description. |
|
||||
| <a id="projectworkitemssort"></a>`sort` | [`WorkItemSort`](#workitemsort) | Sort work items by criteria. |
|
||||
| <a id="projectworkitemsstate"></a>`state` | [`IssuableState`](#issuablestate) | Current state of the work item. |
|
||||
| <a id="projectworkitemsstatuswidget"></a>`statusWidget` | [`StatusFilterInput`](#statusfilterinput) | Input for status widget filter. Ignored if `work_items_mvc_2` is disabled. |
|
||||
| <a id="projectworkitemsstatuswidget"></a>`statusWidget` | [`StatusFilterInput`](#statusfilterinput) | Input for status widget filter. Ignored if `work_items_alpha` is disabled. |
|
||||
| <a id="projectworkitemstypes"></a>`types` | [`[IssueType!]`](#issuetype) | Filter work items by the given work item types. |
|
||||
|
||||
### `ProjectCiCdSetting`
|
||||
|
|
|
|||
|
|
@ -70,6 +70,23 @@ For other pages, descriptions are not actively maintained. However, if you want
|
|||
use a short description of what the page is about.
|
||||
See the Google [Best practices for creating quality meta descriptions](https://developers.google.com/search/docs/appearance/snippet#meta-descriptions) for tips.
|
||||
|
||||
## Avoid pages being added to global navigation
|
||||
|
||||
If a specific page shouldn't be added to the global navigation (have an entry added to
|
||||
[`navigation.yaml`](https://gitlab.com/gitlab-org/gitlab-docs/-/blob/main/content/_data/navigation.yaml)), add
|
||||
the following to the page's metadata:
|
||||
|
||||
```yaml
|
||||
ignore_in_report: true
|
||||
```
|
||||
|
||||
When this metadata is set on a page:
|
||||
|
||||
- The [`pages_not_in_nav.js`](https://gitlab.com/gitlab-org/gitlab-docs/-/blob/main/scripts/pages_not_in_nav.js)
|
||||
script ignores the page when processing the documentation.
|
||||
- Technical writers doing the Technical Writing team's monthly tasks aren't prompted to add the page to the global
|
||||
navigation.
|
||||
|
||||
## Additional metadata
|
||||
|
||||
The following metadata is optional and is not actively maintained.
|
||||
|
|
|
|||
|
|
@ -307,15 +307,15 @@ On the Route 53 dashboard, select **Hosted zones** in the left navigation bar:
|
|||
|
||||
1. Select an existing hosted zone or, if you do not already have one for your domain, select **Create Hosted Zone**, enter your domain name, and select **Create**.
|
||||
1. Select **Create record** and provide the following values:
|
||||
1. **Name:** Use the domain name (the default value) or enter a subdomain.
|
||||
1. **Type:** Select **A - IPv4 address**.
|
||||
1. **Alias:** Defaults to **disabled**. Enable this option.
|
||||
1. **Route traffic to:** Select **Alias to Network Load Balancer**.
|
||||
1. **Region:** Select the region where the Network Load Balancer resides.
|
||||
1. **Choose network load balancer:** Select the Network Load Balancer we created earlier.
|
||||
1. **Routing Policy:** We use **Simple** but you can choose a different policy based on your use case.
|
||||
1. **Evaluate Target Health:** We set this to **No** but you can choose to have the load balancer route traffic based on target health.
|
||||
1. Select **Create**.
|
||||
1. **Name:** Use the domain name (the default value) or enter a subdomain.
|
||||
1. **Type:** Select **A - IPv4 address**.
|
||||
1. **Alias:** Defaults to **disabled**. Enable this option.
|
||||
1. **Route traffic to:** Select **Alias to Network Load Balancer**.
|
||||
1. **Region:** Select the region where the Network Load Balancer resides.
|
||||
1. **Choose network load balancer:** Select the Network Load Balancer we created earlier.
|
||||
1. **Routing Policy:** We use **Simple** but you can choose a different policy based on your use case.
|
||||
1. **Evaluate Target Health:** We set this to **No** but you can choose to have the load balancer route traffic based on target health.
|
||||
1. Select **Create**.
|
||||
1. If you registered your domain through Route 53, you're done. If you used a different domain registrar, you must update your DNS records with your domain registrar. You must:
|
||||
1. Select **Hosted zones** and select the domain you added above.
|
||||
1. You see a list of `NS` records. From your domain registrar's administrator panel, add each of these as `NS` records to your domain's DNS records. These steps may vary between domain registrars. If you're stuck, Google **"name of your registrar" add DNS records** and you should find a help article specific to your domain registrar.
|
||||
|
|
|
|||
|
|
@ -128,7 +128,7 @@ To disable the relative URL:
|
|||
1. Remove `/home/git/gitlab/config/initializers/relative_url.rb`
|
||||
|
||||
1. Follow the same as above starting from 2. and set up the
|
||||
GitLab URL to one that doesn't contain a relative path.
|
||||
GitLab URL to one that doesn't contain a relative path.
|
||||
|
||||
<!-- ## Troubleshooting
|
||||
|
||||
|
|
|
|||
|
|
@ -251,7 +251,7 @@ Redis stores all user sessions and the background task queue.
|
|||
The requirements for Redis are as follows:
|
||||
|
||||
- Redis 6.x or 7.x is required in GitLab 16.0 and later. However, you should upgrade to
|
||||
Redis 6.2.14 or later as [Redis 6.0 is no longer supported](https://endoflife.date/redis).
|
||||
Redis 6.2.14 or later as [Redis 6.0 is no longer supported](https://endoflife.date/redis).
|
||||
- Redis Cluster mode is not supported. Redis Standalone must be used, with or without HA.
|
||||
- Storage requirements for Redis are minimal, about 25 kB per user on average.
|
||||
- [Redis eviction mode](../administration/redis/replication_and_failover_external.md#setting-the-eviction-policy) set appropriately.
|
||||
|
|
|
|||
|
|
@ -411,6 +411,9 @@ You can configure GitLab to use multiple SAML IdPs if:
|
|||
- The `strategy_class` is explicitly set because it cannot be inferred from provider
|
||||
name.
|
||||
|
||||
NOTE:
|
||||
When you configure multiple SAML IdPs, to ensure that SAML Group Links work, you must configure all SAML IdPs to contain group attributes in the SAML response. For more information, see [SAML Group Links](../user/group/saml_sso/group_sync.md).
|
||||
|
||||
To set up multiple SAML IdPs:
|
||||
|
||||
::Tabs
|
||||
|
|
|
|||
|
|
@ -128,7 +128,7 @@ Now that you have a cluster, you're ready to install and configure the Kubernete
|
|||
- To use the `cert-manager`:
|
||||
|
||||
1. Use the `certificate-issuer-install.yaml` to install a `Certificate` and `Issuer` in the default namespace, in addition
|
||||
to the operator installation:
|
||||
to the operator installation:
|
||||
|
||||
```shell
|
||||
cat > certificate-issuer-install.yaml << EOF
|
||||
|
|
|
|||
|
|
@ -29,11 +29,11 @@ To set up the integration, you must:
|
|||
|
||||
- Have a GitLab project where you have at least the Maintainer role.
|
||||
- Have the [Owner](https://cloud.google.com/iam/docs/understanding-roles#owner) IAM role on the
|
||||
Google Cloud projects that you want to use.
|
||||
Google Cloud projects that you want to use.
|
||||
- Have [billing enabled for your Google Cloud project](https://cloud.google.com/billing/docs/how-to/verify-billing-enabled#confirm_billing_is_enabled_on_a_project).
|
||||
- Have a Google Artifact Registry repository with Docker format and Standard mode.
|
||||
- Install the [Google Cloud CLI](https://cloud.google.com/sdk/docs/install)
|
||||
and [Terraform](https://developer.hashicorp.com/terraform/install).
|
||||
and [Terraform](https://developer.hashicorp.com/terraform/install).
|
||||
|
||||
## Secure your usage with Google Cloud Identity and Access Management (IAM)
|
||||
|
||||
|
|
@ -56,7 +56,7 @@ After this step, you can view your Google Cloud artifacts in GitLab.
|
|||
1. Under **Enable integration**, select the **Active** checkbox.
|
||||
1. Complete the fields:
|
||||
- **[Google Cloud project ID](https://cloud.google.com/resource-manager/docs/creating-managing-projects#identifying_projects)**:
|
||||
The ID of the Google Cloud project where your Artifact Registry repository is located.
|
||||
The ID of the Google Cloud project where your Artifact Registry repository is located.
|
||||
- **Repository name**: The name of your Artifact Registry repository.
|
||||
- **Repository location**: The location of your Artifact Registry repository.
|
||||
1. In **Configure Google Cloud IAM policies**, follow the onscreen instructions
|
||||
|
|
@ -80,9 +80,9 @@ a runner manager that creates temporary runners to execute multiple jobs simulta
|
|||
1. Complete the fields.
|
||||
- In the **Platform** section, select **Google Cloud**.
|
||||
- In the **Tags** section, in the **Tags** field, enter the job tags to specify jobs the runner can run.
|
||||
If there are no job tags for this runner, select **Run untagged**.
|
||||
If there are no job tags for this runner, select **Run untagged**.
|
||||
- Optional. In the **Runner description** field, add a description for the runner
|
||||
that displays in GitLab.
|
||||
that displays in GitLab.
|
||||
- Optional. In the **Configuration** section, add additional configurations.
|
||||
1. Select **Create runner**.
|
||||
1. Complete the fields in the **Step 1: Specify environment** section to specify the environment in
|
||||
|
|
|
|||
|
|
@ -291,7 +291,7 @@ Add an output to your `hello` step.
|
|||
```
|
||||
|
||||
- In this `spec`, you've defined a single output `greeting` without a default. Because
|
||||
there is no default, the output `greeting` is required.
|
||||
there is no default, the output `greeting` is required.
|
||||
- Outputs are written to a file `${{ output_file }}` (provided at run time) in the form `key=value`.
|
||||
- This step runs `echo greeting=hello ${{ inputs.name }}` and sends the output to the logs and the output file (`tee ${{ output_file }}`).
|
||||
|
||||
|
|
|
|||
|
|
@ -279,7 +279,7 @@ DETAILS:
|
|||
Prerequisites:
|
||||
|
||||
- The top-level group of the project must have GitLab Duo
|
||||
[experiment and beta features enabled](../gitlab_duo/turn_on_off.md#turn-on-beta-and-experimental-features).
|
||||
[experiment and beta features enabled](../gitlab_duo/turn_on_off.md#turn-on-beta-and-experimental-features).
|
||||
|
||||
To generate a custom visualization with GitLab Duo using a natural language query:
|
||||
|
||||
|
|
@ -321,7 +321,7 @@ defined in `ee/app/validators/json_schemas/analytics_visualization.json`.
|
|||
If a dashboard panel displays an error message:
|
||||
|
||||
- Make sure your [Cube query](../product_analytics/index.md#product-analytics-dashboards) and
|
||||
[visualization](../analytics/analytics_dashboards.md#define-a-chart-visualization) configurations are set up correctly.
|
||||
[visualization](../analytics/analytics_dashboards.md#define-a-chart-visualization) configurations are set up correctly.
|
||||
- For [product analytics](../product_analytics/index.md), also check that your visualization's Cube query is valid.
|
||||
|
||||
### Generate visualization with GitLab Duo returns unexpected results
|
||||
|
|
@ -330,4 +330,4 @@ If GitLab Duo doesn't return the expected or a useful result, try editing your q
|
|||
|
||||
- Specify a date range. For example: _number of unique users in 2023 to 2024, grouped monthly_.
|
||||
- Use the same names for metrics and dimensions as shown in the visualization designer.
|
||||
For example: _returning users_ instead of _existing customers_.
|
||||
For example: _returning users_ instead of _existing customers_.
|
||||
|
|
|
|||
|
|
@ -93,8 +93,8 @@ For OpenAPI Specifications that are generated automatically validation errors ar
|
|||
**For generated OpenAPI Specifications**
|
||||
|
||||
1. Identify the validation errors.
|
||||
1. Use the [Swagger Editor](https://editor.swagger.io/) to identify validation problems in your specification. The visual nature of the Swagger Editor makes it easier to understand what needs to change.
|
||||
1. Alternatively, you can check the log output and look for schema validation warnings. They are prefixed with messages such as `OpenAPI 2.0 schema validation error` or `OpenAPI 3.0.x schema validation error`. Each failed validation provides extra information about `location` and `description`. JSON Schema validation messages can be complex, and editors can help you validate schema documents.
|
||||
1. Use the [Swagger Editor](https://editor.swagger.io/) to identify validation problems in your specification. The visual nature of the Swagger Editor makes it easier to understand what needs to change.
|
||||
1. Alternatively, you can check the log output and look for schema validation warnings. They are prefixed with messages such as `OpenAPI 2.0 schema validation error` or `OpenAPI 3.0.x schema validation error`. Each failed validation provides extra information about `location` and `description`. JSON Schema validation messages can be complex, and editors can help you validate schema documents.
|
||||
1. Review the documentation for the OpenAPI generation your framework/tech stack is using. Identify the changes needed to produce a correct OpenAPI document.
|
||||
1. After the validation issues are resolved, re-run your pipeline.
|
||||
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ Ensure your application does not:
|
|||
|
||||
- Use user supplied information in the process name to execute.
|
||||
- Use user supplied information in an OS command execution function which does
|
||||
not escape shell meta-characters.
|
||||
not escape shell meta-characters.
|
||||
- Use user supplied information in arguments to OS commands.
|
||||
|
||||
The application should have a hardcoded set of arguments that are to be passed to OS commands. If filenames are being passed to these functions, it is recommended that a hash of the filename be used instead, or some other unique identifier. It is strongly recommended that a native library that implements the same functionality be used instead of using OS system commands due to the risk of unknown attacks against third party commands.
|
||||
|
|
|
|||
|
|
@ -60,8 +60,8 @@ You can configure the following security controls:
|
|||
- Select **Configure with a merge request** to create a merge request with the changes required to
|
||||
enable Container Scanning. For more details, see
|
||||
[Enable Container Scanning through an automatic merge request](../container_scanning/index.md#enable-container-scanning-through-an-automatic-merge-request).
|
||||
- [Continuous Container Scanning](../container_scanning/index.md)
|
||||
- Continuous container scanning runs in the registry when any image or database is updated. For more details, read [Continuous container scanning](../../../user/application_security/continuous_vulnerability_scanning/index.md#continuous-vulnerability-scanning-for-container-registry).
|
||||
- [Container Scanning For Registry](../container_scanning/index.md#container-scanning-for-registry)
|
||||
- Enable toggle to configure **Container Scanning For Registry** for the current project.
|
||||
- [Operational Container Scanning](../../clusters/agent/vulnerabilities.md)
|
||||
- Can be configured by adding a configuration block to your agent configuration. For more details, read [Operational Container Scanning](../../clusters/agent/vulnerabilities.md#enable-operational-container-scanning).
|
||||
- [Secret Detection](../secret_detection/pipeline/index.md)
|
||||
|
|
|
|||
|
|
@ -692,6 +692,31 @@ This report can be viewed in the [Dependency List](../dependency_list/index.md).
|
|||
|
||||
You can download CycloneDX SBOMs [the same way as other job artifacts](../../../ci/jobs/job_artifacts.md#download-job-artifacts).
|
||||
|
||||
## Container Scanning For Registry
|
||||
|
||||
DETAILS:
|
||||
**Tier:** Ultimate
|
||||
**Offering:** GitLab.com, Self-managed, GitLab Dedicated
|
||||
|
||||
> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2340) in GitLab 17.1 [with a flag](../../../administration/feature_flags.md) named `container_scanning_for_registry_flag`. Disabled by default.
|
||||
|
||||
FLAG:
|
||||
The availability of this feature is controlled by a feature flag.
|
||||
For more information, see the history.
|
||||
|
||||
When an image is pushed with the `latest` tag, a container scanning job is automatically triggered against the default branch of the project.
|
||||
|
||||
Unlike regular Container Scanning, the scan results do not include a security report. Instead, Container Scanning for Registry relies on [Continuous Vulnerability Scanning](../continuous_vulnerability_scanning/index.md) to inspect the components detected by the scan.
|
||||
|
||||
When security findings are identified, GitLab generates vulnerabilities in the project. These vulnerabilities can be viewed under `Container registry vulnerabilities` tab on the [Vulnerability Report](../vulnerability_report/index.md) page.
|
||||
|
||||
By default there is a limit of `50` scans per project per day.
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- Ensure that the security configuration [Container Scanning For Registry](../configuration#security-testing) is enabled.
|
||||
- The project must contain a repository. Note that if you are utilizing an empty project solely for storing container images, this feature won't function as intended. As a workaround, ensure the project has an initial commit on the default branch.
|
||||
|
||||
## Security Dashboard
|
||||
|
||||
The [Security Dashboard](../security_dashboard/index.md) shows you an overview of all
|
||||
|
|
|
|||
|
|
@ -57,6 +57,7 @@ never considered as affected because this might result in false negatives.
|
|||
GitLab offers security analyzers that can generate a [CycloneDX SBOM report](../../../ci/yaml/artifacts_reports.md#artifactsreportscyclonedx) compatible with GitLab:
|
||||
|
||||
- [Container Scanning](../container_scanning/index.md#configuration)
|
||||
- [Container Scanning For Registry](../container_scanning/index.md#container-scanning-for-registry)
|
||||
- [Dependency Scanning](../dependency_scanning/index.md#configuration)
|
||||
- [Android dependency scanning CI/CD component](https://gitlab.com/explore/catalog/components/android-dependency-scanning) (experimental)
|
||||
|
||||
|
|
@ -86,28 +87,3 @@ Current data sources for security advisories include:
|
|||
|
||||
To find a vulnerability, you can search the [`GitLab Advisory Database`](https://advisories.gitlab.com/).
|
||||
You can also [submit new vulnerabilities](https://gitlab.com/gitlab-org/security-products/gemnasium-db/blob/master/CONTRIBUTING.md).
|
||||
|
||||
## Continuous Vulnerability Scanning For Container Registry
|
||||
|
||||
DETAILS:
|
||||
**Tier:** Ultimate
|
||||
**Offering:** GitLab.com, Self-managed, GitLab Dedicated
|
||||
|
||||
> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2340) in GitLab 17.1 [with a flag](../../../administration/feature_flags.md) named `container_scanning_for_registry_flag`. Disabled by default.
|
||||
|
||||
FLAG:
|
||||
The availability of this feature is controlled by a feature flag.
|
||||
For more information, see the history.
|
||||
|
||||
Continuous Vulnerability Scanning For Container Registry identifies security vulnerabilities in Docker images stored in the [GitLab Container Registry](../../packages/container_registry/index.md), specifically those tagged as `latest`.
|
||||
|
||||
When an image is pushed with the `latest` tag, a container scanning job is automatically triggered against the default branch of the project.
|
||||
|
||||
As security advisories are added or updated, this feature actively scans the Docker images in the Container Registry, identifies any affected images, and generates vulnerabilities in the project.
|
||||
|
||||
By default there is a limit of `50` scans per project per day.
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- Ensure that the security configuration [Container Scanning For Registry](../configuration#security-testing) is enabled.
|
||||
- The project must contain a repository. Note that if you are utilizing an empty project solely for storing container images, this feature won't function as intended. As a workaround, ensure the project has an initial commit on the default branch.
|
||||
|
|
|
|||
|
|
@ -83,8 +83,8 @@ To enable coverage-guided fuzz testing, edit `.gitlab-ci.yml`:
|
|||
```
|
||||
|
||||
1. [Include](../../../ci/yaml/index.md#includetemplate) the
|
||||
[`Coverage-Fuzzing.gitlab-ci.yml` template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/Coverage-Fuzzing.gitlab-ci.yml)
|
||||
provided as part of your GitLab installation.
|
||||
[`Coverage-Fuzzing.gitlab-ci.yml` template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/Coverage-Fuzzing.gitlab-ci.yml)
|
||||
provided as part of your GitLab installation.
|
||||
|
||||
1. Customize the `my_fuzz_target` job to meet your requirements.
|
||||
|
||||
|
|
|
|||
|
|
@ -155,19 +155,19 @@ In GitLab 15.4, we [removed the deprecated analyzers](https://gitlab.com/gitlab-
|
|||
To preview the upcoming changes to the CI/CD configuration in GitLab 15.3 or earlier:
|
||||
|
||||
1. Open an MR to switch from the Stable CI/CD template, `SAST.gitlab-ci.yml`, to [the Latest template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/SAST.latest.gitlab-ci.yml), `SAST.latest.gitlab-ci.yml`.
|
||||
- On GitLab.com, use the latest template directly:
|
||||
- On GitLab.com, use the latest template directly:
|
||||
|
||||
```yaml
|
||||
include:
|
||||
template: 'Jobs/SAST.latest.gitlab-ci.yml'
|
||||
```
|
||||
```yaml
|
||||
include:
|
||||
template: 'Jobs/SAST.latest.gitlab-ci.yml'
|
||||
```
|
||||
|
||||
- On a self-managed instance, download the template from GitLab.com:
|
||||
- On a self-managed instance, download the template from GitLab.com:
|
||||
|
||||
```yaml
|
||||
include:
|
||||
remote: 'https://gitlab.com/gitlab-org/gitlab/-/raw/2851f4d5/lib/gitlab/ci/templates/Jobs/SAST.latest.gitlab-ci.yml'
|
||||
```
|
||||
```yaml
|
||||
include:
|
||||
remote: 'https://gitlab.com/gitlab-org/gitlab/-/raw/2851f4d5/lib/gitlab/ci/templates/Jobs/SAST.latest.gitlab-ci.yml'
|
||||
```
|
||||
|
||||
1. Verify that scanning jobs succeed in the MR. You notice findings from the removed analyzers in _Fixed_ and findings from Semgrep in _New_. (Some findings may show different names, descriptions, and severities, since GitLab manages and edits the Semgrep rulesets.)
|
||||
1. Close the MR.
|
||||
|
|
|
|||
|
|
@ -35,8 +35,8 @@ When SAML is enabled, users with the Owner role see a new menu
|
|||
item in group **Settings > SAML Group Links**.
|
||||
|
||||
- You can configure one or more **SAML Group Links** to map a SAML identity
|
||||
provider group name to a GitLab role.
|
||||
- Members of the SAML identity provider group are added as members of the GitLab
|
||||
provider (IdP) group name to a GitLab role.
|
||||
- Members of the SAML IdP group are added as members of the GitLab
|
||||
group on their next SAML sign-in.
|
||||
- Group membership is evaluated each time a user signs in using SAML.
|
||||
- SAML Group Links can be configured for a top-level group or any subgroup.
|
||||
|
|
@ -55,6 +55,19 @@ To link the SAML groups:
|
|||
|
||||

|
||||
|
||||
### Self-managed GitLab with multiple SAML IdPs
|
||||
|
||||
When a user signs in, GitLab:
|
||||
|
||||
- Checks all the configured SAML group links.
|
||||
- Adds that user to the corresponding GitLab groups based on the SAML groups the user belongs to across the different IdPs.
|
||||
|
||||
For this to work correctly, you must configure all SAML IdPs to contain group attributes in the SAML response.
|
||||
|
||||
For example, if you have two SAML IdPs and you configure a group link named `GTLB-Owners` mapped to the Owner role,
|
||||
the SAML response from either SAML IdP must contain a group attribute `GTLB-Owners`. If one of the SAML IdPs does not return the group attribute,
|
||||
when the user signs in with that SAML IdP, that user is removed from the group.
|
||||
|
||||
### How role conflicts are resolved
|
||||
|
||||
#### Members of multiple mapped SAML groups
|
||||
|
|
|
|||
|
|
@ -294,8 +294,10 @@ To view value stream analytics for your group or project:
|
|||
1. Select a parameter.
|
||||
1. Select a value or enter text to refine the results.
|
||||
1. To view metrics in a particular date range, from the dropdown list select a predefined date range or the **Custom** option. With the **Custom** option selected:
|
||||
- In the **From** field, select a start date.
|
||||
- In the **To** field, select an end date.
|
||||
|
||||
- In the **From** field, select a start date.
|
||||
- In the **To** field, select an end date.
|
||||
|
||||
The charts and list display workflow items created during the date range.
|
||||
1. Optional. Sort results by ascending or descending:
|
||||
- To sort by most recent or oldest workflow item, select the **Last event** header.
|
||||
|
|
|
|||
|
|
@ -35,9 +35,9 @@ Default settings for the Harbor integration at the project level are inherited f
|
|||
To download and run a Harbor image hosted in the GitLab Harbor registry:
|
||||
|
||||
1. Copy the link to your container image:
|
||||
1. On the left sidebar, select **Search or go to** and find your project or group.
|
||||
1. Select **Deploy > Harbor Registry** and find the image you want.
|
||||
1. Select the **Copy** icon next to the image name.
|
||||
1. On the left sidebar, select **Search or go to** and find your project or group.
|
||||
1. Select **Deploy > Harbor Registry** and find the image you want.
|
||||
1. Select the **Copy** icon next to the image name.
|
||||
|
||||
1. Use the command to run the container image you want.
|
||||
|
||||
|
|
|
|||
|
|
@ -253,11 +253,11 @@ The autofill approach has both benefits and limitations.
|
|||
- Data exports have rows for the entire date range, making data analysis easier.
|
||||
- Limitations:
|
||||
- The `day` [granularity](https://cube.dev/docs/product/apis-integrations/rest-api/query-format) must be used.
|
||||
All other granularities are not supported.
|
||||
All other granularities are not supported.
|
||||
- Only date ranges defined by the [`inDateRange`](https://cube.dev/docs/product/apis-integrations/rest-api/query-format#indaterange) filter are filled.
|
||||
- The date selector in the UI already uses this filter.
|
||||
- The filling of data ignores the query-defined limit. If you set a limit of 10 data points over 20 days, it
|
||||
returns 20 data points, with the missing data filled by `0`. [Issue 417231](https://gitlab.com/gitlab-org/gitlab/-/issues/417231) proposes a solution to this limitation.
|
||||
returns 20 data points, with the missing data filled by `0`. [Issue 417231](https://gitlab.com/gitlab-org/gitlab/-/issues/417231) proposes a solution to this limitation.
|
||||
|
||||
## Funnel analysis
|
||||
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ As a user, to delete your own account:
|
|||
1. Select **Delete account**.
|
||||
|
||||
NOTE:
|
||||
On GitLab.com, there is a seven day delay between a user deleting their own account and deletion of the user record. During this time, that user is [blocked](../../../administration/moderate_users.md#block-a-user) and a new account with the same email address or username cannot be created. Accounts with no issues, comments, notes, merge requests, or snippets are deleted immediately. Accounts under paid namespaces are deleted immediately.
|
||||
On GitLab.com, there is a seven day delay between a user deleting their own account and deletion of the user record. During this time, that user is [blocked](../../../administration/moderate_users.md#block-a-user) and a new account with the same email address or username cannot be created. Accounts with no issues, comments, notes, merge requests, or snippets are deleted within an hour. Accounts under paid namespaces are deleted within an hour.
|
||||
|
||||
## Delete users and user contributions
|
||||
|
||||
|
|
|
|||
|
|
@ -133,7 +133,7 @@ DETAILS:
|
|||
**Tier:** Premium, Ultimate
|
||||
|
||||
1. In the editor toolbar for a comment, select **Comment templates**
|
||||
(**{comment-lines}**), then select **Manage group comment templates**.
|
||||
(**{comment-lines}**), then select **Manage group comment templates**.
|
||||
1. To edit, select **Edit** (**{pencil}**).
|
||||
1. To delete, select **Delete** (**{remove}**), then select **Delete** again on the dialog.
|
||||
|
||||
|
|
@ -143,6 +143,6 @@ DETAILS:
|
|||
**Tier:** Premium, Ultimate
|
||||
|
||||
1. In the editor toolbar for a comment, select **Comment templates**
|
||||
(**{comment-lines}**), then select **Manage project comment templates**.
|
||||
(**{comment-lines}**), then select **Manage project comment templates**.
|
||||
1. To edit, select **Edit** (**{pencil}**).
|
||||
1. To delete, select **Delete** (**{remove}**), then select **Delete** again on the dialog.
|
||||
|
|
|
|||
|
|
@ -149,7 +149,7 @@ To create a new project and add its README to your profile:
|
|||
- In the **Project name** field, enter the name for your new project.
|
||||
- In the **Project URL** field, select your GitLab username.
|
||||
- In the **Project slug** field, enter your GitLab username.
|
||||
All of these fields are case sensitive. If your username has capital letters, enter it into the project slug field with the capitals included.
|
||||
All of these fields are case sensitive. If your username has capital letters, enter it into the project slug field with the capitals included.
|
||||
1. For **Visibility Level**, select **Public**.
|
||||

|
||||
1. For **Project Configuration**, ensure **Initialize repository with a README** is selected.
|
||||
|
|
|
|||
|
|
@ -148,19 +148,19 @@ To configure Slack notifications:
|
|||
1. In the **Trigger** section:
|
||||
- Select the checkbox for each GitLab [event](#notification-events) you want to receive notifications for in Slack.
|
||||
- For each checkbox you select, enter the names of the Slack channels you want to receive notifications.
|
||||
You can enter up to 10 channel names separated by commas (for example, `#channel-one, #channel-two`).
|
||||
You can enter up to 10 channel names separated by commas (for example, `#channel-one, #channel-two`).
|
||||
|
||||
NOTE:
|
||||
If the Slack channel is private, you must [add the GitLab for Slack app to the channel](#receive-notifications-to-a-private-channel).
|
||||
|
||||
1. Optional. In the **Notification settings** section:
|
||||
- Select the **Notify only broken pipelines** checkbox
|
||||
to receive notifications for failed pipelines only.
|
||||
to receive notifications for failed pipelines only.
|
||||
- From the **Branches for which notifications are to be sent** dropdown list,
|
||||
select the branches you want to receive notifications for.
|
||||
select the branches you want to receive notifications for.
|
||||
- For **Labels to be notified**, enter any or all of the labels a GitLab
|
||||
issue, merge request, or comment must have to receive notifications for.
|
||||
Leave blank to receive notifications for all events.
|
||||
issue, merge request, or comment must have to receive notifications for.
|
||||
Leave blank to receive notifications for all events.
|
||||
1. Optional. Select **Test settings**.
|
||||
1. Select **Save changes**.
|
||||
|
||||
|
|
|
|||
|
|
@ -25,13 +25,13 @@ see [Leverage Requirements and Test management in your SDLC](https://www.youtube
|
|||
|
||||
1. Optional. Ask your system administrator to [configure a token in the properties file](https://tm-en.doc.squashtest.com/latest/redirect/gitlab-integration-token.html).
|
||||
1. Follow the [Squash TM documentation](https://tm-en.doc.squashtest.com/latest/redirect/gitlab-integration-configuration.html) to:
|
||||
1. Create a GitLab server.
|
||||
1. Enable the `Xsquash4GitLab` plugin
|
||||
1. Configure a synchronization.
|
||||
1. From the **Real-time synchronization** panel, copy the following fields to use later in GitLab:
|
||||
1. Create a GitLab server.
|
||||
1. Enable the `Xsquash4GitLab` plugin
|
||||
1. Configure a synchronization.
|
||||
1. From the **Real-time synchronization** panel, copy the following fields to use later in GitLab:
|
||||
|
||||
- **Webhook URL**.
|
||||
- **Secret token** if your Squash TM system administrator configured one at step 1.
|
||||
- **Webhook URL**.
|
||||
- **Secret token** if your Squash TM system administrator configured one at step 1.
|
||||
|
||||
## Configure GitLab
|
||||
|
||||
|
|
|
|||
|
|
@ -85,9 +85,9 @@ To edit a merge request approval rule:
|
|||
1. In the **Merge request approvals** section, in the **Approval rules** section, next to the rule you want to edit, select **Edit**.
|
||||
1. On the right sidebar, edit the fields:
|
||||
- In **Approvals required**, a value of `0` makes
|
||||
[the rule optional](#configure-optional-approval-rules), and any number greater than `0`
|
||||
creates a required rule.
|
||||
Maximum number of required approvals is `100`.
|
||||
[the rule optional](#configure-optional-approval-rules), and any number greater than `0`
|
||||
creates a required rule.
|
||||
Maximum number of required approvals is `100`.
|
||||
- To remove users or groups, identify the group or user to remove, and select **Remove**
|
||||
(**{remove}**).
|
||||
1. Select **Save changes**.
|
||||
|
|
|
|||
|
|
@ -261,7 +261,7 @@ When mirroring fails due to Silent Mode the following are the debug steps:
|
|||
- [Triggering the mirror using the API](pull.md#trigger-pipelines-for-mirror-updates) shows: `The project is not mirrored`.
|
||||
|
||||
- If pull or push mirror was already set up but there are no further updates on the mirrored repository,
|
||||
confirm the [project's pull and push mirror details ans status](../../../../api/projects.md#get-a-projects-pull-mirror-details) are not recent as shown below. This indicates mirroring was paused and disabling GitLab Silent Mode restarts it automatically.
|
||||
confirm the [project's pull and push mirror details ans status](../../../../api/projects.md#get-a-projects-pull-mirror-details) are not recent as shown below. This indicates mirroring was paused and disabling GitLab Silent Mode restarts it automatically.
|
||||
|
||||
For example, if Silent Mode is what is impeding your imports, the output is similar to the following:
|
||||
|
||||
|
|
|
|||
|
|
@ -520,7 +520,7 @@ This data can now be investigated on the Linux command line using OpenSSL:
|
|||
or the signature is missing the intermediate certificates and a chain to a trusted root can't be built.
|
||||
- Intermediate certificates can be put in the trust store if it's not possible to include them in the signature.
|
||||
- [The procedure for adding certificates](https://docs.gitlab.com/omnibus/settings/ssl/#install-custom-public-certificates)
|
||||
to the trust store for packaged GitLab - using `/etc/gitlab/trusted-certs`.
|
||||
to the trust store for packaged GitLab - using `/etc/gitlab/trusted-certs`.
|
||||
- Test additional trusted certificates using OpenSSL with: `-CAfile /path/to/rootcertificate.pem`
|
||||
- `unsupported certificate purpose`:
|
||||
- The certificate must specify `Digital Signature` in the `X509v3 Key Usage` section of the signer's certificate.
|
||||
|
|
|
|||
|
|
@ -311,7 +311,8 @@ To troubleshoot this:
|
|||
1. Sometimes GitLab cannot automatically select an authentication method that the SMTP server supports. Either:
|
||||
- Try the available authentication methods (**Plain**, **Login** and **CRAM-MD5**).
|
||||
- Check which authentication methods your SMTP server supports, using the
|
||||
[`swaks` command line tool](https://www.jetmore.org/john/code/swaks/):
|
||||
[`swaks` command line tool](https://www.jetmore.org/john/code/swaks/):
|
||||
|
||||
1. Run the following command with your credentials and look for a line that starts with `250-AUTH`:
|
||||
|
||||
```shell
|
||||
|
|
|
|||
|
|
@ -52335,6 +52335,9 @@ msgstr ""
|
|||
msgid "Terminal sync service is running"
|
||||
msgstr ""
|
||||
|
||||
msgid "Terminates"
|
||||
msgstr ""
|
||||
|
||||
msgid "Terms"
|
||||
msgstr ""
|
||||
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ import {
|
|||
TOKEN_TYPE_SOURCE_BRANCH,
|
||||
TOKEN_TYPE_TARGET_BRANCH,
|
||||
TOKEN_TYPE_ASSIGNEE,
|
||||
TOKEN_TYPE_REVIEWER,
|
||||
} from '~/vue_shared/components/filtered_search_bar/constants';
|
||||
import { mergeRequestListTabs } from '~/vue_shared/issuable/list/constants';
|
||||
import { getSortOptions } from '~/issues/list/utils';
|
||||
|
|
@ -110,6 +111,7 @@ describe('Merge requests list app', () => {
|
|||
it('does not have preloaded users when gon.current_user_id does not exist', () => {
|
||||
expect(findIssuableList().props('searchTokens')).toMatchObject([
|
||||
{ type: TOKEN_TYPE_ASSIGNEE },
|
||||
{ type: TOKEN_TYPE_REVIEWER, preloadedUsers: [] },
|
||||
{ type: TOKEN_TYPE_AUTHOR, preloadedUsers: [] },
|
||||
{ type: TOKEN_TYPE_DRAFT },
|
||||
{ type: TOKEN_TYPE_MILESTONE },
|
||||
|
|
@ -122,6 +124,7 @@ describe('Merge requests list app', () => {
|
|||
describe('when all tokens are available', () => {
|
||||
const urlParams = {
|
||||
assignee_username: 'bob',
|
||||
reviewer_username: 'bill',
|
||||
draft: 'yes',
|
||||
milestone_title: 'milestone',
|
||||
'target_branches[]': 'branch-a',
|
||||
|
|
@ -154,6 +157,7 @@ describe('Merge requests list app', () => {
|
|||
|
||||
expect(findIssuableList().props('searchTokens')).toMatchObject([
|
||||
{ type: TOKEN_TYPE_ASSIGNEE },
|
||||
{ type: TOKEN_TYPE_REVIEWER, preloadedUsers },
|
||||
{ type: TOKEN_TYPE_AUTHOR, preloadedUsers },
|
||||
{ type: TOKEN_TYPE_DRAFT },
|
||||
{ type: TOKEN_TYPE_MILESTONE },
|
||||
|
|
@ -165,6 +169,7 @@ describe('Merge requests list app', () => {
|
|||
it('pre-displays tokens that are in the url search parameters', () => {
|
||||
expect(findIssuableList().props('initialFilterValue')).toMatchObject([
|
||||
{ type: TOKEN_TYPE_ASSIGNEE },
|
||||
{ type: TOKEN_TYPE_REVIEWER },
|
||||
{ type: TOKEN_TYPE_DRAFT },
|
||||
{ type: TOKEN_TYPE_MILESTONE },
|
||||
{ type: TOKEN_TYPE_TARGET_BRANCH },
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ describe('Work Item Note Actions', () => {
|
|||
provide: {
|
||||
isGroup: false,
|
||||
glFeatures: {
|
||||
workItemsMvc2: true,
|
||||
workItemsAlpha: true,
|
||||
},
|
||||
},
|
||||
stubs: {
|
||||
|
|
|
|||
|
|
@ -161,7 +161,7 @@ describe('Work Item Note', () => {
|
|||
});
|
||||
|
||||
it('should show the awards list when in edit mode', async () => {
|
||||
createComponent({ note: mockWorkItemCommentNote, workItemsMvc2: true });
|
||||
createComponent({ note: mockWorkItemCommentNote, workItemsAlpha: true });
|
||||
findNoteActions().vm.$emit('startEditing');
|
||||
await nextTick();
|
||||
expect(findAwardsList().exists()).toBe(true);
|
||||
|
|
@ -444,7 +444,7 @@ describe('Work Item Note', () => {
|
|||
});
|
||||
|
||||
it('passes note props to awards list', () => {
|
||||
createComponent({ note: mockWorkItemCommentNote, workItemsMvc2: true });
|
||||
createComponent({ note: mockWorkItemCommentNote, workItemsAlpha: true });
|
||||
|
||||
expect(findAwardsList().props('note')).toBe(mockWorkItemCommentNote);
|
||||
expect(findAwardsList().props('workItemIid')).toBe('1');
|
||||
|
|
|
|||
|
|
@ -152,7 +152,7 @@ describe('WorkItemActions component', () => {
|
|||
},
|
||||
provide: {
|
||||
isGroup: false,
|
||||
glFeatures: { workItemsBeta: true, workItemsMvc2: true },
|
||||
glFeatures: { workItemsBeta: true, workItemsAlpha: true },
|
||||
},
|
||||
mocks: {
|
||||
$toast,
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ describe('WorkItemAttributesWrapper component', () => {
|
|||
|
||||
const createComponent = ({
|
||||
workItem = workItemQueryResponse.data.workItem,
|
||||
workItemsMvc2 = false,
|
||||
workItemsAlpha = false,
|
||||
groupPath = '',
|
||||
} = {}) => {
|
||||
wrapper = shallowMount(WorkItemAttributesWrapper, {
|
||||
|
|
@ -44,7 +44,7 @@ describe('WorkItemAttributesWrapper component', () => {
|
|||
hasIssuableHealthStatusFeature: true,
|
||||
projectNamespace: 'namespace',
|
||||
glFeatures: {
|
||||
workItemsMvc2,
|
||||
workItemsAlpha,
|
||||
},
|
||||
},
|
||||
stubs: {
|
||||
|
|
@ -195,7 +195,7 @@ describe('WorkItemAttributesWrapper component', () => {
|
|||
${'does not render when widget is not returned from API'} | ${false} | ${false}
|
||||
`('$description', ({ developmentWidgetPresent, exists }) => {
|
||||
const response = workItemResponseFactory({ developmentWidgetPresent });
|
||||
createComponent({ workItem: response.data.workItem, workItemsMvc2: false });
|
||||
createComponent({ workItem: response.data.workItem, workItemsAlpha: false });
|
||||
|
||||
expect(findWorkItemDevelopment().exists()).toBe(exists);
|
||||
});
|
||||
|
|
@ -208,7 +208,7 @@ describe('WorkItemAttributesWrapper component', () => {
|
|||
${'does not render when widget is not returned from API'} | ${false} | ${false}
|
||||
`('$description', ({ developmentWidgetPresent, exists }) => {
|
||||
const response = workItemResponseFactory({ developmentWidgetPresent });
|
||||
createComponent({ workItem: response.data.workItem, workItemsMvc2: true });
|
||||
createComponent({ workItem: response.data.workItem, workItemsAlpha: true });
|
||||
|
||||
expect(findWorkItemDevelopment().exists()).toBe(exists);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -104,7 +104,7 @@ describe('WorkItemDetail component', () => {
|
|||
handler = successHandler,
|
||||
mutationHandler,
|
||||
error = undefined,
|
||||
workItemsMvc2Enabled = false,
|
||||
workItemsAlphaEnabled = false,
|
||||
workItemsBeta = false,
|
||||
} = {}) => {
|
||||
wrapper = shallowMountExtended(WorkItemDetail, {
|
||||
|
|
@ -128,7 +128,7 @@ describe('WorkItemDetail component', () => {
|
|||
},
|
||||
provide: {
|
||||
glFeatures: {
|
||||
workItemsMvc2: workItemsMvc2Enabled,
|
||||
workItemsAlpha: workItemsAlphaEnabled,
|
||||
workItemsBeta,
|
||||
},
|
||||
hasIssueWeightsFeature: true,
|
||||
|
|
@ -379,7 +379,7 @@ describe('WorkItemDetail component', () => {
|
|||
createComponent({
|
||||
isModal: true,
|
||||
handler: jest.fn().mockRejectedValue('Oops, problemo'),
|
||||
workItemsMvc2Enabled: true,
|
||||
workItemsAlphaEnabled: true,
|
||||
});
|
||||
|
||||
await waitForPromises();
|
||||
|
|
@ -501,7 +501,7 @@ describe('WorkItemDetail component', () => {
|
|||
});
|
||||
|
||||
it('opens the modal with the child when `show-modal` is emitted', async () => {
|
||||
createComponent({ handler: objectiveHandler, workItemsMvc2Enabled: true });
|
||||
createComponent({ handler: objectiveHandler, workItemsAlphaEnabled: true });
|
||||
await waitForPromises();
|
||||
|
||||
const event = {
|
||||
|
|
@ -525,7 +525,7 @@ describe('WorkItemDetail component', () => {
|
|||
createComponent({
|
||||
isModal: true,
|
||||
handler: objectiveHandler,
|
||||
workItemsMvc2Enabled: true,
|
||||
workItemsAlphaEnabled: true,
|
||||
});
|
||||
|
||||
await waitForPromises();
|
||||
|
|
@ -581,7 +581,7 @@ describe('WorkItemDetail component', () => {
|
|||
it('opens the modal with the linked item when `showModal` is emitted', async () => {
|
||||
createComponent({
|
||||
handler,
|
||||
workItemsMvc2Enabled: true,
|
||||
workItemsAlphaEnabled: true,
|
||||
});
|
||||
await waitForPromises();
|
||||
|
||||
|
|
@ -604,7 +604,7 @@ describe('WorkItemDetail component', () => {
|
|||
createComponent({
|
||||
isModal: true,
|
||||
handler,
|
||||
workItemsMvc2Enabled: true,
|
||||
workItemsAlphaEnabled: true,
|
||||
});
|
||||
|
||||
await waitForPromises();
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ describe('WorkItemActions component', () => {
|
|||
},
|
||||
provide: {
|
||||
isGroup: false,
|
||||
glFeatures: { workItemsBeta: true, workItemsMvc2: true },
|
||||
glFeatures: { workItemsBeta: true, workItemsAlpha: true },
|
||||
},
|
||||
mocks: {
|
||||
$toast,
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ describe('Work items router', () => {
|
|||
beforeEach(() => {
|
||||
window.gon = {
|
||||
features: {
|
||||
workItemsMvc2: false,
|
||||
workItemsAlpha: false,
|
||||
},
|
||||
};
|
||||
});
|
||||
|
|
@ -79,14 +79,14 @@ describe('Work items router', () => {
|
|||
expect(wrapper.findComponent(WorkItemsRoot).exists()).toBe(true);
|
||||
});
|
||||
|
||||
it('does not render create work item page on `/new` route if `workItemsMvc2` feature flag is off', async () => {
|
||||
it('does not render create work item page on `/new` route if `workItemsAlpha` feature flag is off', async () => {
|
||||
await createComponent('/new');
|
||||
|
||||
expect(wrapper.findComponent(CreateWorkItem).exists()).toBe(false);
|
||||
});
|
||||
|
||||
it('renders create work item page on `/new` route', async () => {
|
||||
window.gon.features.workItemsMvc2 = true;
|
||||
window.gon.features.workItemsAlpha = true;
|
||||
await createComponent('/new');
|
||||
|
||||
expect(wrapper.findComponent(CreateWorkItem).exists()).toBe(true);
|
||||
|
|
|
|||
|
|
@ -3797,10 +3797,10 @@ RSpec.describe Group, feature_category: :groups_and_projects do
|
|||
end
|
||||
end
|
||||
|
||||
describe '#work_items_mvc_2_feature_flag_enabled?' do
|
||||
describe '#work_items_alpha_feature_flag_enabled?' do
|
||||
it_behaves_like 'checks self and root ancestor feature flag' do
|
||||
let(:feature_flag) { :work_items_mvc_2 }
|
||||
let(:feature_flag_method) { :work_items_mvc_2_feature_flag_enabled? }
|
||||
let(:feature_flag) { :work_items_alpha }
|
||||
let(:feature_flag_method) { :work_items_alpha_feature_flag_enabled? }
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -8895,12 +8895,12 @@ RSpec.describe Project, factory_default: :keep, feature_category: :groups_and_pr
|
|||
end
|
||||
end
|
||||
|
||||
describe '#work_items_mvc_2_feature_flag_enabled?' do
|
||||
describe '#work_items_alpha_feature_flag_enabled?' do
|
||||
let_it_be(:group_project) { create(:project, :in_subgroup) }
|
||||
|
||||
it_behaves_like 'checks parent group feature flag' do
|
||||
let(:feature_flag_method) { :work_items_mvc_2_feature_flag_enabled? }
|
||||
let(:feature_flag) { :work_items_mvc_2 }
|
||||
let(:feature_flag_method) { :work_items_alpha_feature_flag_enabled? }
|
||||
let(:feature_flag) { :work_items_alpha }
|
||||
let(:subject_project) { group_project }
|
||||
end
|
||||
end
|
||||
|
|
|
|||
Loading…
Reference in New Issue