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/auth/smartcard/certificate.rb' | ||||||
|     - 'ee/lib/gitlab/ci/minutes/cached_quota.rb' |     - 'ee/lib/gitlab/ci/minutes/cached_quota.rb' | ||||||
|     - 'ee/lib/gitlab/ci/minutes/gitlab_contribution_cost_factor.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/parsers/security/container_scanning.rb' | ||||||
|     - 'ee/lib/gitlab/ci/project_config/compliance.rb' |     - 'ee/lib/gitlab/ci/project_config/compliance.rb' | ||||||
|     - 'ee/lib/gitlab/ci/reports/license_scanning/reports_comparer.rb' |     - 'ee/lib/gitlab/ci/reports/license_scanning/reports_comparer.rb' | ||||||
|  |  | ||||||
|  | @ -48,7 +48,7 @@ export default { | ||||||
|     :is="component" |     :is="component" | ||||||
|     :aria-label="ariaLabel" |     :aria-label="ariaLabel" | ||||||
|     :href="href" |     :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" /> |     <gl-icon aria-hidden="true" :name="icon" /> | ||||||
|     <span v-if="count" aria-hidden="true" class="gl-ml-1">{{ formattedCount }}</span> |     <span v-if="count" aria-hidden="true" class="gl-ml-1">{{ formattedCount }}</span> | ||||||
|  |  | ||||||
|  | @ -1,6 +1,7 @@ | ||||||
| <script> | <script> | ||||||
| import { kebabCase } from 'lodash'; | import { kebabCase } from 'lodash'; | ||||||
| import { GlCollapse, GlIcon } from '@gitlab/ui'; | import { GlCollapse, GlIcon } from '@gitlab/ui'; | ||||||
|  | import { NAV_ITEM_LINK_ACTIVE_CLASS } from '../constants'; | ||||||
| import NavItem from './nav_item.vue'; | import NavItem from './nav_item.vue'; | ||||||
| import FlyoutMenu from './flyout_menu.vue'; | import FlyoutMenu from './flyout_menu.vue'; | ||||||
| 
 | 
 | ||||||
|  | @ -61,9 +62,7 @@ export default { | ||||||
|       return this.isExpanded ? 'chevron-up' : 'chevron-down'; |       return this.isExpanded ? 'chevron-up' : 'chevron-down'; | ||||||
|     }, |     }, | ||||||
|     computedLinkClasses() { |     computedLinkClasses() { | ||||||
|       return { |       return this.isActive ? NAV_ITEM_LINK_ACTIVE_CLASS : null; | ||||||
|         'gl-bg-t-gray-a-08': this.isActive, |  | ||||||
|       }; |  | ||||||
|     }, |     }, | ||||||
|     isActive() { |     isActive() { | ||||||
|       return !this.isExpanded && this.item.is_active; |       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" /> |     <hr v-if="separated" aria-hidden="true" class="gl-mx-4 gl-my-2" /> | ||||||
|     <button |     <button | ||||||
|       :id="`menu-section-button-${itemId}`" |       :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" |       :class="computedLinkClasses" | ||||||
|       data-testid="menu-section-button" |       data-testid="menu-section-button" | ||||||
|       :data-qa-section-name="item.title" |       :data-qa-section-name="item.title" | ||||||
|  | @ -126,7 +125,11 @@ export default { | ||||||
|       ></span> |       ></span> | ||||||
|       <span class="gl-flex-shrink-0 gl-w-6 gl-display-flex"> |       <span class="gl-flex-shrink-0 gl-w-6 gl-display-flex"> | ||||||
|         <slot name="icon"> |         <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> |         </slot> | ||||||
|       </span> |       </span> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -223,7 +223,7 @@ export default { | ||||||
|       :is="navItemLinkComponent" |       :is="navItemLinkComponent" | ||||||
|       #default="{ isActive }" |       #default="{ isActive }" | ||||||
|       v-bind="linkProps" |       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" |       :class="computedLinkClasses" | ||||||
|       data-testid="nav-item-link" |       data-testid="nav-item-link" | ||||||
|     > |     > | ||||||
|  | @ -236,7 +236,11 @@ export default { | ||||||
|       ></div> |       ></div> | ||||||
|       <div v-if="!isFlyout" class="gl-flex-shrink-0 gl-w-6 gl-display-flex"> |       <div v-if="!isFlyout" class="gl-flex-shrink-0 gl-w-6 gl-display-flex"> | ||||||
|         <slot name="icon"> |         <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 |           <gl-icon | ||||||
|             v-else-if="isInPinnedSection" |             v-else-if="isInPinnedSection" | ||||||
|             name="grip" |             name="grip" | ||||||
|  | @ -264,7 +268,6 @@ export default { | ||||||
|           v-if="hasPill" |           v-if="hasPill" | ||||||
|           size="sm" |           size="sm" | ||||||
|           variant="neutral" |           variant="neutral" | ||||||
|           class="gl-bg-t-gray-a-08!" |  | ||||||
|           :class="{ |           :class="{ | ||||||
|             'hide-on-focus-or-hover--target transition-opacity-on-hover--target': isPinnable, |             '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" /> |       <user-bar ref="userBar" :has-collapse-button="!showOverlay" :sidebar-data="sidebarData" /> | ||||||
|       <div v-if="showTrialStatusWidget" class="gl-px-2 gl-py-2"> |       <div v-if="showTrialStatusWidget" class="gl-px-2 gl-py-2"> | ||||||
|         <trial-status-widget |         <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 /> |         <trial-status-popover /> | ||||||
|       </div> |       </div> | ||||||
|  |  | ||||||
|  | @ -200,7 +200,7 @@ export default { | ||||||
|       id="super-sidebar-search" |       id="super-sidebar-search" | ||||||
|       v-gl-tooltip.bottom.html="searchTooltip" |       v-gl-tooltip.bottom.html="searchTooltip" | ||||||
|       v-gl-modal="$options.SEARCH_MODAL_ID" |       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" |       data-testid="super-sidebar-search-button" | ||||||
|     > |     > | ||||||
|       <gl-icon name="search" /> |       <gl-icon name="search" /> | ||||||
|  |  | ||||||
|  | @ -248,7 +248,7 @@ export default { | ||||||
|       @shown="onShow" |       @shown="onShow" | ||||||
|     > |     > | ||||||
|       <template #toggle> |       <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> |           <span class="gl-sr-only">{{ toggleText }}</span> | ||||||
|           <gl-avatar |           <gl-avatar | ||||||
|             :size="24" |             :size="24" | ||||||
|  |  | ||||||
|  | @ -54,7 +54,7 @@ export const SIDEBAR_COOKIE_EXPIRATION = 365 * 10; | ||||||
| 
 | 
 | ||||||
| export const DROPDOWN_Y_OFFSET = 4; | 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; | 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-duration: $gl-transition-duration-medium; | ||||||
| $super-sidebar-transition-hint-duration: $super-sidebar-transition-duration / 4; | $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 { | ||||||
|   --super-sidebar-bg: var(--gray-10, #{$gray-10}); |   --super-sidebar-bg: #{$gray-10}; | ||||||
|   --super-sidebar-primary: var(--blue-500, #{$blue-500}); |   --super-sidebar-border-color: #{$t-gray-a-08}; | ||||||
|   --super-sidebar-notification-dot: var(--blue-500, #{$blue-500}); |   --super-sidebar-primary: #{$blue-500}; | ||||||
|  |   --super-sidebar-notification-dot: #{$blue-500}; | ||||||
|   --super-sidebar-user-bar-bg: #{$t-gray-a-04}; |   --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-bg: #{$gray-10}; | ||||||
|   --super-sidebar-user-bar-button-color: var(--gray-900, #{$gray-900}); |   --super-sidebar-user-bar-button-color: #{$gray-900}; | ||||||
|   --super-sidebar-user-bar-button-hover-color: var(--gray-900, #{$gray-900}); |   --super-sidebar-user-bar-button-border-color: #{$t-gray-a-08}; | ||||||
|   // Separate values provided to use `---gray-600` in dark  mode |   --super-sidebar-user-bar-button-hover-bg: #{$t-gray-a-08}; | ||||||
|   --super-sidebar-user-bar-button-icon-color: var(--gray-600, #{$gray-500}); |   --super-sidebar-user-bar-button-hover-color: #{$gray-900}; | ||||||
|   --super-sidebar-user-bar-button-icon-hover-color:  var(--gray-700, #{$gray-700}); |   --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; |   display: flex; | ||||||
|   flex-direction: column; |   flex-direction: column; | ||||||
|  | @ -48,7 +66,7 @@ $super-sidebar-transition-hint-duration: $super-sidebar-transition-duration / 4; | ||||||
|   bottom: $calc-application-footer-height; |   bottom: $calc-application-footer-height; | ||||||
|   left: 0; |   left: 0; | ||||||
|   background-color: var(--super-sidebar-bg); |   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); |   transform: translate3d(0, 0, 0); | ||||||
|   width: $super-sidebar-width; |   width: $super-sidebar-width; | ||||||
|   z-index: $super-sidebar-z-index; |   z-index: $super-sidebar-z-index; | ||||||
|  | @ -69,85 +87,84 @@ $super-sidebar-transition-hint-duration: $super-sidebar-transition-duration / 4; | ||||||
|   .user-bar { |   .user-bar { | ||||||
|     background-color: var(--super-sidebar-user-bar-bg); |     background-color: var(--super-sidebar-user-bar-bg); | ||||||
| 
 | 
 | ||||||
|     .user-bar-item { |     .user-bar-dropdown-toggle { | ||||||
|       @include gl-rounded-base; |  | ||||||
|       @include gl-p-2; |       @include gl-p-2; | ||||||
|       @include gl-bg-transparent; |  | ||||||
|       @include gl-border-none; |       @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, |       &:focus, | ||||||
|       &:active { |       &:active { | ||||||
|         @include gl-focus; |         @include gl-focus; | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     .user-bar-item { |     .btn-default-tertiary { | ||||||
|       &:hover, |       mix-blend-mode: normal; | ||||||
|       &:focus, |  | ||||||
|       &:active { |  | ||||||
|         @include active-toggle; |  | ||||||
|       } |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     .brand-logo { |     .user-bar-button { | ||||||
|       &:hover, |       background-color: var(--super-sidebar-user-bar-button-bg); | ||||||
|       &:focus { |       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); |         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); |         color: var(--super-sidebar-user-bar-button-hover-color); | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     .counter { |     .gl-new-dropdown-toggle[aria-expanded='true'] { | ||||||
|       background-color: var(--super-sidebar-user-bar-button-bg); |       background-color: var(--super-sidebar-user-bar-button-hover-bg); | ||||||
| 
 |       color: var(--super-sidebar-user-bar-button-hover-color); | ||||||
|       &: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; |  | ||||||
|       } |  | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   .item-icon { |   .super-sidebar-nav-item { | ||||||
|     color: $gray-500; |     &:hover, | ||||||
| 
 |     &:focus { | ||||||
|     .gl-dark & { |       background-color: var(--super-sidebar-nav-item-hover-bg); | ||||||
|       color: $gray-600; |  | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     &.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 { |   .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'] { |   .super-sidebar-help-center-toggle[aria-expanded='true'] { | ||||||
|     @include active-toggle($gray-50); |     background-color: $gray-50 !important; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   #trial-status-sidebar-widget:hover { |   #trial-status-sidebar-widget:hover { | ||||||
|  | @ -365,7 +368,7 @@ $super-sidebar-transition-hint-duration: $super-sidebar-transition-duration / 4; | ||||||
|   &:hover, |   &:hover, | ||||||
|   &:focus-within { |   &:focus-within { | ||||||
|     .show-on-focus-or-hover--control { |     .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 { |     .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-darker: $gray-50 !default; | ||||||
| $gray-darkest: $gray-200 !default; | $gray-darkest: $gray-200 !default; | ||||||
| 
 | 
 | ||||||
| $t-gray-a-02: rgba($gray-950, 0.02) !default; | $t-white-a-02: rgba(255, 255, 255, 0.02) !default; | ||||||
| $t-gray-a-04: rgba($gray-950, 0.04) !default; | $t-white-a-04: rgba(255, 255, 255, 0.04) !default; | ||||||
| $t-gray-a-06: rgba($gray-950, 0.06) !default; | $t-white-a-06: rgba(255, 255, 255, 0.06) !default; | ||||||
| $t-gray-a-08: rgba($gray-950, 0.08) !default; | $t-white-a-08: rgba(255, 255, 255, 0.08) !default; | ||||||
| $t-gray-a-16: rgba($gray-950, 0.16) !default; | $t-white-a-16: rgba(255, 255, 255, 0.16) !default; | ||||||
| $t-gray-a-24: rgba($gray-950, 0.24) !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; | $white-dark: darken($gray-50, 2) !default; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -8,11 +8,9 @@ $gray-dark: darken($gray-100, 2); | ||||||
| $gray-darker: darken($gray-200, 2); | $gray-darker: darken($gray-200, 2); | ||||||
| $gray-darkest: $gray-700; | $gray-darkest: $gray-700; | ||||||
| 
 | 
 | ||||||
| // Some of the other $t-gray-a variables are used | // Used for border and background in a couple instances where inverting between modes is desirable | ||||||
| // for borders and some other places, so we cannot override | // once migrated to suitable color values this can be removed | ||||||
| // them. These are used only for box shadows so we can | $t-gray-a-08: rgba($gray-950, 0.08); | ||||||
| $t-gray-a-16: rgba($gray-10, 0.16); |  | ||||||
| $t-gray-a-24: rgba($gray-10, 0.24); |  | ||||||
| 
 | 
 | ||||||
| $black-normal: $gray-900; | $black-normal: $gray-900; | ||||||
| $white-dark: $gray-100; | $white-dark: $gray-100; | ||||||
|  |  | ||||||
|  | @ -5,7 +5,7 @@ | ||||||
|     .page-with-super-sidebar { |     .page-with-super-sidebar { | ||||||
|       @include gitlab-theme-super-sidebar( |       @include gitlab-theme-super-sidebar( | ||||||
|         $theme-blue-50, |         $theme-blue-50, | ||||||
|         $theme-blue-200, |         $theme-blue-100, | ||||||
|         $theme-blue-900, |         $theme-blue-900, | ||||||
|         $theme-blue-900, |         $theme-blue-900, | ||||||
|       ); |       ); | ||||||
|  |  | ||||||
|  | @ -5,7 +5,7 @@ | ||||||
|     .page-with-super-sidebar { |     .page-with-super-sidebar { | ||||||
|       @include gitlab-theme-super-sidebar( |       @include gitlab-theme-super-sidebar( | ||||||
|         $theme-green-50, |         $theme-green-50, | ||||||
|         $theme-green-200, |         $theme-green-100, | ||||||
|         $theme-green-900, |         $theme-green-900, | ||||||
|         $theme-green-900, |         $theme-green-900, | ||||||
|       ); |       ); | ||||||
|  |  | ||||||
|  | @ -11,22 +11,19 @@ | ||||||
|   .super-sidebar { |   .super-sidebar { | ||||||
|     --super-sidebar-bg: #{mix(white, $theme-color-lightest, 50%)}; |     --super-sidebar-bg: #{mix(white, $theme-color-lightest, 50%)}; | ||||||
|     --super-sidebar-user-bar-bg: #{$theme-color}; |     --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-primary: #{$theme-color}; | ||||||
|     --super-sidebar-notification-dot: #{$theme-color-darkest}; |     --super-sidebar-notification-dot: #{$theme-color-darkest}; | ||||||
| 
 | 
 | ||||||
|     .user-bar { |     --super-sidebar-user-bar-button-bg: #{$t-white-a-16}; | ||||||
|       .brand-logo, |     --super-sidebar-user-bar-button-color: #{$theme-color-lightest}; | ||||||
|       .btn-default-tertiary, |     --super-sidebar-user-bar-button-border-color: #{$t-white-a-16}; | ||||||
|       .counter { |     --super-sidebar-user-bar-button-hover-bg: #{$t-white-a-24}; | ||||||
|         mix-blend-mode: normal; |     --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 { |     hr { | ||||||
|       mix-blend-mode: multiply; |       mix-blend-mode: multiply; | ||||||
|  |  | ||||||
|  | @ -5,7 +5,7 @@ | ||||||
|     .page-with-super-sidebar { |     .page-with-super-sidebar { | ||||||
|       @include gitlab-theme-super-sidebar( |       @include gitlab-theme-super-sidebar( | ||||||
|         $theme-indigo-50, |         $theme-indigo-50, | ||||||
|         $theme-indigo-200, |         $theme-indigo-100, | ||||||
|         $theme-indigo-900, |         $theme-indigo-900, | ||||||
|         $theme-indigo-900, |         $theme-indigo-900, | ||||||
|       ); |       ); | ||||||
|  |  | ||||||
|  | @ -5,7 +5,7 @@ | ||||||
|     .page-with-super-sidebar { |     .page-with-super-sidebar { | ||||||
|       @include gitlab-theme-super-sidebar( |       @include gitlab-theme-super-sidebar( | ||||||
|         $theme-light-blue-50, |         $theme-light-blue-50, | ||||||
|         $theme-light-blue-200, |         $theme-light-blue-100, | ||||||
|         $theme-light-blue-700, |         $theme-light-blue-700, | ||||||
|         $theme-light-blue-900, |         $theme-light-blue-900, | ||||||
|       ); |       ); | ||||||
|  |  | ||||||
|  | @ -5,7 +5,7 @@ | ||||||
|     .page-with-super-sidebar { |     .page-with-super-sidebar { | ||||||
|       @include gitlab-theme-super-sidebar( |       @include gitlab-theme-super-sidebar( | ||||||
|         $theme-green-50, |         $theme-green-50, | ||||||
|         $theme-green-200, |         $theme-green-100, | ||||||
|         $theme-green-700, |         $theme-green-700, | ||||||
|         $theme-green-900, |         $theme-green-900, | ||||||
|       ); |       ); | ||||||
|  |  | ||||||
|  | @ -5,7 +5,7 @@ | ||||||
|     .page-with-super-sidebar { |     .page-with-super-sidebar { | ||||||
|       @include gitlab-theme-super-sidebar( |       @include gitlab-theme-super-sidebar( | ||||||
|         $theme-indigo-50, |         $theme-indigo-50, | ||||||
|         $theme-indigo-200, |         $theme-indigo-100, | ||||||
|         $theme-indigo-700, |         $theme-indigo-700, | ||||||
|         $theme-indigo-900, |         $theme-indigo-900, | ||||||
|       ); |       ); | ||||||
|  |  | ||||||
|  | @ -5,7 +5,7 @@ | ||||||
|     .page-with-super-sidebar { |     .page-with-super-sidebar { | ||||||
|       @include gitlab-theme-super-sidebar( |       @include gitlab-theme-super-sidebar( | ||||||
|         $theme-light-red-50, |         $theme-light-red-50, | ||||||
|         $theme-light-red-200, |         $theme-light-red-100, | ||||||
|         $theme-light-red-700, |         $theme-light-red-700, | ||||||
|         $theme-light-red-900, |         $theme-light-red-900, | ||||||
|       ); |       ); | ||||||
|  |  | ||||||
|  | @ -5,7 +5,7 @@ | ||||||
|     .page-with-super-sidebar { |     .page-with-super-sidebar { | ||||||
|       @include gitlab-theme-super-sidebar( |       @include gitlab-theme-super-sidebar( | ||||||
|         $theme-red-50, |         $theme-red-50, | ||||||
|         $theme-red-200, |         $theme-red-100, | ||||||
|         $theme-red-900, |         $theme-red-900, | ||||||
|         $theme-red-900, |         $theme-red-900, | ||||||
|       ); |       ); | ||||||
|  |  | ||||||
|  | @ -178,7 +178,7 @@ module Types | ||||||
|     field :twitter, |     field :twitter, | ||||||
|           type: ::GraphQL::Types::String, |           type: ::GraphQL::Types::String, | ||||||
|           null: true, |           null: true, | ||||||
|           description: 'Twitter username of the user.' |           description: 'X (formerly Twitter) username of the user.' | ||||||
| 
 | 
 | ||||||
|     field :discord, |     field :discord, | ||||||
|           type: ::GraphQL::Types::String, |           type: ::GraphQL::Types::String, | ||||||
|  |  | ||||||
|  | @ -64,7 +64,7 @@ | ||||||
|         = f.text_field :linkedin, class: 'form-control gl-form-input gl-form-input-lg' |         = f.text_field :linkedin, class: 'form-control gl-form-input gl-form-input-lg' | ||||||
| 
 | 
 | ||||||
|       .form-group.gl-form-group{ role: 'group' } |       .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' |         = f.text_field :twitter, class: 'form-control gl-form-input gl-form-input-lg' | ||||||
| 
 | 
 | ||||||
|       .form-group.gl-form-group{ role: 'group' } |       .form-group.gl-form-group{ role: 'group' } | ||||||
|  |  | ||||||
|  | @ -20,7 +20,7 @@ | ||||||
|           %strong= link_to user.linkedin, "https://www.linkedin.com/in/#{user.linkedin}" |           %strong= link_to user.linkedin, "https://www.linkedin.com/in/#{user.linkedin}" | ||||||
|       - unless user.twitter.blank? |       - unless user.twitter.blank? | ||||||
|         %li |         %li | ||||||
|           %span.light= _('Twitter:') |           %span.light= _('X (formerly Twitter):') | ||||||
|           %strong= link_to user.twitter, "https://twitter.com/#{user.twitter}" |           %strong= link_to user.twitter, "https://twitter.com/#{user.twitter}" | ||||||
|       - unless user.website_url.blank? |       - unless user.website_url.blank? | ||||||
|         %li |         %li | ||||||
|  |  | ||||||
|  | @ -7,7 +7,7 @@ | ||||||
|         %div |         %div | ||||||
|           = link_to _('Blog'), 'https://about.gitlab.com/blog/', style: "color:#3777b0;text-decoration:none;" |           = 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;" |           = link_to _('Facebook'), 'https://www.facebook.com/gitlab/', style: "color:#3777b0;text-decoration:none;" | ||||||
|           · |           · | ||||||
|  |  | ||||||
|  | @ -103,7 +103,7 @@ | ||||||
|         %small.form-text.text-gl-muted |         %small.form-text.text-gl-muted | ||||||
|           = s_("Profiles|Your LinkedIn profile name from linkedin.com/in/profilename") |           = s_("Profiles|Your LinkedIn profile name from linkedin.com/in/profilename") | ||||||
|       .form-group.gl-form-group |       .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") |         = f.text_field :twitter, class: 'gl-form-input form-control gl-md-form-input-lg', placeholder: s_("Profiles|@username") | ||||||
|       .form-group.gl-form-group |       .form-group.gl-form-group | ||||||
|         - external_accounts_help_url = help_page_path('user/profile/index', anchor: 'add-external-accounts-to-your-user-profile-page') |         - 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') |                       = sprite_icon('linkedin', css_class: 'linkedin-icon') | ||||||
|                 - if @user.twitter.present? |                 - if @user.twitter.present? | ||||||
|                   = render 'middle_dot_divider', breakpoint: 'sm' do |                   = 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') |                       = sprite_icon('twitter', css_class: 'twitter-icon') | ||||||
|                 - if @user.discord.present? |                 - if @user.discord.present? | ||||||
|                   = render 'middle_dot_divider', breakpoint: 'sm' do |                   = render 'middle_dot_divider', breakpoint: 'sm' do | ||||||
|  |  | ||||||
|  | @ -5,7 +5,7 @@ class FinalizeBackfillCodeSuggestionsNamespaceSettings < Gitlab::Database::Migra | ||||||
| 
 | 
 | ||||||
|   disable_ddl_transaction! |   disable_ddl_transaction! | ||||||
| 
 | 
 | ||||||
|   restrict_gitlab_migration gitlab_schema: :gitlab_main_cell |   restrict_gitlab_migration gitlab_schema: :gitlab_main | ||||||
| 
 | 
 | ||||||
|   def up |   def up | ||||||
|     ensure_batched_background_migration_is_finished( |     ensure_batched_background_migration_is_finished( | ||||||
|  |  | ||||||
|  | @ -5,7 +5,7 @@ class FinalizeBackfillDesignManagementRepositories < Gitlab::Database::Migration | ||||||
| 
 | 
 | ||||||
|   disable_ddl_transaction! |   disable_ddl_transaction! | ||||||
| 
 | 
 | ||||||
|   restrict_gitlab_migration gitlab_schema: :gitlab_main_cell |   restrict_gitlab_migration gitlab_schema: :gitlab_main | ||||||
| 
 | 
 | ||||||
|   def up |   def up | ||||||
|     ensure_batched_background_migration_is_finished( |     ensure_batched_background_migration_is_finished( | ||||||
|  |  | ||||||
|  | @ -5,7 +5,7 @@ class FinalizeBackfillProjectStatisticsStorageSizeWithoutPipelineArtifactsSi < G | ||||||
| 
 | 
 | ||||||
|   disable_ddl_transaction! |   disable_ddl_transaction! | ||||||
| 
 | 
 | ||||||
|   restrict_gitlab_migration gitlab_schema: :gitlab_main_cell |   restrict_gitlab_migration gitlab_schema: :gitlab_main | ||||||
| 
 | 
 | ||||||
|   def up |   def up | ||||||
|     ensure_batched_background_migration_is_finished( |     ensure_batched_background_migration_is_finished( | ||||||
|  |  | ||||||
|  | @ -5,7 +5,7 @@ class FinalizeDeleteOrphanedTransferredProjectApprovalRules < Gitlab::Database:: | ||||||
| 
 | 
 | ||||||
|   disable_ddl_transaction! |   disable_ddl_transaction! | ||||||
| 
 | 
 | ||||||
|   restrict_gitlab_migration gitlab_schema: :gitlab_main_cell |   restrict_gitlab_migration gitlab_schema: :gitlab_main | ||||||
| 
 | 
 | ||||||
|   def up |   def up | ||||||
|     ensure_batched_background_migration_is_finished( |     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 | X-Gitlab-Audit-Event-Type: repository_git_operation | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| ### Example payloads for SSH events | ### Example payloads for Git over SSH events | ||||||
| 
 | 
 | ||||||
| Fetch: | 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. | > [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: | 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: | 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="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="addonuserstate"></a>`state` | [`UserState!`](#userstate) | State of the user. | | ||||||
| | <a id="addonuserstatus"></a>`status` | [`UserStatus`](#userstatus) | User status. | | | <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="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="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. | | | <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="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="autocompleteduserstate"></a>`state` | [`UserState!`](#userstate) | State of the user. | | ||||||
| | <a id="autocompleteduserstatus"></a>`status` | [`UserStatus`](#userstatus) | User status. | | | <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="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="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. | | | <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="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="currentuserstate"></a>`state` | [`UserState!`](#userstate) | State of the user. | | ||||||
| | <a id="currentuserstatus"></a>`status` | [`UserStatus`](#userstatus) | User status. | | | <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="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="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. | | | <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="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="mergerequestassigneestate"></a>`state` | [`UserState!`](#userstate) | State of the user. | | ||||||
| | <a id="mergerequestassigneestatus"></a>`status` | [`UserStatus`](#userstatus) | User status. | | | <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="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="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. | | | <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="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="mergerequestauthorstate"></a>`state` | [`UserState!`](#userstate) | State of the user. | | ||||||
| | <a id="mergerequestauthorstatus"></a>`status` | [`UserStatus`](#userstatus) | User status. | | | <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="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="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. | | | <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="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="mergerequestparticipantstate"></a>`state` | [`UserState!`](#userstate) | State of the user. | | ||||||
| | <a id="mergerequestparticipantstatus"></a>`status` | [`UserStatus`](#userstatus) | User status. | | | <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="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="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. | | | <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="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="mergerequestreviewerstate"></a>`state` | [`UserState!`](#userstate) | State of the user. | | ||||||
| | <a id="mergerequestreviewerstatus"></a>`status` | [`UserStatus`](#userstatus) | User status. | | | <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="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="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. | | | <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="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="usercorestate"></a>`state` | [`UserState!`](#userstate) | State of the user. | | ||||||
| | <a id="usercorestatus"></a>`status` | [`UserStatus`](#userstatus) | User status. | | | <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="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="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. | | | <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="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="userstate"></a>`state` | [`UserState!`](#userstate) | State of the user. | | ||||||
| | <a id="userstatus"></a>`status` | [`UserStatus`](#userstatus) | User status. | | | <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="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="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. | | | <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)                                                                                                             | | | `skip_confirmation`                  | No       | Skip confirmation - true or false (default)                                                                                                             | | ||||||
| | `skype`                              | No       | Skype ID                                                                                                                                                | | | `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)                    | | | `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                                                                                                                                         | | | `discord`                            | No       | Discord account                                                                                                                                         | | ||||||
| | `username`                           | Yes      | Username                                                                                                                                                | | | `username`                           | Yes      | Username                                                                                                                                                | | ||||||
| | `view_diffs_file_by_file`            | No       | Flag indicating the user sees only one file diff per page                                                                                               | | | `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)                                                                                                           | | | `skip_reconfirmation`                | No       | Skip reconfirmation - true or false (default)                                                                                                           | | ||||||
| | `skype`                              | No       | Skype ID                                                                                                                                                | | | `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)                    | | | `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                                                                                                                                         | | | `discord`                            | No       | Discord account                                                                                                                                         | | ||||||
| | `username`                           | No       | Username                                                                                                                                                | | | `username`                           | No       | Username                                                                                                                                                | | ||||||
| | `view_diffs_file_by_file`            | No       | Flag indicating the user sees only one file diff per page                                                                                               | | | `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 | ### How to write navigation task steps | ||||||
| 
 | 
 | ||||||
| To be consistent, use these examples to write navigation steps in a task topic. | 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: | To open project settings: | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -2,78 +2,51 @@ | ||||||
| stage: Create | stage: Create | ||||||
| group: Source Code | 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 | 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)** | # Installing Git **(FREE ALL)** | ||||||
| 
 | 
 | ||||||
| To begin contributing to GitLab projects, you must install the appropriate Git client | To begin contributing to GitLab projects, you must download and install the Git client on your computer. | ||||||
| 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. |  | ||||||
| 
 | 
 | ||||||
| ## 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) | For information on downloading and installing Git on other operating systems, see the | ||||||
| - [Ubuntu Linux](#ubuntu-linux) | [official Git website](https://git-scm.com/downloads). | ||||||
| - [Microsoft Windows](#windows) |  | ||||||
| 
 | 
 | ||||||
| ### macOS | ## Install and update Git on macOS | ||||||
| 
 | 
 | ||||||
| A version of Git is supplied by macOS. You can use this version, or install the latest | Though a version of Git is supplied by macOS, you should install the latest version of Git. A common way to | ||||||
| version of Git on macOS by downloading it from the project website. We recommend | install Git is with [Homebrew](https://brew.sh/index.html). | ||||||
| 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. |  | ||||||
| 
 | 
 | ||||||
| Prerequisites: | To install the latest version of Git on macOS with Homebrew: | ||||||
| 
 | 
 | ||||||
| - 15 GB of available disk space for Homebrew and Xcode. | 1. If you've never installed Homebrew before, follow the | ||||||
| - Extra disk space for any additional development libraries. |    [Homebrew installation instructions](https://brew.sh/index.html). | ||||||
| 
 | 1. In a terminal, install Git by running `brew install git`. | ||||||
| To install Git on macOS: | 1. Verify that Git works on your computer: | ||||||
| 
 |  | ||||||
| 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: |  | ||||||
| 
 | 
 | ||||||
|    ```shell |    ```shell | ||||||
|    git --version |    git --version | ||||||
|    ``` |    ``` | ||||||
| 
 | 
 | ||||||
| #### macOS update | Keep Git up to date by periodically running the following command: | ||||||
| 
 |  | ||||||
| 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: |  | ||||||
| 
 | 
 | ||||||
| ```shell | ```shell | ||||||
| brew update | brew update && brew upgrade git | ||||||
| brew upgrade git |  | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| To verify you are on the updated version, run `git --version` to display | ## Install and update Git on Ubuntu Linux | ||||||
| your current version of Git. |  | ||||||
| 
 | 
 | ||||||
| ### 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 the latest version of Git on Ubuntu Linux with a PPA: | ||||||
| to install Git: |  | ||||||
| 
 | 
 | ||||||
| 1. Open a terminal and run these commands to install the latest Git | 1. In a terminal, configure the required PPA, update the list of Ubuntu packages, and install `git`: | ||||||
| from the officially |  | ||||||
|    maintained package archives: |  | ||||||
| 
 | 
 | ||||||
|    ```shell |    ```shell | ||||||
|    sudo apt-add-repository ppa:git-core/ppa |    sudo apt-add-repository ppa:git-core/ppa | ||||||
|  | @ -81,32 +54,23 @@ from the officially | ||||||
|    sudo apt-get install git |    sudo apt-get install git | ||||||
|    ``` |    ``` | ||||||
| 
 | 
 | ||||||
| 1. To verify that Git works on your computer, run: | 1. Verify that Git works on your computer: | ||||||
| 
 | 
 | ||||||
|    ```shell |    ```shell | ||||||
|    git --version |    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 install Git | ||||||
| 
 | 
 | ||||||
| After you successfully install Git on your computer, read about [adding an SSH key to GitLab](../../../user/ssh.md). | 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 [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. | > - 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. | They can help other users connect with you on other platforms. | ||||||
| 
 | 
 | ||||||
| To add links to other accounts: | To add links to other accounts: | ||||||
|  | @ -146,7 +146,7 @@ To add links to other accounts: | ||||||
|    - LinkedIn profile name. |    - LinkedIn profile name. | ||||||
|    - Mastodon username. |    - Mastodon username. | ||||||
|    - Skype username. |    - Skype username. | ||||||
|    - Twitter @username. |    - X (formerly Twitter) @username. | ||||||
| 
 | 
 | ||||||
|    Your user ID or username must be 500 characters or less. |    Your user ID or username must be 500 characters or less. | ||||||
| 1. Select **Update profile settings**. | 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. | For human interactions, use credentials tied to users such as Personal Access Tokens. | ||||||
| 
 | 
 | ||||||
| To help detect a potential secret leak, you can use the | 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 deploy keys | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,20 +1,20 @@ | ||||||
| --- | --- | ||||||
| stage: Create | stage: ModelOps | ||||||
| group: Incubation | group: MLOps | ||||||
| info: Machine Learning Experiment Tracking is a GitLab Incubation Engineering program. No technical writer assigned to this group. | 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. | > [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: | NOTE: | ||||||
| Model experiment tracking is an [experimental feature](../../../../policy/experiment-beta-support.md). | Model registry and model experiment tracking are [Experiments](../../../../policy/experiment-beta-support.md). | ||||||
| Refer to <https://gitlab.com/gitlab-org/gitlab/-/issues/381660> for feedback and feature requests. | 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. | [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, | GitLab [Model experiment tracking](index.md) and GitLab | ||||||
| [logging experiments](index.md). The setup requires minimal changes to existing code. | [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. | 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>" |    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 | ## Model experiments | ||||||
| and artifacts on GitLab. | 
 | ||||||
|  | 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`. | 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. | Runs are registered as candidates, which can be explored by selecting an experiment, model, or model version. | ||||||
| - Tags, which are registered as metadata. |  | ||||||
| 
 | 
 | ||||||
| ## 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. | > [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 |       # 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 | ## Supported MLflow client methods and caveats | ||||||
| 
 | 
 | ||||||
| GitLab supports these methods from the MLflow client. Other methods might be supported but were not | 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                                                                            | | | 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          |                                                                                     | | | `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. | | | `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 | ## Limitations | ||||||
| 
 | 
 | ||||||
| - The API GitLab supports is the one defined at MLflow version 1.28.0. | - The API GitLab supports is the one defined at MLflow version 2.7.1. | ||||||
| - API endpoints not listed above are not supported. | - MLflow client methods not listed above are not supported. | ||||||
| - During creation of experiments and runs, ExperimentTags are stored, even though they are not displayed. | - 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: | variables: | ||||||
|   DAST_AUTO_DEPLOY_IMAGE_VERSION: 'v2.63.0' |   DAST_AUTO_DEPLOY_IMAGE_VERSION: 'v2.70.0' | ||||||
| 
 | 
 | ||||||
| .dast-auto-deploy: | .dast-auto-deploy: | ||||||
|   image: "${CI_TEMPLATE_REGISTRY_HOST}/gitlab-org/cluster-integration/auto-deploy-image:${DAST_AUTO_DEPLOY_IMAGE_VERSION}" |   image: "${CI_TEMPLATE_REGISTRY_HOST}/gitlab-org/cluster-integration/auto-deploy-image:${DAST_AUTO_DEPLOY_IMAGE_VERSION}" | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| variables: | variables: | ||||||
|   AUTO_DEPLOY_IMAGE_VERSION: 'v2.63.0' |   AUTO_DEPLOY_IMAGE_VERSION: 'v2.70.0' | ||||||
| 
 | 
 | ||||||
| .auto-deploy: | .auto-deploy: | ||||||
|   image: "${CI_TEMPLATE_REGISTRY_HOST}/gitlab-org/cluster-integration/auto-deploy-image:${AUTO_DEPLOY_IMAGE_VERSION}" |   image: "${CI_TEMPLATE_REGISTRY_HOST}/gitlab-org/cluster-integration/auto-deploy-image:${AUTO_DEPLOY_IMAGE_VERSION}" | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| variables: | variables: | ||||||
|   AUTO_DEPLOY_IMAGE_VERSION: 'v2.63.0' |   AUTO_DEPLOY_IMAGE_VERSION: 'v2.70.0' | ||||||
| 
 | 
 | ||||||
| .auto-deploy: | .auto-deploy: | ||||||
|   image: "${CI_TEMPLATE_REGISTRY_HOST}/gitlab-org/cluster-integration/auto-deploy-image:${AUTO_DEPLOY_IMAGE_VERSION}" |   image: "${CI_TEMPLATE_REGISTRY_HOST}/gitlab-org/cluster-integration/auto-deploy-image:${AUTO_DEPLOY_IMAGE_VERSION}" | ||||||
|  |  | ||||||
|  | @ -51386,12 +51386,6 @@ msgstr "" | ||||||
| msgid "Turn on" | msgid "Turn on" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| msgid "Twitter" |  | ||||||
| msgstr "" |  | ||||||
| 
 |  | ||||||
| msgid "Twitter:" |  | ||||||
| msgstr "" |  | ||||||
| 
 |  | ||||||
| msgid "Two-Factor Authentication" | msgid "Two-Factor Authentication" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
|  | @ -55415,6 +55409,12 @@ msgstr "" | ||||||
| msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly." | msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly." | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
|  | msgid "X (formerly Twitter)" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
|  | msgid "X (formerly Twitter):" | ||||||
|  | msgstr "" | ||||||
|  | 
 | ||||||
| msgid "Xcode" | msgid "Xcode" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -62,7 +62,7 @@ | ||||||
|     "@gitlab/svgs": "3.72.0", |     "@gitlab/svgs": "3.72.0", | ||||||
|     "@gitlab/ui": "^71.6.1", |     "@gitlab/ui": "^71.6.1", | ||||||
|     "@gitlab/visual-review-tools": "1.7.3", |     "@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", |     "@mattiasbuelens/web-streams-adapter": "^0.1.0", | ||||||
|     "@rails/actioncable": "7.0.8", |     "@rails/actioncable": "7.0.8", | ||||||
|     "@rails/ujs": "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') |             open_settings_submenu('Merge requests') | ||||||
|           end |           end | ||||||
| 
 | 
 | ||||||
|           def go_to_pages_settings |  | ||||||
|             open_settings_submenu('Pages') |  | ||||||
|           end |  | ||||||
| 
 |  | ||||||
|           def go_to_monitor_settings |           def go_to_monitor_settings | ||||||
|             open_settings_submenu('Monitor') |             open_settings_submenu('Monitor') | ||||||
|           end |           end | ||||||
|  |  | ||||||
|  | @ -14,6 +14,10 @@ module QA | ||||||
|           open_deploy_submenu('Container Registry') |           open_deploy_submenu('Container Registry') | ||||||
|         end |         end | ||||||
| 
 | 
 | ||||||
|  |         def go_to_pages_settings | ||||||
|  |           open_deploy_submenu('Pages') | ||||||
|  |         end | ||||||
|  | 
 | ||||||
|         private |         private | ||||||
| 
 | 
 | ||||||
|         def open_deploy_submenu(sub_menu) |         def open_deploy_submenu(sub_menu) | ||||||
|  |  | ||||||
|  | @ -7,9 +7,8 @@ module QA | ||||||
|     except: { job: 'review-qa-*' }, |     except: { job: 'review-qa-*' }, | ||||||
|     quarantine: { |     quarantine: { | ||||||
|       issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/383215', |       issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/383215', | ||||||
|       type: :flaky |       type: :broken | ||||||
|     }, |     } do | ||||||
|     feature_flag: { name: 'show_pages_in_deployments_menu' } do |  | ||||||
|     # TODO: Convert back to :smoke once proved to be stable. Related issue: https://gitlab.com/gitlab-org/gitlab/-/issues/300906 |     # 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 |     describe 'Pages', product_group: :knowledge do | ||||||
|       let!(:project) { create(:project, name: 'gitlab-pages-projects', template_name: :plainhtml) } |       let!(:project) { create(:project, name: 'gitlab-pages-projects', template_name: :plainhtml) } | ||||||
|  | @ -40,7 +39,7 @@ module QA | ||||||
|         end |         end | ||||||
| 
 | 
 | ||||||
|         Page::Project::Menu.perform(&:go_to_pages_settings) |         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( |         Support::Waiter.wait_until( | ||||||
|           sleep_interval: 2, |           sleep_interval: 2, | ||||||
|  |  | ||||||
|  | @ -29,7 +29,7 @@ describe('NavItemLink component', () => { | ||||||
| 
 | 
 | ||||||
|       expect(wrapper.attributes()).toEqual({ |       expect(wrapper.attributes()).toEqual({ | ||||||
|         href: '/foo', |         href: '/foo', | ||||||
|         class: 'gl-bg-t-gray-a-08', |         class: 'super-sidebar-nav-item-current', | ||||||
|         'aria-current': 'page', |         'aria-current': 'page', | ||||||
|       }); |       }); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|  | @ -45,7 +45,9 @@ describe('NavItemRouterLink component', () => { | ||||||
|         routerLinkSlotProps: { isActive: true }, |         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({ |       expect(wrapper.attributes()).toEqual({ | ||||||
|         href: '/foo', |         href: '/foo', | ||||||
|         'aria-current': 'page', |         'aria-current': 'page', | ||||||
|  |  | ||||||
|  | @ -1292,10 +1292,10 @@ | ||||||
|   resolved "https://registry.yarnpkg.com/@gitlab/visual-review-tools/-/visual-review-tools-1.7.3.tgz#9ea641146436da388ffbad25d7f2abe0df52c235" |   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== |   integrity sha512-NMV++7Ew1FSBDN1xiZaauU9tfeSfgDHcOLpn+8bGpP+O5orUPm2Eu66R5eC5gkjBPaXosNAxNWtriee+aFk4+g== | ||||||
| 
 | 
 | ||||||
| "@gitlab/web-ide@^0.0.1-dev-20231129035648": | "@gitlab/web-ide@^0.0.1-dev-20231211152737": | ||||||
|   version "0.0.1-dev-20231129035648" |   version "0.0.1-dev-20231211152737" | ||||||
|   resolved "https://registry.yarnpkg.com/@gitlab/web-ide/-/web-ide-0.0.1-dev-20231129035648.tgz#8e9ad9be4d27d912eb255c6a03fab4a210f2d2fa" |   resolved "https://registry.yarnpkg.com/@gitlab/web-ide/-/web-ide-0.0.1-dev-20231211152737.tgz#849c6f9256b5a5bd340a3b140d4192c6f5aafc35" | ||||||
|   integrity sha512-66fqT2G+Q7wuiZwXDbTaEYeuXGJSOkg9ZfQS6ARJ5GYhFoJ8U63TjX/+/jcPHBH99h0eN4xrP/YzidglP59BtQ== |   integrity sha512-1bIUvO3Lhdc8hftmfKPjGKMqoI6NBv20noZxpgLtXx+aOF8NsF+bJcBMl12HifDI4w8UAjTmHPMzj+RZfEJLJw== | ||||||
| 
 | 
 | ||||||
| "@graphql-eslint/eslint-plugin@3.20.1": | "@graphql-eslint/eslint-plugin@3.20.1": | ||||||
|   version "3.20.1" |   version "3.20.1" | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue