Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
04f9cef437
commit
ede9464fd9
124 changed files with 687 additions and 1059 deletions
|
@ -36,3 +36,8 @@ template: |
|
|||
{% else %}
|
||||
No changes.
|
||||
{% end %}
|
||||
# The tag format for gitlab-org/gitlab is vX.Y.Z(-rcX)-ee. The -ee prefix would
|
||||
# be treated as a pre-release identifier, which can result in the wrong tag
|
||||
# being used as the starting point of a changelog commit range. The custom regex
|
||||
# here is used to ensure we find the correct tag.
|
||||
tag_regex: '^v(?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)-ee$'
|
||||
|
|
|
@ -690,7 +690,7 @@ GEM
|
|||
rest-client (~> 2.0)
|
||||
launchy (2.5.0)
|
||||
addressable (~> 2.7)
|
||||
lefthook (0.7.2)
|
||||
lefthook (0.7.5)
|
||||
letter_opener (1.7.0)
|
||||
launchy (~> 2.2)
|
||||
letter_opener_web (1.4.0)
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<script>
|
||||
import { GlLoadingIcon } from '@gitlab/ui';
|
||||
import { GlLoadingIcon, GlIntersectionObserver } from '@gitlab/ui';
|
||||
import Draggable from 'vuedraggable';
|
||||
import { mapActions, mapGetters, mapState } from 'vuex';
|
||||
import { sortableStart, sortableEnd } from '~/boards/mixins/sortable_default_options';
|
||||
|
@ -21,6 +21,7 @@ export default {
|
|||
BoardCard,
|
||||
BoardNewIssue,
|
||||
GlLoadingIcon,
|
||||
GlIntersectionObserver,
|
||||
},
|
||||
props: {
|
||||
disabled: {
|
||||
|
@ -65,7 +66,7 @@ export default {
|
|||
return this.list.maxIssueCount > 0 && this.listItemsCount > this.list.maxIssueCount;
|
||||
},
|
||||
hasNextPage() {
|
||||
return this.pageInfoByListId[this.list.id].hasNextPage;
|
||||
return this.pageInfoByListId[this.list.id]?.hasNextPage;
|
||||
},
|
||||
loading() {
|
||||
return this.listsFlags[this.list.id]?.isLoading;
|
||||
|
@ -115,14 +116,9 @@ export default {
|
|||
eventHub.$on(`toggle-issue-form-${this.list.id}`, this.toggleForm);
|
||||
eventHub.$on(`scroll-board-list-${this.list.id}`, this.scrollToTop);
|
||||
},
|
||||
mounted() {
|
||||
// Scroll event on list to load more
|
||||
this.listRef.addEventListener('scroll', this.onScroll);
|
||||
},
|
||||
beforeDestroy() {
|
||||
eventHub.$off(`toggle-issue-form-${this.list.id}`, this.toggleForm);
|
||||
eventHub.$off(`scroll-board-list-${this.list.id}`, this.scrollToTop);
|
||||
this.listRef.removeEventListener('scroll', this.onScroll);
|
||||
},
|
||||
methods: {
|
||||
...mapActions(['fetchItemsForList', 'moveItem']),
|
||||
|
@ -144,16 +140,10 @@ export default {
|
|||
toggleForm() {
|
||||
this.showIssueForm = !this.showIssueForm;
|
||||
},
|
||||
onScroll() {
|
||||
window.requestAnimationFrame(() => {
|
||||
if (
|
||||
!this.loadingMore &&
|
||||
this.scrollTop() > this.scrollHeight() - this.scrollOffset &&
|
||||
this.hasNextPage
|
||||
) {
|
||||
this.loadNextPage();
|
||||
}
|
||||
});
|
||||
onReachingListBottom() {
|
||||
if (!this.loadingMore && this.hasNextPage) {
|
||||
this.loadNextPage();
|
||||
}
|
||||
},
|
||||
handleDragOnStart() {
|
||||
sortableStart();
|
||||
|
@ -249,7 +239,9 @@ export default {
|
|||
data-testid="count-loading-icon"
|
||||
/>
|
||||
<span v-if="showingAllItems">{{ showingAllItemsText }}</span>
|
||||
<span v-else>{{ paginatedIssueText }}</span>
|
||||
<gl-intersection-observer v-else @update="onReachingListBottom">
|
||||
<span>{{ paginatedIssueText }}</span>
|
||||
</gl-intersection-observer>
|
||||
</li>
|
||||
</component>
|
||||
</div>
|
||||
|
|
|
@ -298,7 +298,7 @@ export default {
|
|||
filters: filterParams,
|
||||
isGroup: boardType === BoardType.group,
|
||||
isProject: boardType === BoardType.project,
|
||||
first: 20,
|
||||
first: 10,
|
||||
after: fetchNext ? state.pageInfoByListId[listId].endCursor : undefined,
|
||||
};
|
||||
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
<script>
|
||||
import { GlIcon, GlEmptyState, GlLoadingIcon, GlSprintf } from '@gitlab/ui';
|
||||
import Cookies from 'js-cookie';
|
||||
import { mapActions, mapState, mapGetters } from 'vuex';
|
||||
import PathNavigation from '~/cycle_analytics/components/path_navigation.vue';
|
||||
import { mapActions, mapState } from 'vuex';
|
||||
import { __ } from '~/locale';
|
||||
import banner from './banner.vue';
|
||||
import stageCodeComponent from './stage_code_component.vue';
|
||||
|
@ -30,7 +29,6 @@ export default {
|
|||
'stage-staging-component': stageStagingComponent,
|
||||
'stage-production-component': stageComponent,
|
||||
'stage-nav-item': stageNavItem,
|
||||
PathNavigation,
|
||||
},
|
||||
props: {
|
||||
noDataSvgPath: {
|
||||
|
@ -58,7 +56,6 @@ export default {
|
|||
'summary',
|
||||
'startDate',
|
||||
]),
|
||||
...mapGetters(['pathNavigationData']),
|
||||
displayStageEvents() {
|
||||
const { selectedStageEvents, isLoadingStage, isEmptyStage } = this;
|
||||
return selectedStageEvents.length && !isLoadingStage && !isEmptyStage;
|
||||
|
@ -71,12 +68,6 @@ export default {
|
|||
const { selectedStage } = this;
|
||||
return selectedStage && !selectedStage.isUserAllowed;
|
||||
},
|
||||
selectedStageReady() {
|
||||
return !this.hasNoAccessError && this.selectedStage;
|
||||
},
|
||||
shouldDisplayPathNavigation() {
|
||||
return this.selectedStage;
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
...mapActions([
|
||||
|
@ -92,8 +83,8 @@ export default {
|
|||
isActiveStage(stage) {
|
||||
return stage.slug === this.selectedStage.slug;
|
||||
},
|
||||
onSelectStage(stage) {
|
||||
if (this.isLoadingStage || this.selectedStage?.slug === stage?.slug) return;
|
||||
selectStage(stage) {
|
||||
if (this.selectedStage === stage) return;
|
||||
|
||||
this.setSelectedStage(stage);
|
||||
if (!stage.isUserAllowed) {
|
||||
|
@ -115,23 +106,9 @@ export default {
|
|||
</script>
|
||||
<template>
|
||||
<div class="cycle-analytics">
|
||||
<path-navigation
|
||||
v-if="shouldDisplayPathNavigation"
|
||||
class="js-path-navigation gl-w-full gl-pb-2"
|
||||
:loading="isLoading"
|
||||
:stages="pathNavigationData"
|
||||
:selected-stage="selectedStage"
|
||||
:with-stage-counts="false"
|
||||
@selected="(ev) => onSelectStage(ev)"
|
||||
/>
|
||||
<gl-loading-icon v-if="isLoading" size="lg" />
|
||||
<div v-else class="wrapper">
|
||||
<!--
|
||||
We wont have access to the stage counts until we move to a default value stream
|
||||
For now we can use the `withStageCounts` flag to ensure we don't display empty stage counts
|
||||
Related issue: https://gitlab.com/gitlab-org/gitlab/-/issues/326705
|
||||
-->
|
||||
<div class="card" data-testid="vsa-stage-overview-metrics">
|
||||
<div class="card">
|
||||
<div class="card-header">{{ __('Recent Project Activity') }}</div>
|
||||
<div class="d-flex justify-content-between">
|
||||
<div v-for="item in summary" :key="item.title" class="gl-flex-grow-1 gl-text-center">
|
||||
|
@ -162,12 +139,40 @@ export default {
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="stage-panel-container" data-testid="vsa-stage-table">
|
||||
<div class="card stage-panel gl-px-5">
|
||||
<div class="stage-panel-container">
|
||||
<div class="card stage-panel">
|
||||
<div class="card-header border-bottom-0">
|
||||
<nav class="col-headers">
|
||||
<ul class="gl-display-flex gl-justify-content-space-between gl-list-style-none">
|
||||
<li>
|
||||
<ul>
|
||||
<li class="stage-header pl-5">
|
||||
<span class="stage-name font-weight-bold">{{
|
||||
s__('ProjectLifecycle|Stage')
|
||||
}}</span>
|
||||
<span
|
||||
class="has-tooltip"
|
||||
data-placement="top"
|
||||
:title="__('The phase of the development lifecycle.')"
|
||||
aria-hidden="true"
|
||||
>
|
||||
<gl-icon name="question-o" class="gl-text-gray-500" />
|
||||
</span>
|
||||
</li>
|
||||
<li class="median-header">
|
||||
<span class="stage-name font-weight-bold">{{ __('Median') }}</span>
|
||||
<span
|
||||
class="has-tooltip"
|
||||
data-placement="top"
|
||||
:title="
|
||||
__(
|
||||
'The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6.',
|
||||
)
|
||||
"
|
||||
aria-hidden="true"
|
||||
>
|
||||
<gl-icon name="question-o" class="gl-text-gray-500" />
|
||||
</span>
|
||||
</li>
|
||||
<li class="event-header pl-3">
|
||||
<span v-if="selectedStage" class="stage-name font-weight-bold">{{
|
||||
selectedStage.legend ? __(selectedStage.legend) : __('Related Issues')
|
||||
}}</span>
|
||||
|
@ -182,7 +187,7 @@ export default {
|
|||
<gl-icon name="question-o" class="gl-text-gray-500" />
|
||||
</span>
|
||||
</li>
|
||||
<li>
|
||||
<li class="total-time-header pr-5 text-right">
|
||||
<span class="stage-name font-weight-bold">{{ __('Time') }}</span>
|
||||
<span
|
||||
class="has-tooltip"
|
||||
|
@ -196,8 +201,22 @@ export default {
|
|||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
|
||||
<div class="stage-panel-body">
|
||||
<section class="stage-events overflow-auto gl-w-full">
|
||||
<nav class="stage-nav">
|
||||
<ul>
|
||||
<stage-nav-item
|
||||
v-for="stage in stages"
|
||||
:key="stage.title"
|
||||
:title="stage.title"
|
||||
:is-user-allowed="stage.isUserAllowed"
|
||||
:value="stage.value"
|
||||
:is-active="isActiveStage(stage)"
|
||||
@select="selectStage(stage)"
|
||||
/>
|
||||
</ul>
|
||||
</nav>
|
||||
<section class="stage-events overflow-auto">
|
||||
<gl-loading-icon v-show="isLoadingStage" size="lg" />
|
||||
<template v-if="displayNoAccess">
|
||||
<gl-empty-state
|
||||
|
|
|
@ -1,117 +0,0 @@
|
|||
<script>
|
||||
import {
|
||||
GlPath,
|
||||
GlPopover,
|
||||
GlDeprecatedSkeletonLoading as GlSkeletonLoading,
|
||||
GlSafeHtmlDirective as SafeHtml,
|
||||
} from '@gitlab/ui';
|
||||
import { OVERVIEW_STAGE_ID } from '../constants';
|
||||
|
||||
export default {
|
||||
name: 'PathNavigation',
|
||||
components: {
|
||||
GlPath,
|
||||
GlSkeletonLoading,
|
||||
GlPopover,
|
||||
},
|
||||
directives: {
|
||||
SafeHtml,
|
||||
},
|
||||
props: {
|
||||
loading: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
default: false,
|
||||
},
|
||||
stages: {
|
||||
type: Array,
|
||||
required: true,
|
||||
},
|
||||
selectedStage: {
|
||||
type: Object,
|
||||
required: false,
|
||||
default: () => {},
|
||||
},
|
||||
withStageCounts: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
default: true,
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
showPopover({ id }) {
|
||||
return id && id !== OVERVIEW_STAGE_ID;
|
||||
},
|
||||
hasStageCount({ stageCount = null }) {
|
||||
return stageCount !== null;
|
||||
},
|
||||
},
|
||||
popoverOptions: {
|
||||
triggers: 'hover',
|
||||
placement: 'bottom',
|
||||
},
|
||||
};
|
||||
</script>
|
||||
<template>
|
||||
<gl-skeleton-loading v-if="loading" :lines="2" class="h-auto pt-2 pb-1" />
|
||||
<gl-path v-else :key="selectedStage.id" :items="stages" @selected="$emit('selected', $event)">
|
||||
<template #default="{ pathItem, pathId }">
|
||||
<gl-popover
|
||||
v-if="showPopover(pathItem)"
|
||||
v-bind="$options.popoverOptions"
|
||||
:target="pathId"
|
||||
:css-classes="['stage-item-popover']"
|
||||
data-testid="stage-item-popover"
|
||||
>
|
||||
<template #title>{{ pathItem.title }}</template>
|
||||
<div class="gl-px-4">
|
||||
<div class="gl-display-flex gl-justify-content-space-between">
|
||||
<div class="gl-pr-4 gl-pb-4">
|
||||
{{ s__('ValueStreamEvent|Stage time (median)') }}
|
||||
</div>
|
||||
<div class="gl-pb-4 gl-font-weight-bold">{{ pathItem.metric }}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="withStageCounts" class="gl-px-4">
|
||||
<div class="gl-display-flex gl-justify-content-space-between">
|
||||
<div class="gl-pr-4 gl-pb-4">
|
||||
{{ s__('ValueStreamEvent|Items in stage') }}
|
||||
</div>
|
||||
<div class="gl-pb-4 gl-font-weight-bold">
|
||||
<template v-if="hasStageCount(pathItem)">{{
|
||||
n__('%d item', '%d items', pathItem.stageCount)
|
||||
}}</template>
|
||||
<template v-else>-</template>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="gl-px-4 gl-pt-4 gl-border-t-1 gl-border-t-solid gl-border-gray-50">
|
||||
<div
|
||||
v-if="pathItem.startEventHtmlDescription"
|
||||
class="gl-display-flex gl-flex-direction-row"
|
||||
>
|
||||
<div class="gl-display-flex gl-flex-direction-column gl-pr-4 gl-pb-4 metric-label">
|
||||
{{ s__('ValueStreamEvent|Start') }}
|
||||
</div>
|
||||
<div
|
||||
v-safe-html="pathItem.startEventHtmlDescription"
|
||||
class="gl-display-flex gl-flex-direction-column gl-pb-4 stage-event-description"
|
||||
></div>
|
||||
</div>
|
||||
<div
|
||||
v-if="pathItem.endEventHtmlDescription"
|
||||
class="gl-display-flex gl-flex-direction-row"
|
||||
>
|
||||
<div class="gl-display-flex gl-flex-direction-column gl-pr-4 metric-label">
|
||||
{{ s__('ValueStreamEvent|Stop') }}
|
||||
</div>
|
||||
<div
|
||||
v-safe-html="pathItem.endEventHtmlDescription"
|
||||
class="gl-display-flex gl-flex-direction-column stage-event-description"
|
||||
></div>
|
||||
</div>
|
||||
</div>
|
||||
</gl-popover>
|
||||
</template>
|
||||
</gl-path>
|
||||
</template>
|
|
@ -1,2 +1 @@
|
|||
export const DEFAULT_DAYS_TO_DISPLAY = 30;
|
||||
export const OVERVIEW_STAGE_ID = 'overview';
|
||||
|
|
|
@ -1,13 +0,0 @@
|
|||
import { transformStagesForPathNavigation } from '../utils';
|
||||
|
||||
export const filterStagesByHiddenStatus = (stages = [], isHidden = true) =>
|
||||
stages.filter(({ hidden = false }) => hidden === isHidden);
|
||||
|
||||
export const pathNavigationData = ({ stages, medians, stageCounts, selectedStage }) => {
|
||||
return transformStagesForPathNavigation({
|
||||
stages: filterStagesByHiddenStatus(stages, false),
|
||||
medians,
|
||||
stageCounts,
|
||||
selectedStage,
|
||||
});
|
||||
};
|
|
@ -8,7 +8,6 @@
|
|||
import Vue from 'vue';
|
||||
import Vuex from 'vuex';
|
||||
import * as actions from './actions';
|
||||
import * as getters from './getters';
|
||||
import mutations from './mutations';
|
||||
import state from './state';
|
||||
|
||||
|
@ -17,7 +16,6 @@ Vue.use(Vuex);
|
|||
export default () =>
|
||||
new Vuex.Store({
|
||||
actions,
|
||||
getters,
|
||||
mutations,
|
||||
state,
|
||||
});
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { decorateData, decorateEvents, formatMedianValues } from '../utils';
|
||||
import { decorateData, decorateEvents } from '../utils';
|
||||
import * as types from './mutation_types';
|
||||
|
||||
export default {
|
||||
|
@ -20,10 +20,9 @@ export default {
|
|||
},
|
||||
[types.RECEIVE_CYCLE_ANALYTICS_DATA_SUCCESS](state, data) {
|
||||
state.isLoading = false;
|
||||
const { stages, summary, medians } = decorateData(data);
|
||||
const { stages, summary } = decorateData(data);
|
||||
state.stages = stages;
|
||||
state.summary = summary;
|
||||
state.medians = formatMedianValues(medians);
|
||||
state.hasError = false;
|
||||
},
|
||||
[types.RECEIVE_CYCLE_ANALYTICS_DATA_ERROR](state) {
|
||||
|
|
|
@ -1,9 +1,6 @@
|
|||
import { unescape } from 'lodash';
|
||||
import { sanitize } from '~/lib/dompurify';
|
||||
import { roundToNearestHalf, convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
|
||||
import { parseSeconds } from '~/lib/utils/datetime_utility';
|
||||
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
|
||||
import { dasherize } from '~/lib/utils/text_utility';
|
||||
import { __, s__, sprintf } from '../locale';
|
||||
import { __ } from '../locale';
|
||||
import DEFAULT_EVENT_OBJECTS from './default_event_objects';
|
||||
|
||||
const EMPTY_STAGE_TEXTS = {
|
||||
|
@ -43,17 +40,10 @@ const mapToEvent = (event, stage) => {
|
|||
|
||||
export const decorateEvents = (events, stage) => events.map((event) => mapToEvent(event, stage));
|
||||
|
||||
/*
|
||||
* NOTE: We currently use the `name` field since the project level stages are in memory
|
||||
* once we migrate to a default value stream https://gitlab.com/gitlab-org/gitlab/-/issues/326705
|
||||
* we can use the `id` to identify which median we are using
|
||||
*/
|
||||
const mapToStage = (permissions, { name, ...rest }) => {
|
||||
const slug = dasherize(name.toLowerCase());
|
||||
const mapToStage = (permissions, item) => {
|
||||
const slug = dasherize(item.name.toLowerCase());
|
||||
return {
|
||||
...rest,
|
||||
name,
|
||||
id: name,
|
||||
...item,
|
||||
slug,
|
||||
active: false,
|
||||
isUserAllowed: permissions[slug],
|
||||
|
@ -63,95 +53,11 @@ const mapToStage = (permissions, { name, ...rest }) => {
|
|||
};
|
||||
|
||||
const mapToSummary = ({ value, ...rest }) => ({ ...rest, value: value || '-' });
|
||||
const mapToMedians = ({ id, value }) => ({ id, value });
|
||||
|
||||
export const decorateData = (data = {}) => {
|
||||
const { permissions, stats, summary } = data;
|
||||
const stages = stats?.map((item) => mapToStage(permissions, item)) || [];
|
||||
return {
|
||||
stages,
|
||||
stages: stats?.map((item) => mapToStage(permissions, item)) || [],
|
||||
summary: summary?.map((item) => mapToSummary(item)) || [],
|
||||
medians: stages?.map((item) => mapToMedians(item)) || [],
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* Takes the stages and median data, combined with the selected stage, to build an
|
||||
* array which is formatted to proivde the data required for the path navigation.
|
||||
*
|
||||
* @param {Array} stages - The stages available to the group / project
|
||||
* @param {Object} medians - The median values for the stages available to the group / project
|
||||
* @param {Object} stageCounts - The total item count for the stages available
|
||||
* @param {Object} selectedStage - The currently selected stage
|
||||
* @returns {Array} An array of stages formatted with data required for the path navigation
|
||||
*/
|
||||
export const transformStagesForPathNavigation = ({
|
||||
stages,
|
||||
medians,
|
||||
stageCounts = {},
|
||||
selectedStage,
|
||||
}) => {
|
||||
const formattedStages = stages.map((stage) => {
|
||||
return {
|
||||
metric: medians[stage?.id],
|
||||
selected: stage.id === selectedStage.id,
|
||||
stageCount: stageCounts && stageCounts[stage?.id],
|
||||
icon: null,
|
||||
...stage,
|
||||
};
|
||||
});
|
||||
|
||||
return formattedStages;
|
||||
};
|
||||
|
||||
export const timeSummaryForPathNavigation = ({ seconds, hours, days, minutes, weeks, months }) => {
|
||||
if (months) {
|
||||
return sprintf(s__('ValueStreamAnalytics|%{value}M'), {
|
||||
value: roundToNearestHalf(months),
|
||||
});
|
||||
} else if (weeks) {
|
||||
return sprintf(s__('ValueStreamAnalytics|%{value}w'), {
|
||||
value: roundToNearestHalf(weeks),
|
||||
});
|
||||
} else if (days) {
|
||||
return sprintf(s__('ValueStreamAnalytics|%{value}d'), {
|
||||
value: roundToNearestHalf(days),
|
||||
});
|
||||
} else if (hours) {
|
||||
return sprintf(s__('ValueStreamAnalytics|%{value}h'), { value: hours });
|
||||
} else if (minutes) {
|
||||
return sprintf(s__('ValueStreamAnalytics|%{value}m'), { value: minutes });
|
||||
} else if (seconds) {
|
||||
return unescape(sanitize(s__('ValueStreamAnalytics|<1m'), { ALLOWED_TAGS: [] }));
|
||||
}
|
||||
return '-';
|
||||
};
|
||||
|
||||
/**
|
||||
* Takes a raw median value in seconds and converts it to a string representation
|
||||
* ie. converts 172800 => 2d (2 days)
|
||||
*
|
||||
* @param {Number} Median - The number of seconds for the median calculation
|
||||
* @returns {String} String representation ie 2w
|
||||
*/
|
||||
export const medianTimeToParsedSeconds = (value) =>
|
||||
timeSummaryForPathNavigation({
|
||||
...parseSeconds(value, { daysPerWeek: 7, hoursPerDay: 24 }),
|
||||
seconds: value,
|
||||
});
|
||||
|
||||
/**
|
||||
* Takes the raw median value arrays and converts them into a useful object
|
||||
* containing the string for display in the path navigation
|
||||
* ie. converts [{ id: 'test', value: 172800 }] => { 'test': '2d' }
|
||||
*
|
||||
* @param {Array} Medians - Array of stage median objects, each contains a `id`, `value` and `error`
|
||||
* @returns {Object} Returns key value pair with the stage name and its display median value
|
||||
*/
|
||||
export const formatMedianValues = (medians = []) =>
|
||||
medians.reduce((acc, { id, value = 0 }) => {
|
||||
return {
|
||||
...acc,
|
||||
[id]: value ? medianTimeToParsedSeconds(value) : '-',
|
||||
};
|
||||
}, {});
|
||||
|
|
|
@ -129,7 +129,7 @@ export default class Project {
|
|||
const currentRef = $dropdown.data('ref');
|
||||
// The split and startWith is to ensure an exact word match
|
||||
// and avoid partial match ie. currentRef is "dev" and loc is "development"
|
||||
const splitPathAfterRefPortion = loc.split(currentRef)[1];
|
||||
const splitPathAfterRefPortion = loc.split('/-/')[1].split(currentRef)[1];
|
||||
const doesPathContainRef = splitPathAfterRefPortion?.startsWith('/');
|
||||
|
||||
if (doesPathContainRef) {
|
||||
|
|
|
@ -30,12 +30,32 @@
|
|||
|
||||
.col-headers {
|
||||
ul {
|
||||
@include clearfix;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
li {
|
||||
display: inline-block;
|
||||
float: left;
|
||||
line-height: 50px;
|
||||
width: 20%;
|
||||
}
|
||||
|
||||
.stage-header {
|
||||
width: 20.5%;
|
||||
}
|
||||
|
||||
.median-header {
|
||||
width: 19.5%;
|
||||
}
|
||||
|
||||
.event-header {
|
||||
width: 45%;
|
||||
}
|
||||
|
||||
.total-time-header {
|
||||
width: 15%;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -100,6 +120,7 @@
|
|||
}
|
||||
|
||||
li {
|
||||
@include clearfix;
|
||||
list-style-type: none;
|
||||
}
|
||||
|
||||
|
@ -148,6 +169,7 @@
|
|||
|
||||
.events-description {
|
||||
line-height: 65px;
|
||||
padding: 0 $gl-padding;
|
||||
}
|
||||
|
||||
.events-info {
|
||||
|
@ -156,6 +178,7 @@
|
|||
}
|
||||
|
||||
.stage-events {
|
||||
width: 60%;
|
||||
min-height: 467px;
|
||||
}
|
||||
|
||||
|
@ -167,8 +190,8 @@
|
|||
.stage-event-item {
|
||||
@include clearfix;
|
||||
list-style-type: none;
|
||||
padding-bottom: $gl-padding;
|
||||
margin-bottom: $gl-padding;
|
||||
padding: 0 0 $gl-padding;
|
||||
margin: 0 $gl-padding $gl-padding;
|
||||
border-bottom: 1px solid var(--gray-50, $gray-50);
|
||||
|
||||
&:last-child {
|
||||
|
|
|
@ -49,14 +49,14 @@ class Projects::PipelinesController < Projects::ApplicationController
|
|||
|
||||
respond_to do |format|
|
||||
format.html do
|
||||
experiment(:pipeline_empty_state_templates, actor: current_user) do |e|
|
||||
experiment(:pipeline_empty_state_templates, namespace: project.root_ancestor) do |e|
|
||||
e.exclude! unless current_user
|
||||
e.exclude! if @pipelines_count.to_i > 0
|
||||
e.exclude! if helpers.has_gitlab_ci?(project)
|
||||
|
||||
e.use {}
|
||||
e.try {}
|
||||
e.track(:view, value: project.namespace_id)
|
||||
e.record!
|
||||
end
|
||||
experiment(:code_quality_walkthrough, namespace: project.root_ancestor) do |e|
|
||||
e.exclude! unless current_user
|
||||
|
@ -67,7 +67,7 @@ class Projects::PipelinesController < Projects::ApplicationController
|
|||
|
||||
e.use {}
|
||||
e.try {}
|
||||
e.track(:view, property: project.root_ancestor.id.to_s)
|
||||
e.record!
|
||||
end
|
||||
end
|
||||
format.json do
|
||||
|
|
|
@ -12,6 +12,8 @@ class ApplicationExperiment < Gitlab::Experiment # rubocop:disable Gitlab/Namesp
|
|||
def publish(_result = nil)
|
||||
return unless should_track? # don't track events for excluded contexts
|
||||
|
||||
record_experiment if @record # record the subject in the database if the context contains a namespace, group, project, actor or user
|
||||
|
||||
track(:assignment) # track that we've assigned a variant for this context
|
||||
|
||||
begin
|
||||
|
@ -32,6 +34,10 @@ class ApplicationExperiment < Gitlab::Experiment # rubocop:disable Gitlab/Namesp
|
|||
))
|
||||
end
|
||||
|
||||
def record!
|
||||
@record = true
|
||||
end
|
||||
|
||||
def exclude!
|
||||
@excluded = true
|
||||
end
|
||||
|
@ -49,4 +55,13 @@ class ApplicationExperiment < Gitlab::Experiment # rubocop:disable Gitlab/Namesp
|
|||
def experiment_group?
|
||||
Feature.enabled?(feature_flag_name, self, type: :experiment, default_enabled: :yaml)
|
||||
end
|
||||
|
||||
def record_experiment
|
||||
subject = context.value[:namespace] || context.value[:group] || context.value[:project] || context.value[:user] || context.value[:actor]
|
||||
return unless subject.is_a?(Group) || subject.is_a?(User) || subject.is_a?(Project)
|
||||
|
||||
variant = :experimental if @variant_name != :control
|
||||
|
||||
Experiment.add_subject(name, variant: variant || :control, subject: subject)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -2,7 +2,19 @@
|
|||
|
||||
module Types
|
||||
class BaseEnum < GraphQL::Schema::Enum
|
||||
extend GitlabStyleDeprecations
|
||||
class CustomValue < GraphQL::Schema::EnumValue
|
||||
include ::GitlabStyleDeprecations
|
||||
|
||||
attr_reader :deprecation
|
||||
|
||||
def initialize(name, desc = nil, **kwargs)
|
||||
@deprecation = gitlab_deprecation(kwargs)
|
||||
|
||||
super(name, desc, **kwargs)
|
||||
end
|
||||
end
|
||||
|
||||
enum_value_class(CustomValue)
|
||||
|
||||
class << self
|
||||
# Registers enum definition by the given DeclarativeEnum module
|
||||
|
@ -41,7 +53,6 @@ module Types
|
|||
|
||||
def value(*args, **kwargs, &block)
|
||||
enum[args[0].downcase] = kwargs[:value] || args[0]
|
||||
gitlab_deprecation(kwargs)
|
||||
|
||||
super(*args, **kwargs, &block)
|
||||
end
|
||||
|
|
|
@ -11,7 +11,11 @@ class Experiment < ApplicationRecord
|
|||
end
|
||||
|
||||
def self.add_group(name, variant:, group:)
|
||||
find_or_create_by!(name: name).record_group_and_variant!(group, variant)
|
||||
add_subject(name, variant: variant, subject: group)
|
||||
end
|
||||
|
||||
def self.add_subject(name, variant:, subject:)
|
||||
find_or_create_by!(name: name).record_subject_and_variant!(subject, variant)
|
||||
end
|
||||
|
||||
def self.record_conversion_event(name, user, context = {})
|
||||
|
@ -37,8 +41,11 @@ class Experiment < ApplicationRecord
|
|||
experiment_user.update!(converted_at: Time.current, context: merged_context(experiment_user, context))
|
||||
end
|
||||
|
||||
def record_group_and_variant!(group, variant)
|
||||
experiment_subject = experiment_subjects.find_or_initialize_by(group: group)
|
||||
def record_subject_and_variant!(subject, variant)
|
||||
subject = subject.owner if subject.is_a?(Namespace) && subject.user?
|
||||
raise 'Incompatible subject provided!' unless subject.is_a?(Group) || subject.is_a?(User) || subject.is_a?(Project)
|
||||
|
||||
experiment_subject = experiment_subjects.find_or_initialize_by(subject.class.name.downcase => subject)
|
||||
experiment_subject.assign_attributes(variant: variant)
|
||||
# We only call save when necessary because this causes the request to stick to the primary DB
|
||||
# even when the save is a no-op
|
||||
|
|
|
@ -50,6 +50,8 @@ class PagesDomain < ApplicationRecord
|
|||
after_update :update_daemon, if: :saved_change_to_pages_config?
|
||||
after_destroy :update_daemon
|
||||
|
||||
scope :for_project, ->(project) { where(project: project) }
|
||||
|
||||
scope :enabled, -> { where('enabled_until >= ?', Time.current ) }
|
||||
scope :needs_verification, -> do
|
||||
verified_at = arel_table[:verified_at]
|
||||
|
|
|
@ -8,5 +8,9 @@ class AnalyticsStageEntity < Grape::Entity
|
|||
expose :legend
|
||||
expose :description
|
||||
|
||||
expose :project_median, as: :value
|
||||
expose :project_median, as: :value do |stage|
|
||||
# median returns a BatchLoader instance which we first have to unwrap by using to_f
|
||||
# we use to_f to make sure results below 1 are presented to the end-user
|
||||
stage.project_median.to_f.nonzero? ? distance_of_time_in_words(stage.project_median) : nil
|
||||
end
|
||||
end
|
||||
|
|
|
@ -3,8 +3,13 @@
|
|||
module Pages
|
||||
class DeleteService < BaseService
|
||||
def execute
|
||||
project.mark_pages_as_not_deployed # prevents domain from updating config when deleted
|
||||
project.pages_domains.delete_all
|
||||
project.mark_pages_as_not_deployed
|
||||
|
||||
# project.pages_domains.delete_all will just nullify project_id:
|
||||
# > If no :dependent option is given, then it will follow the default
|
||||
# > strategy for `has_many :through` associations.
|
||||
# > The default strategy is :nullify which sets the foreign keys to NULL.
|
||||
PagesDomain.for_project(project).delete_all
|
||||
|
||||
DestroyPagesDeploymentsWorker.perform_async(project.id)
|
||||
|
||||
|
|
|
@ -432,15 +432,6 @@
|
|||
:weight: 1
|
||||
:idempotent:
|
||||
:tags: []
|
||||
- :name: cronjob:prune_web_hook_logs
|
||||
:worker_name: PruneWebHookLogsWorker
|
||||
:feature_category: :integrations
|
||||
:has_external_dependencies:
|
||||
:urgency: :low
|
||||
:resource_boundary: :unknown
|
||||
:weight: 1
|
||||
:idempotent:
|
||||
:tags: []
|
||||
- :name: cronjob:releases_manage_evidence
|
||||
:worker_name: Releases::ManageEvidenceWorker
|
||||
:feature_category: :release_evidence
|
||||
|
|
|
@ -1,24 +0,0 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
# Worker that deletes a fixed number of outdated rows from the "web_hook_logs"
|
||||
# table.
|
||||
class PruneWebHookLogsWorker # rubocop:disable Scalability/IdempotentWorker
|
||||
include ApplicationWorker
|
||||
|
||||
sidekiq_options retry: 3
|
||||
# rubocop:disable Scalability/CronWorkerContext
|
||||
# This worker does not perform work scoped to a context
|
||||
include CronjobQueue
|
||||
# rubocop:enable Scalability/CronWorkerContext
|
||||
|
||||
feature_category :integrations
|
||||
|
||||
# The maximum number of rows to remove in a single job.
|
||||
DELETE_LIMIT = 50_000
|
||||
|
||||
def perform
|
||||
cutoff_date = 90.days.ago.beginning_of_day
|
||||
|
||||
WebHookLog.created_before(cutoff_date).delete_with_limit(DELETE_LIMIT)
|
||||
end
|
||||
end
|
|
@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/329190
|
|||
milestone: '13.12'
|
||||
type: development
|
||||
group: group::source code
|
||||
default_enabled: false
|
||||
default_enabled: true
|
||||
|
|
|
@ -1,8 +0,0 @@
|
|||
---
|
||||
name: usage_data_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile
|
||||
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54707
|
||||
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/322166
|
||||
milestone: '13.10'
|
||||
type: development
|
||||
group: group::pipeline authoring
|
||||
default_enabled: true
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
key_path: counts.projects_creating_incidents
|
||||
description: Counts of Projects that have created incidents
|
||||
description: Counts of Projects that have incident issues, regardless of status.
|
||||
product_section: ops
|
||||
product_stage: monitor
|
||||
product_group: group::health
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: reference, howto
|
||||
---
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: reference, howto
|
||||
---
|
||||
|
|
|
@ -13624,10 +13624,10 @@ Values for sorting alerts.
|
|||
| <a id="alertmanagementalertsortupdated_desc"></a>`UPDATED_DESC` | Updated at descending order. |
|
||||
| <a id="alertmanagementalertsortupdated_time_asc"></a>`UPDATED_TIME_ASC` | Created time by ascending order. |
|
||||
| <a id="alertmanagementalertsortupdated_time_desc"></a>`UPDATED_TIME_DESC` | Created time by descending order. |
|
||||
| <a id="alertmanagementalertsortcreated_asc"></a>`created_asc` **{warning-solid}** | **Deprecated:** This was renamed. Please use `CREATED_ASC`. Deprecated in 13.5. |
|
||||
| <a id="alertmanagementalertsortcreated_desc"></a>`created_desc` **{warning-solid}** | **Deprecated:** This was renamed. Please use `CREATED_DESC`. Deprecated in 13.5. |
|
||||
| <a id="alertmanagementalertsortupdated_asc"></a>`updated_asc` **{warning-solid}** | **Deprecated:** This was renamed. Please use `UPDATED_ASC`. Deprecated in 13.5. |
|
||||
| <a id="alertmanagementalertsortupdated_desc"></a>`updated_desc` **{warning-solid}** | **Deprecated:** This was renamed. Please use `UPDATED_DESC`. Deprecated in 13.5. |
|
||||
| <a id="alertmanagementalertsortcreated_asc"></a>`created_asc` **{warning-solid}** | **Deprecated** in 13.5. This was renamed. Use: `CREATED_ASC`. |
|
||||
| <a id="alertmanagementalertsortcreated_desc"></a>`created_desc` **{warning-solid}** | **Deprecated** in 13.5. This was renamed. Use: `CREATED_DESC`. |
|
||||
| <a id="alertmanagementalertsortupdated_asc"></a>`updated_asc` **{warning-solid}** | **Deprecated** in 13.5. This was renamed. Use: `UPDATED_ASC`. |
|
||||
| <a id="alertmanagementalertsortupdated_desc"></a>`updated_desc` **{warning-solid}** | **Deprecated** in 13.5. This was renamed. Use: `UPDATED_DESC`. |
|
||||
|
||||
### `AlertManagementDomainFilter`
|
||||
|
||||
|
@ -13897,10 +13897,10 @@ Values for sorting container repositories.
|
|||
| <a id="containerrepositorysortname_desc"></a>`NAME_DESC` | Name by descending order. |
|
||||
| <a id="containerrepositorysortupdated_asc"></a>`UPDATED_ASC` | Updated at ascending order. |
|
||||
| <a id="containerrepositorysortupdated_desc"></a>`UPDATED_DESC` | Updated at descending order. |
|
||||
| <a id="containerrepositorysortcreated_asc"></a>`created_asc` **{warning-solid}** | **Deprecated:** This was renamed. Please use `CREATED_ASC`. Deprecated in 13.5. |
|
||||
| <a id="containerrepositorysortcreated_desc"></a>`created_desc` **{warning-solid}** | **Deprecated:** This was renamed. Please use `CREATED_DESC`. Deprecated in 13.5. |
|
||||
| <a id="containerrepositorysortupdated_asc"></a>`updated_asc` **{warning-solid}** | **Deprecated:** This was renamed. Please use `UPDATED_ASC`. Deprecated in 13.5. |
|
||||
| <a id="containerrepositorysortupdated_desc"></a>`updated_desc` **{warning-solid}** | **Deprecated:** This was renamed. Please use `UPDATED_DESC`. Deprecated in 13.5. |
|
||||
| <a id="containerrepositorysortcreated_asc"></a>`created_asc` **{warning-solid}** | **Deprecated** in 13.5. This was renamed. Use: `CREATED_ASC`. |
|
||||
| <a id="containerrepositorysortcreated_desc"></a>`created_desc` **{warning-solid}** | **Deprecated** in 13.5. This was renamed. Use: `CREATED_DESC`. |
|
||||
| <a id="containerrepositorysortupdated_asc"></a>`updated_asc` **{warning-solid}** | **Deprecated** in 13.5. This was renamed. Use: `UPDATED_ASC`. |
|
||||
| <a id="containerrepositorysortupdated_desc"></a>`updated_desc` **{warning-solid}** | **Deprecated** in 13.5. This was renamed. Use: `UPDATED_DESC`. |
|
||||
|
||||
### `ContainerRepositoryStatus`
|
||||
|
||||
|
@ -14022,10 +14022,10 @@ Roadmap sort values.
|
|||
| <a id="epicsortend_date_desc"></a>`END_DATE_DESC` | Sort by end date in descending order. |
|
||||
| <a id="epicsortstart_date_asc"></a>`START_DATE_ASC` | Sort by start date in ascending order. |
|
||||
| <a id="epicsortstart_date_desc"></a>`START_DATE_DESC` | Sort by start date in descending order. |
|
||||
| <a id="epicsortend_date_asc"></a>`end_date_asc` **{warning-solid}** | **Deprecated:** Use END_DATE_ASC. Deprecated in 13.11. |
|
||||
| <a id="epicsortend_date_desc"></a>`end_date_desc` **{warning-solid}** | **Deprecated:** Use END_DATE_DESC. Deprecated in 13.11. |
|
||||
| <a id="epicsortstart_date_asc"></a>`start_date_asc` **{warning-solid}** | **Deprecated:** Use START_DATE_ASC. Deprecated in 13.11. |
|
||||
| <a id="epicsortstart_date_desc"></a>`start_date_desc` **{warning-solid}** | **Deprecated:** Use START_DATE_DESC. Deprecated in 13.11. |
|
||||
| <a id="epicsortend_date_asc"></a>`end_date_asc` **{warning-solid}** | **Deprecated** in 13.11. Use END_DATE_ASC. |
|
||||
| <a id="epicsortend_date_desc"></a>`end_date_desc` **{warning-solid}** | **Deprecated** in 13.11. Use END_DATE_DESC. |
|
||||
| <a id="epicsortstart_date_asc"></a>`start_date_asc` **{warning-solid}** | **Deprecated** in 13.11. Use START_DATE_ASC. |
|
||||
| <a id="epicsortstart_date_desc"></a>`start_date_desc` **{warning-solid}** | **Deprecated** in 13.11. Use START_DATE_DESC. |
|
||||
|
||||
### `EpicState`
|
||||
|
||||
|
@ -14154,10 +14154,10 @@ Values for sorting issues.
|
|||
| <a id="issuesortupdated_desc"></a>`UPDATED_DESC` | Updated at descending order. |
|
||||
| <a id="issuesortweight_asc"></a>`WEIGHT_ASC` | Weight by ascending order. |
|
||||
| <a id="issuesortweight_desc"></a>`WEIGHT_DESC` | Weight by descending order. |
|
||||
| <a id="issuesortcreated_asc"></a>`created_asc` **{warning-solid}** | **Deprecated:** This was renamed. Please use `CREATED_ASC`. Deprecated in 13.5. |
|
||||
| <a id="issuesortcreated_desc"></a>`created_desc` **{warning-solid}** | **Deprecated:** This was renamed. Please use `CREATED_DESC`. Deprecated in 13.5. |
|
||||
| <a id="issuesortupdated_asc"></a>`updated_asc` **{warning-solid}** | **Deprecated:** This was renamed. Please use `UPDATED_ASC`. Deprecated in 13.5. |
|
||||
| <a id="issuesortupdated_desc"></a>`updated_desc` **{warning-solid}** | **Deprecated:** This was renamed. Please use `UPDATED_DESC`. Deprecated in 13.5. |
|
||||
| <a id="issuesortcreated_asc"></a>`created_asc` **{warning-solid}** | **Deprecated** in 13.5. This was renamed. Use: `CREATED_ASC`. |
|
||||
| <a id="issuesortcreated_desc"></a>`created_desc` **{warning-solid}** | **Deprecated** in 13.5. This was renamed. Use: `CREATED_DESC`. |
|
||||
| <a id="issuesortupdated_asc"></a>`updated_asc` **{warning-solid}** | **Deprecated** in 13.5. This was renamed. Use: `UPDATED_ASC`. |
|
||||
| <a id="issuesortupdated_desc"></a>`updated_desc` **{warning-solid}** | **Deprecated** in 13.5. This was renamed. Use: `UPDATED_DESC`. |
|
||||
|
||||
### `IssueState`
|
||||
|
||||
|
@ -14307,10 +14307,10 @@ Values for sorting merge requests.
|
|||
| <a id="mergerequestsortpriority_desc"></a>`PRIORITY_DESC` | Priority by descending order. |
|
||||
| <a id="mergerequestsortupdated_asc"></a>`UPDATED_ASC` | Updated at ascending order. |
|
||||
| <a id="mergerequestsortupdated_desc"></a>`UPDATED_DESC` | Updated at descending order. |
|
||||
| <a id="mergerequestsortcreated_asc"></a>`created_asc` **{warning-solid}** | **Deprecated:** This was renamed. Please use `CREATED_ASC`. Deprecated in 13.5. |
|
||||
| <a id="mergerequestsortcreated_desc"></a>`created_desc` **{warning-solid}** | **Deprecated:** This was renamed. Please use `CREATED_DESC`. Deprecated in 13.5. |
|
||||
| <a id="mergerequestsortupdated_asc"></a>`updated_asc` **{warning-solid}** | **Deprecated:** This was renamed. Please use `UPDATED_ASC`. Deprecated in 13.5. |
|
||||
| <a id="mergerequestsortupdated_desc"></a>`updated_desc` **{warning-solid}** | **Deprecated:** This was renamed. Please use `UPDATED_DESC`. Deprecated in 13.5. |
|
||||
| <a id="mergerequestsortcreated_asc"></a>`created_asc` **{warning-solid}** | **Deprecated** in 13.5. This was renamed. Use: `CREATED_ASC`. |
|
||||
| <a id="mergerequestsortcreated_desc"></a>`created_desc` **{warning-solid}** | **Deprecated** in 13.5. This was renamed. Use: `CREATED_DESC`. |
|
||||
| <a id="mergerequestsortupdated_asc"></a>`updated_asc` **{warning-solid}** | **Deprecated** in 13.5. This was renamed. Use: `UPDATED_ASC`. |
|
||||
| <a id="mergerequestsortupdated_desc"></a>`updated_desc` **{warning-solid}** | **Deprecated** in 13.5. This was renamed. Use: `UPDATED_DESC`. |
|
||||
|
||||
### `MergeRequestState`
|
||||
|
||||
|
@ -14644,10 +14644,10 @@ Common sort values.
|
|||
| <a id="sortcreated_desc"></a>`CREATED_DESC` | Created at descending order. |
|
||||
| <a id="sortupdated_asc"></a>`UPDATED_ASC` | Updated at ascending order. |
|
||||
| <a id="sortupdated_desc"></a>`UPDATED_DESC` | Updated at descending order. |
|
||||
| <a id="sortcreated_asc"></a>`created_asc` **{warning-solid}** | **Deprecated:** This was renamed. Please use `CREATED_ASC`. Deprecated in 13.5. |
|
||||
| <a id="sortcreated_desc"></a>`created_desc` **{warning-solid}** | **Deprecated:** This was renamed. Please use `CREATED_DESC`. Deprecated in 13.5. |
|
||||
| <a id="sortupdated_asc"></a>`updated_asc` **{warning-solid}** | **Deprecated:** This was renamed. Please use `UPDATED_ASC`. Deprecated in 13.5. |
|
||||
| <a id="sortupdated_desc"></a>`updated_desc` **{warning-solid}** | **Deprecated:** This was renamed. Please use `UPDATED_DESC`. Deprecated in 13.5. |
|
||||
| <a id="sortcreated_asc"></a>`created_asc` **{warning-solid}** | **Deprecated** in 13.5. This was renamed. Use: `CREATED_ASC`. |
|
||||
| <a id="sortcreated_desc"></a>`created_desc` **{warning-solid}** | **Deprecated** in 13.5. This was renamed. Use: `CREATED_DESC`. |
|
||||
| <a id="sortupdated_asc"></a>`updated_asc` **{warning-solid}** | **Deprecated** in 13.5. This was renamed. Use: `UPDATED_ASC`. |
|
||||
| <a id="sortupdated_desc"></a>`updated_desc` **{warning-solid}** | **Deprecated** in 13.5. This was renamed. Use: `UPDATED_DESC`. |
|
||||
|
||||
### `TestCaseStatus`
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
---
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
---
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
---
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
---
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
---
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
---
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
---
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
---
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
---
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: reference, api
|
||||
---
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: reference
|
||||
---
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
comments: false
|
||||
description: "Learn how to use GitLab CI/CD, the GitLab built-in Continuous Integration, Continuous Deployment, and Continuous Delivery toolset to build, test, and deploy your application."
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: index, concepts, howto
|
||||
---
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: howto
|
||||
---
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: howto
|
||||
---
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: index, howto
|
||||
---
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: reference
|
||||
---
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
comments: false
|
||||
type: index
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: concepts, howto
|
||||
---
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: howto
|
||||
---
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: howto
|
||||
---
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
comments: false
|
||||
type: index
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
disqus_identifier: 'https://docs.gitlab.com/ee/articles/laravel_with_gitlab_and_envoy/index.html'
|
||||
author: Mehran Rasulian
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: tutorial
|
||||
---
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: reference
|
||||
---
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
description: "An overview of Continuous Integration, Continuous Delivery, and Continuous Deployment, as well as an introduction to GitLab CI/CD."
|
||||
type: concepts
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
---
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
---
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: reference, index
|
||||
last_update: 2019-07-03
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: reference
|
||||
last_update: 2019-07-03
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: reference
|
||||
last_update: 2019-07-03
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
comments: false
|
||||
type: index, howto
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
comments: false
|
||||
type: index, howto
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: reference
|
||||
---
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
disqus_identifier: 'https://docs.gitlab.com/ee/ci/pipelines.html'
|
||||
type: reference
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
disqus_identifier: 'https://docs.gitlab.com/ee/user/project/pipelines/job_artifacts.html'
|
||||
type: reference, howto
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: reference
|
||||
---
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: reference, howto
|
||||
---
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: reference
|
||||
---
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
disqus_identifier: 'https://docs.gitlab.com/ee/user/project/pipelines/schedules.html'
|
||||
type: reference, howto
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
disqus_identifier: 'https://docs.gitlab.com/ee/user/project/pipelines/settings.html'
|
||||
type: reference, howto
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: reference
|
||||
---
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: tutorial
|
||||
---
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: tutorial
|
||||
---
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: reference
|
||||
---
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: reference
|
||||
---
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: reference
|
||||
---
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: reference
|
||||
---
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: reference
|
||||
---
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
|
||||
type: reference
|
||||
---
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: reference
|
||||
---
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: reference
|
||||
---
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
---
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: index, concepts, howto
|
||||
---
|
||||
|
|
|
@ -394,6 +394,26 @@ You may be asked from time to time to track a specific record ID in experiments.
|
|||
The approach is largely up to the PM and engineer creating the implementation.
|
||||
No recommendations are provided here at this time.
|
||||
|
||||
### Record experiment subjects
|
||||
|
||||
Snowplow tracking of identifiable users or groups is prohibited, but you can still
|
||||
determine if an experiment is successful or not. We're allowed to record the ID of
|
||||
a group, project or user in our database. Therefore, we can tell the experiment
|
||||
to record their ID together with the assigned experiment variant in the
|
||||
`experiment_subjects` database table for later analysis.
|
||||
|
||||
For the recording to work, the experiment's context must include a `namespace`,
|
||||
`group`, `project`, `user`, or `actor`.
|
||||
|
||||
To record the experiment subject when you first assign a variant, call `record!` in
|
||||
the experiment's block:
|
||||
|
||||
```ruby
|
||||
experiment(:pill_color, actor: current_user) do |e|
|
||||
e.record!
|
||||
end
|
||||
```
|
||||
|
||||
## Test with RSpec
|
||||
|
||||
This gem provides some RSpec helpers and custom matchers. These are in flux as of GitLab 13.10.
|
||||
|
|
|
@ -550,7 +550,7 @@ of the available SAST Analyzers and what data is currently available.
|
|||
|
||||
The `remediations` field of the report is an array of remediation objects.
|
||||
Each remediation describes a patch that can be applied to
|
||||
[automatically fix](../../user/application_security/vulnerabilities/index.md#remediate-a-vulnerability-automatically)
|
||||
[resolve](../../user/application_security/vulnerabilities/index.md#resolve-a-vulnerability)
|
||||
a set of vulnerabilities.
|
||||
|
||||
Here is an example of a report that contains remediations.
|
||||
|
|
|
@ -101,7 +101,7 @@ and complete an integration with the Secure stage.
|
|||
- Users can interact with the findings from your artifact within their workflow. They can dismiss the findings or accept them and create a backlog issue.
|
||||
- To automatically create issues without user interaction, use the [issue API](../../api/issues.md).
|
||||
1. Optional: Provide auto-remediation steps:
|
||||
- If you specified `remediations` in your artifact, it is proposed through our [automatic remediation](../../user/application_security/vulnerabilities/index.md#remediate-a-vulnerability-automatically)
|
||||
- If you specified `remediations` in your artifact, it is proposed through our [remediation](../../user/application_security/vulnerabilities/index.md#resolve-a-vulnerability)
|
||||
interface.
|
||||
1. Demo the integration to GitLab:
|
||||
- After you have tested and are ready to demo your integration please
|
||||
|
|
|
@ -4272,7 +4272,7 @@ Tiers: `free`, `premium`, `ultimate`
|
|||
|
||||
### `counts.projects_creating_incidents`
|
||||
|
||||
Counts of Projects that have created incidents
|
||||
Counts of Projects that have incident issues, regardless of status
|
||||
|
||||
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180453_projects_creating_incidents.yml)
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
stage: Verify
|
||||
group: Continuous Integration
|
||||
group: Pipeline Execution
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: reference
|
||||
---
|
||||
|
|
|
@ -717,7 +717,7 @@ file, it's necessary to set [`GIT_STRATEGY: fetch`](../../../ci/runners/README.m
|
|||
your `.gitlab-ci.yml` file by following the instructions described in this document's
|
||||
[overriding the container scanning template](#overriding-the-container-scanning-template) section.
|
||||
|
||||
Read more about the [solutions for vulnerabilities](../vulnerabilities/index.md#remediate-a-vulnerability-automatically).
|
||||
Read more about the [solutions for vulnerabilities](../vulnerabilities/index.md#resolve-a-vulnerability).
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
|
|
|
@ -231,11 +231,11 @@ Read more on [how to use private Maven repositories](../index.md#using-private-m
|
|||
Once a vulnerability is found, you can interact with it. Read more on how to
|
||||
[address the vulnerabilities](../vulnerabilities/index.md).
|
||||
|
||||
## Solutions for vulnerabilities (auto-remediation)
|
||||
## Solutions for vulnerabilities
|
||||
|
||||
Some vulnerabilities can be fixed by applying the solution that GitLab
|
||||
automatically generates. Read more about the
|
||||
[solutions for vulnerabilities](../vulnerabilities/index.md#remediate-a-vulnerability-automatically).
|
||||
[solutions for vulnerabilities](../vulnerabilities/index.md#resolve-a-vulnerability).
|
||||
|
||||
## Security Dashboard
|
||||
|
||||
|
|
|
@ -383,7 +383,7 @@ For more details about which findings or vulnerabilities you can view in each of
|
|||
- Change the status.
|
||||
- Create an issue.
|
||||
- Link it to an existing issue.
|
||||
- In some cases, [apply an automatic remediation for a vulnerability](vulnerabilities/index.md#remediate-a-vulnerability-automatically).
|
||||
- [Resolve the vulnerability](vulnerabilities/index.md#resolve-a-vulnerability), if a solution is known.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
|
|
|
@ -64,9 +64,9 @@ Once a vulnerability is found, you can interact with it. Read more on how to
|
|||
Please note that in some cases the reported vulnerabilities provide metadata that can contain
|
||||
external links exposed in the UI. These links might not be accessible within an offline environment.
|
||||
|
||||
### Automatic remediation for vulnerabilities
|
||||
### Resolving vulnerabilities
|
||||
|
||||
The [automatic remediation for vulnerabilities](../vulnerabilities/index.md#remediate-a-vulnerability-automatically) feature is available for offline Dependency Scanning and Container Scanning, but may not work
|
||||
The [resolving vulnerabilities](../vulnerabilities/index.md#resolve-a-vulnerability) feature is available for offline Dependency Scanning and Container Scanning, but may not work
|
||||
depending on your instance's configuration. We can only suggest solutions, which are generally more
|
||||
current versions that have been patched, when we are able to access up-to-date registry services
|
||||
hosting the latest versions of that dependency or image.
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 52 KiB |
|
@ -9,44 +9,47 @@ info: To determine the technical writer assigned to the Stage/Group associated w
|
|||
|
||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13561) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.0.
|
||||
|
||||
Each security vulnerability in a project's [Vulnerability Report](../vulnerability_report/index.md) has an individual page which includes:
|
||||
Each vulnerability in a project has a Vulnerability Page. This page contains details of the
|
||||
vulnerability. The details included vary according to the type of vulnerability. Details of each
|
||||
vulnerability include:
|
||||
|
||||
- Details of the vulnerability.
|
||||
- The status of the vulnerability in the project.
|
||||
- Available actions for the vulnerability.
|
||||
- Any issues related to the vulnerability.
|
||||
- Description
|
||||
- When it was detected
|
||||
- Current status
|
||||
- Available actions
|
||||
- Linked issues
|
||||
- Actions log
|
||||
|
||||
On the vulnerability's page, you can:
|
||||
|
||||
- [Change the vulnerability's status](#change-vulnerability-status).
|
||||
- [Create an issue](#create-an-issue-for-a-vulnerability).
|
||||
- [Link issues to the vulnerability](#link-gitlab-issues-to-the-vulnerability).
|
||||
- [Remediate a vulnerability automatically](#remediate-a-vulnerability-automatically), if an
|
||||
automatic solution is available.
|
||||
- [Remediate a vulnerability manually](#remediate-a-vulnerability-manually), if a solution is
|
||||
- [Link issues to the vulnerability](#linked-issues).
|
||||
- [Resolve a vulnerability](#resolve-a-vulnerability), if a solution is
|
||||
available.
|
||||
|
||||
## Vulnerability status values
|
||||
|
||||
A vulnerability's status can be one of the following:
|
||||
|
||||
| Status | Description |
|
||||
|:----------|:------------|
|
||||
| Detected | The default state for a newly discovered vulnerability. |
|
||||
| Confirmed | A user has seen this vulnerability and confirmed it to be accurate. |
|
||||
| Dismissed | A user has seen this vulnerability and dismissed it because it is not accurate or otherwise not to be resolved. |
|
||||
| Resolved | The vulnerability has been fixed and is no longer valid. |
|
||||
|
||||
## Change vulnerability status
|
||||
|
||||
You can change the status of a vulnerability using the **Status** dropdown to one of
|
||||
the following values:
|
||||
|
||||
| Status | Description |
|
||||
|-----------|----------------------------------------------------------------------------------------------------------------|
|
||||
| Detected | The default state for a newly discovered vulnerability |
|
||||
| Confirmed | A user has seen this vulnerability and confirmed it to be accurate |
|
||||
| Dismissed | A user has seen this vulnerability and dismissed it because it is not accurate or otherwise not to be resolved |
|
||||
| Resolved | The vulnerability has been fixed and is no longer valid |
|
||||
|
||||
A timeline shows you when the vulnerability status has changed
|
||||
and allows you to comment on a change.
|
||||
To change a vulnerability's status, select a new value from the **Status** dropdown then select
|
||||
**Change status**. Optionally, add a comment to the log entry at the bottom of the page.
|
||||
|
||||
## Create an issue for a vulnerability
|
||||
|
||||
From a vulnerability's page you can create an issue to track all action taken to resolve or
|
||||
mitigate it.
|
||||
|
||||
From a vulnerability you can create either:
|
||||
You can create either:
|
||||
|
||||
- [A GitLab issue](#create-a-gitlab-issue-for-a-vulnerability) (default).
|
||||
- [A Jira issue](#create-a-jira-issue-for-a-vulnerability).
|
||||
|
@ -111,35 +114,45 @@ To disable it:
|
|||
Feature.disable(:jira_for_vulnerabilities)
|
||||
```
|
||||
|
||||
## Link GitLab issues to the vulnerability
|
||||
## Linked issues
|
||||
|
||||
NOTE:
|
||||
If Jira issue support is enabled, GitLab issues are disabled so this feature is not available.
|
||||
|
||||
You can link one or more existing GitLab issues to the vulnerability. This allows you to
|
||||
indicate that this vulnerability affects multiple issues. It also allows you to indicate
|
||||
that the resolution of one issue would resolve multiple vulnerabilities.
|
||||
You can link one or more existing GitLab issues to a vulnerability. Adding a link helps track
|
||||
the issue that resolves or mitigates a vulnerability.
|
||||
|
||||
Linked issues are shown in the Vulnerability Report and the vulnerability's page.
|
||||
Issues linked to a vulnerability are shown in the Vulnerability Report and the vulnerability's page.
|
||||
|
||||
## Link to an existing issue
|
||||
|
||||
If you already have an open issue, you can link to it from the vulnerability.
|
||||
NOTE:
|
||||
|
||||
- The vulnerability page shows related issues, but the issue page doesn't show the vulnerability it's related to.
|
||||
- An issue can only be related to one vulnerability at a time.
|
||||
- Issues can be linked across groups and projects.
|
||||
|
||||
To link to an existing issue:
|
||||
## Link to existing issues
|
||||
|
||||
1. Open the vulnerability.
|
||||
1. [Add a linked issue](../../project/issues/related_issues.md).
|
||||
To link a vulnerability to existing issues:
|
||||
|
||||
## Remediate a vulnerability automatically
|
||||
1. Go to the vulnerability's page.
|
||||
1. In the **Linked issues** section, select the plus icon (**{plus}**).
|
||||
1. For each issue to be linked, either:
|
||||
- Paste a link to the issue.
|
||||
- Enter the issue's ID (prefixed with a hash `#`).
|
||||
1. Select **Add**.
|
||||
|
||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/5656) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 11.7.
|
||||
The selected issues are added to the **Linked issues** section, and the linked issues counter is updated.
|
||||
|
||||
## Resolve a vulnerability
|
||||
|
||||
For some vulnerabilities a solution is already known. In those instances, a vulnerability's page
|
||||
includes a **Resolve with merge request** option.
|
||||
|
||||
To resolve a vulnerability, you can either:
|
||||
|
||||
- [Resolve a vulnerability with a merge request](#resolve-a-vulnerability-with-a-merge-request).
|
||||
- [Resolve a vulnerability manually](#resolve-a-vulnerability-manually).
|
||||
|
||||
Some vulnerabilities can be fixed by applying the solution that GitLab automatically generates.
|
||||
The following scanners are supported:
|
||||
|
||||
- [Dependency Scanning](../dependency_scanning/index.md).
|
||||
|
@ -147,35 +160,26 @@ The following scanners are supported:
|
|||
`yarn`.
|
||||
- [Container Scanning](../container_scanning/index.md).
|
||||
|
||||
### Remediate a vulnerability manually
|
||||
![Create merge request from vulnerability](img/create_mr_from_vulnerability_v13_4.png)
|
||||
|
||||
### Resolve a vulnerability with a merge request
|
||||
|
||||
To resolve the vulnerability with a merge request, go to the vulnerability's page and from the
|
||||
**Resolve with merge request** dropdown select **Resolve with merge request**.
|
||||
|
||||
A merge request is created which applies the patch required to resolve the vulnerability.
|
||||
Process the merge request according to your standard workflow.
|
||||
|
||||
### Resolve a vulnerability manually
|
||||
|
||||
To manually apply the patch that GitLab generated for a vulnerability:
|
||||
|
||||
1. Select the **Resolve with merge request** dropdown, then select **Download patch to resolve**:
|
||||
|
||||
![Resolve with Merge Request button dropdown](img/vulnerability_page_merge_request_button_dropdown_v13_1.png)
|
||||
|
||||
1. Go to the vulnerability's page and from the **Resolve with merge request** dropdown select
|
||||
**Download patch to resolve**.
|
||||
1. Ensure your local project has the same commit checked out that was used to generate the patch.
|
||||
1. Run `git apply remediation.patch`.
|
||||
1. Verify and commit the changes to your branch.
|
||||
|
||||
### Create a merge request with the suggested patch
|
||||
|
||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9224) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 11.9.
|
||||
|
||||
In some cases, you can create a merge request that automatically remediates the
|
||||
vulnerability. Any vulnerability that has a
|
||||
[solution](#remediate-a-vulnerability-automatically) can have a merge
|
||||
request created to automatically solve the issue.
|
||||
|
||||
If this action is available:
|
||||
|
||||
1. Select the **Resolve with merge request** dropdown, then select **Resolve with merge request**.
|
||||
|
||||
![Create merge request from vulnerability](img/create_mr_from_vulnerability_v13_4.png)
|
||||
|
||||
A merge request is created. It applies the solution to the source branch.
|
||||
|
||||
## Vulnerability scanner maintenance
|
||||
|
||||
The following vulnerability scanners and their databases are regularly updated:
|
||||
|
|
|
@ -70,21 +70,6 @@ merge request:
|
|||
This change overrides the choice you made in your user preferences and persists until you clear your
|
||||
browser's cookies or change this behavior again.
|
||||
|
||||
## Merge requests commit navigation
|
||||
|
||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/18140) in GitLab 13.0.
|
||||
|
||||
To seamlessly navigate among commits in a merge request:
|
||||
|
||||
1. Select the **Commits** tab.
|
||||
1. Select a commit to open it in the single-commit view.
|
||||
1. Navigate through the commits by either:
|
||||
|
||||
- Selecting **Prev** and **Next** buttons below the tab buttons.
|
||||
- Using the <kbd>X</kbd> and <kbd>C</kbd> keyboard shortcuts.
|
||||
|
||||
![Merge requests commit navigation](img/commit_nav_v13_11.png)
|
||||
|
||||
## Incrementally expand merge request diffs
|
||||
|
||||
By default, the diff shows only the parts of a file which are changed.
|
||||
|
|
28
doc/user/project/merge_requests/commits.md
Normal file
28
doc/user/project/merge_requests/commits.md
Normal file
|
@ -0,0 +1,28 @@
|
|||
---
|
||||
stage: Create
|
||||
group: Code Review
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: index, reference
|
||||
---
|
||||
|
||||
# Commits tab in merge requests **(FREE)**
|
||||
|
||||
The **Commits** tab in a merge request displays a sequential list of commits
|
||||
to the Git branch your merge request is based on. From this page, you can review
|
||||
full commit messages and copy a commit's SHA when you need to
|
||||
[cherry-pick changes](cherry_pick_changes.md).
|
||||
|
||||
## Merge requests commit navigation
|
||||
|
||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/18140) in GitLab 13.0.
|
||||
|
||||
To seamlessly navigate among commits in a merge request:
|
||||
|
||||
1. Select the **Commits** tab.
|
||||
1. Select a commit to open it in the single-commit view.
|
||||
1. Navigate through the commits by either:
|
||||
|
||||
- Selecting **Prev** and **Next** buttons below the tab buttons.
|
||||
- Using the <kbd>X</kbd> and <kbd>C</kbd> keyboard shortcuts.
|
||||
|
||||
![Merge requests commit navigation](img/commit_nav_v13_11.png)
|
|
@ -67,8 +67,8 @@ After you have created the merge request, you can also:
|
|||
- [Discuss](../../discussions/index.md) your implementation with your team in the merge request thread.
|
||||
- [Perform inline code reviews](reviews/index.md#perform-inline-code-reviews).
|
||||
- Add [merge request dependencies](merge_request_dependencies.md) to restrict it to be merged only when other merge requests have been merged. **(PREMIUM)**
|
||||
- Preview continuous integration [pipelines on the merge request widget](reviews/index.md#pipeline-status-in-merge-requests-widgets).
|
||||
- Preview how your changes look directly on your deployed application with [Review Apps](reviews/index.md#live-preview-with-review-apps).
|
||||
- Preview continuous integration [pipelines on the merge request widget](widgets.md).
|
||||
- Preview how your changes look directly on your deployed application with [Review Apps](widgets.md#live-preview-with-review-apps).
|
||||
- [Allow collaboration on merge requests across forks](allow_collaboration.md).
|
||||
- Perform a [Review](reviews/index.md) to create multiple comments on a diff and publish them when you're ready.
|
||||
- Add [code suggestions](reviews/suggestions.md) to change the content of merge requests directly into merge request threads, and easily apply them to the codebase directly from the UI.
|
||||
|
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
|
@ -17,12 +17,64 @@ Merge requests include:
|
|||
- A comment section for discussion threads.
|
||||
- The list of commits.
|
||||
|
||||
To get started, read the [introduction to merge requests](getting_started.md).
|
||||
|
||||
## Merge request tabs
|
||||
|
||||
Merge requests contain tabs at the top of the page to help you navigate to
|
||||
important parts of the merge request: **Overview**, **Commits**, **Pipelines**, and **Changes**.
|
||||
important parts of the merge request:
|
||||
|
||||
![Merge request tab positions](img/merge_request_tab_position_v13_11.png)
|
||||
|
||||
To get started, read the [introduction to merge requests](getting_started.md).
|
||||
- **Overview**: Contains the description, notifications from pipelines, and a
|
||||
discussion area for [comment threads](../../discussions/index.md#resolvable-comments-and-threads)
|
||||
and [code suggestions](reviews/suggestions.md). The right sidebar provides fields
|
||||
to add assignees, reviewers, labels, and a milestone to your work, and the
|
||||
[merge request widgets area](widgets.md) reports results from pipelines and tests.
|
||||
- **Commits**: Contains a list of commits added to this merge request. For more
|
||||
information, read [Commits tab in merge requests](commits.md).
|
||||
- **Pipelines**: If configured, contains a list of recent [GitLab CI/CD](../../../ci/README.md)
|
||||
pipelines and their status.
|
||||
- **Changes**: Contains the diffs of files changed by this merge request. You can
|
||||
[configure the display](changes.md).
|
||||
|
||||
## View merge requests
|
||||
|
||||
You can view merge requests for a specific project, or for all projects in a group:
|
||||
|
||||
- **Specific project**: Go to your project and select **Merge requests**.
|
||||
- **All projects in a group**: Go to your group and select **Merge requests**.
|
||||
If your group contains subgroups, this view also displays merge requests from the subgroup projects.
|
||||
GitLab displays a count of open merge requests in the left sidebar, but
|
||||
[caches the value](reviews/index.md#cached-merge-request-count) for groups with a large number of
|
||||
open merge requests.
|
||||
|
||||
GitLab displays open merge requests, with tabs to filter the list by open and closed status:
|
||||
|
||||
![Project merge requests list view](img/project_merge_requests_list_view_v13_5.png)
|
||||
|
||||
You can [search and filter](../../search/index.md#filtering-issue-and-merge-request-lists),
|
||||
the results, or select a merge request to begin a review.
|
||||
|
||||
## Merge request sidebar
|
||||
|
||||
The **Overview** tab of a merge request displays a sidebar. In this sidebar, you
|
||||
can assign, categorize, and track progress on a merge request:
|
||||
|
||||
- [**Assignee**](getting_started.md#assignee): Designate the directly responsible
|
||||
individual (DRI) for a merge request. With
|
||||
[multiple assignees](getting_started.md#multiple-assignees), you can assign a
|
||||
merge request to more than one person at a time.
|
||||
- [**Reviewer**](reviews/index.md): Designate a team member to review a merge request.
|
||||
Higher tiers can assign multiple reviewers, and [require approvals](approvals/index.md)
|
||||
from these reviewers.
|
||||
- [**Milestone**](../milestones/index.md): Track time-sensitive changes.
|
||||
- [**Time tracking**](../time_tracking.md): Time spent on a merge request.
|
||||
- [**Labels**](../labels.md): Categorize a merge request and display it on
|
||||
appropriate [issue boards](../issue_board.md).
|
||||
- **Participants**: A list of users participating or watching a merge request.
|
||||
- [**Notifications**](../../profile/notifications.md): A toggle to select whether
|
||||
or not to receive notifications for updates to a merge request.
|
||||
|
||||
## Merge request workflows
|
||||
|
||||
|
@ -51,24 +103,6 @@ For a web developer writing a webpage for your company's website:
|
|||
1. Once approved, your merge request is [squashed and merged](squash_and_merge.md), and [deployed to staging with GitLab Pages](https://about.gitlab.com/blog/2021/02/05/ci-deployment-and-environments/).
|
||||
1. Your production team [cherry picks](cherry_pick_changes.md) the merge commit into production.
|
||||
|
||||
## View merge requests
|
||||
|
||||
You can view merge requests for a specific project, or for all projects in a group:
|
||||
|
||||
- **Specific project**: Go to your project and select **Merge requests**.
|
||||
- **All projects in a group**: Go to your group and select **Merge requests**.
|
||||
If your group contains subgroups, this view also displays merge requests from the subgroup projects.
|
||||
GitLab displays a count of open merge requests in the left sidebar, but
|
||||
[caches the value](reviews/index.md#cached-merge-request-count) for groups with a large number of
|
||||
open merge requests.
|
||||
|
||||
GitLab displays open merge requests, with tabs to filter the list by open and closed status:
|
||||
|
||||
![Project merge requests list view](img/project_merge_requests_list_view_v13_5.png)
|
||||
|
||||
You can [search and filter](../../search/index.md#filtering-issue-and-merge-request-lists),
|
||||
the results, or select a merge request to begin a review.
|
||||
|
||||
## Related topics
|
||||
|
||||
- [Create a merge request](creating_merge_requests.md)
|
||||
|
|
|
@ -204,56 +204,6 @@ Multiline comments display the comment's line numbers above the body of the comm
|
|||
|
||||
![Multiline comment selection displayed above comment](img/multiline-comment-saved.png)
|
||||
|
||||
## Pipeline status in merge requests widgets
|
||||
|
||||
If you've set up [GitLab CI/CD](../../../../ci/README.md) in your project,
|
||||
you can see:
|
||||
|
||||
- Both pre-merge and post-merge pipelines and the environment information if any.
|
||||
- Which deployments are in progress.
|
||||
|
||||
If an application is successfully deployed to an
|
||||
[environment](../../../../ci/environments/index.md), the deployed environment and the link to the
|
||||
Review App are both shown.
|
||||
|
||||
NOTE:
|
||||
When the pipeline fails in a merge request but it can still be merged,
|
||||
the **Merge** button is colored red.
|
||||
|
||||
### Post-merge pipeline status
|
||||
|
||||
When a merge request is merged, you can see the post-merge pipeline status of
|
||||
the branch the merge request was merged into. For example, when a merge request
|
||||
is merged into the [default branch](../../repository/branches/default.md) and then triggers a deployment to the staging
|
||||
environment.
|
||||
|
||||
Ongoing deployments are shown, and the state (deploying or deployed)
|
||||
for environments. If it's the first time the branch is deployed, the link
|
||||
returns a `404` error until done. During the deployment, the stop button is
|
||||
disabled. If the pipeline fails to deploy, the deployment information is hidden.
|
||||
|
||||
![Merge request pipeline](img/merge_request_pipeline.png)
|
||||
|
||||
For more information, [read about pipelines](../../../../ci/pipelines/index.md).
|
||||
|
||||
### Merge when pipeline succeeds (MWPS)
|
||||
|
||||
Set a merge request that looks ready to merge to
|
||||
[merge automatically when CI pipeline succeeds](../merge_when_pipeline_succeeds.md).
|
||||
|
||||
### Live preview with Review Apps
|
||||
|
||||
If you configured [Review Apps](https://about.gitlab.com/stages-devops-lifecycle/review-apps/) for your project,
|
||||
you can preview the changes submitted to a feature branch through a merge request
|
||||
on a per-branch basis. You don't need to checkout the branch, install, and preview locally.
|
||||
All your changes are available to preview by anyone with the Review Apps link.
|
||||
|
||||
With GitLab [Route Maps](../../../../ci/review_apps/index.md#route-maps) set, the
|
||||
merge request widget takes you directly to the pages changed, making it easier and
|
||||
faster to preview proposed modifications.
|
||||
|
||||
[Read more about Review Apps](../../../../ci/review_apps/index.md).
|
||||
|
||||
## Associated features
|
||||
|
||||
These features are associated with merge requests:
|
||||
|
|
64
doc/user/project/merge_requests/widgets.md
Normal file
64
doc/user/project/merge_requests/widgets.md
Normal file
|
@ -0,0 +1,64 @@
|
|||
---
|
||||
stage: Create
|
||||
group: Code Review
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
type: index, reference
|
||||
---
|
||||
|
||||
# Merge request widgets **(FREE)**
|
||||
|
||||
The **Overview** page of a merge request displays status updates from services
|
||||
that perform actions on your merge request. All subscription levels display a
|
||||
widgets area, but the content of the area depends on your subscription level
|
||||
and the services you configure for your project.
|
||||
|
||||
## Pipeline information
|
||||
|
||||
If you've set up [GitLab CI/CD](../../../ci/README.md) in your project,
|
||||
a [merge request](index.md) displays pipeline information in the widgets area
|
||||
of the **Overview** tab:
|
||||
|
||||
- Both pre-merge and post-merge pipelines, and the environment information, if any.
|
||||
- Which deployments are in progress.
|
||||
|
||||
If an application is successfully deployed to an
|
||||
[environment](../../../ci/environments/index.md), the deployed environment and the link to the
|
||||
[review app](https://about.gitlab.com/stages-devops-lifecycle/review-apps/) are both shown.
|
||||
|
||||
NOTE:
|
||||
When the pipeline fails in a merge request but it can still be merged,
|
||||
the **Merge** button is colored red.
|
||||
|
||||
## Post-merge pipeline status
|
||||
|
||||
When a merge request is merged, you can see the post-merge pipeline status of
|
||||
the branch the merge request was merged into. For example, when a merge request
|
||||
is merged into the [default branch](../repository/branches/default.md) and then triggers a deployment to the staging
|
||||
environment.
|
||||
|
||||
Ongoing deployments are shown, and the state (deploying or deployed)
|
||||
for environments. If it's the first time the branch is deployed, the link
|
||||
returns a `404` error until done. During the deployment, the stop button is
|
||||
disabled. If the pipeline fails to deploy, the deployment information is hidden.
|
||||
|
||||
![Merge request pipeline](img/merge_request_pipeline.png)
|
||||
|
||||
For more information, [read about pipelines](../../../ci/pipelines/index.md).
|
||||
|
||||
## Merge when pipeline succeeds (MWPS)
|
||||
|
||||
Set a merge request that looks ready to merge to
|
||||
[merge automatically when CI pipeline succeeds](merge_when_pipeline_succeeds.md).
|
||||
|
||||
## Live preview with Review Apps
|
||||
|
||||
If you configured [Review Apps](https://about.gitlab.com/stages-devops-lifecycle/review-apps/) for your project,
|
||||
you can preview the changes submitted to a feature branch through a merge request
|
||||
on a per-branch basis. You don't need to checkout the branch, install, and preview locally.
|
||||
All your changes are available to preview by anyone with the Review Apps link.
|
||||
|
||||
With GitLab [Route Maps](../../../ci/review_apps/index.md#route-maps) set, the
|
||||
merge request widget takes you directly to the pages changed, making it easier and
|
||||
faster to preview proposed modifications.
|
||||
|
||||
[Read more about Review Apps](../../../ci/review_apps/index.md).
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue