Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
		
							parent
							
								
									6d08f67e10
								
							
						
					
					
						commit
						101d32c3b8
					
				|  | @ -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' | ||||
|  |  | |||
|  | @ -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> | ||||
|  |  | |||
|  | @ -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> | ||||
| 
 | ||||
|  |  | |||
|  | @ -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, | ||||
|           }" | ||||
|  |  | |||
|  | @ -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> | ||||
|  |  | |||
|  | @ -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" /> | ||||
|  |  | |||
|  | @ -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" | ||||
|  |  | |||
|  | @ -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; | ||||
| 
 | ||||
|  |  | |||
|  | @ -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'] { | ||||
|     .gl-new-dropdown-toggle[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; | ||||
|       color: var(--super-sidebar-user-bar-button-hover-color); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   .super-sidebar-nav-item { | ||||
|     &:hover, | ||||
|       &[aria-expanded='true'] { | ||||
|         box-shadow: none; | ||||
|     &: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); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   .item-icon { | ||||
|     color: $gray-500; | ||||
| 
 | ||||
|     .gl-dark & { | ||||
|       color: $gray-600; | ||||
|     } | ||||
|   .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 { | ||||
|  |  | |||
|  | @ -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; | ||||
| 
 | ||||
|  |  | |||
|  | @ -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; | ||||
|  |  | |||
|  | @ -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, | ||||
|       ); | ||||
|  |  | |||
|  | @ -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, | ||||
|       ); | ||||
|  |  | |||
|  | @ -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; | ||||
|  |  | |||
|  | @ -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, | ||||
|       ); | ||||
|  |  | |||
|  | @ -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, | ||||
|       ); | ||||
|  |  | |||
|  | @ -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, | ||||
|       ); | ||||
|  |  | |||
|  | @ -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, | ||||
|       ); | ||||
|  |  | |||
|  | @ -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, | ||||
|       ); | ||||
|  |  | |||
|  | @ -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, | ||||
|       ); | ||||
|  |  | |||
|  | @ -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, | ||||
|  |  | |||
|  | @ -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' } | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -7,7 +7,7 @@ | |||
|         %div | ||||
|           = link_to _('Blog'), 'https://about.gitlab.com/blog/', style: "color:#3777b0;text-decoration:none;" | ||||
|           · | ||||
|           = 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;" | ||||
|           · | ||||
|           = link_to _('Facebook'), 'https://www.facebook.com/gitlab/', style: "color:#3777b0;text-decoration:none;" | ||||
|           · | ||||
|  |  | |||
|  | @ -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') | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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( | ||||
|  |  | |||
|  | @ -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( | ||||
|  |  | |||
|  | @ -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( | ||||
|  |  | |||
|  | @ -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( | ||||
|  |  | |||
|  | @ -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: | ||||
| 
 | ||||
|  |  | |||
|  | @ -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. | | ||||
|  |  | |||
|  | @ -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                                                                                               | | ||||
|  |  | |||
|  | @ -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: | ||||
| 
 | ||||
|  |  | |||
|  | @ -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. --> | ||||
|  |  | |||
|  | @ -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**. | ||||
|  |  | |||
|  | @ -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 | ||||
| 
 | ||||
|  |  | |||
|  | @ -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. | ||||
|  |  | |||
|  | @ -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). | ||||
|  | @ -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}" | ||||
|  |  | |||
|  | @ -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}" | ||||
|  |  | |||
|  | @ -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}" | ||||
|  |  | |||
|  | @ -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 "" | ||||
| 
 | ||||
|  |  | |||
|  | @ -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", | ||||
|  |  | |||
|  | @ -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) | ||||
|  | @ -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) | ||||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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) | ||||
|  |  | |||
|  | @ -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, | ||||
|  |  | |||
|  | @ -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', | ||||
|       }); | ||||
|     }); | ||||
|  |  | |||
|  | @ -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', | ||||
|  |  | |||
|  | @ -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" | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue