Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2023-12-12 00:22:18 +00:00
parent 6d08f67e10
commit 101d32c3b8
52 changed files with 540 additions and 305 deletions

View File

@ -414,7 +414,6 @@ Gitlab/StrongMemoizeAttr:
- 'ee/lib/gitlab/auth/smartcard/certificate.rb'
- 'ee/lib/gitlab/ci/minutes/cached_quota.rb'
- 'ee/lib/gitlab/ci/minutes/gitlab_contribution_cost_factor.rb'
- 'ee/lib/gitlab/ci/minutes/runners_availability.rb'
- 'ee/lib/gitlab/ci/parsers/security/container_scanning.rb'
- 'ee/lib/gitlab/ci/project_config/compliance.rb'
- 'ee/lib/gitlab/ci/reports/license_scanning/reports_comparer.rb'

View File

@ -48,7 +48,7 @@ export default {
:is="component"
:aria-label="ariaLabel"
:href="href"
class="counter gl-display-block gl-flex-grow-1 gl-text-center gl-py-3 gl-rounded-base gl-border-none gl-inset-border-1-gray-a-08 gl-line-height-1 gl-font-sm gl-hover-text-decoration-none gl-focus--focus"
class="user-bar-button gl-display-block gl-flex-grow-1 gl-text-center gl-py-3 gl-rounded-base gl-border-none gl-line-height-1 gl-font-sm gl-hover-text-decoration-none"
>
<gl-icon aria-hidden="true" :name="icon" />
<span v-if="count" aria-hidden="true" class="gl-ml-1">{{ formattedCount }}</span>

View File

@ -1,6 +1,7 @@
<script>
import { kebabCase } from 'lodash';
import { GlCollapse, GlIcon } from '@gitlab/ui';
import { NAV_ITEM_LINK_ACTIVE_CLASS } from '../constants';
import NavItem from './nav_item.vue';
import FlyoutMenu from './flyout_menu.vue';
@ -61,9 +62,7 @@ export default {
return this.isExpanded ? 'chevron-up' : 'chevron-down';
},
computedLinkClasses() {
return {
'gl-bg-t-gray-a-08': this.isActive,
};
return this.isActive ? NAV_ITEM_LINK_ACTIVE_CLASS : null;
},
isActive() {
return !this.isExpanded && this.item.is_active;
@ -109,7 +108,7 @@ export default {
<hr v-if="separated" aria-hidden="true" class="gl-mx-4 gl-my-2" />
<button
:id="`menu-section-button-${itemId}`"
class="gl-rounded-base gl-relative gl-display-flex gl-align-items-center gl-min-h-7 gl-gap-3 gl-mb-2 gl-py-2 gl-px-3 gl-text-black-normal! gl-hover-bg-t-gray-a-08 gl-focus-bg-t-gray-a-08 gl-text-decoration-none! gl-appearance-none gl-border-0 gl-bg-transparent gl-text-left gl-w-full gl-focus--focus"
class="super-sidebar-nav-item gl-rounded-base gl-relative gl-display-flex gl-align-items-center gl-min-h-7 gl-gap-3 gl-mb-2 gl-py-2 gl-px-3 gl-text-black-normal! gl-text-decoration-none! gl-appearance-none gl-border-0 gl-bg-transparent gl-text-left gl-w-full gl-focus--focus"
:class="computedLinkClasses"
data-testid="menu-section-button"
:data-qa-section-name="item.title"
@ -126,7 +125,11 @@ export default {
></span>
<span class="gl-flex-shrink-0 gl-w-6 gl-display-flex">
<slot name="icon">
<gl-icon v-if="item.icon" :name="item.icon" class="gl-m-auto item-icon" />
<gl-icon
v-if="item.icon"
:name="item.icon"
class="super-sidebar-nav-item-icon gl-m-auto"
/>
</slot>
</span>

View File

@ -223,7 +223,7 @@ export default {
:is="navItemLinkComponent"
#default="{ isActive }"
v-bind="linkProps"
class="gl-relative gl-display-flex gl-align-items-center gl-min-h-7 gl-gap-3 gl-mb-1 gl-py-2 gl-text-black-normal! gl-hover-bg-t-gray-a-08 gl-focus-bg-t-gray-a-08 gl-text-decoration-none! gl-focus--focus show-on-focus-or-hover--control hide-on-focus-or-hover--control"
class="super-sidebar-nav-item gl-relative gl-display-flex gl-align-items-center gl-min-h-7 gl-gap-3 gl-mb-1 gl-py-2 gl-text-black-normal! gl-text-decoration-none! gl-focus--focus show-on-focus-or-hover--control hide-on-focus-or-hover--control"
:class="computedLinkClasses"
data-testid="nav-item-link"
>
@ -236,7 +236,11 @@ export default {
></div>
<div v-if="!isFlyout" class="gl-flex-shrink-0 gl-w-6 gl-display-flex">
<slot name="icon">
<gl-icon v-if="item.icon" :name="item.icon" class="gl-m-auto item-icon" />
<gl-icon
v-if="item.icon"
:name="item.icon"
class="super-sidebar-nav-item-icon gl-m-auto"
/>
<gl-icon
v-else-if="isInPinnedSection"
name="grip"
@ -264,7 +268,6 @@ export default {
v-if="hasPill"
size="sm"
variant="neutral"
class="gl-bg-t-gray-a-08!"
:class="{
'hide-on-focus-or-hover--target transition-opacity-on-hover--target': isPinnable,
}"

View File

@ -204,7 +204,7 @@ export default {
<user-bar ref="userBar" :has-collapse-button="!showOverlay" :sidebar-data="sidebarData" />
<div v-if="showTrialStatusWidget" class="gl-px-2 gl-py-2">
<trial-status-widget
class="gl-rounded-base gl-relative gl-display-flex gl-align-items-center gl-mb-1 gl-px-3 gl-line-height-normal gl-text-black-normal! gl-hover-bg-t-gray-a-08 gl-focus-bg-t-gray-a-08 gl-text-decoration-none! gl-py-3"
class="super-sidebar-nav-item gl-rounded-base gl-relative gl-display-flex gl-align-items-center gl-mb-1 gl-px-3 gl-line-height-normal gl-text-black-normal! gl-text-decoration-none! gl-py-3"
/>
<trial-status-popover />
</div>

View File

@ -200,7 +200,7 @@ export default {
id="super-sidebar-search"
v-gl-tooltip.bottom.html="searchTooltip"
v-gl-modal="$options.SEARCH_MODAL_ID"
class="counter gl-display-block gl-py-3 gl-bg-gray-10 gl-rounded-base gl-text-gray-900 gl-border-none gl-inset-border-1-gray-a-08 gl-line-height-1 gl-focus--focus gl-w-full"
class="user-bar-button gl-display-block gl-py-3 gl-bg-gray-10 gl-rounded-base gl-text-gray-900 gl-border-none gl-line-height-1 gl-w-full"
data-testid="super-sidebar-search-button"
>
<gl-icon name="search" />

View File

@ -248,7 +248,7 @@ export default {
@shown="onShow"
>
<template #toggle>
<gl-button category="tertiary" class="user-bar-item btn-with-notification">
<gl-button category="tertiary" class="user-bar-dropdown-toggle btn-with-notification">
<span class="gl-sr-only">{{ toggleText }}</span>
<gl-avatar
:size="24"

View File

@ -54,7 +54,7 @@ export const SIDEBAR_COOKIE_EXPIRATION = 365 * 10;
export const DROPDOWN_Y_OFFSET = 4;
export const NAV_ITEM_LINK_ACTIVE_CLASS = 'gl-bg-t-gray-a-08';
export const NAV_ITEM_LINK_ACTIVE_CLASS = 'super-sidebar-nav-item-current';
export const IMPERSONATING_OFFSET = 34;

View File

@ -1,12 +1,3 @@
@mixin active-toggle($background-color: var(--super-sidebar-user-bar-button-hover-bg)) {
background-color: $background-color !important;
mix-blend-mode: multiply;
.gl-dark & {
mix-blend-mode: screen;
}
}
$super-sidebar-transition-duration: $gl-transition-duration-medium;
$super-sidebar-transition-hint-duration: $super-sidebar-transition-duration / 4;
@ -29,17 +20,44 @@ $super-sidebar-transition-hint-duration: $super-sidebar-transition-duration / 4;
}
.super-sidebar {
--super-sidebar-bg: var(--gray-10, #{$gray-10});
--super-sidebar-primary: var(--blue-500, #{$blue-500});
--super-sidebar-notification-dot: var(--blue-500, #{$blue-500});
--super-sidebar-bg: #{$gray-10};
--super-sidebar-border-color: #{$t-gray-a-08};
--super-sidebar-primary: #{$blue-500};
--super-sidebar-notification-dot: #{$blue-500};
--super-sidebar-user-bar-bg: #{$t-gray-a-04};
--super-sidebar-user-bar-button-bg: var(--gray-10, #{$gray-10});
--super-sidebar-user-bar-button-hover-bg: var(--gray-50, #{$gray-50});
--super-sidebar-user-bar-button-color: var(--gray-900, #{$gray-900});
--super-sidebar-user-bar-button-hover-color: var(--gray-900, #{$gray-900});
// Separate values provided to use `---gray-600` in dark mode
--super-sidebar-user-bar-button-icon-color: var(--gray-600, #{$gray-500});
--super-sidebar-user-bar-button-icon-hover-color: var(--gray-700, #{$gray-700});
--super-sidebar-user-bar-button-bg: #{$gray-10};
--super-sidebar-user-bar-button-color: #{$gray-900};
--super-sidebar-user-bar-button-border-color: #{$t-gray-a-08};
--super-sidebar-user-bar-button-hover-bg: #{$t-gray-a-08};
--super-sidebar-user-bar-button-hover-color: #{$gray-900};
--super-sidebar-user-bar-button-active-bg: #{$t-gray-a-16};
--super-sidebar-user-bar-button-icon-color: #{$gray-500};
--super-sidebar-user-bar-button-icon-hover-color: #{$gray-700};
--super-sidebar-user-bar-button-icon-mix-blend-mode: normal;
--super-sidebar-nav-item-hover-bg: #{$t-gray-a-08};
--super-sidebar-nav-item-active-bg: #{$t-gray-a-16};
--super-sidebar-nav-item-current-bg: #{$t-gray-a-08};
--super-sidebar-nav-item-icon-color: #{$gray-500};
.gl-dark & {
--super-sidebar-border-color: #{$t-white-a-08};
--super-sidebar-user-bar-bg: #{$t-white-a-04};
--super-sidebar-user-bar-button-bg: #{$gray-10};
--super-sidebar-user-bar-button-border-color: #{$t-white-a-08};
--super-sidebar-user-bar-button-hover-bg: #{$t-white-a-16};
--super-sidebar-user-bar-button-active-bg: #{$t-white-a-24};
--super-sidebar-user-bar-button-icon-color: #{$gray-600};
--super-sidebar-nav-item-hover-bg: #{$t-white-a-08};
--super-sidebar-nav-item-active-bg: #{$t-white-a-16};
--super-sidebar-nav-item-current-bg: #{$t-white-a-08};
--super-sidebar-nav-item-icon-color: #{$gray-600};
}
display: flex;
flex-direction: column;
@ -48,7 +66,7 @@ $super-sidebar-transition-hint-duration: $super-sidebar-transition-duration / 4;
bottom: $calc-application-footer-height;
left: 0;
background-color: var(--super-sidebar-bg);
border-right: 1px solid $t-gray-a-08;
border-right: 1px solid var(--super-sidebar-border-color);
transform: translate3d(0, 0, 0);
width: $super-sidebar-width;
z-index: $super-sidebar-z-index;
@ -69,85 +87,84 @@ $super-sidebar-transition-hint-duration: $super-sidebar-transition-duration / 4;
.user-bar {
background-color: var(--super-sidebar-user-bar-bg);
.user-bar-item {
@include gl-rounded-base;
.user-bar-dropdown-toggle {
@include gl-p-2;
@include gl-bg-transparent;
@include gl-border-none;
&[aria-expanded='true'] {
background-color: var(--super-sidebar-user-bar-button-hover-bg);
}
}
.brand-logo,
.btn-default-tertiary,
.user-bar-button {
color: var(--super-sidebar-user-bar-button-color);
.gl-icon {
color: var(--super-sidebar-user-bar-button-icon-color) !important;
mix-blend-mode: var(--super-sidebar-user-bar-button-icon-mix-blend-mode);
}
&:active,
&:hover,
&:focus {
background-color: var(--super-sidebar-user-bar-button-hover-bg);
color: var(--super-sidebar-user-bar-button-hover-color);
.gl-icon {
color: var(--super-sidebar-user-bar-button-icon-hover-color);
}
}
&:active {
background-color: var(--super-sidebar-user-bar-button-active-bg) !important;
}
&:focus,
&:active {
@include gl-focus;
}
}
.user-bar-item {
&:hover,
&:focus,
&:active {
@include active-toggle;
}
.btn-default-tertiary {
mix-blend-mode: normal;
}
.brand-logo {
&:hover,
&:focus {
.user-bar-button {
background-color: var(--super-sidebar-user-bar-button-bg);
box-shadow: inset 0 0 0 $gl-border-size-1 var(--super-sidebar-user-bar-button-border-color);
&[aria-expanded='true'] {
background-color: var(--super-sidebar-user-bar-button-hover-bg);
mix-blend-mode: multiply;
.gl-dark & {
mix-blend-mode: screen;
}
}
}
.btn-default-tertiary,
.counter {
color: var(--super-sidebar-user-bar-button-color);
.gl-icon {
color: var(--super-sidebar-user-bar-button-icon-color) !important;
}
&:hover,
&:focus {
background-color: var(--super-sidebar-user-bar-button-hover-bg) !important;
color: var(--super-sidebar-user-bar-button-hover-color);
}
}
.counter {
background-color: var(--super-sidebar-user-bar-button-bg);
&:hover,
&:focus,
&[aria-expanded='true'] {
background-color: var(--super-sidebar-user-bar-button-hover-bg);
border-color: transparent;
mix-blend-mode: multiply;
.gl-icon {
color: var(--super-sidebar-user-bar-button-icon-hover-color);
}
.gl-dark & {
mix-blend-mode: screen;
}
}
&:hover,
&[aria-expanded='true'] {
box-shadow: none;
}
.gl-new-dropdown-toggle[aria-expanded='true'] {
background-color: var(--super-sidebar-user-bar-button-hover-bg);
color: var(--super-sidebar-user-bar-button-hover-color);
}
}
.item-icon {
color: $gray-500;
.gl-dark & {
color: $gray-600;
.super-sidebar-nav-item {
&:hover,
&:focus {
background-color: var(--super-sidebar-nav-item-hover-bg);
}
&.super-sidebar-nav-item-current {
background-color: var(--super-sidebar-nav-item-current-bg);
}
&:active,
&:focus:active {
background-color: var(--super-sidebar-nav-item-active-bg);
}
}
.super-sidebar-nav-item-icon {
color: var(--super-sidebar-nav-item-icon-color);
}
.active-indicator {
@ -173,22 +190,8 @@ $super-sidebar-transition-hint-duration: $super-sidebar-transition-duration / 4;
}
}
.gl-new-dropdown-toggle[aria-expanded='true'] {
@include active-toggle;
}
.gl-new-dropdown-custom-toggle {
.btn-with-notification {
mix-blend-mode: unset; // Our tertiary buttons otherwise use another mix-blend mode, making border-color semi-transparent.
}
[aria-expanded='true'] {
@include active-toggle;
}
}
.super-sidebar-help-center-toggle[aria-expanded='true'] {
@include active-toggle($gray-50);
background-color: $gray-50 !important;
}
#trial-status-sidebar-widget:hover {
@ -365,7 +368,7 @@ $super-sidebar-transition-hint-duration: $super-sidebar-transition-duration / 4;
&:hover,
&:focus-within {
.show-on-focus-or-hover--control {
@include gl-bg-t-gray-a-08;
background-color: var(--super-sidebar-nav-item-hover-bg);
}
.show-on-focus-or-hover--target {

View File

@ -101,12 +101,20 @@ $gray-dark: darken($gray-light, $darken-dark-factor) !default;
$gray-darker: $gray-50 !default;
$gray-darkest: $gray-200 !default;
$t-gray-a-02: rgba($gray-950, 0.02) !default;
$t-gray-a-04: rgba($gray-950, 0.04) !default;
$t-gray-a-06: rgba($gray-950, 0.06) !default;
$t-gray-a-08: rgba($gray-950, 0.08) !default;
$t-gray-a-16: rgba($gray-950, 0.16) !default;
$t-gray-a-24: rgba($gray-950, 0.24) !default;
$t-white-a-02: rgba(255, 255, 255, 0.02) !default;
$t-white-a-04: rgba(255, 255, 255, 0.04) !default;
$t-white-a-06: rgba(255, 255, 255, 0.06) !default;
$t-white-a-08: rgba(255, 255, 255, 0.08) !default;
$t-white-a-16: rgba(255, 255, 255, 0.16) !default;
$t-white-a-24: rgba(255, 255, 255, 0.24) !default;
$t-white-a-36: rgba(255, 255, 255, 0.36) !default;
$t-gray-a-02: rgba(31, 30, 36, 0.02) !default;
$t-gray-a-04: rgba(31, 30, 36, 0.04) !default;
$t-gray-a-06: rgba(31, 30, 36, 0.06) !default;
$t-gray-a-08: rgba(31, 30, 36, 0.08) !default;
$t-gray-a-16: rgba(31, 30, 36, 0.16) !default;
$t-gray-a-24: rgba(31, 30, 36, 0.24) !default;
$white-dark: darken($gray-50, 2) !default;

View File

@ -8,11 +8,9 @@ $gray-dark: darken($gray-100, 2);
$gray-darker: darken($gray-200, 2);
$gray-darkest: $gray-700;
// Some of the other $t-gray-a variables are used
// for borders and some other places, so we cannot override
// them. These are used only for box shadows so we can
$t-gray-a-16: rgba($gray-10, 0.16);
$t-gray-a-24: rgba($gray-10, 0.24);
// Used for border and background in a couple instances where inverting between modes is desirable
// once migrated to suitable color values this can be removed
$t-gray-a-08: rgba($gray-950, 0.08);
$black-normal: $gray-900;
$white-dark: $gray-100;

View File

@ -5,7 +5,7 @@
.page-with-super-sidebar {
@include gitlab-theme-super-sidebar(
$theme-blue-50,
$theme-blue-200,
$theme-blue-100,
$theme-blue-900,
$theme-blue-900,
);

View File

@ -5,7 +5,7 @@
.page-with-super-sidebar {
@include gitlab-theme-super-sidebar(
$theme-green-50,
$theme-green-200,
$theme-green-100,
$theme-green-900,
$theme-green-900,
);

View File

@ -11,22 +11,19 @@
.super-sidebar {
--super-sidebar-bg: #{mix(white, $theme-color-lightest, 50%)};
--super-sidebar-user-bar-bg: #{$theme-color};
--super-sidebar-user-bar-button-bg: rgba(255, 255, 255, 0.16);
--super-sidebar-user-bar-button-hover-bg: rgba(255, 255, 255, 0.24);
--super-sidebar-user-bar-button-color: #{$theme-color-lightest};
--super-sidebar-user-bar-button-hover-color: #{$white};
--super-sidebar-user-bar-button-icon-color: #{$theme-color-light};
--super-sidebar-user-bar-button-icon-hover-color: #{$theme-color-light};
--super-sidebar-primary: #{$theme-color};
--super-sidebar-notification-dot: #{$theme-color-darkest};
.user-bar {
.brand-logo,
.btn-default-tertiary,
.counter {
mix-blend-mode: normal;
}
}
--super-sidebar-user-bar-button-bg: #{$t-white-a-16};
--super-sidebar-user-bar-button-color: #{$theme-color-lightest};
--super-sidebar-user-bar-button-border-color: #{$t-white-a-16};
--super-sidebar-user-bar-button-hover-bg: #{$t-white-a-24};
--super-sidebar-user-bar-button-hover-color: #{$white};
--super-sidebar-user-bar-button-active-bg: #{$t-white-a-36};
--super-sidebar-user-bar-button-icon-color: #{$theme-color-light};
--super-sidebar-user-bar-button-icon-hover-color: #{$theme-color-light};
--super-sidebar-user-bar-button-icon-mix-blend-mode: screen;
hr {
mix-blend-mode: multiply;

View File

@ -5,7 +5,7 @@
.page-with-super-sidebar {
@include gitlab-theme-super-sidebar(
$theme-indigo-50,
$theme-indigo-200,
$theme-indigo-100,
$theme-indigo-900,
$theme-indigo-900,
);

View File

@ -5,7 +5,7 @@
.page-with-super-sidebar {
@include gitlab-theme-super-sidebar(
$theme-light-blue-50,
$theme-light-blue-200,
$theme-light-blue-100,
$theme-light-blue-700,
$theme-light-blue-900,
);

View File

@ -5,7 +5,7 @@
.page-with-super-sidebar {
@include gitlab-theme-super-sidebar(
$theme-green-50,
$theme-green-200,
$theme-green-100,
$theme-green-700,
$theme-green-900,
);

View File

@ -5,7 +5,7 @@
.page-with-super-sidebar {
@include gitlab-theme-super-sidebar(
$theme-indigo-50,
$theme-indigo-200,
$theme-indigo-100,
$theme-indigo-700,
$theme-indigo-900,
);

View File

@ -5,7 +5,7 @@
.page-with-super-sidebar {
@include gitlab-theme-super-sidebar(
$theme-light-red-50,
$theme-light-red-200,
$theme-light-red-100,
$theme-light-red-700,
$theme-light-red-900,
);

View File

@ -5,7 +5,7 @@
.page-with-super-sidebar {
@include gitlab-theme-super-sidebar(
$theme-red-50,
$theme-red-200,
$theme-red-100,
$theme-red-900,
$theme-red-900,
);

View File

@ -178,7 +178,7 @@ module Types
field :twitter,
type: ::GraphQL::Types::String,
null: true,
description: 'Twitter username of the user.'
description: 'X (formerly Twitter) username of the user.'
field :discord,
type: ::GraphQL::Types::String,

View File

@ -64,7 +64,7 @@
= f.text_field :linkedin, class: 'form-control gl-form-input gl-form-input-lg'
.form-group.gl-form-group{ role: 'group' }
= f.label :twitter, _('Twitter'), class: 'gl-display-block col-form-label'
= f.label :twitter, _('X (formerly Twitter)'), class: 'gl-display-block col-form-label'
= f.text_field :twitter, class: 'form-control gl-form-input gl-form-input-lg'
.form-group.gl-form-group{ role: 'group' }

View File

@ -20,7 +20,7 @@
%strong= link_to user.linkedin, "https://www.linkedin.com/in/#{user.linkedin}"
- unless user.twitter.blank?
%li
%span.light= _('Twitter:')
%span.light= _('X (formerly Twitter):')
%strong= link_to user.twitter, "https://twitter.com/#{user.twitter}"
- unless user.website_url.blank?
%li

View File

@ -7,7 +7,7 @@
%div
= link_to _('Blog'), 'https://about.gitlab.com/blog/', style: "color:#3777b0;text-decoration:none;"
&middot;
= link_to _('Twitter'), 'https://twitter.com/gitlab', style: "color:#3777b0;text-decoration:none;"
= link_to _('X (formerly Twitter)'), 'https://twitter.com/gitlab', style: "color:#3777b0;text-decoration:none;"
&middot;
= link_to _('Facebook'), 'https://www.facebook.com/gitlab/', style: "color:#3777b0;text-decoration:none;"
&middot;

View File

@ -103,7 +103,7 @@
%small.form-text.text-gl-muted
= s_("Profiles|Your LinkedIn profile name from linkedin.com/in/profilename")
.form-group.gl-form-group
= f.label :twitter
= f.label :twitter, _('X (formerly Twitter)')
= f.text_field :twitter, class: 'gl-form-input form-control gl-md-form-input-lg', placeholder: s_("Profiles|@username")
.form-group.gl-form-group
- external_accounts_help_url = help_page_path('user/profile/index', anchor: 'add-external-accounts-to-your-user-profile-page')

View File

@ -87,7 +87,7 @@
= sprite_icon('linkedin', css_class: 'linkedin-icon')
- if @user.twitter.present?
= render 'middle_dot_divider', breakpoint: 'sm' do
= link_to twitter_url(@user), class: 'gl-hover-text-decoration-none', title: "Twitter", target: '_blank', rel: 'noopener noreferrer nofollow' do
= link_to twitter_url(@user), class: 'gl-hover-text-decoration-none', title: _("X (formerly Twitter)"), target: '_blank', rel: 'noopener noreferrer nofollow' do
= sprite_icon('twitter', css_class: 'twitter-icon')
- if @user.discord.present?
= render 'middle_dot_divider', breakpoint: 'sm' do

View File

@ -5,7 +5,7 @@ class FinalizeBackfillCodeSuggestionsNamespaceSettings < Gitlab::Database::Migra
disable_ddl_transaction!
restrict_gitlab_migration gitlab_schema: :gitlab_main_cell
restrict_gitlab_migration gitlab_schema: :gitlab_main
def up
ensure_batched_background_migration_is_finished(

View File

@ -5,7 +5,7 @@ class FinalizeBackfillDesignManagementRepositories < Gitlab::Database::Migration
disable_ddl_transaction!
restrict_gitlab_migration gitlab_schema: :gitlab_main_cell
restrict_gitlab_migration gitlab_schema: :gitlab_main
def up
ensure_batched_background_migration_is_finished(

View File

@ -5,7 +5,7 @@ class FinalizeBackfillProjectStatisticsStorageSizeWithoutPipelineArtifactsSi < G
disable_ddl_transaction!
restrict_gitlab_migration gitlab_schema: :gitlab_main_cell
restrict_gitlab_migration gitlab_schema: :gitlab_main
def up
ensure_batched_background_migration_is_finished(

View File

@ -5,7 +5,7 @@ class FinalizeDeleteOrphanedTransferredProjectApprovalRules < Gitlab::Database::
disable_ddl_transaction!
restrict_gitlab_migration gitlab_schema: :gitlab_main_cell
restrict_gitlab_migration gitlab_schema: :gitlab_main
def up
ensure_batched_background_migration_is_finished(

View File

@ -40,7 +40,7 @@ X-Gitlab-Event-Streaming-Token: <DESTINATION_TOKEN>
X-Gitlab-Audit-Event-Type: repository_git_operation
```
### Example payloads for SSH events
### Example payloads for Git over SSH events
Fetch:
@ -106,7 +106,7 @@ Push:
}
```
### Example payloads for SSH events with Deploy Key
### Example payloads for Git over SSH events with Deploy Key
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/363876) in GitLab 15.3.
@ -142,7 +142,7 @@ Fetch:
}
```
### Example payloads for HTTP and HTTPS events
### Example payloads for Git over HTTP and HTTPS events
Fetch:
@ -208,7 +208,7 @@ Push:
}
```
### Example payloads for HTTP and HTTPS events with Deploy Token
### Example payloads for Git over HTTP and HTTPS events with Deploy Token
Fetch:

View File

@ -14052,7 +14052,7 @@ A user with add-on data.
| <a id="addonusersavedreplies"></a>`savedReplies` | [`SavedReplyConnection`](#savedreplyconnection) | Saved replies authored by the user. (see [Connections](#connections)) |
| <a id="addonuserstate"></a>`state` | [`UserState!`](#userstate) | State of the user. |
| <a id="addonuserstatus"></a>`status` | [`UserStatus`](#userstatus) | User status. |
| <a id="addonusertwitter"></a>`twitter` | [`String`](#string) | Twitter username of the user. |
| <a id="addonusertwitter"></a>`twitter` | [`String`](#string) | X (formerly Twitter) username of the user. |
| <a id="addonuseruserachievements"></a>`userAchievements` **{warning-solid}** | [`UserAchievementConnection`](#userachievementconnection) | **Introduced** in 15.10. This feature is an Experiment. It can be changed or removed at any time. Achievements for the user. Only returns for namespaces where the `achievements` feature flag is enabled. |
| <a id="addonuseruserpermissions"></a>`userPermissions` | [`UserPermissions!`](#userpermissions) | Permissions for the current user on the resource. |
| <a id="addonuserusername"></a>`username` | [`String!`](#string) | Username of the user. Unique within this instance of GitLab. |
@ -14740,7 +14740,7 @@ Core representation of a GitLab user.
| <a id="autocompletedusersavedreplies"></a>`savedReplies` | [`SavedReplyConnection`](#savedreplyconnection) | Saved replies authored by the user. (see [Connections](#connections)) |
| <a id="autocompleteduserstate"></a>`state` | [`UserState!`](#userstate) | State of the user. |
| <a id="autocompleteduserstatus"></a>`status` | [`UserStatus`](#userstatus) | User status. |
| <a id="autocompletedusertwitter"></a>`twitter` | [`String`](#string) | Twitter username of the user. |
| <a id="autocompletedusertwitter"></a>`twitter` | [`String`](#string) | X (formerly Twitter) username of the user. |
| <a id="autocompleteduseruserachievements"></a>`userAchievements` **{warning-solid}** | [`UserAchievementConnection`](#userachievementconnection) | **Introduced** in 15.10. This feature is an Experiment. It can be changed or removed at any time. Achievements for the user. Only returns for namespaces where the `achievements` feature flag is enabled. |
| <a id="autocompleteduseruserpermissions"></a>`userPermissions` | [`UserPermissions!`](#userpermissions) | Permissions for the current user on the resource. |
| <a id="autocompleteduserusername"></a>`username` | [`String!`](#string) | Username of the user. Unique within this instance of GitLab. |
@ -16766,7 +16766,7 @@ The currently authenticated GitLab user.
| <a id="currentusersavedreplies"></a>`savedReplies` | [`SavedReplyConnection`](#savedreplyconnection) | Saved replies authored by the user. (see [Connections](#connections)) |
| <a id="currentuserstate"></a>`state` | [`UserState!`](#userstate) | State of the user. |
| <a id="currentuserstatus"></a>`status` | [`UserStatus`](#userstatus) | User status. |
| <a id="currentusertwitter"></a>`twitter` | [`String`](#string) | Twitter username of the user. |
| <a id="currentusertwitter"></a>`twitter` | [`String`](#string) | X (formerly Twitter) username of the user. |
| <a id="currentuseruserachievements"></a>`userAchievements` **{warning-solid}** | [`UserAchievementConnection`](#userachievementconnection) | **Introduced** in 15.10. This feature is an Experiment. It can be changed or removed at any time. Achievements for the user. Only returns for namespaces where the `achievements` feature flag is enabled. |
| <a id="currentuseruserpermissions"></a>`userPermissions` | [`UserPermissions!`](#userpermissions) | Permissions for the current user on the resource. |
| <a id="currentuserusername"></a>`username` | [`String!`](#string) | Username of the user. Unique within this instance of GitLab. |
@ -21625,7 +21625,7 @@ A user assigned to a merge request.
| <a id="mergerequestassigneesavedreplies"></a>`savedReplies` | [`SavedReplyConnection`](#savedreplyconnection) | Saved replies authored by the user. (see [Connections](#connections)) |
| <a id="mergerequestassigneestate"></a>`state` | [`UserState!`](#userstate) | State of the user. |
| <a id="mergerequestassigneestatus"></a>`status` | [`UserStatus`](#userstatus) | User status. |
| <a id="mergerequestassigneetwitter"></a>`twitter` | [`String`](#string) | Twitter username of the user. |
| <a id="mergerequestassigneetwitter"></a>`twitter` | [`String`](#string) | X (formerly Twitter) username of the user. |
| <a id="mergerequestassigneeuserachievements"></a>`userAchievements` **{warning-solid}** | [`UserAchievementConnection`](#userachievementconnection) | **Introduced** in 15.10. This feature is an Experiment. It can be changed or removed at any time. Achievements for the user. Only returns for namespaces where the `achievements` feature flag is enabled. |
| <a id="mergerequestassigneeuserpermissions"></a>`userPermissions` | [`UserPermissions!`](#userpermissions) | Permissions for the current user on the resource. |
| <a id="mergerequestassigneeusername"></a>`username` | [`String!`](#string) | Username of the user. Unique within this instance of GitLab. |
@ -21913,7 +21913,7 @@ The author of the merge request.
| <a id="mergerequestauthorsavedreplies"></a>`savedReplies` | [`SavedReplyConnection`](#savedreplyconnection) | Saved replies authored by the user. (see [Connections](#connections)) |
| <a id="mergerequestauthorstate"></a>`state` | [`UserState!`](#userstate) | State of the user. |
| <a id="mergerequestauthorstatus"></a>`status` | [`UserStatus`](#userstatus) | User status. |
| <a id="mergerequestauthortwitter"></a>`twitter` | [`String`](#string) | Twitter username of the user. |
| <a id="mergerequestauthortwitter"></a>`twitter` | [`String`](#string) | X (formerly Twitter) username of the user. |
| <a id="mergerequestauthoruserachievements"></a>`userAchievements` **{warning-solid}** | [`UserAchievementConnection`](#userachievementconnection) | **Introduced** in 15.10. This feature is an Experiment. It can be changed or removed at any time. Achievements for the user. Only returns for namespaces where the `achievements` feature flag is enabled. |
| <a id="mergerequestauthoruserpermissions"></a>`userPermissions` | [`UserPermissions!`](#userpermissions) | Permissions for the current user on the resource. |
| <a id="mergerequestauthorusername"></a>`username` | [`String!`](#string) | Username of the user. Unique within this instance of GitLab. |
@ -22264,7 +22264,7 @@ A user participating in a merge request.
| <a id="mergerequestparticipantsavedreplies"></a>`savedReplies` | [`SavedReplyConnection`](#savedreplyconnection) | Saved replies authored by the user. (see [Connections](#connections)) |
| <a id="mergerequestparticipantstate"></a>`state` | [`UserState!`](#userstate) | State of the user. |
| <a id="mergerequestparticipantstatus"></a>`status` | [`UserStatus`](#userstatus) | User status. |
| <a id="mergerequestparticipanttwitter"></a>`twitter` | [`String`](#string) | Twitter username of the user. |
| <a id="mergerequestparticipanttwitter"></a>`twitter` | [`String`](#string) | X (formerly Twitter) username of the user. |
| <a id="mergerequestparticipantuserachievements"></a>`userAchievements` **{warning-solid}** | [`UserAchievementConnection`](#userachievementconnection) | **Introduced** in 15.10. This feature is an Experiment. It can be changed or removed at any time. Achievements for the user. Only returns for namespaces where the `achievements` feature flag is enabled. |
| <a id="mergerequestparticipantuserpermissions"></a>`userPermissions` | [`UserPermissions!`](#userpermissions) | Permissions for the current user on the resource. |
| <a id="mergerequestparticipantusername"></a>`username` | [`String!`](#string) | Username of the user. Unique within this instance of GitLab. |
@ -22588,7 +22588,7 @@ A user assigned to a merge request as a reviewer.
| <a id="mergerequestreviewersavedreplies"></a>`savedReplies` | [`SavedReplyConnection`](#savedreplyconnection) | Saved replies authored by the user. (see [Connections](#connections)) |
| <a id="mergerequestreviewerstate"></a>`state` | [`UserState!`](#userstate) | State of the user. |
| <a id="mergerequestreviewerstatus"></a>`status` | [`UserStatus`](#userstatus) | User status. |
| <a id="mergerequestreviewertwitter"></a>`twitter` | [`String`](#string) | Twitter username of the user. |
| <a id="mergerequestreviewertwitter"></a>`twitter` | [`String`](#string) | X (formerly Twitter) username of the user. |
| <a id="mergerequestrevieweruserachievements"></a>`userAchievements` **{warning-solid}** | [`UserAchievementConnection`](#userachievementconnection) | **Introduced** in 15.10. This feature is an Experiment. It can be changed or removed at any time. Achievements for the user. Only returns for namespaces where the `achievements` feature flag is enabled. |
| <a id="mergerequestrevieweruserpermissions"></a>`userPermissions` | [`UserPermissions!`](#userpermissions) | Permissions for the current user on the resource. |
| <a id="mergerequestreviewerusername"></a>`username` | [`String!`](#string) | Username of the user. Unique within this instance of GitLab. |
@ -27643,7 +27643,7 @@ Core representation of a GitLab user.
| <a id="usercoresavedreplies"></a>`savedReplies` | [`SavedReplyConnection`](#savedreplyconnection) | Saved replies authored by the user. (see [Connections](#connections)) |
| <a id="usercorestate"></a>`state` | [`UserState!`](#userstate) | State of the user. |
| <a id="usercorestatus"></a>`status` | [`UserStatus`](#userstatus) | User status. |
| <a id="usercoretwitter"></a>`twitter` | [`String`](#string) | Twitter username of the user. |
| <a id="usercoretwitter"></a>`twitter` | [`String`](#string) | X (formerly Twitter) username of the user. |
| <a id="usercoreuserachievements"></a>`userAchievements` **{warning-solid}** | [`UserAchievementConnection`](#userachievementconnection) | **Introduced** in 15.10. This feature is an Experiment. It can be changed or removed at any time. Achievements for the user. Only returns for namespaces where the `achievements` feature flag is enabled. |
| <a id="usercoreuserpermissions"></a>`userPermissions` | [`UserPermissions!`](#userpermissions) | Permissions for the current user on the resource. |
| <a id="usercoreusername"></a>`username` | [`String!`](#string) | Username of the user. Unique within this instance of GitLab. |
@ -33355,7 +33355,7 @@ Implementations:
| <a id="usersavedreplies"></a>`savedReplies` | [`SavedReplyConnection`](#savedreplyconnection) | Saved replies authored by the user. (see [Connections](#connections)) |
| <a id="userstate"></a>`state` | [`UserState!`](#userstate) | State of the user. |
| <a id="userstatus"></a>`status` | [`UserStatus`](#userstatus) | User status. |
| <a id="usertwitter"></a>`twitter` | [`String`](#string) | Twitter username of the user. |
| <a id="usertwitter"></a>`twitter` | [`String`](#string) | X (formerly Twitter) username of the user. |
| <a id="useruserachievements"></a>`userAchievements` **{warning-solid}** | [`UserAchievementConnection`](#userachievementconnection) | **Introduced** in 15.10. This feature is an Experiment. It can be changed or removed at any time. Achievements for the user. Only returns for namespaces where the `achievements` feature flag is enabled. |
| <a id="useruserpermissions"></a>`userPermissions` | [`UserPermissions!`](#userpermissions) | Permissions for the current user on the resource. |
| <a id="userusername"></a>`username` | [`String!`](#string) | Username of the user. Unique within this instance of GitLab. |

View File

@ -574,7 +574,7 @@ Parameters:
| `skip_confirmation` | No | Skip confirmation - true or false (default) |
| `skype` | No | Skype ID |
| `theme_id` | No | GitLab theme for the user (for more information, see the [user preference documentation](../user/profile/preferences.md#change-the-color-theme) for more information) |
| `twitter` | No | Twitter account |
| `twitter` | No | X (formerly Twitter) account |
| `discord` | No | Discord account |
| `username` | Yes | Username |
| `view_diffs_file_by_file` | No | Flag indicating the user sees only one file diff per page |
@ -625,7 +625,7 @@ Parameters:
| `skip_reconfirmation` | No | Skip reconfirmation - true or false (default) |
| `skype` | No | Skype ID |
| `theme_id` | No | GitLab theme for the user (for more information, see the [user preference documentation](../user/profile/preferences.md#change-the-color-theme) for more information) |
| `twitter` | No | Twitter account |
| `twitter` | No | X (formerly Twitter) account |
| `discord` | No | Discord account |
| `username` | No | Username |
| `view_diffs_file_by_file` | No | Flag indicating the user sees only one file diff per page |

View File

@ -981,7 +981,8 @@ Guidance for each individual UI element is in [the word list](word_list.md).
### How to write navigation task steps
To be consistent, use these examples to write navigation steps in a task topic.
Although alternative steps might exist, use these steps instead.
Although alternative steps might exist, including items pinned by default,
use these steps instead.
To open project settings:

View File

@ -2,78 +2,51 @@
stage: Create
group: Source Code
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://handbook.gitlab.com/handbook/product/ux/technical-writing/#assignments
description: 'This article describes how to install Git on macOS, Ubuntu Linux and Windows.'
---
# Installing Git **(FREE ALL)**
To begin contributing to GitLab projects, you must install the appropriate Git client
on your computer. Information about [installing Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
is also available at the official Git website.
To begin contributing to GitLab projects, you must download and install the Git client on your computer.
## Supported operating systems
This page provides information on installing Git on the following operating systems:
Git is available for the following operating systems:
- macOS
- Ubuntu Linux
- Microsoft Windows
- [macOS](#macos)
- [Ubuntu Linux](#ubuntu-linux)
- [Microsoft Windows](#windows)
For information on downloading and installing Git on other operating systems, see the
[official Git website](https://git-scm.com/downloads).
### macOS
## Install and update Git on macOS
A version of Git is supplied by macOS. You can use this version, or install the latest
version of Git on macOS by downloading it from the project website. We recommend
installing Git with [Homebrew](https://brew.sh/index.html). With Homebrew, you can
access an extensive selection of libraries and applications, with their dependencies
managed for you.
Though a version of Git is supplied by macOS, you should install the latest version of Git. A common way to
install Git is with [Homebrew](https://brew.sh/index.html).
Prerequisites:
To install the latest version of Git on macOS with Homebrew:
- 15 GB of available disk space for Homebrew and Xcode.
- Extra disk space for any additional development libraries.
To install Git on macOS:
1. Open a terminal and install Xcode Command Line Tools:
```shell
xcode-select --install
```
Alternatively, you can install the entire [Xcode](https://developer.apple.com/xcode/)
package through the macOS App Store.
1. Select **Install** to download and install Xcode Command Line Tools.
1. Install Homebrew according to the [official Homebrew installation instructions](https://brew.sh/index.html).
1. Install Git by running `brew install git` from your terminal.
1. In a terminal, verify that Git works on your computer:
1. If you've never installed Homebrew before, follow the
[Homebrew installation instructions](https://brew.sh/index.html).
1. In a terminal, install Git by running `brew install git`.
1. Verify that Git works on your computer:
```shell
git --version
```
#### macOS update
Periodically you may need to update the version of Git installed by
[Homebrew](/ee/topics/git/how_to_install_git/index.md#macos). To do so,
open a terminal and run these commands:
Keep Git up to date by periodically running the following command:
```shell
brew update
brew upgrade git
brew update && brew upgrade git
```
To verify you are on the updated version, run `git --version` to display
your current version of Git.
## Install and update Git on Ubuntu Linux
### Ubuntu Linux
Though a version of Git is supplied by Ubuntu, you should install the latest version of Git. The latest version is
available using a Personal Package Archive (PPA).
On Ubuntu and other Linux operating systems, use the built-in package manager
to install Git:
To install the latest version of Git on Ubuntu Linux with a PPA:
1. Open a terminal and run these commands to install the latest Git
from the officially
maintained package archives:
1. In a terminal, configure the required PPA, update the list of Ubuntu packages, and install `git`:
```shell
sudo apt-add-repository ppa:git-core/ppa
@ -81,32 +54,23 @@ from the officially
sudo apt-get install git
```
1. To verify that Git works on your computer, run:
1. Verify that Git works on your computer:
```shell
git --version
```
#### Ubuntu Linux Update
Keep Git up to date by periodically running the following command:
Periodically it may be necessary to update Git installed. To do so, run the same [commands](/ee/topics/git/how_to_install_git/index.md#ubuntu-linux).
```shell
sudo apt-get update && sudo apt-get install git
```
### Windows
## Install Git on Microsoft Windows
Go to the [Git website](https://git-scm.com/), and then download and install Git for Windows.
For information on downloading and installing Git on Microsoft Windows, see the
[official Git documentation](https://git-scm.com/download/win).
## After you install Git
After you successfully install Git on your computer, read about [adding an SSH key to GitLab](../../../user/ssh.md).
<!-- ## Troubleshooting
Include any troubleshooting steps that you can foresee. If you know beforehand what issues
one might have when setting this up, or when something is changed, or on upgrading, it's
important to describe those, too. Think of things that may go wrong and include them here.
This is important to minimize requests for support, and to avoid doc comments with
questions that you know someone might ask.
Each scenario can be a third-level heading, for example `### Getting error message X`.
If you have none to add when creating a doc, leave this section in place
but commented out to help encourage others to add to it in the future. -->

View File

@ -134,7 +134,7 @@ to match your username.
> - Mastodon user account [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/132892) in GitLab 16.6 [with a flag](../feature_flags.md) named `mastodon_social_ui`. Disabled by default.
> - Mastodon user account [generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/428163) in GitLab 16.7. Feature flag `mastodon_social_ui` removed.
You can add links to certain other external accounts you might have, like Skype and Twitter.
You can add links to certain other external accounts you might have, like Skype and X (formerly Twitter).
They can help other users connect with you on other platforms.
To add links to other accounts:
@ -146,7 +146,7 @@ To add links to other accounts:
- LinkedIn profile name.
- Mastodon username.
- Skype username.
- Twitter @username.
- X (formerly Twitter) @username.
Your user ID or username must be 500 characters or less.
1. Select **Update profile settings**.

View File

@ -65,7 +65,7 @@ As with all sensitive information, you should ensure only those who need access
For human interactions, use credentials tied to users such as Personal Access Tokens.
To help detect a potential secret leak, you can use the
[Audit Event](../../../administration/audit_event_streaming/examples.md#example-payloads-for-ssh-events-with-deploy-key) feature.
[Audit Event](../../../administration/audit_event_streaming/examples.md#example-payloads-for-git-over-ssh-events-with-deploy-key) feature.
## View deploy keys

View File

@ -1,20 +1,20 @@
---
stage: Create
group: Incubation
info: Machine Learning Experiment Tracking is a GitLab Incubation Engineering program. No technical writer assigned to this group.
stage: ModelOps
group: MLOps
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://handbook.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
# MLflow client compatibility **(FREE ALL)**
# MLflow client compatibility **(FREE ALL EXPERIMENT)**
> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/8560) in GitLab 15.11 as an [Experiment](../../../../policy/experiment-beta-support.md#experiment) release [with a flag](../../../../administration/feature_flags.md) named `ml_experiment_tracking`. Disabled by default.
NOTE:
Model experiment tracking is an [experimental feature](../../../../policy/experiment-beta-support.md).
Refer to <https://gitlab.com/gitlab-org/gitlab/-/issues/381660> for feedback and feature requests.
Model registry and model experiment tracking are [Experiments](../../../../policy/experiment-beta-support.md).
Provide feedback [for model experiment tracking](https://gitlab.com/gitlab-org/gitlab/-/issues/381660). Provide feedback for [model registry](https://gitlab.com/gitlab-org/gitlab/-/epics/9423).
[MLflow](https://mlflow.org/) is a popular open source tool for Machine Learning Experiment Tracking.
GitLab [Model experiment tracking](index.md) is compatible with MLflow Client,
[logging experiments](index.md). The setup requires minimal changes to existing code.
GitLab [Model experiment tracking](index.md) and GitLab
[Model registry](../model_registry/index.md) are compatible with the MLflow client. The setup requires minimal changes to existing code.
GitLab plays the role of a MLflow server. Running `mlflow server` is not necessary.
@ -37,18 +37,18 @@ To use MLflow client compatibility from a local environment:
export MLFLOW_TRACKING_TOKEN="<your_access_token>"
```
1. If your training code contains the call to `mlflow.set_tracking_uri()`, remove it.
1. If the training code contains the call to `mlflow.set_tracking_uri()`, remove it.
When running the training code, MLflow creates experiments, runs, log parameters, metrics, metadata
and artifacts on GitLab.
## Model experiments
When running the training code, MLflow client can be used to create experiments, runs,
models, model versions, log parameters, metrics, metadata and artifacts on GitLab.
After experiments are logged, they are listed under `/<your project>/-/ml/experiments`.
Runs are registered as:
- Model Candidates, which can be explored by selecting an experiment.
- Tags, which are registered as metadata.
Runs are registered as candidates, which can be explored by selecting an experiment, model, or model version.
## Associating a candidate to a CI/CD job
### Associating a candidate to a CI/CD job
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/119454) in GitLab 16.1.
@ -71,10 +71,179 @@ candidate metadata. To associate a candidate to a CI/CD job:
# End of snippet to be included
```
## Model registry
You can also manage models and model versions by using the MLflow
client. Models are registered under `/<your project>/-/ml/models`.
### Models
#### Creating a model
```python
client = MlflowClient()
model_name = '<your_model_name>'
description = 'Model description'
model = client.create_registered_model(model_name, description=description)
```
**Notes**
- `create_registered_model` argument `tags` is ignored.
- `name` must be unique within the project.
- `name` cannot be the name of an existing experiment.
#### Fetching a model
```python
client = MlflowClient()
model_name = '<your_model_name>'
model = client.get_registered_model(model_name)
```
#### Updating a model
```python
client = MlflowClient()
model_name = '<your_model_name>'
description = 'New description'
client.update_registered_model(model_name, description=description)
```
#### Deleting a model
```python
client = MlflowClient()
model_name = '<your_model_name>'
client.delete_registered_model(model_name)
```
### Logging candidates to a model
Every model has an associated experiment with the same name. To log a candidate/run to the model,
use the experiment with the name of the model:
```python
client = MlflowClient()
model_name = '<your_model_name>'
exp = client.get_experiment_by_name(model_name)
run = client.create_run(exp.experiment_id)
```
### Model version
#### Creating a model version
```python
client = MlflowClient()
model_name = '<your_model_name>'
description = 'Model version description'
model_version = client.create_model_version(model_name, source="", description=description)
```
**Notes**
- Argument `run_id` is ignored. Every model version behaves as a Candidate/Run. Creating a mode version from a run is not yet supported.
- Argument `source` is ignored. GitLab will create a package location for the model version files.
- Argument `tags` is ignored.
- Argument `run_link` is ignored.
- Argument `await_creation_for` is ignored.
#### Updating a model
```python
client = MlflowClient()
model_name = '<your_model_name>'
version = '<your_version>'
description = 'New description'
client.update_model_version(model_name, version, description=description)
```
#### Fetching a model version
```python
client = MlflowClient()
model_name = '<your_model_name>'
version = '<your_version>'
client.get_model_version(model_name, version)
```
#### Getting latest versions of a model
```python
client = MlflowClient()
model_name = '<your_model_name>'
client.get_latest_versions(model_name)
```
**Notes**
- Argument `stages` is ignored.
- Versions are ordered by last created.
#### Logging metrics and parameters to a model version
Every model version is also a candidate/run, allowing users to log parameters
and metrics. The run ID can either be found at the Model version page in GitLab,
or by using the MLflow client:
```python
client = MlflowClient()
model_name = '<your_model_name>'
version = '<your_version>'
model_version = client.get_model_version(model_name, version)
run_id = model_version.run_id
# Your training code
client.log_metric(run_id, '<metric_name>', '<metric_value>')
client.log_param(run_id, '<param_name>', '<param_value>')
client.log_batch(run_id, metric_list, param_list, tag_list)
```
#### Logging artifacts to a model version
GitLab creates a package that can be used by the MLflow client to upload files.
```python
client = MlflowClient()
model_name = '<your_model_name>'
version = '<your_version>'
model_version = client.get_model_version(model_name, version)
run_id = model_version.run_id
# Your training code
client.log_artifact(run_id, '<local/path/to/file.txt>', artifact_path="")
client.log_figure(run_id, figure, artifact_file="my_plot.png")
client.log_dict(run_id, my_dict, artifact_file="my_dict.json")
client.log_image(run_id, image, artifact_file="image.png")
```
Artifacts will then be available under `https/<your project>/-/ml/models/<model_id>/versions/<version_id>`.
#### Linking a model version to a CI/CD job
Similar to candidates, it is also possible to link a model version to a CI/CD job:
```python
client = MlflowClient()
model_name = '<your_model_name>'
version = '<your_version>'
model_version = client.get_model_version(model_name, version)
run_id = model_version.run_id
# Your training code
if os.getenv('GITLAB_CI'):
client.set_tag(model_version.run_id, 'gitlab.CI_JOB_ID', os.getenv('CI_JOB_ID'))
```
## Supported MLflow client methods and caveats
GitLab supports these methods from the MLflow client. Other methods might be supported but were not
tested. More information can be found in the [MLflow Documentation](https://www.mlflow.org/docs/1.28.0/python_api/mlflow.html).
tested. More information can be found in the [MLflow Documentation](https://www.mlflow.org/docs/1.28.0/python_api/mlflow.html). The MlflowClient counterparts
of the methods below are also supported with the same caveats.
| Method | Supported | Version Added | Comments |
|--------------------------|------------------|----------------|-------------------------------------------------------------------------------------|
@ -102,9 +271,23 @@ tested. More information can be found in the [MLflow Documentation](https://www.
| `update_run` | Yes | 15.11 | |
| `log_model` | Partial | 15.11 | (15.11) Saves the artifacts, but not the model data. `artifact_path` must be empty. |
Other MLflowClient methods:
| Method | Supported | Version added | Comments |
|---------------------------|------------------|---------------|--------------------------------------------------|
| `create_registered_model` | Yes with caveats | 16.8 | [See notes](#creating-a-model) |
| `get_registered_model` | Yes | 16.8 | |
| `delete_registered_model` | Yes | 16.8 | |
| `update_registered_model` | Yes | 16.8 | |
| `create_model_version` | Yes with caveats | 16.8 | [See notes](#creating-a-model-version) |
| `get_model_version` | Yes | 16.8 | |
| `get_latest_versions` | Yes with caveats | 16.8 | [See notes](#getting-latest-versions-of-a-model) |
| `update_model_version` | Yes | 16.8 | |
| `create_registered_model` | Yes | 16.8 | |
| `create_registered_model` | Yes | 16.8 | |
## Limitations
- The API GitLab supports is the one defined at MLflow version 1.28.0.
- API endpoints not listed above are not supported.
- The API GitLab supports is the one defined at MLflow version 2.7.1.
- MLflow client methods not listed above are not supported.
- During creation of experiments and runs, ExperimentTags are stored, even though they are not displayed.
- MLflow Model Registry is not supported.

View File

@ -0,0 +1,79 @@
---
stage: ModelOps
group: MLOps
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://handbook.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
# Model registry **(FREE ALL EXPERIMENT)**
> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/9423) in GitLab 16.8 as an [Experiment](../../../../policy/experiment-beta-support.md#experiment) release [with a flag](../../../../administration/feature_flags.md) named `ml_experiment_tracking`. Disabled by default. To enable the feature, an administrator can [enable the feature flag](../../../../administration/feature_flags.md) named `model_registry`.
NOTE:
Model registry is an [Experiment](../../../../policy/experiment-beta-support.md). [Provide feedback](https://gitlab.com/groups/gitlab-org/-/epics/9423).
Model registry allows data scientists and developers to manage their machine learning
models, along with all metadata associated with their creation: parameters, performance
metrics, artifacts, logs and more. For the full list of currently supported features,
see [epic 9423](https://gitlab.com/groups/gitlab-org/-/epics/9423).
## Access the model registry
To set the model registry [visibility level](../../../public_access.md) to public, private or disabled:
1. On the left sidebar, select **Search or go to** and find your group.
1. Select **Settings > General**.
1. Expand **Visibility, project features, permissions**.
1. Under **Model registry**, ensure the toggle is on and select who you want to have access.
Users must have
at least the [Reporter role](../../../permissions.md#roles) to modify or delete models and model versions.
## Exploring models, model versions and model candidates
Model registry can be accessed on `https/<your-project>-/ml/models`.
## Creating machine learning models and model versions
Models and model versions can be created using the [MLflow](https://www.mlflow.org/docs/latest/tracking.html) client compatibility.
See [MLflow client compatibility](../experiment_tracking/mlflow_client.md#model-registry) on how to
create and manage models and model versions.
## Upload files, log metrics, log parameters to a model version
Files can either be uploaded to a model version using:
- The package registry, where a model version is associated to a package of name `<model_name>/<model_version>`.
- The MLflow client compatibility. [View details](../experiment_tracking/mlflow_client.md#logging-artifacts-to-a-model-version).
Users can log metrics and a parameters of a model version through the MLflow client compatibility, [see details](../experiment_tracking/mlflow_client.md#logging-metrics-and-parameters-to-a-model-version)
## Link a model version to a CI/CD job
When creating a model version through a GitLab CI/CD job, you can link the model
version to the job, giving easy access to the job's logs, merge request, and pipeline.
This can be done through the MLflow client compatibility. [View details](../experiment_tracking/mlflow_client.md#linking-a-model-version-to-a-cicd-job).
## Model versions and semantic versioning
The version of a model version in GitLab must follow [Semantic Version specification](https://semver.org/).
Using semantic versioning facilitates model deployment, by communicating which
if a new version can be deployed without changes to the application:
- A change in the major component signifies a breaking change in the model, and that the application
that consumes the model must be updated to properly use this new version.
A new algorithm or the addition of a mandatory feature column are examples of breaking
changes that would require a bump at the major component.
- A change in the minor component signifies a non-breaking change, and that the
consumer can safely use the new version without breaking, although it might
need to be updated to use its new functionality. For example, adding a non-mandatory
feature column to the model is a minor bump, because when that feature is not passed,
it will still work.
- A change in the patch component means that a new version is out that does not
require any action by the application. For example, a daily retrain of the
model does not change the feature set or how the application consumes the
model version. Auto updating to a new patch is a safe update.
## Related topics
- Development details, feedback, and feature requests in [epic 9423](https://gitlab.com/groups/gitlab-org/-/epics/9423).

View File

@ -1,5 +1,5 @@
variables:
DAST_AUTO_DEPLOY_IMAGE_VERSION: 'v2.63.0'
DAST_AUTO_DEPLOY_IMAGE_VERSION: 'v2.70.0'
.dast-auto-deploy:
image: "${CI_TEMPLATE_REGISTRY_HOST}/gitlab-org/cluster-integration/auto-deploy-image:${DAST_AUTO_DEPLOY_IMAGE_VERSION}"

View File

@ -1,5 +1,5 @@
variables:
AUTO_DEPLOY_IMAGE_VERSION: 'v2.63.0'
AUTO_DEPLOY_IMAGE_VERSION: 'v2.70.0'
.auto-deploy:
image: "${CI_TEMPLATE_REGISTRY_HOST}/gitlab-org/cluster-integration/auto-deploy-image:${AUTO_DEPLOY_IMAGE_VERSION}"

View File

@ -1,5 +1,5 @@
variables:
AUTO_DEPLOY_IMAGE_VERSION: 'v2.63.0'
AUTO_DEPLOY_IMAGE_VERSION: 'v2.70.0'
.auto-deploy:
image: "${CI_TEMPLATE_REGISTRY_HOST}/gitlab-org/cluster-integration/auto-deploy-image:${AUTO_DEPLOY_IMAGE_VERSION}"

View File

@ -51386,12 +51386,6 @@ msgstr ""
msgid "Turn on"
msgstr ""
msgid "Twitter"
msgstr ""
msgid "Twitter:"
msgstr ""
msgid "Two-Factor Authentication"
msgstr ""
@ -55415,6 +55409,12 @@ msgstr ""
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
msgid "X (formerly Twitter)"
msgstr ""
msgid "X (formerly Twitter):"
msgstr ""
msgid "Xcode"
msgstr ""

View File

@ -62,7 +62,7 @@
"@gitlab/svgs": "3.72.0",
"@gitlab/ui": "^71.6.1",
"@gitlab/visual-review-tools": "1.7.3",
"@gitlab/web-ide": "^0.0.1-dev-20231129035648",
"@gitlab/web-ide": "^0.0.1-dev-20231211152737",
"@mattiasbuelens/web-streams-adapter": "^0.1.0",
"@rails/actioncable": "7.0.8",
"@rails/ujs": "7.0.8",

View File

@ -0,0 +1,22 @@
# frozen_string_literal: true
module QA
module Page
module Project
class Pages < Page::Base
view 'app/views/projects/pages/_access.html.haml' do
element 'access-page-container'
end
def go_to_access_page
within_element('access-page-container') do
find('a').click
page.driver.browser.switch_to.window(page.driver.browser.window_handles.last)
end
end
end
end
end
end
QA::Page::Project::Pages.prepend_mod_with("Page::Project::Pages", namespace: QA)

View File

@ -1,26 +0,0 @@
# frozen_string_literal: true
module QA
module Page
module Project
module Settings
class Pages < Page::Base
include QA::Page::Settings::Common
view 'app/views/projects/pages/_access.html.haml' do
element 'access-page-container'
end
def go_to_access_page
within_element('access-page-container') do
find('a').click
page.driver.browser.switch_to.window(page.driver.browser.window_handles.last)
end
end
end
end
end
end
end
QA::Page::Project::Settings::Pages.prepend_mod_with("Page::Project::Settings::Pages", namespace: QA)

View File

@ -19,10 +19,6 @@ module QA
open_settings_submenu('Merge requests')
end
def go_to_pages_settings
open_settings_submenu('Pages')
end
def go_to_monitor_settings
open_settings_submenu('Monitor')
end

View File

@ -14,6 +14,10 @@ module QA
open_deploy_submenu('Container Registry')
end
def go_to_pages_settings
open_deploy_submenu('Pages')
end
private
def open_deploy_submenu(sub_menu)

View File

@ -7,9 +7,8 @@ module QA
except: { job: 'review-qa-*' },
quarantine: {
issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/383215',
type: :flaky
},
feature_flag: { name: 'show_pages_in_deployments_menu' } do
type: :broken
} do
# TODO: Convert back to :smoke once proved to be stable. Related issue: https://gitlab.com/gitlab-org/gitlab/-/issues/300906
describe 'Pages', product_group: :knowledge do
let!(:project) { create(:project, name: 'gitlab-pages-projects', template_name: :plainhtml) }
@ -40,7 +39,7 @@ module QA
end
Page::Project::Menu.perform(&:go_to_pages_settings)
Page::Project::Settings::Pages.perform(&:go_to_access_page)
Page::Project::Pages.perform(&:go_to_access_page)
Support::Waiter.wait_until(
sleep_interval: 2,

View File

@ -29,7 +29,7 @@ describe('NavItemLink component', () => {
expect(wrapper.attributes()).toEqual({
href: '/foo',
class: 'gl-bg-t-gray-a-08',
class: 'super-sidebar-nav-item-current',
'aria-current': 'page',
});
});

View File

@ -45,7 +45,9 @@ describe('NavItemRouterLink component', () => {
routerLinkSlotProps: { isActive: true },
});
expect(wrapper.findComponent(RouterLinkStub).props('activeClass')).toBe('gl-bg-t-gray-a-08');
expect(wrapper.findComponent(RouterLinkStub).props('activeClass')).toBe(
'super-sidebar-nav-item-current',
);
expect(wrapper.attributes()).toEqual({
href: '/foo',
'aria-current': 'page',

View File

@ -1292,10 +1292,10 @@
resolved "https://registry.yarnpkg.com/@gitlab/visual-review-tools/-/visual-review-tools-1.7.3.tgz#9ea641146436da388ffbad25d7f2abe0df52c235"
integrity sha512-NMV++7Ew1FSBDN1xiZaauU9tfeSfgDHcOLpn+8bGpP+O5orUPm2Eu66R5eC5gkjBPaXosNAxNWtriee+aFk4+g==
"@gitlab/web-ide@^0.0.1-dev-20231129035648":
version "0.0.1-dev-20231129035648"
resolved "https://registry.yarnpkg.com/@gitlab/web-ide/-/web-ide-0.0.1-dev-20231129035648.tgz#8e9ad9be4d27d912eb255c6a03fab4a210f2d2fa"
integrity sha512-66fqT2G+Q7wuiZwXDbTaEYeuXGJSOkg9ZfQS6ARJ5GYhFoJ8U63TjX/+/jcPHBH99h0eN4xrP/YzidglP59BtQ==
"@gitlab/web-ide@^0.0.1-dev-20231211152737":
version "0.0.1-dev-20231211152737"
resolved "https://registry.yarnpkg.com/@gitlab/web-ide/-/web-ide-0.0.1-dev-20231211152737.tgz#849c6f9256b5a5bd340a3b140d4192c6f5aafc35"
integrity sha512-1bIUvO3Lhdc8hftmfKPjGKMqoI6NBv20noZxpgLtXx+aOF8NsF+bJcBMl12HifDI4w8UAjTmHPMzj+RZfEJLJw==
"@graphql-eslint/eslint-plugin@3.20.1":
version "3.20.1"