Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
		
							parent
							
								
									5de7e7c72a
								
							
						
					
					
						commit
						000087abd5
					
				|  | @ -13,11 +13,6 @@ import * as Emoji from '~/emoji'; | ||||||
| 
 | 
 | ||||||
| const animationEndEventString = 'animationend webkitAnimationEnd MSAnimationEnd oAnimationEnd'; | const animationEndEventString = 'animationend webkitAnimationEnd MSAnimationEnd oAnimationEnd'; | ||||||
| const transitionEndEventString = 'transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd'; | const transitionEndEventString = 'transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd'; | ||||||
| const requestAnimationFrame = |  | ||||||
|   window.requestAnimationFrame || |  | ||||||
|   window.webkitRequestAnimationFrame || |  | ||||||
|   window.mozRequestAnimationFrame || |  | ||||||
|   window.setTimeout; |  | ||||||
| 
 | 
 | ||||||
| const FROM_SENTENCE_REGEX = /(?:, and | and |, )/; // For separating lists produced by ruby's Array#toSentence
 | const FROM_SENTENCE_REGEX = /(?:, and | and |, )/; // For separating lists produced by ruby's Array#toSentence
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -51,6 +51,7 @@ export default { | ||||||
|       'scrollToDraft', |       'scrollToDraft', | ||||||
|       'toggleResolveDiscussion', |       'toggleResolveDiscussion', | ||||||
|     ]), |     ]), | ||||||
|  |     ...mapActions(['setSelectedCommentPositionHover']), | ||||||
|     update(data) { |     update(data) { | ||||||
|       this.updateDraft(data); |       this.updateDraft(data); | ||||||
|     }, |     }, | ||||||
|  | @ -67,7 +68,11 @@ export default { | ||||||
| }; | }; | ||||||
| </script> | </script> | ||||||
| <template> | <template> | ||||||
|   <article class="draft-note-component note-wrapper"> |   <article | ||||||
|  |     class="draft-note-component note-wrapper" | ||||||
|  |     @mouseenter="setSelectedCommentPositionHover(draft.position.line_range)" | ||||||
|  |     @mouseleave="setSelectedCommentPositionHover()" | ||||||
|  |   > | ||||||
|     <ul class="notes draft-notes"> |     <ul class="notes draft-notes"> | ||||||
|       <noteable-note |       <noteable-note | ||||||
|         :note="draft" |         :note="draft" | ||||||
|  |  | ||||||
|  | @ -148,10 +148,7 @@ export default { | ||||||
| 
 | 
 | ||||||
| <template> | <template> | ||||||
|   <div class="content discussion-form discussion-form-container discussion-notes"> |   <div class="content discussion-form discussion-form-container discussion-notes"> | ||||||
|     <div |     <div v-if="glFeatures.multilineComments" class="gl-mb-3 gl-text-gray-700 gl-pb-3"> | ||||||
|       v-if="glFeatures.multilineComments" |  | ||||||
|       class="gl-mb-3 gl-text-gray-700 gl-border-gray-100 gl-border-b-solid gl-border-b-1 gl-pb-3" |  | ||||||
|     > |  | ||||||
|       <multiline-comment-form |       <multiline-comment-form | ||||||
|         v-model="commentLineStart" |         v-model="commentLineStart" | ||||||
|         :line="line" |         :line="line" | ||||||
|  |  | ||||||
|  | @ -37,6 +37,11 @@ export default { | ||||||
|       required: false, |       required: false, | ||||||
|       default: false, |       default: false, | ||||||
|     }, |     }, | ||||||
|  |     isCommented: { | ||||||
|  |       type: Boolean, | ||||||
|  |       required: false, | ||||||
|  |       default: false, | ||||||
|  |     }, | ||||||
|   }, |   }, | ||||||
|   data() { |   data() { | ||||||
|     return { |     return { | ||||||
|  | @ -47,7 +52,10 @@ export default { | ||||||
|     ...mapGetters('diffs', ['fileLineCoverage']), |     ...mapGetters('diffs', ['fileLineCoverage']), | ||||||
|     ...mapState({ |     ...mapState({ | ||||||
|       isHighlighted(state) { |       isHighlighted(state) { | ||||||
|         return this.line.line_code !== null && this.line.line_code === state.diffs.highlightedRow; |         if (this.isCommented) return true; | ||||||
|  | 
 | ||||||
|  |         const lineCode = this.line.line_code; | ||||||
|  |         return lineCode ? lineCode === state.diffs.highlightedRow : false; | ||||||
|       }, |       }, | ||||||
|     }), |     }), | ||||||
|     isContextLine() { |     isContextLine() { | ||||||
|  |  | ||||||
|  | @ -1,10 +1,11 @@ | ||||||
| <script> | <script> | ||||||
| import { mapGetters } from 'vuex'; | import { mapGetters, mapState } from 'vuex'; | ||||||
| import draftCommentsMixin from '~/diffs/mixins/draft_comments'; | import draftCommentsMixin from '~/diffs/mixins/draft_comments'; | ||||||
| import InlineDraftCommentRow from '~/batch_comments/components/inline_draft_comment_row.vue'; | import InlineDraftCommentRow from '~/batch_comments/components/inline_draft_comment_row.vue'; | ||||||
| import inlineDiffTableRow from './inline_diff_table_row.vue'; | import inlineDiffTableRow from './inline_diff_table_row.vue'; | ||||||
| import inlineDiffCommentRow from './inline_diff_comment_row.vue'; | import inlineDiffCommentRow from './inline_diff_comment_row.vue'; | ||||||
| import inlineDiffExpansionRow from './inline_diff_expansion_row.vue'; | import inlineDiffExpansionRow from './inline_diff_expansion_row.vue'; | ||||||
|  | import { getCommentedLines } from '~/notes/components/multiline_comment_utils'; | ||||||
| 
 | 
 | ||||||
| export default { | export default { | ||||||
|   components: { |   components: { | ||||||
|  | @ -31,9 +32,19 @@ export default { | ||||||
|   }, |   }, | ||||||
|   computed: { |   computed: { | ||||||
|     ...mapGetters('diffs', ['commitId']), |     ...mapGetters('diffs', ['commitId']), | ||||||
|  |     ...mapState({ | ||||||
|  |       selectedCommentPosition: ({ notes }) => notes.selectedCommentPosition, | ||||||
|  |       selectedCommentPositionHover: ({ notes }) => notes.selectedCommentPositionHover, | ||||||
|  |     }), | ||||||
|     diffLinesLength() { |     diffLinesLength() { | ||||||
|       return this.diffLines.length; |       return this.diffLines.length; | ||||||
|     }, |     }, | ||||||
|  |     commentedLines() { | ||||||
|  |       return getCommentedLines( | ||||||
|  |         this.selectedCommentPosition || this.selectedCommentPositionHover, | ||||||
|  |         this.diffLines, | ||||||
|  |       ); | ||||||
|  |     }, | ||||||
|   }, |   }, | ||||||
|   userColorScheme: window.gon.user_color_scheme, |   userColorScheme: window.gon.user_color_scheme, | ||||||
| }; | }; | ||||||
|  | @ -67,6 +78,7 @@ export default { | ||||||
|           :file-path="diffFile.file_path" |           :file-path="diffFile.file_path" | ||||||
|           :line="line" |           :line="line" | ||||||
|           :is-bottom="index + 1 === diffLinesLength" |           :is-bottom="index + 1 === diffLinesLength" | ||||||
|  |           :is-commented="index >= commentedLines.startLine && index <= commentedLines.endLine" | ||||||
|         /> |         /> | ||||||
|         <inline-diff-comment-row |         <inline-diff-comment-row | ||||||
|           :key="`icr-${line.line_code || index}`" |           :key="`icr-${line.line_code || index}`" | ||||||
|  |  | ||||||
|  | @ -40,6 +40,11 @@ export default { | ||||||
|       required: false, |       required: false, | ||||||
|       default: false, |       default: false, | ||||||
|     }, |     }, | ||||||
|  |     isCommented: { | ||||||
|  |       type: Boolean, | ||||||
|  |       required: false, | ||||||
|  |       default: false, | ||||||
|  |     }, | ||||||
|   }, |   }, | ||||||
|   data() { |   data() { | ||||||
|     return { |     return { | ||||||
|  | @ -51,6 +56,8 @@ export default { | ||||||
|     ...mapGetters('diffs', ['fileLineCoverage']), |     ...mapGetters('diffs', ['fileLineCoverage']), | ||||||
|     ...mapState({ |     ...mapState({ | ||||||
|       isHighlighted(state) { |       isHighlighted(state) { | ||||||
|  |         if (this.isCommented) return true; | ||||||
|  | 
 | ||||||
|         const lineCode = |         const lineCode = | ||||||
|           (this.line.left && this.line.left.line_code) || |           (this.line.left && this.line.left.line_code) || | ||||||
|           (this.line.right && this.line.right.line_code); |           (this.line.right && this.line.right.line_code); | ||||||
|  |  | ||||||
|  | @ -1,10 +1,11 @@ | ||||||
| <script> | <script> | ||||||
| import { mapGetters } from 'vuex'; | import { mapGetters, mapState } from 'vuex'; | ||||||
| import draftCommentsMixin from '~/diffs/mixins/draft_comments'; | import draftCommentsMixin from '~/diffs/mixins/draft_comments'; | ||||||
| import ParallelDraftCommentRow from '~/batch_comments/components/parallel_draft_comment_row.vue'; | import ParallelDraftCommentRow from '~/batch_comments/components/parallel_draft_comment_row.vue'; | ||||||
| import parallelDiffTableRow from './parallel_diff_table_row.vue'; | import parallelDiffTableRow from './parallel_diff_table_row.vue'; | ||||||
| import parallelDiffCommentRow from './parallel_diff_comment_row.vue'; | import parallelDiffCommentRow from './parallel_diff_comment_row.vue'; | ||||||
| import parallelDiffExpansionRow from './parallel_diff_expansion_row.vue'; | import parallelDiffExpansionRow from './parallel_diff_expansion_row.vue'; | ||||||
|  | import { getCommentedLines } from '~/notes/components/multiline_comment_utils'; | ||||||
| 
 | 
 | ||||||
| export default { | export default { | ||||||
|   components: { |   components: { | ||||||
|  | @ -31,9 +32,19 @@ export default { | ||||||
|   }, |   }, | ||||||
|   computed: { |   computed: { | ||||||
|     ...mapGetters('diffs', ['commitId']), |     ...mapGetters('diffs', ['commitId']), | ||||||
|  |     ...mapState({ | ||||||
|  |       selectedCommentPosition: ({ notes }) => notes.selectedCommentPosition, | ||||||
|  |       selectedCommentPositionHover: ({ notes }) => notes.selectedCommentPositionHover, | ||||||
|  |     }), | ||||||
|     diffLinesLength() { |     diffLinesLength() { | ||||||
|       return this.diffLines.length; |       return this.diffLines.length; | ||||||
|     }, |     }, | ||||||
|  |     commentedLines() { | ||||||
|  |       return getCommentedLines( | ||||||
|  |         this.selectedCommentPosition || this.selectedCommentPositionHover, | ||||||
|  |         this.diffLines, | ||||||
|  |       ); | ||||||
|  |     }, | ||||||
|   }, |   }, | ||||||
|   userColorScheme: window.gon.user_color_scheme, |   userColorScheme: window.gon.user_color_scheme, | ||||||
| }; | }; | ||||||
|  | @ -69,6 +80,7 @@ export default { | ||||||
|           :file-path="diffFile.file_path" |           :file-path="diffFile.file_path" | ||||||
|           :line="line" |           :line="line" | ||||||
|           :is-bottom="index + 1 === diffLinesLength" |           :is-bottom="index + 1 === diffLinesLength" | ||||||
|  |           :is-commented="index >= commentedLines.startLine && index <= commentedLines.endLine" | ||||||
|         /> |         /> | ||||||
|         <parallel-diff-comment-row |         <parallel-diff-comment-row | ||||||
|           :key="`dcr-${line.line_code || index}`" |           :key="`dcr-${line.line_code || index}`" | ||||||
|  |  | ||||||
|  | @ -0,0 +1,7 @@ | ||||||
|  | fragment User on User { | ||||||
|  |   id | ||||||
|  |   avatarUrl | ||||||
|  |   name | ||||||
|  |   username | ||||||
|  |   webUrl | ||||||
|  | } | ||||||
|  | @ -74,7 +74,7 @@ export default { | ||||||
|     }, |     }, | ||||||
|   }, |   }, | ||||||
|   methods: { |   methods: { | ||||||
|     ...mapActions(['toggleDiscussion']), |     ...mapActions(['toggleDiscussion', 'setSelectedCommentPositionHover']), | ||||||
|     componentName(note) { |     componentName(note) { | ||||||
|       if (note.isPlaceholderNote) { |       if (note.isPlaceholderNote) { | ||||||
|         if (note.placeholderType === SYSTEM_NOTE) { |         if (note.placeholderType === SYSTEM_NOTE) { | ||||||
|  | @ -99,7 +99,11 @@ export default { | ||||||
| 
 | 
 | ||||||
| <template> | <template> | ||||||
|   <div class="discussion-notes"> |   <div class="discussion-notes"> | ||||||
|     <ul class="notes"> |     <ul | ||||||
|  |       class="notes" | ||||||
|  |       @mouseenter="setSelectedCommentPositionHover(discussion.position.line_range)" | ||||||
|  |       @mouseleave="setSelectedCommentPositionHover()" | ||||||
|  |     > | ||||||
|       <template v-if="shouldGroupReplies"> |       <template v-if="shouldGroupReplies"> | ||||||
|         <component |         <component | ||||||
|           :is="componentName(firstNote)" |           :is="componentName(firstNote)" | ||||||
|  |  | ||||||
|  | @ -1,4 +1,5 @@ | ||||||
| <script> | <script> | ||||||
|  | import { mapActions } from 'vuex'; | ||||||
| import { GlFormSelect, GlSprintf } from '@gitlab/ui'; | import { GlFormSelect, GlSprintf } from '@gitlab/ui'; | ||||||
| import { getSymbol, getLineClasses } from './multiline_comment_utils'; | import { getSymbol, getLineClasses } from './multiline_comment_utils'; | ||||||
| 
 | 
 | ||||||
|  | @ -39,8 +40,13 @@ export default { | ||||||
|       old_line: line.old_line, |       old_line: line.old_line, | ||||||
|       new_line: line.new_line, |       new_line: line.new_line, | ||||||
|     }; |     }; | ||||||
|  |     this.highlightSelection(); | ||||||
|  |   }, | ||||||
|  |   destroyed() { | ||||||
|  |     this.setSelectedCommentPosition(); | ||||||
|   }, |   }, | ||||||
|   methods: { |   methods: { | ||||||
|  |     ...mapActions(['setSelectedCommentPosition']), | ||||||
|     getSymbol({ type }) { |     getSymbol({ type }) { | ||||||
|       return getSymbol(type); |       return getSymbol(type); | ||||||
|     }, |     }, | ||||||
|  | @ -50,6 +56,16 @@ export default { | ||||||
|     updateCommentLineStart(value) { |     updateCommentLineStart(value) { | ||||||
|       this.commentLineStart = value; |       this.commentLineStart = value; | ||||||
|       this.$emit('input', value); |       this.$emit('input', value); | ||||||
|  |       this.highlightSelection(); | ||||||
|  |     }, | ||||||
|  |     highlightSelection() { | ||||||
|  |       const { line_code, new_line, old_line, type } = this.line; | ||||||
|  |       const updatedLineRange = { | ||||||
|  |         start: { ...this.commentLineStart }, | ||||||
|  |         end: { line_code, new_line, old_line, type }, | ||||||
|  |       }; | ||||||
|  | 
 | ||||||
|  |       this.setSelectedCommentPosition(updatedLineRange); | ||||||
|     }, |     }, | ||||||
|   }, |   }, | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | @ -90,3 +90,22 @@ export function formatLineRange(start, end) { | ||||||
|     end: extractProps(end), |     end: extractProps(end), | ||||||
|   }; |   }; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | export function getCommentedLines(selectedCommentPosition, diffLines) { | ||||||
|  |   if (!selectedCommentPosition) { | ||||||
|  |     // This structure simplifies the logic that consumes this result
 | ||||||
|  |     // by keeping the returned shape the same and adjusting the bounds
 | ||||||
|  |     // to something unreachable. This way our component logic stays:
 | ||||||
|  |     // "if index between start and end"
 | ||||||
|  |     return { | ||||||
|  |       startLine: diffLines.length + 1, | ||||||
|  |       endLine: diffLines.length + 1, | ||||||
|  |     }; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   const { start, end } = selectedCommentPosition; | ||||||
|  |   const startLine = diffLines.findIndex(l => l.line_code === start.line_code); | ||||||
|  |   const endLine = diffLines.findIndex(l => l.line_code === end.line_code); | ||||||
|  | 
 | ||||||
|  |   return { startLine, endLine }; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -186,6 +186,7 @@ export default { | ||||||
|     eventHub.$on('enterEditMode', ({ noteId }) => { |     eventHub.$on('enterEditMode', ({ noteId }) => { | ||||||
|       if (noteId === this.note.id) { |       if (noteId === this.note.id) { | ||||||
|         this.isEditing = true; |         this.isEditing = true; | ||||||
|  |         this.setSelectedCommentPositionHover(); | ||||||
|         this.scrollToNoteIfNeeded($(this.$el)); |         this.scrollToNoteIfNeeded($(this.$el)); | ||||||
|       } |       } | ||||||
|     }); |     }); | ||||||
|  | @ -205,9 +206,11 @@ export default { | ||||||
|       'toggleResolveNote', |       'toggleResolveNote', | ||||||
|       'scrollToNoteIfNeeded', |       'scrollToNoteIfNeeded', | ||||||
|       'updateAssignees', |       'updateAssignees', | ||||||
|  |       'setSelectedCommentPositionHover', | ||||||
|     ]), |     ]), | ||||||
|     editHandler() { |     editHandler() { | ||||||
|       this.isEditing = true; |       this.isEditing = true; | ||||||
|  |       this.setSelectedCommentPositionHover(); | ||||||
|       this.$emit('handleEdit'); |       this.$emit('handleEdit'); | ||||||
|     }, |     }, | ||||||
|     deleteHandler() { |     deleteHandler() { | ||||||
|  | @ -284,6 +287,7 @@ export default { | ||||||
|           } else { |           } else { | ||||||
|             this.isRequesting = false; |             this.isRequesting = false; | ||||||
|             this.isEditing = true; |             this.isEditing = true; | ||||||
|  |             this.setSelectedCommentPositionHover(); | ||||||
|             this.$nextTick(() => { |             this.$nextTick(() => { | ||||||
|               const msg = __('Something went wrong while editing your comment. Please try again.'); |               const msg = __('Something went wrong while editing your comment. Please try again.'); | ||||||
|               Flash(msg, 'alert', this.$el); |               Flash(msg, 'alert', this.$el); | ||||||
|  | @ -340,7 +344,7 @@ export default { | ||||||
|         :line="line" |         :line="line" | ||||||
|         :comment-line-options="commentLineOptions" |         :comment-line-options="commentLineOptions" | ||||||
|         :line-range="note.position.line_range" |         :line-range="note.position.line_range" | ||||||
|         class="gl-mb-3 gl-text-gray-700 gl-border-gray-100 gl-border-b-solid gl-border-b-1 gl-pb-3" |         class="gl-mb-3 gl-text-gray-700 gl-pb-3" | ||||||
|       /> |       /> | ||||||
|       <div |       <div | ||||||
|         v-else |         v-else | ||||||
|  |  | ||||||
|  | @ -99,6 +99,14 @@ export const setDiscussionSortDirection = ({ commit }, direction) => { | ||||||
|   commit(types.SET_DISCUSSIONS_SORT, direction); |   commit(types.SET_DISCUSSIONS_SORT, direction); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | export const setSelectedCommentPosition = ({ commit }, position) => { | ||||||
|  |   commit(types.SET_SELECTED_COMMENT_POSITION, position); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | export const setSelectedCommentPositionHover = ({ commit }, position) => { | ||||||
|  |   commit(types.SET_SELECTED_COMMENT_POSITION_HOVER, position); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| export const removeNote = ({ commit, dispatch, state }, note) => { | export const removeNote = ({ commit, dispatch, state }, note) => { | ||||||
|   const discussion = state.discussions.find(({ id }) => id === note.discussion_id); |   const discussion = state.discussions.find(({ id }) => id === note.discussion_id); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -12,6 +12,15 @@ export default () => ({ | ||||||
|     lastFetchedAt: null, |     lastFetchedAt: null, | ||||||
|     currentDiscussionId: null, |     currentDiscussionId: null, | ||||||
|     batchSuggestionsInfo: [], |     batchSuggestionsInfo: [], | ||||||
|  |     /** | ||||||
|  |      * selectedCommentPosition & selectedCommentPosition structures are the same as `position.line_range`: | ||||||
|  |      * { | ||||||
|  |      *  start: { line_code: string, new_line: number, old_line:number, type: string }, | ||||||
|  |      *  end: { line_code: string, new_line: number, old_line:number, type: string }, | ||||||
|  |      * } | ||||||
|  |      */ | ||||||
|  |     selectedCommentPosition: null, | ||||||
|  |     selectedCommentPositionHover: null, | ||||||
| 
 | 
 | ||||||
|     // View layer
 |     // View layer
 | ||||||
|     isToggleStateButtonLoading: false, |     isToggleStateButtonLoading: false, | ||||||
|  |  | ||||||
|  | @ -33,6 +33,8 @@ export const SET_EXPAND_DISCUSSIONS = 'SET_EXPAND_DISCUSSIONS'; | ||||||
| export const UPDATE_RESOLVABLE_DISCUSSIONS_COUNTS = 'UPDATE_RESOLVABLE_DISCUSSIONS_COUNTS'; | export const UPDATE_RESOLVABLE_DISCUSSIONS_COUNTS = 'UPDATE_RESOLVABLE_DISCUSSIONS_COUNTS'; | ||||||
| export const SET_CURRENT_DISCUSSION_ID = 'SET_CURRENT_DISCUSSION_ID'; | export const SET_CURRENT_DISCUSSION_ID = 'SET_CURRENT_DISCUSSION_ID'; | ||||||
| export const SET_DISCUSSIONS_SORT = 'SET_DISCUSSIONS_SORT'; | export const SET_DISCUSSIONS_SORT = 'SET_DISCUSSIONS_SORT'; | ||||||
|  | export const SET_SELECTED_COMMENT_POSITION = 'SET_SELECTED_COMMENT_POSITION'; | ||||||
|  | export const SET_SELECTED_COMMENT_POSITION_HOVER = 'SET_SELECTED_COMMENT_POSITION_HOVER'; | ||||||
| 
 | 
 | ||||||
| // Issue
 | // Issue
 | ||||||
| export const CLOSE_ISSUE = 'CLOSE_ISSUE'; | export const CLOSE_ISSUE = 'CLOSE_ISSUE'; | ||||||
|  |  | ||||||
|  | @ -308,6 +308,14 @@ export default { | ||||||
|     state.discussionSortOrder = sort; |     state.discussionSortOrder = sort; | ||||||
|   }, |   }, | ||||||
| 
 | 
 | ||||||
|  |   [types.SET_SELECTED_COMMENT_POSITION](state, position) { | ||||||
|  |     state.selectedCommentPosition = position; | ||||||
|  |   }, | ||||||
|  | 
 | ||||||
|  |   [types.SET_SELECTED_COMMENT_POSITION_HOVER](state, position) { | ||||||
|  |     state.selectedCommentPositionHover = position; | ||||||
|  |   }, | ||||||
|  | 
 | ||||||
|   [types.DISABLE_COMMENTS](state, value) { |   [types.DISABLE_COMMENTS](state, value) { | ||||||
|     state.commentsDisabled = value; |     state.commentsDisabled = value; | ||||||
|   }, |   }, | ||||||
|  |  | ||||||
|  | @ -97,6 +97,7 @@ export default { | ||||||
|               :path="entry.flatPath" |               :path="entry.flatPath" | ||||||
|               :type="entry.type" |               :type="entry.type" | ||||||
|               :url="entry.webUrl" |               :url="entry.webUrl" | ||||||
|  |               :mode="entry.mode" | ||||||
|               :submodule-tree-url="entry.treeUrl" |               :submodule-tree-url="entry.treeUrl" | ||||||
|               :lfs-oid="entry.lfsOid" |               :lfs-oid="entry.lfsOid" | ||||||
|               :loading-path="loadingPath" |               :loading-path="loadingPath" | ||||||
|  |  | ||||||
|  | @ -66,6 +66,11 @@ export default { | ||||||
|       type: String, |       type: String, | ||||||
|       required: true, |       required: true, | ||||||
|     }, |     }, | ||||||
|  |     mode: { | ||||||
|  |       type: String, | ||||||
|  |       required: false, | ||||||
|  |       default: '', | ||||||
|  |     }, | ||||||
|     type: { |     type: { | ||||||
|       type: String, |       type: String, | ||||||
|       required: true, |       required: true, | ||||||
|  | @ -140,6 +145,7 @@ export default { | ||||||
|       > |       > | ||||||
|         <file-icon |         <file-icon | ||||||
|           :file-name="fullPath" |           :file-name="fullPath" | ||||||
|  |           :file-mode="mode" | ||||||
|           :folder="isFolder" |           :folder="isFolder" | ||||||
|           :submodule="isSubmodule" |           :submodule="isSubmodule" | ||||||
|           :loading="path === loadingPath" |           :loading="path === loadingPath" | ||||||
|  |  | ||||||
|  | @ -1,6 +1,7 @@ | ||||||
| <script> | <script> | ||||||
| import { GlLoadingIcon, GlIcon } from '@gitlab/ui'; | import { GlLoadingIcon, GlIcon } from '@gitlab/ui'; | ||||||
| import getIconForFile from './file_icon/file_icon_map'; | import getIconForFile from './file_icon/file_icon_map'; | ||||||
|  | import { FILE_SYMLINK_MODE } from '../constants'; | ||||||
| 
 | 
 | ||||||
| /* This is a re-usable vue component for rendering a svg sprite | /* This is a re-usable vue component for rendering a svg sprite | ||||||
|     icon |     icon | ||||||
|  | @ -24,6 +25,11 @@ export default { | ||||||
|       type: String, |       type: String, | ||||||
|       required: true, |       required: true, | ||||||
|     }, |     }, | ||||||
|  |     fileMode: { | ||||||
|  |       type: String, | ||||||
|  |       required: false, | ||||||
|  |       default: '', | ||||||
|  |     }, | ||||||
| 
 | 
 | ||||||
|     folder: { |     folder: { | ||||||
|       type: Boolean, |       type: Boolean, | ||||||
|  | @ -60,8 +66,12 @@ export default { | ||||||
|     }, |     }, | ||||||
|   }, |   }, | ||||||
|   computed: { |   computed: { | ||||||
|  |     isSymlink() { | ||||||
|  |       return this.fileMode === FILE_SYMLINK_MODE; | ||||||
|  |     }, | ||||||
|     spriteHref() { |     spriteHref() { | ||||||
|       const iconName = this.submodule ? 'folder-git' : getIconForFile(this.fileName) || 'file'; |       const iconName = this.submodule ? 'folder-git' : getIconForFile(this.fileName) || 'file'; | ||||||
|  | 
 | ||||||
|       return `${gon.sprite_file_icons}#${iconName}`; |       return `${gon.sprite_file_icons}#${iconName}`; | ||||||
|     }, |     }, | ||||||
|     folderIconName() { |     folderIconName() { | ||||||
|  | @ -75,13 +85,11 @@ export default { | ||||||
| </script> | </script> | ||||||
| <template> | <template> | ||||||
|   <span> |   <span> | ||||||
|     <svg v-if="!loading && !folder" :class="[iconSizeClass, cssClasses]"> |     <gl-loading-icon v-if="loading" :inline="true" /> | ||||||
|       <use v-bind="{ 'xlink:href': spriteHref }" /></svg |     <gl-icon v-else-if="isSymlink" name="symlink" :size="size" /> | ||||||
|     ><gl-icon |     <svg v-else-if="!folder" :class="[iconSizeClass, cssClasses]"> | ||||||
|       v-if="!loading && folder" |       <use v-bind="{ 'xlink:href': spriteHref }" /> | ||||||
|       :name="folderIconName" |     </svg> | ||||||
|       :size="size" |     <gl-icon v-else :name="folderIconName" :size="size" class="folder-icon" /> | ||||||
|       class="folder-icon" |  | ||||||
|     /><gl-loading-icon v-if="loading" :inline="true" /> |  | ||||||
|   </span> |   </span> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
|  | @ -6,6 +6,8 @@ const INTERVALS = { | ||||||
|   day: 'day', |   day: 'day', | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | export const FILE_SYMLINK_MODE = '120000'; | ||||||
|  | 
 | ||||||
| export const timeRanges = [ | export const timeRanges = [ | ||||||
|   { |   { | ||||||
|     label: __('30 minutes'), |     label: __('30 minutes'), | ||||||
|  |  | ||||||
|  | @ -10,7 +10,7 @@ | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   .design-pin { |   .design-pin { | ||||||
|     transition: opacity 0.5s ease; |     transition: opacity $gl-transition-duration-medium $general-hover-transition-curve; | ||||||
| 
 | 
 | ||||||
|     &.inactive { |     &.inactive { | ||||||
|       @include gl-opacity-5; |       @include gl-opacity-5; | ||||||
|  | @ -108,6 +108,7 @@ | ||||||
|     .design-note { |     .design-note { | ||||||
|       padding: $gl-padding; |       padding: $gl-padding; | ||||||
|       list-style: none; |       list-style: none; | ||||||
|  |       transition: background $gl-transition-duration-medium $general-hover-transition-curve; | ||||||
| 
 | 
 | ||||||
|       a { |       a { | ||||||
|         color: inherit; |         color: inherit; | ||||||
|  | @ -150,7 +151,7 @@ | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .design-dropzone-card { | .design-dropzone-card { | ||||||
|   transition: border $general-hover-transition-duration $general-hover-transition-curve; |   transition: border $gl-transition-duration-medium $general-hover-transition-curve; | ||||||
|   color: $gl-text-color; |   color: $gl-text-color; | ||||||
| 
 | 
 | ||||||
|   &:focus, |   &:focus, | ||||||
|  |  | ||||||
|  | @ -92,3 +92,5 @@ module Resolvers | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  | 
 | ||||||
|  | Resolvers::IssuesResolver.prepend_if_ee('::EE::Resolvers::IssuesResolver') | ||||||
|  |  | ||||||
|  | @ -0,0 +1,13 @@ | ||||||
|  | # frozen_string_literal: true | ||||||
|  | 
 | ||||||
|  | module Types | ||||||
|  |   # rubocop: disable Graphql/AuthorizeTypes | ||||||
|  |   class IssueConnectionType < GraphQL::Types::Relay::BaseConnection | ||||||
|  |     field :count, Integer, null: false, | ||||||
|  |           description: 'Total count of collection' | ||||||
|  | 
 | ||||||
|  |     def count | ||||||
|  |       object.items.size | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | end | ||||||
|  | @ -4,6 +4,8 @@ module Types | ||||||
|   class IssueType < BaseObject |   class IssueType < BaseObject | ||||||
|     graphql_name 'Issue' |     graphql_name 'Issue' | ||||||
| 
 | 
 | ||||||
|  |     connection_type_class(Types::IssueConnectionType) | ||||||
|  | 
 | ||||||
|     implements(Types::Notes::NoteableType) |     implements(Types::Notes::NoteableType) | ||||||
| 
 | 
 | ||||||
|     authorize :read_issue |     authorize :read_issue | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| - type = local_assigns.fetch(:type) | - type = local_assigns.fetch(:type) | ||||||
| - bulk_issue_health_status_flag = Feature.enabled?(:bulk_update_health_status, @project&.group) && type == :issues && @project&.group&.feature_available?(:issuable_health_status) | - bulk_issue_health_status_flag = Feature.enabled?(:bulk_update_health_status, @project&.group, default_enabled: true) && type == :issues && @project&.group&.feature_available?(:issuable_health_status) | ||||||
| - epic_bulk_edit_flag = @project&.group&.feature_available?(:epics) && type == :issues | - epic_bulk_edit_flag = @project&.group&.feature_available?(:epics) && type == :issues | ||||||
| 
 | 
 | ||||||
| %aside.issues-bulk-update.js-right-sidebar.right-sidebar{ "aria-live" => "polite", data: { 'signed-in': current_user.present? } } | %aside.issues-bulk-update.js-right-sidebar.right-sidebar{ "aria-live" => "polite", data: { 'signed-in': current_user.present? } } | ||||||
|  |  | ||||||
|  | @ -0,0 +1,5 @@ | ||||||
|  | --- | ||||||
|  | title: Improve animations of design note selection in design management | ||||||
|  | merge_request: 36927 | ||||||
|  | author: | ||||||
|  | type: changed | ||||||
|  | @ -0,0 +1,5 @@ | ||||||
|  | --- | ||||||
|  | title: Highlight commented rows | ||||||
|  | merge_request: 34432 | ||||||
|  | author: | ||||||
|  | type: added | ||||||
|  | @ -0,0 +1,5 @@ | ||||||
|  | --- | ||||||
|  | title: Show symlink icon in repository browser | ||||||
|  | merge_request: 36524 | ||||||
|  | author: | ||||||
|  | type: fixed | ||||||
|  | @ -10,4 +10,7 @@ link: https://docs.gitlab.com/ee/development/documentation/styleguide.html#alert | ||||||
| level: error | level: error | ||||||
| scope: raw | scope: raw | ||||||
| raw: | raw: | ||||||
|   - 'NOTE: \*\*[^:]*\*\*' |   - '((NOTE|TIP|CAUTION|DANGER): \*\*[^:]*\*\*)|' | ||||||
|  |   - '((NOTE: \*\*NOTE:\*\*)|(TIP: \*\*TIP:\*\*)|(CAUTION: \*\*CAUTION:\*\*)|(DANGER: \*\*DANGER:\*\*))|' | ||||||
|  |   - '((NOTE: \*\*note:\*\*)|(TIP: \*\*tip:\*\*)|(CAUTION: \*\*caution:\*\*)|(DANGER: \*\*danger:\*\*))|' | ||||||
|  |   - '((NOTE|TIP|CAUTION|DANGER): \*\*.*\*\*.+)' | ||||||
|  |  | ||||||
|  | @ -62,7 +62,8 @@ JWT will provide you with a secret key for you to use. | ||||||
|      } |      } | ||||||
|    ``` |    ``` | ||||||
| 
 | 
 | ||||||
|    NOTE: **Note:** For more information on each configuration option refer to |    NOTE: **Note:** | ||||||
|  |    For more information on each configuration option refer to | ||||||
|    the [OmniAuth JWT usage documentation](https://github.com/mbleigh/omniauth-jwt#usage). |    the [OmniAuth JWT usage documentation](https://github.com/mbleigh/omniauth-jwt#usage). | ||||||
| 
 | 
 | ||||||
| 1. Change `YOUR_APP_SECRET` to the client secret and set `auth_url` to your redirect URL. | 1. Change `YOUR_APP_SECRET` to the client secret and set `auth_url` to your redirect URL. | ||||||
|  |  | ||||||
|  | @ -34,7 +34,8 @@ The steps below cover: | ||||||
|    'Entire domain (GitLab)' or 'Selected organizational units' for both 'Verify user |    'Entire domain (GitLab)' or 'Selected organizational units' for both 'Verify user | ||||||
|    credentials' and 'Read user information'. Select 'Add LDAP Client' |    credentials' and 'Read user information'. Select 'Add LDAP Client' | ||||||
| 
 | 
 | ||||||
|    TIP: **Tip:** If you plan to use GitLab [LDAP Group Sync](index.md#group-sync-starter-only) |    TIP: **Tip:** | ||||||
|  |    If you plan to use GitLab [LDAP Group Sync](index.md#group-sync-starter-only) | ||||||
|    , turn on 'Read group information'. |    , turn on 'Read group information'. | ||||||
| 
 | 
 | ||||||
|     |     | ||||||
|  |  | ||||||
|  | @ -357,7 +357,7 @@ GitLab syncs the `admin_group`. | ||||||
| 
 | 
 | ||||||
| #### Sync all groups **(STARTER ONLY)** | #### Sync all groups **(STARTER ONLY)** | ||||||
| 
 | 
 | ||||||
| NOTE: **NOTE:** | NOTE: **Note:** | ||||||
| To sync all groups manually when debugging is unnecessary, [use the Rake | To sync all groups manually when debugging is unnecessary, [use the Rake | ||||||
| task](../../raketasks/ldap.md#run-a-group-sync-starter-only) instead. | task](../../raketasks/ldap.md#run-a-group-sync-starter-only) instead. | ||||||
| 
 | 
 | ||||||
|  | @ -653,7 +653,7 @@ adfind -h ad.example.org:636 -ssl -u "CN=GitLabSRV,CN=Users,DC=GitLab,DC=org" -u | ||||||
| 
 | 
 | ||||||
| ### Rails console | ### Rails console | ||||||
| 
 | 
 | ||||||
| CAUTION: **CAUTION:** | CAUTION: **Caution:** | ||||||
| Please note that it is very easy to create, read, modify, and destroy data on the | Please note that it is very easy to create, read, modify, and destroy data on the | ||||||
| rails console, so please be sure to run commands exactly as listed. | rails console, so please be sure to run commands exactly as listed. | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -32,13 +32,15 @@ To bring the former **primary** node up to date: | ||||||
|    sudo gitlab-ctl start |    sudo gitlab-ctl start | ||||||
|    ``` |    ``` | ||||||
| 
 | 
 | ||||||
|    NOTE: **Note:** If you [disabled the **primary** node permanently](index.md#step-2-permanently-disable-the-primary-node), |    NOTE: **Note:** | ||||||
|  |    If you [disabled the **primary** node permanently](index.md#step-2-permanently-disable-the-primary-node), | ||||||
|    you need to undo those steps now. For Debian/Ubuntu you just need to run |    you need to undo those steps now. For Debian/Ubuntu you just need to run | ||||||
|    `sudo systemctl enable gitlab-runsvdir`. For CentOS 6, you need to install |    `sudo systemctl enable gitlab-runsvdir`. For CentOS 6, you need to install | ||||||
|    the GitLab instance from scratch and set it up as a **secondary** node by |    the GitLab instance from scratch and set it up as a **secondary** node by | ||||||
|    following [Setup instructions](../replication/index.md#setup-instructions). In this case, you don't need to follow the next step. |    following [Setup instructions](../replication/index.md#setup-instructions). In this case, you don't need to follow the next step. | ||||||
| 
 | 
 | ||||||
|    NOTE: **Note:** If you [changed the DNS records](index.md#step-4-optional-updating-the-primary-domain-dns-record) |    NOTE: **Note:** | ||||||
|  |    If you [changed the DNS records](index.md#step-4-optional-updating-the-primary-domain-dns-record) | ||||||
|    for this node during disaster recovery procedure you may need to [block |    for this node during disaster recovery procedure you may need to [block | ||||||
|    all the writes to this node](planned_failover.md#prevent-updates-to-the-primary-node) |    all the writes to this node](planned_failover.md#prevent-updates-to-the-primary-node) | ||||||
|    during this procedure. |    during this procedure. | ||||||
|  |  | ||||||
|  | @ -130,7 +130,8 @@ There is an [issue where support is being discussed](https://gitlab.com/gitlab-o | ||||||
|    connect to the **primary** node's database. For this reason, we need the address of |    connect to the **primary** node's database. For this reason, we need the address of | ||||||
|    each node. |    each node. | ||||||
| 
 | 
 | ||||||
|    NOTE: **Note:** For external PostgreSQL instances, see [additional instructions](external_database.md). |    NOTE: **Note:** | ||||||
|  |    For external PostgreSQL instances, see [additional instructions](external_database.md). | ||||||
| 
 | 
 | ||||||
|    If you are using a cloud provider, you can lookup the addresses for each |    If you are using a cloud provider, you can lookup the addresses for each | ||||||
|    Geo node through your cloud provider's management console. |    Geo node through your cloud provider's management console. | ||||||
|  | @ -419,7 +420,8 @@ data before running `pg_basebackup`. | ||||||
| 
 | 
 | ||||||
| 1. Execute the command below to start a backup/restore and begin the replication | 1. Execute the command below to start a backup/restore and begin the replication | ||||||
| 
 | 
 | ||||||
|    CAUTION: **Warning:** Each Geo **secondary** node must have its own unique replication slot name. |    CAUTION: **Warning:** | ||||||
|  |    Each Geo **secondary** node must have its own unique replication slot name. | ||||||
|    Using the same slot name between two secondaries will break PostgreSQL replication. |    Using the same slot name between two secondaries will break PostgreSQL replication. | ||||||
| 
 | 
 | ||||||
|    ```shell |    ```shell | ||||||
|  |  | ||||||
|  | @ -126,7 +126,7 @@ these epics/issues: | ||||||
| - [Unreplicated Data Types](https://gitlab.com/groups/gitlab-org/-/epics/893) | - [Unreplicated Data Types](https://gitlab.com/groups/gitlab-org/-/epics/893) | ||||||
| - [Verify all replicated data](https://gitlab.com/groups/gitlab-org/-/epics/1430) | - [Verify all replicated data](https://gitlab.com/groups/gitlab-org/-/epics/1430) | ||||||
| 
 | 
 | ||||||
| DANGER: **DANGER** | DANGER: **Danger:** | ||||||
| Features not on this list, or with **No** in the **Replicated** column, | Features not on this list, or with **No** in the **Replicated** column, | ||||||
| are not replicated on the **secondary** node. Failing over without manually | are not replicated on the **secondary** node. Failing over without manually | ||||||
| replicating data from those features will cause the data to be **lost**. | replicating data from those features will cause the data to be **lost**. | ||||||
|  |  | ||||||
|  | @ -270,7 +270,8 @@ the tracking database on port 5432. | ||||||
|    query_exec "GRANT USAGE ON FOREIGN SERVER gitlab_secondary TO ${GEO_DB_USER};" |    query_exec "GRANT USAGE ON FOREIGN SERVER gitlab_secondary TO ${GEO_DB_USER};" | ||||||
|    ``` |    ``` | ||||||
| 
 | 
 | ||||||
|    NOTE: **Note:** The script template above uses `gitlab-psql` as it's intended to be executed from the Geo machine, |    NOTE: **Note:** | ||||||
|  |    The script template above uses `gitlab-psql` as it's intended to be executed from the Geo machine, | ||||||
|    but you can change it to `psql` and run it from any machine that has access to the database. We also recommend using |    but you can change it to `psql` and run it from any machine that has access to the database. We also recommend using | ||||||
|    `psql` for AWS RDS. |    `psql` for AWS RDS. | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -90,7 +90,8 @@ The following steps enable a GitLab cluster to serve as the **primary** node. | ||||||
| 
 | 
 | ||||||
| After making these changes, [reconfigure GitLab](../../restart_gitlab.md#omnibus-gitlab-reconfigure) so the changes take effect. | After making these changes, [reconfigure GitLab](../../restart_gitlab.md#omnibus-gitlab-reconfigure) so the changes take effect. | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** PostgreSQL and Redis should have already been disabled on the | NOTE: **Note:** | ||||||
|  | PostgreSQL and Redis should have already been disabled on the | ||||||
| application servers, and connections from the application servers to those | application servers, and connections from the application servers to those | ||||||
| services on the backend servers configured, during normal GitLab multi-node set up. See | services on the backend servers configured, during normal GitLab multi-node set up. See | ||||||
| multi-node configuration documentation for | multi-node configuration documentation for | ||||||
|  | @ -141,7 +142,8 @@ recommended. | ||||||
| 
 | 
 | ||||||
| ### Step 2: Configure the main read-only replica PostgreSQL database on the **secondary** node | ### Step 2: Configure the main read-only replica PostgreSQL database on the **secondary** node | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** The following documentation assumes the database will be run on | NOTE: **Note:** | ||||||
|  | The following documentation assumes the database will be run on | ||||||
| a single node only. Multi-node PostgreSQL on **secondary** nodes is | a single node only. Multi-node PostgreSQL on **secondary** nodes is | ||||||
| [not currently supported](https://gitlab.com/groups/gitlab-org/-/epics/2536). | [not currently supported](https://gitlab.com/groups/gitlab-org/-/epics/2536). | ||||||
| 
 | 
 | ||||||
|  | @ -206,7 +208,8 @@ If using an external PostgreSQL instance, refer also to | ||||||
| 
 | 
 | ||||||
| ### Step 3: Configure the tracking database on the **secondary** node | ### Step 3: Configure the tracking database on the **secondary** node | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** This documentation assumes the tracking database will be run on | NOTE: **Note:** | ||||||
|  | This documentation assumes the tracking database will be run on | ||||||
| only a single machine, rather than as a PostgreSQL cluster. | only a single machine, rather than as a PostgreSQL cluster. | ||||||
| 
 | 
 | ||||||
| Configure the tracking database. | Configure the tracking database. | ||||||
|  |  | ||||||
|  | @ -452,13 +452,13 @@ to start again from scratch, there are a few steps that can help you: | ||||||
|    chown git:git /var/opt/gitlab/git-data/repositories |    chown git:git /var/opt/gitlab/git-data/repositories | ||||||
|    ``` |    ``` | ||||||
| 
 | 
 | ||||||
|    TIP: **Tip** |    TIP: **Tip:** | ||||||
|    You may want to remove the `/var/opt/gitlab/git-data/repositories.old` in the future |    You may want to remove the `/var/opt/gitlab/git-data/repositories.old` in the future | ||||||
|    as soon as you confirmed that you don't need it anymore, to save disk space. |    as soon as you confirmed that you don't need it anymore, to save disk space. | ||||||
| 
 | 
 | ||||||
| 1. _(Optional)_ Rename other data folders and create new ones | 1. _(Optional)_ Rename other data folders and create new ones | ||||||
| 
 | 
 | ||||||
|    CAUTION: **Caution**: |    CAUTION: **Caution:** | ||||||
|    You may still have files on the **secondary** node that have been removed from **primary** node but |    You may still have files on the **secondary** node that have been removed from **primary** node but | ||||||
|    removal have not been reflected. If you skip this step, they will never be removed |    removal have not been reflected. If you skip this step, they will never be removed | ||||||
|    from this Geo node. |    from this Geo node. | ||||||
|  | @ -701,7 +701,8 @@ To check the configuration: | ||||||
|    Description          | |    Description          | | ||||||
|    ``` |    ``` | ||||||
| 
 | 
 | ||||||
|    NOTE: **Note:** Pay particular attention to the host and port under |    NOTE: **Note:** | ||||||
|  |    Pay particular attention to the host and port under | ||||||
|    FDW options. That configuration should point to the Geo secondary |    FDW options. That configuration should point to the Geo secondary | ||||||
|    database. |    database. | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -36,7 +36,8 @@ different steps. | ||||||
| 
 | 
 | ||||||
| ## General update steps | ## General update steps | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** These general update steps are not intended for [high-availability deployments](https://docs.gitlab.com/omnibus/update/README.html#multi-node--ha-deployment), and will cause downtime. If you want to avoid downtime, consider using [zero downtime updates](https://docs.gitlab.com/omnibus/update/README.html#zero-downtime-updates). | NOTE: **Note:** | ||||||
|  | These general update steps are not intended for [high-availability deployments](https://docs.gitlab.com/omnibus/update/README.html#multi-node--ha-deployment), and will cause downtime. If you want to avoid downtime, consider using [zero downtime updates](https://docs.gitlab.com/omnibus/update/README.html#zero-downtime-updates). | ||||||
| 
 | 
 | ||||||
| To update the Geo nodes when a new GitLab version is released, update **primary** | To update the Geo nodes when a new GitLab version is released, update **primary** | ||||||
| and all **secondary** nodes: | and all **secondary** nodes: | ||||||
|  |  | ||||||
|  | @ -136,7 +136,8 @@ We will note in the instructions below where these secrets are required. | ||||||
| 
 | 
 | ||||||
| ### PostgreSQL | ### PostgreSQL | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** do not store the GitLab application database and the Praefect | NOTE: **Note:** | ||||||
|  | do not store the GitLab application database and the Praefect | ||||||
| database on the same PostgreSQL server if using | database on the same PostgreSQL server if using | ||||||
| [Geo](../geo/replication/index.md). The replication state is internal to each instance | [Geo](../geo/replication/index.md). The replication state is internal to each instance | ||||||
| of GitLab and should not be replicated. | of GitLab and should not be replicated. | ||||||
|  | @ -286,7 +287,8 @@ application server, or a Gitaly node. | ||||||
|    so we use `default` here as well. This cluster has three Gitaly nodes `gitaly-1`, |    so we use `default` here as well. This cluster has three Gitaly nodes `gitaly-1`, | ||||||
|    `gitaly-2`, and `gitaly-3`, which will be replicas of each other. |    `gitaly-2`, and `gitaly-3`, which will be replicas of each other. | ||||||
| 
 | 
 | ||||||
|    CAUTION: **CAUTION:** If you have data on an already existing storage called |    CAUTION: **Caution:** | ||||||
|  |    If you have data on an already existing storage called | ||||||
|    `default`, you should configure the virtual storage with another name and |    `default`, you should configure the virtual storage with another name and | ||||||
|    [migrate the data to the Praefect storage](#migrating-existing-repositories-to-praefect) |    [migrate the data to the Praefect storage](#migrating-existing-repositories-to-praefect) | ||||||
|    afterwards. |    afterwards. | ||||||
|  | @ -300,7 +302,8 @@ application server, or a Gitaly node. | ||||||
|    More Gitaly nodes can be added to the cluster to increase the number of |    More Gitaly nodes can be added to the cluster to increase the number of | ||||||
|    replicas. More clusters can also be added for very large GitLab instances. |    replicas. More clusters can also be added for very large GitLab instances. | ||||||
| 
 | 
 | ||||||
|    NOTE: **Note:** The `gitaly-1` node is currently denoted the primary. This |    NOTE: **Note:** | ||||||
|  |    The `gitaly-1` node is currently denoted the primary. This | ||||||
|    can be used to manually fail from one node to another. This will be removed |    can be used to manually fail from one node to another. This will be removed | ||||||
|    in the [future](https://gitlab.com/gitlab-org/gitaly/-/issues/2634). |    in the [future](https://gitlab.com/gitlab-org/gitaly/-/issues/2634). | ||||||
| 
 | 
 | ||||||
|  | @ -493,7 +496,8 @@ To configure Praefect with TLS: | ||||||
| 
 | 
 | ||||||
| ### Gitaly | ### Gitaly | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** Complete these steps for **each** Gitaly node. | NOTE: **Note:** | ||||||
|  | Complete these steps for **each** Gitaly node. | ||||||
| 
 | 
 | ||||||
| To complete this section you will need: | To complete this section you will need: | ||||||
| 
 | 
 | ||||||
|  | @ -700,7 +704,8 @@ Particular attention should be shown to: | ||||||
| 1. Disable the default Gitaly service running on the GitLab host. It won't be needed | 1. Disable the default Gitaly service running on the GitLab host. It won't be needed | ||||||
|    as GitLab will connect to the configured cluster. |    as GitLab will connect to the configured cluster. | ||||||
| 
 | 
 | ||||||
|    CAUTION: **CAUTION** If you have existing data stored on the default Gitaly storage, |    CAUTION: **Caution:** | ||||||
|  |    If you have existing data stored on the default Gitaly storage, | ||||||
|    you should [migrate the data your Praefect storage first](#migrating-existing-repositories-to-praefect). |    you should [migrate the data your Praefect storage first](#migrating-existing-repositories-to-praefect). | ||||||
| 
 | 
 | ||||||
|    ```ruby |    ```ruby | ||||||
|  | @ -966,7 +971,8 @@ Virtual storage: default | ||||||
| 
 | 
 | ||||||
| Currently `dataloss` only considers a repository up to date if it has been directly replicated to from the previous write-enabled primary. While reconciling from an up to date secondary can recover the data, this is not visible in the data loss report. This is due for improvement via [Gitaly#2866](https://gitlab.com/gitlab-org/gitaly/-/issues/2866). | Currently `dataloss` only considers a repository up to date if it has been directly replicated to from the previous write-enabled primary. While reconciling from an up to date secondary can recover the data, this is not visible in the data loss report. This is due for improvement via [Gitaly#2866](https://gitlab.com/gitlab-org/gitaly/-/issues/2866). | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** `dataloss` is still in beta and the output format is subject to change. | NOTE: **Note:** | ||||||
|  | `dataloss` is still in beta and the output format is subject to change. | ||||||
| 
 | 
 | ||||||
| ### Checking repository checksums | ### Checking repository checksums | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -113,14 +113,14 @@ Nodes running GitLab-bundled Consul should be: | ||||||
| - Members of a healthy cluster prior to upgrading the Omnibus GitLab package. | - Members of a healthy cluster prior to upgrading the Omnibus GitLab package. | ||||||
| - Upgraded one node at a time. | - Upgraded one node at a time. | ||||||
| 
 | 
 | ||||||
| NOTE: **NOTE:** | NOTE: **Note:** | ||||||
| Running `curl http://127.0.0.1:8500/v1/health/state/critical` from any Consul node will identify existing health issues in the cluster. The command will return an empty array if the cluster is healthy. | Running `curl http://127.0.0.1:8500/v1/health/state/critical` from any Consul node will identify existing health issues in the cluster. The command will return an empty array if the cluster is healthy. | ||||||
| 
 | 
 | ||||||
| Consul clusters communicate using the raft protocol. If the current leader goes offline, there needs to be a leader election. A leader node must exist to facilitate synchronization across the cluster. If too many nodes go offline at the same time, the cluster will lose quorum and not elect a leader due to [broken consensus](https://www.consul.io/docs/internals/consensus.html). | Consul clusters communicate using the raft protocol. If the current leader goes offline, there needs to be a leader election. A leader node must exist to facilitate synchronization across the cluster. If too many nodes go offline at the same time, the cluster will lose quorum and not elect a leader due to [broken consensus](https://www.consul.io/docs/internals/consensus.html). | ||||||
| 
 | 
 | ||||||
| Consult the [troubleshooting section](#troubleshooting) if the cluster is not able to recover after the upgrade. The [outage recovery](#outage-recovery) may be of particular interest. | Consult the [troubleshooting section](#troubleshooting) if the cluster is not able to recover after the upgrade. The [outage recovery](#outage-recovery) may be of particular interest. | ||||||
| 
 | 
 | ||||||
| NOTE: **NOTE:** | NOTE: **Note:** | ||||||
| GitLab only uses Consul to store transient data that is easily regenerated. If the bundled Consul was not used by any process other than GitLab itself, then [rebuilding the cluster from scratch](#recreate-from-scratch) is fine. | GitLab only uses Consul to store transient data that is easily regenerated. If the bundled Consul was not used by any process other than GitLab itself, then [rebuilding the cluster from scratch](#recreate-from-scratch) is fine. | ||||||
| 
 | 
 | ||||||
| ## Troubleshooting | ## Troubleshooting | ||||||
|  |  | ||||||
|  | @ -6,11 +6,13 @@ type: reference | ||||||
| 
 | 
 | ||||||
| This section describes how to configure the GitLab application (Rails) component. | This section describes how to configure the GitLab application (Rails) component. | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** There is some additional configuration near the bottom for | NOTE: **Note:** | ||||||
|  | There is some additional configuration near the bottom for | ||||||
| additional GitLab application servers. It's important to read and understand | additional GitLab application servers. It's important to read and understand | ||||||
| these additional steps before proceeding with GitLab installation. | these additional steps before proceeding with GitLab installation. | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** [Cloud Object Storage service](object_storage.md) with [Gitaly](gitaly.md) | NOTE: **Note:** | ||||||
|  | [Cloud Object Storage service](object_storage.md) with [Gitaly](gitaly.md) | ||||||
| is recommended over [NFS](nfs.md) wherever possible for improved performance. | is recommended over [NFS](nfs.md) wherever possible for improved performance. | ||||||
| 
 | 
 | ||||||
| 1. If necessary, install the NFS client utility packages using the following | 1. If necessary, install the NFS client utility packages using the following | ||||||
|  | @ -79,19 +81,22 @@ is recommended over [NFS](nfs.md) wherever possible for improved performance. | ||||||
| 
 | 
 | ||||||
| 1. [Enable monitoring](#enable-monitoring) | 1. [Enable monitoring](#enable-monitoring) | ||||||
| 
 | 
 | ||||||
|    NOTE: **Note:** To maintain uniformity of links across HA clusters, the `external_url` |    NOTE: **Note:** | ||||||
|  |    To maintain uniformity of links across HA clusters, the `external_url` | ||||||
|    on the first application server as well as the additional application |    on the first application server as well as the additional application | ||||||
|    servers should point to the external URL that users will use to access GitLab. |    servers should point to the external URL that users will use to access GitLab. | ||||||
|    In a typical HA setup, this will be the URL of the load balancer which will |    In a typical HA setup, this will be the URL of the load balancer which will | ||||||
|    route traffic to all GitLab application servers in the HA cluster. |    route traffic to all GitLab application servers in the HA cluster. | ||||||
| 
 | 
 | ||||||
|    NOTE: **Note:** When you specify `https` in the `external_url`, as in the example |    NOTE: **Note:** | ||||||
|  |    When you specify `https` in the `external_url`, as in the example | ||||||
|    above, GitLab assumes you have SSL certificates in `/etc/gitlab/ssl/`. If |    above, GitLab assumes you have SSL certificates in `/etc/gitlab/ssl/`. If | ||||||
|    certificates are not present, NGINX will fail to start. See |    certificates are not present, NGINX will fail to start. See | ||||||
|    [NGINX documentation](https://docs.gitlab.com/omnibus/settings/nginx.html#enable-https) |    [NGINX documentation](https://docs.gitlab.com/omnibus/settings/nginx.html#enable-https) | ||||||
|    for more information. |    for more information. | ||||||
| 
 | 
 | ||||||
|    NOTE: **Note:** It is best to set the `uid` and `gid`s prior to the initial reconfigure |    NOTE: **Note:** | ||||||
|  |    It is best to set the `uid` and `gid`s prior to the initial reconfigure | ||||||
|    of GitLab. Omnibus will not recursively `chown` directories if set after the initial reconfigure. |    of GitLab. Omnibus will not recursively `chown` directories if set after the initial reconfigure. | ||||||
| 
 | 
 | ||||||
| ## First GitLab application server | ## First GitLab application server | ||||||
|  | @ -133,7 +138,8 @@ need some extra configuration. | ||||||
| 
 | 
 | ||||||
| 1. Run `sudo gitlab-ctl reconfigure` to compile the configuration. | 1. Run `sudo gitlab-ctl reconfigure` to compile the configuration. | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** You will need to restart the GitLab applications nodes after an update has occurred and database | NOTE: **Note:** | ||||||
|  | You will need to restart the GitLab applications nodes after an update has occurred and database | ||||||
| migrations performed. | migrations performed. | ||||||
| 
 | 
 | ||||||
| ## Enable Monitoring | ## Enable Monitoring | ||||||
|  |  | ||||||
|  | @ -12,7 +12,8 @@ From GitLab 13.0, using NFS for Git repositories is deprecated. In GitLab 14.0, | ||||||
| support for NFS for Git repositories is scheduled to be removed. Upgrade to | support for NFS for Git repositories is scheduled to be removed. Upgrade to | ||||||
| [Gitaly Cluster](../gitaly/praefect.md) as soon as possible. | [Gitaly Cluster](../gitaly/praefect.md) as soon as possible. | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** Filesystem performance has a big impact on overall GitLab | NOTE: **Note:** | ||||||
|  | Filesystem performance has a big impact on overall GitLab | ||||||
| performance, especially for actions that read or write to Git repositories. See | performance, especially for actions that read or write to Git repositories. See | ||||||
| [Filesystem Performance Benchmarking](../operations/filesystem_benchmarking.md) | [Filesystem Performance Benchmarking](../operations/filesystem_benchmarking.md) | ||||||
| for steps to test filesystem performance. | for steps to test filesystem performance. | ||||||
|  | @ -105,7 +106,8 @@ administrators to keep NFS server delegation disabled. | ||||||
| 
 | 
 | ||||||
| #### Improving NFS performance with Unicorn | #### Improving NFS performance with Unicorn | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** From GitLab 12.1, it will automatically be detected if Rugged can and should be used per storage. | NOTE: **Note:** | ||||||
|  | From GitLab 12.1, it will automatically be detected if Rugged can and should be used per storage. | ||||||
| 
 | 
 | ||||||
| If you previously enabled Rugged using the feature flag, you will need to unset the feature flag by using: | If you previously enabled Rugged using the feature flag, you will need to unset the feature flag by using: | ||||||
| 
 | 
 | ||||||
|  | @ -117,7 +119,8 @@ If the Rugged feature flag is explicitly set to either true or false, GitLab wil | ||||||
| 
 | 
 | ||||||
| #### Improving NFS performance with Puma | #### Improving NFS performance with Puma | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** From GitLab 12.7, Rugged auto-detection is disabled if Puma thread count is greater than 1. | NOTE: **Note:** | ||||||
|  | From GitLab 12.7, Rugged auto-detection is disabled if Puma thread count is greater than 1. | ||||||
| 
 | 
 | ||||||
| If you want to use Rugged with Puma, it is recommended to [set Puma thread count to 1](https://docs.gitlab.com/omnibus/settings/puma.html#puma-settings). | If you want to use Rugged with Puma, it is recommended to [set Puma thread count to 1](https://docs.gitlab.com/omnibus/settings/puma.html#puma-settings). | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -94,7 +94,8 @@ you want using steps 1 and 2 from the GitLab downloads page. | ||||||
| 
 | 
 | ||||||
| 1. Run `gitlab-ctl reconfigure`. | 1. Run `gitlab-ctl reconfigure`. | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** You will need to restart the Sidekiq nodes after an update has occurred and database | NOTE: **Note:** | ||||||
|  | You will need to restart the Sidekiq nodes after an update has occurred and database | ||||||
| migrations performed. | migrations performed. | ||||||
| 
 | 
 | ||||||
| ## Example configuration | ## Example configuration | ||||||
|  |  | ||||||
|  | @ -83,7 +83,8 @@ Plan.default.actual_limits.update!(project_hooks: 100) | ||||||
| Plan.default.actual_limits.update!(group_hooks: 100) | Plan.default.actual_limits.update!(group_hooks: 100) | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** Set the limit to `0` to disable it. | NOTE: **Note:** | ||||||
|  | Set the limit to `0` to disable it. | ||||||
| 
 | 
 | ||||||
| ## Incoming emails from auto-responders | ## Incoming emails from auto-responders | ||||||
| 
 | 
 | ||||||
|  | @ -120,7 +121,8 @@ Plan.default.actual_limits.update!(offset_pagination_limit: 10000) | ||||||
| 
 | 
 | ||||||
| - **Default offset pagination limit:** 50000 | - **Default offset pagination limit:** 50000 | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** Set the limit to `0` to disable it. | NOTE: **Note:** | ||||||
|  | Set the limit to `0` to disable it. | ||||||
| 
 | 
 | ||||||
| ## CI/CD limits | ## CI/CD limits | ||||||
| 
 | 
 | ||||||
|  | @ -152,7 +154,8 @@ To set this limit on a self-managed installation, run the following in the | ||||||
| Plan.default.actual_limits.update!(ci_active_jobs: 500) | Plan.default.actual_limits.update!(ci_active_jobs: 500) | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** Set the limit to `0` to disable it. | NOTE: **Note:** | ||||||
|  | Set the limit to `0` to disable it. | ||||||
| 
 | 
 | ||||||
| ### Number of CI/CD subscriptions to a project | ### Number of CI/CD subscriptions to a project | ||||||
| 
 | 
 | ||||||
|  | @ -174,7 +177,8 @@ To set this limit on a self-managed installation, run the following in the | ||||||
| Plan.default.actual_limits.update!(ci_project_subscriptions: 500) | Plan.default.actual_limits.update!(ci_project_subscriptions: 500) | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** Set the limit to `0` to disable it. | NOTE: **Note:** | ||||||
|  | Set the limit to `0` to disable it. | ||||||
| 
 | 
 | ||||||
| ### Number of pipeline schedules | ### Number of pipeline schedules | ||||||
| 
 | 
 | ||||||
|  | @ -306,7 +310,8 @@ characters and the rest will not be indexed and hence will not be searchable. | ||||||
| This limit can be configured for self-managed installations when [enabling | This limit can be configured for self-managed installations when [enabling | ||||||
| Elasticsearch](../integration/elasticsearch.md#enabling-elasticsearch). | Elasticsearch](../integration/elasticsearch.md#enabling-elasticsearch). | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** Set the limit to `0` to disable it. | NOTE: **Note:** | ||||||
|  | Set the limit to `0` to disable it. | ||||||
| 
 | 
 | ||||||
| ## Wiki limits | ## Wiki limits | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -130,7 +130,8 @@ that, login with an Admin account and do following: | ||||||
| - Check **Enable PlantUML** checkbox. | - Check **Enable PlantUML** checkbox. | ||||||
| - Set the PlantUML instance as `https://gitlab.example.com/-/plantuml/`. | - Set the PlantUML instance as `https://gitlab.example.com/-/plantuml/`. | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** If you are using a PlantUML server running v1.2020.9 and | NOTE: **Note:** | ||||||
|  | If you are using a PlantUML server running v1.2020.9 and | ||||||
| above (for example, [plantuml.com](https://plantuml.com)), set the `PLANTUML_ENCODING` | above (for example, [plantuml.com](https://plantuml.com)), set the `PLANTUML_ENCODING` | ||||||
| environment variable to enable the `deflate` compression. On Omnibus, | environment variable to enable the `deflate` compression. On Omnibus, | ||||||
| this can be done set in `/etc/gitlab.rb`: | this can be done set in `/etc/gitlab.rb`: | ||||||
|  |  | ||||||
|  | @ -45,7 +45,8 @@ detail below. | ||||||
| 
 | 
 | ||||||
| ## Enabling and disabling terminal support | ## Enabling and disabling terminal support | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** AWS Elastic Load Balancers (ELBs) do not support web sockets. | NOTE: **Note:** | ||||||
|  | AWS Elastic Load Balancers (ELBs) do not support web sockets. | ||||||
| AWS Application Load Balancers (ALBs) must be used if you want web terminals | AWS Application Load Balancers (ALBs) must be used if you want web terminals | ||||||
| to work. See [AWS Elastic Load Balancing Product Comparison](https://aws.amazon.com/elasticloadbalancing/features/#compare) | to work. See [AWS Elastic Load Balancing Product Comparison](https://aws.amazon.com/elasticloadbalancing/features/#compare) | ||||||
| for more information. | for more information. | ||||||
|  |  | ||||||
|  | @ -106,7 +106,8 @@ If you configure GitLab to store CI logs and artifacts on object storage, you mu | ||||||
| 
 | 
 | ||||||
| #### Object Storage Settings | #### Object Storage Settings | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** In GitLab 13.2 and later, we recommend using the | NOTE: **Note:** | ||||||
|  | In GitLab 13.2 and later, we recommend using the | ||||||
| [consolidated object storage settings](object_storage.md#consolidated-object-storage-configuration). | [consolidated object storage settings](object_storage.md#consolidated-object-storage-configuration). | ||||||
| This section describes the earlier configuration format. | This section describes the earlier configuration format. | ||||||
| 
 | 
 | ||||||
|  | @ -163,7 +164,7 @@ _The artifacts are stored by default in | ||||||
|    gitlab-rake gitlab:artifacts:migrate |    gitlab-rake gitlab:artifacts:migrate | ||||||
|    ``` |    ``` | ||||||
| 
 | 
 | ||||||
| CAUTION: **CAUTION:** | CAUTION: **Caution:** | ||||||
| JUnit test report artifact (`junit.xml.gz`) migration | JUnit test report artifact (`junit.xml.gz`) migration | ||||||
| [is not supported](https://gitlab.com/gitlab-org/gitlab/-/issues/27698) | [is not supported](https://gitlab.com/gitlab-org/gitlab/-/issues/27698) | ||||||
| by the `gitlab:artifacts:migrate` script. | by the `gitlab:artifacts:migrate` script. | ||||||
|  | @ -196,7 +197,7 @@ _The artifacts are stored by default in | ||||||
|    sudo -u git -H bundle exec rake gitlab:artifacts:migrate RAILS_ENV=production |    sudo -u git -H bundle exec rake gitlab:artifacts:migrate RAILS_ENV=production | ||||||
|    ``` |    ``` | ||||||
| 
 | 
 | ||||||
| CAUTION: **CAUTION:** | CAUTION: **Caution:** | ||||||
| JUnit test report artifact (`junit.xml.gz`) migration | JUnit test report artifact (`junit.xml.gz`) migration | ||||||
| [is not supported](https://gitlab.com/gitlab-org/gitlab/-/issues/27698) | [is not supported](https://gitlab.com/gitlab-org/gitlab/-/issues/27698) | ||||||
| by the `gitlab:artifacts:migrate` script. | by the `gitlab:artifacts:migrate` script. | ||||||
|  | @ -434,7 +435,7 @@ the number you want. | ||||||
| 
 | 
 | ||||||
| #### Delete job artifacts from jobs completed before a specific date | #### Delete job artifacts from jobs completed before a specific date | ||||||
| 
 | 
 | ||||||
| CAUTION: **CAUTION:** | CAUTION: **Caution:** | ||||||
| These commands remove data permanently from the database and from disk. We | These commands remove data permanently from the database and from disk. We | ||||||
| highly recommend running them only under the guidance of a Support Engineer, or | highly recommend running them only under the guidance of a Support Engineer, or | ||||||
| running them in a test environment with a backup of the instance ready to be | running them in a test environment with a backup of the instance ready to be | ||||||
|  | @ -460,7 +461,7 @@ If you need to manually remove job artifacts associated with multiple jobs while | ||||||
| 
 | 
 | ||||||
| 1. Delete job artifacts older than a specific date: | 1. Delete job artifacts older than a specific date: | ||||||
| 
 | 
 | ||||||
|    NOTE: **NOTE:** |    NOTE: **Note:** | ||||||
|    This step will also erase artifacts that users have chosen to |    This step will also erase artifacts that users have chosen to | ||||||
|    ["keep"](../ci/pipelines/job_artifacts.md#browsing-artifacts). |    ["keep"](../ci/pipelines/job_artifacts.md#browsing-artifacts). | ||||||
| 
 | 
 | ||||||
|  | @ -481,7 +482,7 @@ If you need to manually remove job artifacts associated with multiple jobs while | ||||||
| 
 | 
 | ||||||
| #### Delete job artifacts and logs from jobs completed before a specific date | #### Delete job artifacts and logs from jobs completed before a specific date | ||||||
| 
 | 
 | ||||||
| CAUTION: **CAUTION:** | CAUTION: **Caution:** | ||||||
| These commands remove data permanently from the database and from disk. We | These commands remove data permanently from the database and from disk. We | ||||||
| highly recommend running them only under the guidance of a Support Engineer, or | highly recommend running them only under the guidance of a Support Engineer, or | ||||||
| running them in a test environment with a backup of the instance ready to be | running them in a test environment with a backup of the instance ready to be | ||||||
|  |  | ||||||
|  | @ -73,7 +73,7 @@ job output in the UI will be empty. | ||||||
| 
 | 
 | ||||||
| For example, to delete all job logs older than 60 days, run the following from a shell in your GitLab instance: | For example, to delete all job logs older than 60 days, run the following from a shell in your GitLab instance: | ||||||
| 
 | 
 | ||||||
| DANGER: **Warning:** | DANGER: **Danger:** | ||||||
| This command will permanently delete the log files and is irreversible. | This command will permanently delete the log files and is irreversible. | ||||||
| 
 | 
 | ||||||
| ```shell | ```shell | ||||||
|  |  | ||||||
|  | @ -63,7 +63,8 @@ GitLab provides two different options for the uploading mechanism: "Direct uploa | ||||||
| 
 | 
 | ||||||
| [Read more about using object storage with GitLab](../object_storage.md). | [Read more about using object storage with GitLab](../object_storage.md). | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** In GitLab 13.2 and later, we recommend using the | NOTE: **Note:** | ||||||
|  | In GitLab 13.2 and later, we recommend using the | ||||||
| [consolidated object storage settings](../object_storage.md#consolidated-object-storage-configuration). | [consolidated object storage settings](../object_storage.md#consolidated-object-storage-configuration). | ||||||
| This section describes the earlier configuration format. | This section describes the earlier configuration format. | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -112,7 +112,8 @@ The ActionCable connection or channel class is used as the `controller`. | ||||||
| } | } | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** Starting with GitLab 12.5, if an error occurs, an | NOTE: **Note:** | ||||||
|  | Starting with GitLab 12.5, if an error occurs, an | ||||||
| `exception` field is included with `class`, `message`, and | `exception` field is included with `class`, `message`, and | ||||||
| `backtrace`. Previous versions included an `error` field instead of | `backtrace`. Previous versions included an `error` field instead of | ||||||
| `exception.class` and `exception.message`. For example: | `exception.class` and `exception.message`. For example: | ||||||
|  |  | ||||||
|  | @ -72,7 +72,8 @@ be configured already. | ||||||
| 
 | 
 | ||||||
| ## Object Storage Settings | ## Object Storage Settings | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** In GitLab 13.2 and later, we recommend using the | NOTE: **Note:** | ||||||
|  | In GitLab 13.2 and later, we recommend using the | ||||||
| [consolidated object storage settings](object_storage.md#consolidated-object-storage-configuration). | [consolidated object storage settings](object_storage.md#consolidated-object-storage-configuration). | ||||||
| This section describes the earlier configuration format. | This section describes the earlier configuration format. | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -44,13 +44,15 @@ Using the consolidated object storage configuration has a number of advantages: | ||||||
| - It enables the use of [encrypted S3 buckets](#encrypted-s3-buckets). | - It enables the use of [encrypted S3 buckets](#encrypted-s3-buckets). | ||||||
| - It [uploads files to S3 with proper `Content-MD5` headers](https://gitlab.com/gitlab-org/gitlab-workhorse/-/issues/222). | - It [uploads files to S3 with proper `Content-MD5` headers](https://gitlab.com/gitlab-org/gitlab-workhorse/-/issues/222). | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** Only AWS S3-compatible providers and Google are | NOTE: **Note:** | ||||||
|  | Only AWS S3-compatible providers and Google are | ||||||
| supported at the moment since [direct upload | supported at the moment since [direct upload | ||||||
| mode](../development/uploads.md#direct-upload) must be used. Background | mode](../development/uploads.md#direct-upload) must be used. Background | ||||||
| upload is not supported in this mode. We recommend direct upload mode because | upload is not supported in this mode. We recommend direct upload mode because | ||||||
| it does not require a shared folder, and [this setting may become the default](https://gitlab.com/gitlab-org/gitlab/-/issues/27331). | it does not require a shared folder, and [this setting may become the default](https://gitlab.com/gitlab-org/gitlab/-/issues/27331). | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** Consolidated object storage configuration cannot be used for | NOTE: **Note:** | ||||||
|  | Consolidated object storage configuration cannot be used for | ||||||
| backups or Mattermost. See [the full table for a complete list](#storage-specific-configuration). | backups or Mattermost. See [the full table for a complete list](#storage-specific-configuration). | ||||||
| 
 | 
 | ||||||
| Most types of objects, such as CI artifacts, LFS files, upload | Most types of objects, such as CI artifacts, LFS files, upload | ||||||
|  | @ -253,7 +255,8 @@ gitlab_rails['object_store']['connection'] = { | ||||||
| 
 | 
 | ||||||
| #### OpenStack-compatible connection settings | #### OpenStack-compatible connection settings | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** This is not compatible with the consolidated object storage form. | NOTE: **Note:** | ||||||
|  | This is not compatible with the consolidated object storage form. | ||||||
| OpenStack Swift is only supported with the storage-specific form. See the | OpenStack Swift is only supported with the storage-specific form. See the | ||||||
| [S3 settings](#s3-compatible-connection-settings) if you want to use the consolidated form. | [S3 settings](#s3-compatible-connection-settings) if you want to use the consolidated form. | ||||||
| 
 | 
 | ||||||
|  | @ -274,7 +277,8 @@ Here are the valid connection settings below for the Swift API, provided by | ||||||
| 
 | 
 | ||||||
| #### Rackspace Cloud Files | #### Rackspace Cloud Files | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** This is not compatible with the consolidated object | NOTE: **Note:** | ||||||
|  | This is not compatible with the consolidated object | ||||||
| storage form. Rackspace Cloud is only supported with the storage-specific form. | storage form. Rackspace Cloud is only supported with the storage-specific form. | ||||||
| 
 | 
 | ||||||
| Here are the valid connection parameters for Rackspace Cloud, provided by | Here are the valid connection parameters for Rackspace Cloud, provided by | ||||||
|  | @ -408,7 +412,8 @@ additional complexity and unnecessary redundancy. Since both GitLab | ||||||
| Rails and Workhorse components need access to object storage, the | Rails and Workhorse components need access to object storage, the | ||||||
| consolidated form avoids excessive duplication of credentials. | consolidated form avoids excessive duplication of credentials. | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** The consolidated object storage configuration is **only** used if all | NOTE: **Note:** | ||||||
|  | The consolidated object storage configuration is **only** used if all | ||||||
| lines from the original form is omitted. To move to the consolidated form, remove the original configuration (for example, `artifacts_object_store_enabled`, `uploads_object_store_connection`, and so on.) | lines from the original form is omitted. To move to the consolidated form, remove the original configuration (for example, `artifacts_object_store_enabled`, `uploads_object_store_connection`, and so on.) | ||||||
| 
 | 
 | ||||||
| ## Storage-specific configuration | ## Storage-specific configuration | ||||||
|  |  | ||||||
|  | @ -3,7 +3,8 @@ | ||||||
| > - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/1631) in [GitLab Starter](https://about.gitlab.com/pricing/) 9.3. | > - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/1631) in [GitLab Starter](https://about.gitlab.com/pricing/) 9.3. | ||||||
| > - [Available in](https://gitlab.com/gitlab-org/gitlab/-/issues/3953) GitLab Community Edition 10.4. | > - [Available in](https://gitlab.com/gitlab-org/gitlab/-/issues/3953) GitLab Community Edition 10.4. | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** This document describes a drop-in replacement for the | NOTE: **Note:** | ||||||
|  | This document describes a drop-in replacement for the | ||||||
| `authorized_keys` file. For normal (non-deploy key) users, consider using | `authorized_keys` file. For normal (non-deploy key) users, consider using | ||||||
| [SSH certificates](ssh_certificates.md). They are even faster, but are not a | [SSH certificates](ssh_certificates.md). They are even faster, but are not a | ||||||
| drop-in replacement. | drop-in replacement. | ||||||
|  | @ -73,16 +74,19 @@ Confirm that SSH is working by commenting out your user's key in the `authorized | ||||||
| A successful pull would mean that GitLab was able to find the key in the database, | A successful pull would mean that GitLab was able to find the key in the database, | ||||||
| since it is not present in the file anymore. | since it is not present in the file anymore. | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** For Omnibus Docker, `AuthorizedKeysCommand` is setup by default in | NOTE: **Note:** | ||||||
|  | For Omnibus Docker, `AuthorizedKeysCommand` is setup by default in | ||||||
| GitLab 11.11 and later. | GitLab 11.11 and later. | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** For Installations from source, the command would be located at | NOTE: **Note:** | ||||||
|  | For Installations from source, the command would be located at | ||||||
| `/home/git/gitlab-shell/bin/gitlab-shell-authorized-keys-check` if [the install from source](../../install/installation.md#install-gitlab-shell) instructions were followed. | `/home/git/gitlab-shell/bin/gitlab-shell-authorized-keys-check` if [the install from source](../../install/installation.md#install-gitlab-shell) instructions were followed. | ||||||
| You might want to consider creating a wrapper script somewhere else since this command needs to be | You might want to consider creating a wrapper script somewhere else since this command needs to be | ||||||
| owned by `root` and not be writable by group or others. You could also consider changing the ownership of this command | owned by `root` and not be writable by group or others. You could also consider changing the ownership of this command | ||||||
| as required, but that might require temporary ownership changes during `gitlab-shell` upgrades. | as required, but that might require temporary ownership changes during `gitlab-shell` upgrades. | ||||||
| 
 | 
 | ||||||
| CAUTION: **Caution:** Do not disable writes until SSH is confirmed to be working | CAUTION: **Caution:** | ||||||
|  | Do not disable writes until SSH is confirmed to be working | ||||||
| perfectly, because the file will quickly become out-of-date. | perfectly, because the file will quickly become out-of-date. | ||||||
| 
 | 
 | ||||||
| In the case of lookup failures (which are common), the `authorized_keys` | In the case of lookup failures (which are common), the `authorized_keys` | ||||||
|  |  | ||||||
|  | @ -65,7 +65,8 @@ operations per second. | ||||||
| 
 | 
 | ||||||
| ### Simple benchmarking | ### Simple benchmarking | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** This test is naive but may be useful if `fio` is not | NOTE: **Note:** | ||||||
|  | This test is naive but may be useful if `fio` is not | ||||||
| available on the system. It's possible to receive good results on this | available on the system. It's possible to receive good results on this | ||||||
| test but still have poor performance due to read speed and various other | test but still have poor performance due to read speed and various other | ||||||
| factors. | factors. | ||||||
|  |  | ||||||
|  | @ -344,7 +344,8 @@ This path is accessible to: | ||||||
| - The user running the Container Registry daemon. | - The user running the Container Registry daemon. | ||||||
| - The user running GitLab. | - The user running GitLab. | ||||||
| 
 | 
 | ||||||
| CAUTION: **Warning:** You should confirm that all GitLab, Registry and web server users | CAUTION: **Warning:** | ||||||
|  | You should confirm that all GitLab, Registry and web server users | ||||||
| have access to this directory. | have access to this directory. | ||||||
| 
 | 
 | ||||||
| **Omnibus GitLab installations** | **Omnibus GitLab installations** | ||||||
|  | @ -382,7 +383,8 @@ driver for the Container Registry. | ||||||
| 
 | 
 | ||||||
| [Read more about using object storage with GitLab](../object_storage.md). | [Read more about using object storage with GitLab](../object_storage.md). | ||||||
| 
 | 
 | ||||||
| CAUTION: **Warning:** GitLab will not backup Docker images that are not stored on the | CAUTION: **Warning:** | ||||||
|  | GitLab will not backup Docker images that are not stored on the | ||||||
| filesystem. Remember to enable backups with your object storage provider if | filesystem. Remember to enable backups with your object storage provider if | ||||||
| desired. | desired. | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -87,7 +87,8 @@ store the blobs of the dependency proxy. | ||||||
| 
 | 
 | ||||||
| [Read more about using object storage with GitLab](../object_storage.md). | [Read more about using object storage with GitLab](../object_storage.md). | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** In GitLab 13.2 and later, we recommend using the | NOTE: **Note:** | ||||||
|  | In GitLab 13.2 and later, we recommend using the | ||||||
| [consolidated object storage settings](../object_storage.md#consolidated-object-storage-configuration). | [consolidated object storage settings](../object_storage.md#consolidated-object-storage-configuration). | ||||||
| This section describes the earlier configuration format. | This section describes the earlier configuration format. | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -99,7 +99,8 @@ store packages. | ||||||
| 
 | 
 | ||||||
| [Read more about using object storage with GitLab](../object_storage.md). | [Read more about using object storage with GitLab](../object_storage.md). | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** We recommend using the [consolidated object storage settings](../object_storage.md#consolidated-object-storage-configuration). The following instructions apply to the original config format. | NOTE: **Note:** | ||||||
|  | We recommend using the [consolidated object storage settings](../object_storage.md#consolidated-object-storage-configuration). The following instructions apply to the original config format. | ||||||
| 
 | 
 | ||||||
| **Omnibus GitLab installations** | **Omnibus GitLab installations** | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -966,7 +966,8 @@ after it has been restored to service. | ||||||
|   gitlab-ctl restart repmgrd |   gitlab-ctl restart repmgrd | ||||||
|   ``` |   ``` | ||||||
| 
 | 
 | ||||||
|   CAUTION: **Warning:** When the server is brought back online, and before |   CAUTION: **Warning:** | ||||||
|  |   When the server is brought back online, and before | ||||||
|   you switch it to a standby node, repmgr will report that there are two masters. |   you switch it to a standby node, repmgr will report that there are two masters. | ||||||
|   If there are any clients that are still attempting to write to the old master, |   If there are any clients that are still attempting to write to the old master, | ||||||
|   this will cause a split, and the old master will need to be resynced from |   this will cause a split, and the old master will need to be resynced from | ||||||
|  | @ -1129,7 +1130,8 @@ If you're running into an issue with a component not outlined here, be sure to c | ||||||
| 
 | 
 | ||||||
| ## Patroni | ## Patroni | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** Starting from GitLab 13.1, Patroni is available for **experimental** use to replace repmgr. Due to its | NOTE: **Note:** | ||||||
|  | Starting from GitLab 13.1, Patroni is available for **experimental** use to replace repmgr. Due to its | ||||||
| experimental nature, Patroni support is **subject to change without notice.** | experimental nature, Patroni support is **subject to change without notice.** | ||||||
| 
 | 
 | ||||||
| Patroni is an opinionated solution for PostgreSQL high-availability. It takes the control of PostgreSQL, overrides its | Patroni is an opinionated solution for PostgreSQL high-availability. It takes the control of PostgreSQL, overrides its | ||||||
|  | @ -1320,7 +1322,8 @@ You can switch an exiting database cluster to use Patroni instead of repmgr with | ||||||
|    sudo gitlab-ctl stop postgresql |    sudo gitlab-ctl stop postgresql | ||||||
|    ``` |    ``` | ||||||
| 
 | 
 | ||||||
|    NOTE: **Note:**  Ensure that there is no `walsender` process running on the primary node. |    NOTE: **Note:** | ||||||
|  |    Ensure that there is no `walsender` process running on the primary node. | ||||||
|    `ps aux | grep walsender` must not show any running process.   |    `ps aux | grep walsender` must not show any running process.   | ||||||
| 
 | 
 | ||||||
| 1. On the primary node, [configure Patroni](#configuring-patroni-cluster). Remove `repmgr` and any other | 1. On the primary node, [configure Patroni](#configuring-patroni-cluster). Remove `repmgr` and any other | ||||||
|  |  | ||||||
|  | @ -53,7 +53,8 @@ together with Omnibus GitLab. This is recommended as part of our | ||||||
|    gitlab_rails['auto_migrate'] = false |    gitlab_rails['auto_migrate'] = false | ||||||
|    ``` |    ``` | ||||||
| 
 | 
 | ||||||
|    NOTE: **Note:** The role `postgres_role` was introduced with GitLab 10.3 |    NOTE: **Note:** | ||||||
|  |    The role `postgres_role` was introduced with GitLab 10.3 | ||||||
| 
 | 
 | ||||||
| 1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect. | 1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect. | ||||||
| 1. Note the PostgreSQL node's IP address or hostname, port, and | 1. Note the PostgreSQL node's IP address or hostname, port, and | ||||||
|  |  | ||||||
|  | @ -36,7 +36,7 @@ The following task will run a [group sync](../auth/ldap/index.md#group-sync-star | ||||||
| when you'd like to update all configured group memberships against LDAP without | when you'd like to update all configured group memberships against LDAP without | ||||||
| waiting for the next scheduled group sync to be run. | waiting for the next scheduled group sync to be run. | ||||||
| 
 | 
 | ||||||
| NOTE: **NOTE:** | NOTE: **Note:** | ||||||
| If you'd like to change the frequency at which a group sync is performed, | If you'd like to change the frequency at which a group sync is performed, | ||||||
| [adjust the cron schedule](../auth/ldap/index.md#adjusting-ldap-group-sync-schedule-starter-only) | [adjust the cron schedule](../auth/ldap/index.md#adjusting-ldap-group-sync-schedule-starter-only) | ||||||
| instead. | instead. | ||||||
|  |  | ||||||
|  | @ -260,7 +260,7 @@ clear it. | ||||||
| 
 | 
 | ||||||
| To clear all exclusive leases: | To clear all exclusive leases: | ||||||
| 
 | 
 | ||||||
| DANGER: **DANGER**: | DANGER: **Danger:** | ||||||
| Don't run it while GitLab or Sidekiq is running | Don't run it while GitLab or Sidekiq is running | ||||||
| 
 | 
 | ||||||
| ```shell | ```shell | ||||||
|  |  | ||||||
|  | @ -339,7 +339,8 @@ the same Sentinels. | ||||||
| 
 | 
 | ||||||
| ### Step 3. Configuring the Redis Sentinel instances | ### Step 3. Configuring the Redis Sentinel instances | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** If you are using an external Redis Sentinel instance, be sure | NOTE: **Note:** | ||||||
|  | If you are using an external Redis Sentinel instance, be sure | ||||||
| to exclude the `requirepass` parameter from the Sentinel | to exclude the `requirepass` parameter from the Sentinel | ||||||
| configuration. This parameter will cause clients to report `NOAUTH | configuration. This parameter will cause clients to report `NOAUTH | ||||||
| Authentication required.`. [Redis Sentinel 3.2.x does not support | Authentication required.`. [Redis Sentinel 3.2.x does not support | ||||||
|  |  | ||||||
|  | @ -658,7 +658,8 @@ On each node perform the following: | ||||||
|    sudo gitlab-ctl tail gitaly |    sudo gitlab-ctl tail gitaly | ||||||
|    ``` |    ``` | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** When you specify `https` in the `external_url`, as in the example | NOTE: **Note:** | ||||||
|  | When you specify `https` in the `external_url`, as in the example | ||||||
| above, GitLab assumes you have SSL certificates in `/etc/gitlab/ssl/`. If | above, GitLab assumes you have SSL certificates in `/etc/gitlab/ssl/`. If | ||||||
| certificates are not present, NGINX will fail to start. See the | certificates are not present, NGINX will fail to start. See the | ||||||
| [NGINX documentation](https://docs.gitlab.com/omnibus/settings/nginx.html#enable-https) | [NGINX documentation](https://docs.gitlab.com/omnibus/settings/nginx.html#enable-https) | ||||||
|  |  | ||||||
|  | @ -4,7 +4,8 @@ This page describes GitLab reference architecture for up to 3,000 users. | ||||||
| For a full list of reference architectures, see | For a full list of reference architectures, see | ||||||
| [Available reference architectures](index.md#available-reference-architectures). | [Available reference architectures](index.md#available-reference-architectures). | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** The 3,000-user reference architecture documented below is | NOTE: **Note:** | ||||||
|  | The 3,000-user reference architecture documented below is | ||||||
| designed to help your organization achieve a highly-available GitLab deployment. | designed to help your organization achieve a highly-available GitLab deployment. | ||||||
| If you do not have the expertise or need to maintain a highly-available | If you do not have the expertise or need to maintain a highly-available | ||||||
| environment, you can have a simpler and less costly-to-operate environment by | environment, you can have a simpler and less costly-to-operate environment by | ||||||
|  |  | ||||||
|  | @ -38,7 +38,8 @@ When scaling GitLab, there are several factors to consider: | ||||||
| - A load balancer is added in front to distribute traffic across the application nodes. | - A load balancer is added in front to distribute traffic across the application nodes. | ||||||
| - The application nodes connects to a shared file server and PostgreSQL and Redis services on the backend. | - The application nodes connects to a shared file server and PostgreSQL and Redis services on the backend. | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** Depending on your workflow, the following recommended | NOTE: **Note:** | ||||||
|  | Depending on your workflow, the following recommended | ||||||
| reference architectures may need to be adapted accordingly. Your workload | reference architectures may need to be adapted accordingly. Your workload | ||||||
| is influenced by factors including how active your users are, | is influenced by factors including how active your users are, | ||||||
| how much automation you use, mirroring, and repository/change size. Additionally the | how much automation you use, mirroring, and repository/change size. Additionally the | ||||||
|  |  | ||||||
|  | @ -60,7 +60,8 @@ files and add the full paths of the alternative repository storage paths. In | ||||||
| the example below, we add two more mount points that are named `nfs_1` and `nfs_2` | the example below, we add two more mount points that are named `nfs_1` and `nfs_2` | ||||||
| respectively. | respectively. | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** This example uses NFS. We do not recommend using EFS for storage as it may impact GitLab's performance. See the [relevant documentation](high_availability/nfs.md#avoid-using-awss-elastic-file-system-efs) for more details. | NOTE: **Note:** | ||||||
|  | This example uses NFS. We do not recommend using EFS for storage as it may impact GitLab's performance. See the [relevant documentation](high_availability/nfs.md#avoid-using-awss-elastic-file-system-efs) for more details. | ||||||
| 
 | 
 | ||||||
| **For installations from source** | **For installations from source** | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -21,7 +21,8 @@ files must be provided: | ||||||
| Optionally, you can also provide a bundle of CA certs (PEM-encoded) to be | Optionally, you can also provide a bundle of CA certs (PEM-encoded) to be | ||||||
| included on each signature. This will typically be an intermediate CA. | included on each signature. This will typically be an intermediate CA. | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** Be mindful of the access levels for your private keys and visibility to | NOTE: **Note:** | ||||||
|  | Be mindful of the access levels for your private keys and visibility to | ||||||
| third parties. | third parties. | ||||||
| 
 | 
 | ||||||
| **For Omnibus installations:** | **For Omnibus installations:** | ||||||
|  | @ -38,7 +39,8 @@ third parties. | ||||||
| 
 | 
 | ||||||
| 1. Save the file and [reconfigure GitLab](restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect. | 1. Save the file and [reconfigure GitLab](restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect. | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** The key needs to be readable by the GitLab system user (`git` by default). | NOTE: **Note:** | ||||||
|  | The key needs to be readable by the GitLab system user (`git` by default). | ||||||
| 
 | 
 | ||||||
| **For installations from source:** | **For installations from source:** | ||||||
| 
 | 
 | ||||||
|  | @ -61,7 +63,8 @@ NOTE: **Note:** The key needs to be readable by the GitLab system user (`git` by | ||||||
| 
 | 
 | ||||||
| 1. Save the file and [restart GitLab](restart_gitlab.md#installations-from-source) for the changes to take effect. | 1. Save the file and [restart GitLab](restart_gitlab.md#installations-from-source) for the changes to take effect. | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** The key needs to be readable by the GitLab system user (`git` by default). | NOTE: **Note:** | ||||||
|  | The key needs to be readable by the GitLab system user (`git` by default). | ||||||
| 
 | 
 | ||||||
| ### How to convert S/MIME PKCS#12 / PFX format to PEM encoding | ### How to convert S/MIME PKCS#12 / PFX format to PEM encoding | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -11,13 +11,13 @@ having an issue with GitLab, it is highly recommended that you check your | ||||||
| [support options](https://about.gitlab.com/support/) first, before attempting to use | [support options](https://about.gitlab.com/support/) first, before attempting to use | ||||||
| this information. | this information. | ||||||
| 
 | 
 | ||||||
| CAUTION: **CAUTION:** | CAUTION: **Caution:** | ||||||
| Please note that some of these scripts could be damaging if not run correctly, | Please note that some of these scripts could be damaging if not run correctly, | ||||||
| or under the right conditions. We highly recommend running them under the | or under the right conditions. We highly recommend running them under the | ||||||
| guidance of a Support Engineer, or running them in a test environment with a | guidance of a Support Engineer, or running them in a test environment with a | ||||||
| backup of the instance ready to be restored, just in case. | backup of the instance ready to be restored, just in case. | ||||||
| 
 | 
 | ||||||
| CAUTION: **CAUTION:** | CAUTION: **Caution:** | ||||||
| Please also note that as GitLab changes, changes to the code are inevitable, | Please also note that as GitLab changes, changes to the code are inevitable, | ||||||
| and so some scripts may not work as they once used to. These are not kept | and so some scripts may not work as they once used to. These are not kept | ||||||
| up-to-date as these scripts/commands were added as they were found/needed. As | up-to-date as these scripts/commands were added as they were found/needed. As | ||||||
|  |  | ||||||
|  | @ -10,7 +10,7 @@ and it may be useful for users with experience with Linux. If you are currently | ||||||
| having an issue with GitLab, you may want to check your [support options](https://about.gitlab.com/support/) | having an issue with GitLab, you may want to check your [support options](https://about.gitlab.com/support/) | ||||||
| first, before attempting to use this information. | first, before attempting to use this information. | ||||||
| 
 | 
 | ||||||
| CAUTION: **CAUTION:** | CAUTION: **Caution:** | ||||||
| If you are administering GitLab you are expected to know these commands for your distribution | If you are administering GitLab you are expected to know these commands for your distribution | ||||||
| of choice. If you are a GitLab Support Engineer, consider this a cross-reference to | of choice. If you are a GitLab Support Engineer, consider this a cross-reference to | ||||||
| translate `yum` -> `apt-get` and the like. | translate `yum` -> `apt-get` and the like. | ||||||
|  |  | ||||||
|  | @ -6,7 +6,7 @@ Thanks to this, we also get access to the amazing tools built right into Rails. | ||||||
| In this guide, we'll introduce the [Rails console](debug.md#starting-a-rails-console-session) | In this guide, we'll introduce the [Rails console](debug.md#starting-a-rails-console-session) | ||||||
| and the basics of interacting with your GitLab instance from the command line. | and the basics of interacting with your GitLab instance from the command line. | ||||||
| 
 | 
 | ||||||
| CAUTION: **CAUTION:** | CAUTION: **Caution:** | ||||||
| The Rails console interacts directly with your GitLab instance. In many cases, | The Rails console interacts directly with your GitLab instance. In many cases, | ||||||
| there are no handrails to prevent you from permanently modifying, corrupting | there are no handrails to prevent you from permanently modifying, corrupting | ||||||
| or destroying production data. If you would like to explore the Rails console | or destroying production data. If you would like to explore the Rails console | ||||||
|  |  | ||||||
|  | @ -8,7 +8,8 @@ This page is useful information about PostgreSQL that the GitLab Support | ||||||
| Team sometimes uses while troubleshooting. GitLab is making this public, so that anyone | Team sometimes uses while troubleshooting. GitLab is making this public, so that anyone | ||||||
| can make use of the Support team's collected knowledge. | can make use of the Support team's collected knowledge. | ||||||
| 
 | 
 | ||||||
| CAUTION: **Caution:** Some procedures documented here may break your GitLab instance. Use at your own risk. | CAUTION: **Caution:** | ||||||
|  | Some procedures documented here may break your GitLab instance. Use at your own risk. | ||||||
| 
 | 
 | ||||||
| If you are on a [paid tier](https://about.gitlab.com/pricing/) and are not sure how | If you are on a [paid tier](https://about.gitlab.com/pricing/) and are not sure how | ||||||
| to use these commands, it is best to [contact Support](https://about.gitlab.com/support/) | to use these commands, it is best to [contact Support](https://about.gitlab.com/support/) | ||||||
|  | @ -115,7 +116,8 @@ Quoting from issue [#1](https://gitlab.com/gitlab-org/gitlab/-/issues/30528): | ||||||
| 
 | 
 | ||||||
| > "If a deadlock is hit, and we resolve it through aborting the transaction after a short period, then the retry mechanisms we already have will make the deadlocked piece of work try again, and it's unlikely we'll deadlock multiple times in a row." | > "If a deadlock is hit, and we resolve it through aborting the transaction after a short period, then the retry mechanisms we already have will make the deadlocked piece of work try again, and it's unlikely we'll deadlock multiple times in a row." | ||||||
| 
 | 
 | ||||||
| TIP: **Tip:** In support, our general approach to reconfiguring timeouts (applies also to the HTTP stack as well) is that it's acceptable to do it temporarily as a workaround. If it makes GitLab usable for the customer, then it buys time to understand the problem more completely, implement a hot fix, or make some other change that addresses the root cause. Generally, the timeouts should be put back to reasonable defaults once the root cause is resolved. | TIP: **Tip:** | ||||||
|  | In support, our general approach to reconfiguring timeouts (applies also to the HTTP stack as well) is that it's acceptable to do it temporarily as a workaround. If it makes GitLab usable for the customer, then it buys time to understand the problem more completely, implement a hot fix, or make some other change that addresses the root cause. Generally, the timeouts should be put back to reasonable defaults once the root cause is resolved. | ||||||
| 
 | 
 | ||||||
| In this case, the guidance we had from development was to drop deadlock_timeout and/or statement_timeout but to leave the third setting at 60s. Setting idle_in_transaction protects the database from sessions potentially hanging for days. There's more discussion in [the issue relating to introducing this timeout on GitLab.com](https://gitlab.com/gitlab-com/gl-infra/production/-/issues/1053). | In this case, the guidance we had from development was to drop deadlock_timeout and/or statement_timeout but to leave the third setting at 60s. Setting idle_in_transaction protects the database from sessions potentially hanging for days. There's more discussion in [the issue relating to introducing this timeout on GitLab.com](https://gitlab.com/gitlab-com/gl-infra/production/-/issues/1053). | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -283,7 +283,8 @@ queue = Sidekiq::Queue.new('<queue name>') | ||||||
| queue.each { |job| job.delete if <condition>} | queue.each { |job| job.delete if <condition>} | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** This will remove jobs that are queued but not started, running jobs will not be killed. Have a look at the section below for cancelling running jobs. | NOTE: **Note:** | ||||||
|  | This will remove jobs that are queued but not started, running jobs will not be killed. Have a look at the section below for cancelling running jobs. | ||||||
| 
 | 
 | ||||||
| In the method above, `<queue-name>` is the name of the queue that contains the job(s) you want to delete and `<condition>` will decide which jobs get deleted. | In the method above, `<queue-name>` is the name of the queue that contains the job(s) you want to delete and `<condition>` will decide which jobs get deleted. | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -57,7 +57,8 @@ This configuration relies on valid AWS credentials to be configured already. | ||||||
| 
 | 
 | ||||||
| [Read more about using object storage with GitLab](object_storage.md). | [Read more about using object storage with GitLab](object_storage.md). | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** We recommend using the [consolidated object storage settings](object_storage.md#consolidated-object-storage-configuration). The following instructions apply to the original config format. | NOTE: **Note:** | ||||||
|  | We recommend using the [consolidated object storage settings](object_storage.md#consolidated-object-storage-configuration). The following instructions apply to the original config format. | ||||||
| 
 | 
 | ||||||
| ## Object Storage Settings | ## Object Storage Settings | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -38,7 +38,7 @@ are paginated. | ||||||
| 
 | 
 | ||||||
| Read more on [pagination](README.md#pagination). | Read more on [pagination](README.md#pagination). | ||||||
| 
 | 
 | ||||||
| CAUTION: **Deprecation** | CAUTION: **Deprecation:** | ||||||
| > `reference` attribute in response is deprecated in favour of `references`. | > `reference` attribute in response is deprecated in favour of `references`. | ||||||
| > Introduced [GitLab 12.6](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20354) | > Introduced [GitLab 12.6](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20354) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w | ||||||
| 
 | 
 | ||||||
| > [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9566) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.5. | > [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9566) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.5. | ||||||
| 
 | 
 | ||||||
| CAUTION: **Deprecation** | CAUTION: **Deprecation:** | ||||||
| This API is deprecated and [scheduled for removal in GitLab 14.0](https://gitlab.com/gitlab-org/gitlab/-/issues/213369). | This API is deprecated and [scheduled for removal in GitLab 14.0](https://gitlab.com/gitlab-org/gitlab/-/issues/213369). | ||||||
| 
 | 
 | ||||||
| The API for creating, updating, reading and deleting Feature Flag Specs. | The API for creating, updating, reading and deleting Feature Flag Specs. | ||||||
|  |  | ||||||
|  | @ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w | ||||||
| 
 | 
 | ||||||
| > [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9566) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.5. | > [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9566) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.5. | ||||||
| 
 | 
 | ||||||
| CAUTION: **Deprecation** | CAUTION: **Deprecation:** | ||||||
| This API is deprecated and [scheduled for removal in GitLab 14.0](https://gitlab.com/gitlab-org/gitlab/-/issues/213369). Use [this API](feature_flags.md) instead. | This API is deprecated and [scheduled for removal in GitLab 14.0](https://gitlab.com/gitlab-org/gitlab/-/issues/213369). Use [this API](feature_flags.md) instead. | ||||||
| 
 | 
 | ||||||
| API for accessing resources of [GitLab Feature Flags](../operations/feature_flags.md). | API for accessing resources of [GitLab Feature Flags](../operations/feature_flags.md). | ||||||
|  |  | ||||||
|  | @ -4370,6 +4370,11 @@ type EpicIssue implements Noteable { | ||||||
| The connection type for EpicIssue. | The connection type for EpicIssue. | ||||||
| """ | """ | ||||||
| type EpicIssueConnection { | type EpicIssueConnection { | ||||||
|  |   """ | ||||||
|  |   Total count of collection | ||||||
|  |   """ | ||||||
|  |   count: Int! | ||||||
|  | 
 | ||||||
|   """ |   """ | ||||||
|   A list of edges. |   A list of edges. | ||||||
|   """ |   """ | ||||||
|  | @ -5043,6 +5048,11 @@ type Group { | ||||||
|     """ |     """ | ||||||
|     iids: [String!] |     iids: [String!] | ||||||
| 
 | 
 | ||||||
|  |     """ | ||||||
|  |     Iterations applied to the issue | ||||||
|  |     """ | ||||||
|  |     iterationId: [ID] | ||||||
|  | 
 | ||||||
|     """ |     """ | ||||||
|     Labels applied to this issue |     Labels applied to this issue | ||||||
|     """ |     """ | ||||||
|  | @ -5967,6 +5977,11 @@ type Issue implements Noteable { | ||||||
| The connection type for Issue. | The connection type for Issue. | ||||||
| """ | """ | ||||||
| type IssueConnection { | type IssueConnection { | ||||||
|  |   """ | ||||||
|  |   Total count of collection | ||||||
|  |   """ | ||||||
|  |   count: Int! | ||||||
|  | 
 | ||||||
|   """ |   """ | ||||||
|   A list of edges. |   A list of edges. | ||||||
|   """ |   """ | ||||||
|  | @ -9199,6 +9214,11 @@ type Project { | ||||||
|     """ |     """ | ||||||
|     iids: [String!] |     iids: [String!] | ||||||
| 
 | 
 | ||||||
|  |     """ | ||||||
|  |     Iterations applied to the issue | ||||||
|  |     """ | ||||||
|  |     iterationId: [ID] | ||||||
|  | 
 | ||||||
|     """ |     """ | ||||||
|     Labels applied to this issue |     Labels applied to this issue | ||||||
|     """ |     """ | ||||||
|  | @ -9294,6 +9314,11 @@ type Project { | ||||||
|     """ |     """ | ||||||
|     iids: [String!] |     iids: [String!] | ||||||
| 
 | 
 | ||||||
|  |     """ | ||||||
|  |     Iterations applied to the issue | ||||||
|  |     """ | ||||||
|  |     iterationId: [ID] | ||||||
|  | 
 | ||||||
|     """ |     """ | ||||||
|     Labels applied to this issue |     Labels applied to this issue | ||||||
|     """ |     """ | ||||||
|  |  | ||||||
|  | @ -12216,6 +12216,24 @@ | ||||||
|           "name": "EpicIssueConnection", |           "name": "EpicIssueConnection", | ||||||
|           "description": "The connection type for EpicIssue.", |           "description": "The connection type for EpicIssue.", | ||||||
|           "fields": [ |           "fields": [ | ||||||
|  |             { | ||||||
|  |               "name": "count", | ||||||
|  |               "description": "Total count of collection", | ||||||
|  |               "args": [ | ||||||
|  | 
 | ||||||
|  |               ], | ||||||
|  |               "type": { | ||||||
|  |                 "kind": "NON_NULL", | ||||||
|  |                 "name": null, | ||||||
|  |                 "ofType": { | ||||||
|  |                   "kind": "SCALAR", | ||||||
|  |                   "name": "Int", | ||||||
|  |                   "ofType": null | ||||||
|  |                 } | ||||||
|  |               }, | ||||||
|  |               "isDeprecated": false, | ||||||
|  |               "deprecationReason": null | ||||||
|  |             }, | ||||||
|             { |             { | ||||||
|               "name": "edges", |               "name": "edges", | ||||||
|               "description": "A list of edges.", |               "description": "A list of edges.", | ||||||
|  | @ -14041,6 +14059,20 @@ | ||||||
|                   }, |                   }, | ||||||
|                   "defaultValue": "created_desc" |                   "defaultValue": "created_desc" | ||||||
|                 }, |                 }, | ||||||
|  |                 { | ||||||
|  |                   "name": "iterationId", | ||||||
|  |                   "description": "Iterations applied to the issue", | ||||||
|  |                   "type": { | ||||||
|  |                     "kind": "LIST", | ||||||
|  |                     "name": null, | ||||||
|  |                     "ofType": { | ||||||
|  |                       "kind": "SCALAR", | ||||||
|  |                       "name": "ID", | ||||||
|  |                       "ofType": null | ||||||
|  |                     } | ||||||
|  |                   }, | ||||||
|  |                   "defaultValue": null | ||||||
|  |                 }, | ||||||
|                 { |                 { | ||||||
|                   "name": "after", |                   "name": "after", | ||||||
|                   "description": "Returns the elements in the list that come after the specified cursor.", |                   "description": "Returns the elements in the list that come after the specified cursor.", | ||||||
|  | @ -16428,6 +16460,24 @@ | ||||||
|           "name": "IssueConnection", |           "name": "IssueConnection", | ||||||
|           "description": "The connection type for Issue.", |           "description": "The connection type for Issue.", | ||||||
|           "fields": [ |           "fields": [ | ||||||
|  |             { | ||||||
|  |               "name": "count", | ||||||
|  |               "description": "Total count of collection", | ||||||
|  |               "args": [ | ||||||
|  | 
 | ||||||
|  |               ], | ||||||
|  |               "type": { | ||||||
|  |                 "kind": "NON_NULL", | ||||||
|  |                 "name": null, | ||||||
|  |                 "ofType": { | ||||||
|  |                   "kind": "SCALAR", | ||||||
|  |                   "name": "Int", | ||||||
|  |                   "ofType": null | ||||||
|  |                 } | ||||||
|  |               }, | ||||||
|  |               "isDeprecated": false, | ||||||
|  |               "deprecationReason": null | ||||||
|  |             }, | ||||||
|             { |             { | ||||||
|               "name": "edges", |               "name": "edges", | ||||||
|               "description": "A list of edges.", |               "description": "A list of edges.", | ||||||
|  | @ -27439,6 +27489,20 @@ | ||||||
|                     "ofType": null |                     "ofType": null | ||||||
|                   }, |                   }, | ||||||
|                   "defaultValue": "created_desc" |                   "defaultValue": "created_desc" | ||||||
|  |                 }, | ||||||
|  |                 { | ||||||
|  |                   "name": "iterationId", | ||||||
|  |                   "description": "Iterations applied to the issue", | ||||||
|  |                   "type": { | ||||||
|  |                     "kind": "LIST", | ||||||
|  |                     "name": null, | ||||||
|  |                     "ofType": { | ||||||
|  |                       "kind": "SCALAR", | ||||||
|  |                       "name": "ID", | ||||||
|  |                       "ofType": null | ||||||
|  |                     } | ||||||
|  |                   }, | ||||||
|  |                   "defaultValue": null | ||||||
|                 } |                 } | ||||||
|               ], |               ], | ||||||
|               "type": { |               "type": { | ||||||
|  | @ -27619,6 +27683,20 @@ | ||||||
|                   }, |                   }, | ||||||
|                   "defaultValue": "created_desc" |                   "defaultValue": "created_desc" | ||||||
|                 }, |                 }, | ||||||
|  |                 { | ||||||
|  |                   "name": "iterationId", | ||||||
|  |                   "description": "Iterations applied to the issue", | ||||||
|  |                   "type": { | ||||||
|  |                     "kind": "LIST", | ||||||
|  |                     "name": null, | ||||||
|  |                     "ofType": { | ||||||
|  |                       "kind": "SCALAR", | ||||||
|  |                       "name": "ID", | ||||||
|  |                       "ofType": null | ||||||
|  |                     } | ||||||
|  |                   }, | ||||||
|  |                   "defaultValue": null | ||||||
|  |                 }, | ||||||
|                 { |                 { | ||||||
|                   "name": "after", |                   "name": "after", | ||||||
|                   "description": "Returns the elements in the list that come after the specified cursor.", |                   "description": "Returns the elements in the list that come after the specified cursor.", | ||||||
|  |  | ||||||
|  | @ -170,7 +170,8 @@ Example response: | ||||||
| } | } | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** An older endpoint `PUT /groups/:id/labels` with `name` in the parameters is still available, but deprecated. | NOTE: **Note:** | ||||||
|  | An older endpoint `PUT /groups/:id/labels` with `name` in the parameters is still available, but deprecated. | ||||||
| 
 | 
 | ||||||
| ## Delete a group label | ## Delete a group label | ||||||
| 
 | 
 | ||||||
|  | @ -189,7 +190,8 @@ DELETE /groups/:id/labels/:label_id | ||||||
| curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/5/labels/bug" | curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/5/labels/bug" | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** An older endpoint `DELETE /groups/:id/labels` with `name` in the parameters is still available, but deprecated. | NOTE: **Note:** | ||||||
|  | An older endpoint `DELETE /groups/:id/labels` with `name` in the parameters is still available, but deprecated. | ||||||
| 
 | 
 | ||||||
| ## Subscribe to a group label | ## Subscribe to a group label | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -16,7 +16,7 @@ are paginated. | ||||||
| 
 | 
 | ||||||
| Read more on [pagination](README.md#pagination). | Read more on [pagination](README.md#pagination). | ||||||
| 
 | 
 | ||||||
| CAUTION: **Deprecation** | CAUTION: **Deprecation:** | ||||||
| > `reference` attribute in response is deprecated in favour of `references`. | > `reference` attribute in response is deprecated in favour of `references`. | ||||||
| > Introduced [GitLab 12.6](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20354) | > Introduced [GitLab 12.6](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20354) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -199,7 +199,8 @@ DELETE /projects/:id/labels/:label_id | ||||||
| curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/labels/bug" | curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/labels/bug" | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** An older endpoint `DELETE /projects/:id/labels` with `name` in the parameters is still available, but deprecated. | NOTE: **Note:** | ||||||
|  | An older endpoint `DELETE /projects/:id/labels` with `name` in the parameters is still available, but deprecated. | ||||||
| 
 | 
 | ||||||
| ## Edit an existing label | ## Edit an existing label | ||||||
| 
 | 
 | ||||||
|  | @ -242,7 +243,8 @@ Example response: | ||||||
| } | } | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** An older endpoint `PUT /projects/:id/labels` with `name` or `label_id` in the parameters is still available, but deprecated. | NOTE: **Note:** | ||||||
|  | An older endpoint `PUT /projects/:id/labels` with `name` or `label_id` in the parameters is still available, but deprecated. | ||||||
| 
 | 
 | ||||||
| ## Promote a project label to a group label | ## Promote a project label to a group label | ||||||
| 
 | 
 | ||||||
|  | @ -279,7 +281,8 @@ Example response: | ||||||
| } | } | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** An older endpoint `PUT /projects/:id/labels/promote` with `name` in the parameters is still available, but deprecated. | NOTE: **Note:** | ||||||
|  | An older endpoint `PUT /projects/:id/labels/promote` with `name` in the parameters is still available, but deprecated. | ||||||
| 
 | 
 | ||||||
| ## Subscribe to a label | ## Subscribe to a label | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -2,7 +2,7 @@ | ||||||
| 
 | 
 | ||||||
| Every API call to merge requests must be authenticated. | Every API call to merge requests must be authenticated. | ||||||
| 
 | 
 | ||||||
| CAUTION: **Deprecation** | CAUTION: **Deprecation:** | ||||||
| > `reference` attribute in response is deprecated in favour of `references`. | > `reference` attribute in response is deprecated in favour of `references`. | ||||||
| > Introduced [GitLab 12.6](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20354) | > Introduced [GitLab 12.6](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20354) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -68,7 +68,8 @@ the `plan` parameter associated with a namespace: | ||||||
| ] | ] | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** Only group maintainers/owners are presented with `members_count_with_descendants`, as well as `plan` **(BRONZE ONLY)**. | NOTE: **Note:** | ||||||
|  | Only group maintainers/owners are presented with `members_count_with_descendants`, as well as `plan` **(BRONZE ONLY)**. | ||||||
| 
 | 
 | ||||||
| ## Search for namespace | ## Search for namespace | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -80,7 +80,7 @@ GET /groups/:id/packages | ||||||
| curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/:id/packages?exclude_subgroups=true" | curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/:id/packages?exclude_subgroups=true" | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| CAUTION: **Deprecation** | CAUTION: **Deprecation:** | ||||||
| > The `build_info` attribute in the response is deprecated in favour of `pipeline`. | > The `build_info` attribute in the response is deprecated in favour of `pipeline`. | ||||||
| > Introduced [GitLab 12.10](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/28040). | > Introduced [GitLab 12.10](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/28040). | ||||||
| 
 | 
 | ||||||
|  | @ -165,7 +165,7 @@ GET /projects/:id/packages/:package_id | ||||||
| curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/:id/packages/:package_id" | curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/:id/packages/:package_id" | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| CAUTION: **Deprecation** | CAUTION: **Deprecation:** | ||||||
| > The `build_info` attribute in the response is deprecated in favour of `pipeline`. | > The `build_info` attribute in the response is deprecated in favour of `pipeline`. | ||||||
| > Introduced [GitLab 12.10](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/28040). | > Introduced [GitLab 12.10](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/28040). | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1087,7 +1087,8 @@ POST /projects | ||||||
| | `group_with_project_templates_id` | integer | no | **(PREMIUM)** For group-level custom templates, specifies ID of group from which all the custom project templates are sourced. Leave empty for instance-level templates. Requires `use_custom_template` to be true | | | `group_with_project_templates_id` | integer | no | **(PREMIUM)** For group-level custom templates, specifies ID of group from which all the custom project templates are sourced. Leave empty for instance-level templates. Requires `use_custom_template` to be true | | ||||||
| | `packages_enabled` | boolean | no | **(PREMIUM ONLY)** Enable or disable packages repository feature | | | `packages_enabled` | boolean | no | **(PREMIUM ONLY)** Enable or disable packages repository feature | | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** If your HTTP repository is not publicly accessible, | NOTE: **Note:** | ||||||
|  | If your HTTP repository is not publicly accessible, | ||||||
| add authentication information to the URL: `https://username:password@gitlab.company.com/group/project.git` | add authentication information to the URL: `https://username:password@gitlab.company.com/group/project.git` | ||||||
| where `password` is a public access key with the `api` scope enabled. | where `password` is a public access key with the `api` scope enabled. | ||||||
| 
 | 
 | ||||||
|  | @ -1157,7 +1158,8 @@ POST /projects/user/:user_id | ||||||
| | `group_with_project_templates_id` | integer | no | **(PREMIUM)** For group-level custom templates, specifies ID of group from which all the custom project templates are sourced. Leave empty for instance-level templates. Requires `use_custom_template` to be true | | | `group_with_project_templates_id` | integer | no | **(PREMIUM)** For group-level custom templates, specifies ID of group from which all the custom project templates are sourced. Leave empty for instance-level templates. Requires `use_custom_template` to be true | | ||||||
| | `packages_enabled` | boolean | no | **(PREMIUM ONLY)** Enable or disable packages repository feature | | | `packages_enabled` | boolean | no | **(PREMIUM ONLY)** Enable or disable packages repository feature | | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** If your HTTP repository is not publicly accessible, | NOTE: **Note:** | ||||||
|  | If your HTTP repository is not publicly accessible, | ||||||
| add authentication information to the URL: `https://username:password@gitlab.company.com/group/project.git` | add authentication information to the URL: `https://username:password@gitlab.company.com/group/project.git` | ||||||
| where `password` is a public access key with the `api` scope enabled. | where `password` is a public access key with the `api` scope enabled. | ||||||
| 
 | 
 | ||||||
|  | @ -1228,7 +1230,8 @@ PUT /projects/:id | ||||||
| | `packages_enabled` | boolean | no | **(PREMIUM ONLY)** Enable or disable packages repository feature | | | `packages_enabled` | boolean | no | **(PREMIUM ONLY)** Enable or disable packages repository feature | | ||||||
| | `service_desk_enabled` | boolean | no | **(PREMIUM ONLY)** Enable or disable service desk feature | | | `service_desk_enabled` | boolean | no | **(PREMIUM ONLY)** Enable or disable service desk feature | | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** If your HTTP repository is not publicly accessible, | NOTE: **Note:** | ||||||
|  | If your HTTP repository is not publicly accessible, | ||||||
| add authentication information to the URL: `https://username:password@gitlab.company.com/group/project.git` | add authentication information to the URL: `https://username:password@gitlab.company.com/group/project.git` | ||||||
| where `password` is a public access key with the `api` scope enabled. | where `password` is a public access key with the `api` scope enabled. | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -318,7 +318,8 @@ Example Responses: | ||||||
| } | } | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** The `plan` and `trial` parameters are only available on GitLab Enterprise Edition. | NOTE: **Note:** | ||||||
|  | The `plan` and `trial` parameters are only available on GitLab Enterprise Edition. | ||||||
| 
 | 
 | ||||||
| Users on GitLab [Starter, Bronze, or higher](https://about.gitlab.com/pricing/) will also see | Users on GitLab [Starter, Bronze, or higher](https://about.gitlab.com/pricing/) will also see | ||||||
| the `shared_runners_minutes_limit`, and `extra_shared_runners_minutes_limit` parameters. | the `shared_runners_minutes_limit`, and `extra_shared_runners_minutes_limit` parameters. | ||||||
|  | @ -1412,7 +1413,8 @@ Parameters: | ||||||
| 
 | 
 | ||||||
| ### Get user activities (admin only) | ### Get user activities (admin only) | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** This API endpoint is only available on 8.15 (EE) and 9.1 (CE) and above. | NOTE: **Note:** | ||||||
|  | This API endpoint is only available on 8.15 (EE) and 9.1 (CE) and above. | ||||||
| 
 | 
 | ||||||
| Get the last activity date for all users, sorted from oldest to newest. | Get the last activity date for all users, sorted from oldest to newest. | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -681,11 +681,13 @@ To add `DOCKER_AUTH_CONFIG` to a Runner: | ||||||
| 
 | 
 | ||||||
| 1. Restart the Runner service. | 1. Restart the Runner service. | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** The double quotes included in the `DOCKER_AUTH_CONFIG` | NOTE: **Note:** | ||||||
|  | The double quotes included in the `DOCKER_AUTH_CONFIG` | ||||||
| data must be escaped with backslashes. This prevents them from being | data must be escaped with backslashes. This prevents them from being | ||||||
| interpreted as TOML. | interpreted as TOML. | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** The `environment` option is a list. So your Runner may | NOTE: **Note:** | ||||||
|  | The `environment` option is a list. So your Runner may | ||||||
| have existing entries and you should add this to the list, not replace | have existing entries and you should add this to the list, not replace | ||||||
| it. | it. | ||||||
| 
 | 
 | ||||||
|  | @ -715,7 +717,8 @@ To configure credentials store, follow these steps: | ||||||
|      `${GITLAB_RUNNER_HOME}/.docker/config.json`. GitLab Runner will read this configuration file |      `${GITLAB_RUNNER_HOME}/.docker/config.json`. GitLab Runner will read this configuration file | ||||||
|      and will use the needed helper for this specific repository. |      and will use the needed helper for this specific repository. | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** `credsStore` is used to access ALL the registries. | NOTE: **Note:** | ||||||
|  | `credsStore` is used to access ALL the registries. | ||||||
| If you will want to use both images from private registry and public images from DockerHub, | If you will want to use both images from private registry and public images from DockerHub, | ||||||
| pulling from DockerHub will fail, because Docker daemon will try to use the same credentials for **ALL** the registries. | pulling from DockerHub will fail, because Docker daemon will try to use the same credentials for **ALL** the registries. | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -124,7 +124,7 @@ The environment `name` and `url` is exposed in various places | ||||||
| within GitLab. Each time a job that has an environment specified | within GitLab. Each time a job that has an environment specified | ||||||
| succeeds, a deployment is recorded, along with the Git SHA, and environment name. | succeeds, a deployment is recorded, along with the Git SHA, and environment name. | ||||||
| 
 | 
 | ||||||
| CAUTION: **Caution**: | CAUTION: **Caution:** | ||||||
| Some characters are not allowed in environment names. Use only letters, | Some characters are not allowed in environment names. Use only letters, | ||||||
| numbers, spaces, and `-`, `_`, `/`, `{`, `}`, or `.`. Also, it must not start nor end with `/`. | numbers, spaces, and `-`, `_`, `/`, `{`, `}`, or `.`. Also, it must not start nor end with `/`. | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -60,7 +60,7 @@ To communicate with Vault, you can use either its CLI client or perform API requ | ||||||
| 
 | 
 | ||||||
| ## Example | ## Example | ||||||
| 
 | 
 | ||||||
| CAUTION: **Caution**: | CAUTION: **Caution:** | ||||||
| JWTs are credentials, which can grant access to resources. Be careful where you paste them! | JWTs are credentials, which can grant access to resources. Be careful where you paste them! | ||||||
| 
 | 
 | ||||||
| Let's say you have the passwords for your staging and production databases stored in a Vault server that is running on `http://vault.example.com:8200`. Your staging password is `pa$$w0rd` and your production password is `real-pa$$w0rd`. | Let's say you have the passwords for your staging and production databases stored in a Vault server that is running on `http://vault.example.com:8200`. Your staging password is `pa$$w0rd` and your production password is `real-pa$$w0rd`. | ||||||
|  | @ -156,7 +156,7 @@ Combined with GitLab's [protected branches](../../../user/project/protected_bran | ||||||
| 
 | 
 | ||||||
| For the full list of options, see Vault's [Create Role documentation](https://www.vaultproject.io/api/auth/jwt#create-role). | For the full list of options, see Vault's [Create Role documentation](https://www.vaultproject.io/api/auth/jwt#create-role). | ||||||
| 
 | 
 | ||||||
| CAUTION: **Caution**: | CAUTION: **Caution:** | ||||||
| Always restrict your roles to project or namespace by using one of the provided claims (e.g. `project_id` or `namespace_id`). Otherwise any JWT generated by this instance may be allowed to authenticate using this role. | Always restrict your roles to project or namespace by using one of the provided claims (e.g. `project_id` or `namespace_id`). Otherwise any JWT generated by this instance may be allowed to authenticate using this role. | ||||||
| 
 | 
 | ||||||
| Now, configure the JWT Authentication method: | Now, configure the JWT Authentication method: | ||||||
|  |  | ||||||
|  | @ -38,10 +38,12 @@ but support [is planned](https://gitlab.com/gitlab-org/charts/gitlab-runner/-/is | ||||||
| 
 | 
 | ||||||
| ## Debugging a running job | ## Debugging a running job | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** Not all executors are | NOTE: **Note:** | ||||||
|  | Not all executors are | ||||||
| [supported](https://docs.gitlab.com/runner/executors/#compatibility-chart). | [supported](https://docs.gitlab.com/runner/executors/#compatibility-chart). | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** The `docker` executor does not keep running | NOTE: **Note:** | ||||||
|  | The `docker` executor does not keep running | ||||||
| after the build script is finished. At that point, the terminal will automatically | after the build script is finished. At that point, the terminal will automatically | ||||||
| disconnect and will not wait for the user to finish. Please follow [this | disconnect and will not wait for the user to finish. Please follow [this | ||||||
| issue](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/3605) for updates on | issue](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/3605) for updates on | ||||||
|  |  | ||||||
|  | @ -419,7 +419,7 @@ information in the UI. | ||||||
| 
 | 
 | ||||||
| ## Erasing artifacts | ## Erasing artifacts | ||||||
| 
 | 
 | ||||||
| DANGER: **Warning:** | DANGER: **Danger:** | ||||||
| This is a destructive action that leads to data loss. Use with caution. | This is a destructive action that leads to data loss. Use with caution. | ||||||
| 
 | 
 | ||||||
| You can erase a single job via the UI, which will also remove the job's | You can erase a single job via the UI, which will also remove the job's | ||||||
|  |  | ||||||
|  | @ -1181,7 +1181,7 @@ job: | ||||||
| - If the pipeline is a scheduled pipeline, the job is **not** be added to the pipeline. | - If the pipeline is a scheduled pipeline, the job is **not** be added to the pipeline. | ||||||
| - In **all other cases**, the job is added to the pipeline, with `when: on_success`. | - In **all other cases**, the job is added to the pipeline, with `when: on_success`. | ||||||
| 
 | 
 | ||||||
| CAUTION: **Caution** | CAUTION: **Caution:** | ||||||
| If you use `when: on_success`, `always`, or `delayed` as the final rule, two | If you use `when: on_success`, `always`, or `delayed` as the final rule, two | ||||||
| simultaneous pipelines may start. Both push pipelines and merge request pipelines can | simultaneous pipelines may start. Both push pipelines and merge request pipelines can | ||||||
| be triggered by the same event (a push to the source branch for an open merge request). | be triggered by the same event (a push to the source branch for an open merge request). | ||||||
|  | @ -1569,7 +1569,7 @@ and must be surrounded by `/`. | ||||||
| So `issue-/.*/` won't work to match all tag names or branch names | So `issue-/.*/` won't work to match all tag names or branch names | ||||||
| that begin with `issue-`. | that begin with `issue-`. | ||||||
| 
 | 
 | ||||||
| TIP: **Tip** | TIP: **Tip:** | ||||||
| Use anchors `^` and `$` to avoid the regular expression | Use anchors `^` and `$` to avoid the regular expression | ||||||
| matching only a substring of the tag name or branch name. | matching only a substring of the tag name or branch name. | ||||||
| For example, `/^issue-.*$/` is equivalent to `/^issue-/`, | For example, `/^issue-.*$/` is equivalent to `/^issue-/`, | ||||||
|  | @ -3921,7 +3921,8 @@ variables: | ||||||
|   GIT_STRATEGY: none |   GIT_STRATEGY: none | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** `GIT_STRATEGY` is not supported for | NOTE: **Note:** | ||||||
|  | `GIT_STRATEGY` is not supported for | ||||||
| [Kubernetes executor](https://docs.gitlab.com/runner/executors/kubernetes.html), | [Kubernetes executor](https://docs.gitlab.com/runner/executors/kubernetes.html), | ||||||
| but may be in the future. See the [support Git strategy with Kubernetes executor feature proposal](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/3847) | but may be in the future. See the [support Git strategy with Kubernetes executor feature proposal](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/3847) | ||||||
| for updates. | for updates. | ||||||
|  |  | ||||||
|  | @ -571,7 +571,8 @@ module Types | ||||||
| end | end | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** If the field's type already [has a particular | NOTE: **Note:** | ||||||
|  | If the field's type already [has a particular | ||||||
| authorization](#type-authorization) then there is no need to add that | authorization](#type-authorization) then there is no need to add that | ||||||
| same authorization to the field. | same authorization to the field. | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -27,7 +27,8 @@ limit values. It's recommended to create separate migration script files. | ||||||
|   add_column(:plan_limits, :project_hooks, :integer, default: 100, null: false) |   add_column(:plan_limits, :project_hooks, :integer, default: 100, null: false) | ||||||
|   ``` |   ``` | ||||||
| 
 | 
 | ||||||
|   NOTE: **Note:** Plan limits entries set to `0` mean that limits are not |   NOTE: **Note:** | ||||||
|  |   Plan limits entries set to `0` mean that limits are not | ||||||
|   enabled. You should use this setting only in special and documented circumstances. |   enabled. You should use this setting only in special and documented circumstances. | ||||||
| 
 | 
 | ||||||
| 1. (Optionally) Create the database migration that fine-tunes each level with | 1. (Optionally) Create the database migration that fine-tunes each level with | ||||||
|  | @ -57,7 +58,8 @@ limit values. It's recommended to create separate migration script files. | ||||||
|   end |   end | ||||||
|   ``` |   ``` | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** Some plans exist only on GitLab.com. This will be no-op | NOTE: **Note:** | ||||||
|  | Some plans exist only on GitLab.com. This will be no-op | ||||||
| for plans that do not exist. | for plans that do not exist. | ||||||
| 
 | 
 | ||||||
| ### Plan limits validation | ### Plan limits validation | ||||||
|  | @ -95,7 +97,8 @@ can be used to validate that a model does not exceed the limits. It ensures | ||||||
| that the count of the records for the current model does not exceed the defined | that the count of the records for the current model does not exceed the defined | ||||||
| limit. | limit. | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** You must specify the limit scope of the object being validated | NOTE: **Note:** | ||||||
|  | You must specify the limit scope of the object being validated | ||||||
| and the limit name if it's different from the pluralized model name. | and the limit name if it's different from the pluralized model name. | ||||||
| 
 | 
 | ||||||
| ```ruby | ```ruby | ||||||
|  | @ -143,4 +146,5 @@ GitLab.com: | ||||||
| - `silver` - Namespaces and projects with a Silver subscription | - `silver` - Namespaces and projects with a Silver subscription | ||||||
| - `gold` - Namespaces and projects with a Gold subscription | - `gold` - Namespaces and projects with a Gold subscription | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** The test environment doesn't have any plans. | NOTE: **Note:** | ||||||
|  | The test environment doesn't have any plans. | ||||||
|  |  | ||||||
|  | @ -17,7 +17,8 @@ To request access to Chatops on GitLab.com: | ||||||
|     1. You could also use the "Sign in with" Google button to sign in, with your GitLab.com email address. |     1. You could also use the "Sign in with" Google button to sign in, with your GitLab.com email address. | ||||||
| 1. Ask in the [#production](https://gitlab.slack.com/messages/production) channel for an existing member to add you to the `chatops` project in Ops. They can do it by running `/chatops run member add <username> gitlab-com/chatops --ops` command in that channel. | 1. Ask in the [#production](https://gitlab.slack.com/messages/production) channel for an existing member to add you to the `chatops` project in Ops. They can do it by running `/chatops run member add <username> gitlab-com/chatops --ops` command in that channel. | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** If you had to change your username for GitLab.com on the first step, make sure [to reflect this information](https://gitlab.com/gitlab-com/www-gitlab-com#adding-yourself-to-the-team-page) on [the team page](https://about.gitlab.com/company/team/). | NOTE: **Note:** | ||||||
|  | If you had to change your username for GitLab.com on the first step, make sure [to reflect this information](https://gitlab.com/gitlab-com/www-gitlab-com#adding-yourself-to-the-team-page) on [the team page](https://about.gitlab.com/company/team/). | ||||||
| 
 | 
 | ||||||
| ## See also | ## See also | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -92,7 +92,8 @@ A job with the `created` state won't be seen by the Runner yet. To make it possi | ||||||
| 
 | 
 | ||||||
| When the Runner is connected, it requests the next `pending` job to run by polling the server continuously. | When the Runner is connected, it requests the next `pending` job to run by polling the server continuously. | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** API endpoints used by the Runner to interact with GitLab are defined in [`lib/api/runner.rb`](https://gitlab.com/gitlab-org/gitlab/blob/master/lib/api/runner.rb) | NOTE: **Note:** | ||||||
|  | API endpoints used by the Runner to interact with GitLab are defined in [`lib/api/runner.rb`](https://gitlab.com/gitlab-org/gitlab/blob/master/lib/api/runner.rb) | ||||||
| 
 | 
 | ||||||
| After the server receives the request it selects a `pending` job based on the [`Ci::RegisterJobService` algorithm](#ciregisterjobservice), then assigns and sends the job to the Runner. | After the server receives the request it selects a `pending` job based on the [`Ci::RegisterJobService` algorithm](#ciregisterjobservice), then assigns and sends the job to the Runner. | ||||||
| 
 | 
 | ||||||
|  | @ -126,7 +127,8 @@ There are 3 top level queries that this service uses to gather the majority of t | ||||||
| 
 | 
 | ||||||
| This list of jobs is then filtered further by matching tags between job and Runner tags. | This list of jobs is then filtered further by matching tags between job and Runner tags. | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** If a job contains tags, the Runner will not pick the job if it does not match **all** the tags. | NOTE: **Note:** | ||||||
|  | If a job contains tags, the Runner will not pick the job if it does not match **all** the tags. | ||||||
| The Runner may have more tags than defined for the job, but not vice-versa. | The Runner may have more tags than defined for the job, but not vice-versa. | ||||||
| 
 | 
 | ||||||
| Finally if the Runner can only pick jobs that are tagged, all untagged jobs are filtered out. | Finally if the Runner can only pick jobs that are tagged, all untagged jobs are filtered out. | ||||||
|  |  | ||||||
|  | @ -113,7 +113,8 @@ end | ||||||
| 
 | 
 | ||||||
| Validating the foreign key will scan the whole table and make sure that each relation is correct. | Validating the foreign key will scan the whole table and make sure that each relation is correct. | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** When using [background migrations](../background_migrations.md), foreign key validation should happen in the next GitLab release. | NOTE: **Note:** | ||||||
|  | When using [background migrations](../background_migrations.md), foreign key validation should happen in the next GitLab release. | ||||||
| 
 | 
 | ||||||
| Migration file for validating the foreign key: | Migration file for validating the foreign key: | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -190,7 +190,8 @@ In general, migrations for a single deploy shouldn't take longer than | ||||||
| 1 hour for GitLab.com. The following guidelines are not hard rules, they were | 1 hour for GitLab.com. The following guidelines are not hard rules, they were | ||||||
| estimated to keep migration timing to a minimum. | estimated to keep migration timing to a minimum. | ||||||
| 
 | 
 | ||||||
| NOTE: **Note:** Keep in mind that all runtimes should be measured against GitLab.com. | NOTE: **Note:** | ||||||
|  | Keep in mind that all runtimes should be measured against GitLab.com. | ||||||
| 
 | 
 | ||||||
| | Migration Type | Execution Time Recommended | Notes | | | Migration Type | Execution Time Recommended | Notes | | ||||||
| |----|----|---| | |----|----|---| | ||||||
|  |  | ||||||
|  | @ -98,7 +98,7 @@ for clarity. | ||||||
| To see the improvements planned, check the | To see the improvements planned, check the | ||||||
| [global nav epic](https://gitlab.com/groups/gitlab-com/-/epics/21). | [global nav epic](https://gitlab.com/groups/gitlab-com/-/epics/21). | ||||||
| 
 | 
 | ||||||
| CAUTION: **Attention!** | NOTE: **Note:** | ||||||
| **Do not** [add items](#adding-new-items) to the global nav without | **Do not** [add items](#adding-new-items) to the global nav without | ||||||
| the consent of one of the technical writers. | the consent of one of the technical writers. | ||||||
| 
 | 
 | ||||||
|  | @ -275,7 +275,7 @@ and the following syntax rules. | ||||||
|   an "information" icon on the nav to make the user aware that the feature is |   an "information" icon on the nav to make the user aware that the feature is | ||||||
|   EE-only. |   EE-only. | ||||||
| 
 | 
 | ||||||
| DANGER: **Important!** | CAUTION: **Caution:** | ||||||
| All links present on the data file must end in `.html`, not `.md`. Do not | All links present on the data file must end in `.html`, not `.md`. Do not | ||||||
| start any relative link with a forward slash `/`. | start any relative link with a forward slash `/`. | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue