Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
7d5d23819b
commit
a898b6057e
|
@ -50,11 +50,6 @@
|
|||
/ee/app/models/project_alias.rb @patrickbajao
|
||||
/ee/lib/api/project_aliases.rb @patrickbajao
|
||||
|
||||
# Code Owners
|
||||
#
|
||||
/ee/lib/gitlab/code_owners/ @reprazent @kerrizor @garyh
|
||||
/doc/user/project/code_owners.md @reprazent @kerrizor @garyh
|
||||
|
||||
# Quality owned files
|
||||
/qa/ @gl-quality
|
||||
|
||||
|
@ -78,3 +73,9 @@ Dangerfile @gl-quality/eng-prod
|
|||
/lib/gitlab/usage_data.rb @gitlab-org/growth/telemetry
|
||||
/lib/gitlab/cycle_analytics/usage_data.rb @gitlab-org/growth/telemetry
|
||||
/lib/gitlab/usage_data_counters/ @gitlab-org/growth/telemetry
|
||||
|
||||
[Code Owners]
|
||||
/ee/lib/gitlab/code_owners.rb @reprazent @kerrizor @garyh
|
||||
/ee/lib/gitlab/code_owners/ @reprazent @kerrizor @garyh
|
||||
/ee/spec/lib/gitlab/code_owners/ @reprazent @kerrizor @garyh
|
||||
/doc/user/project/code_owners.md @reprazent @kerrizor @garyh
|
||||
|
|
4
Gemfile
4
Gemfile
|
@ -81,7 +81,9 @@ gem 'gitlab_omniauth-ldap', '~> 2.1.1', require: 'omniauth-ldap'
|
|||
gem 'net-ldap'
|
||||
|
||||
# API
|
||||
gem 'grape', '~> 1.3.3'
|
||||
# Locked at Grape v1.4.0 until https://github.com/ruby-grape/grape/pull/2088 is merged
|
||||
# Remove config/initializers/grape_patch.rb
|
||||
gem 'grape', '= 1.4.0'
|
||||
gem 'grape-entity', '~> 0.7.1'
|
||||
gem 'rack-cors', '~> 1.0.6', require: 'rack/cors'
|
||||
|
||||
|
|
|
@ -453,7 +453,7 @@ GEM
|
|||
signet (~> 0.14)
|
||||
gpgme (2.0.20)
|
||||
mini_portile2 (~> 2.3)
|
||||
grape (1.3.3)
|
||||
grape (1.4.0)
|
||||
activesupport
|
||||
builder
|
||||
dry-types (>= 1.1)
|
||||
|
@ -1269,7 +1269,7 @@ DEPENDENCIES
|
|||
google-api-client (~> 0.33)
|
||||
google-protobuf (~> 3.8.0)
|
||||
gpgme (~> 2.0.19)
|
||||
grape (~> 1.3.3)
|
||||
grape (= 1.4.0)
|
||||
grape-entity (~> 0.7.1)
|
||||
grape-path-helpers (~> 1.3)
|
||||
grape_logging (~> 1.7)
|
||||
|
|
|
@ -233,7 +233,7 @@ export default {
|
|||
</script>
|
||||
|
||||
<template>
|
||||
<div class="boards-switcher js-boards-selector append-right-10">
|
||||
<div class="boards-switcher js-boards-selector gl-mr-3">
|
||||
<span class="boards-selector-wrapper js-boards-selector-wrapper">
|
||||
<gl-dropdown
|
||||
data-qa-selector="boards_dropdown"
|
||||
|
|
|
@ -112,7 +112,7 @@ export default {
|
|||
<div v-for="variable in variables" :key="variable.id" class="gl-responsive-table-row">
|
||||
<div class="table-section section-50">
|
||||
<div class="table-mobile-header" role="rowheader">{{ s__('Pipeline|Key') }}</div>
|
||||
<div class="table-mobile-content append-right-10">
|
||||
<div class="table-mobile-content gl-mr-3">
|
||||
<input
|
||||
:ref="`${$options.inputTypes.key}-${variable.id}`"
|
||||
v-model="variable.key"
|
||||
|
@ -124,7 +124,7 @@ export default {
|
|||
|
||||
<div class="table-section section-50">
|
||||
<div class="table-mobile-header" role="rowheader">{{ s__('Pipeline|Value') }}</div>
|
||||
<div class="table-mobile-content append-right-10">
|
||||
<div class="table-mobile-content gl-mr-3">
|
||||
<input
|
||||
:ref="`${$options.inputTypes.value}-${variable.id}`"
|
||||
v-model="variable.secret_value"
|
||||
|
@ -149,7 +149,7 @@ export default {
|
|||
<div class="gl-responsive-table-row">
|
||||
<div class="table-section section-50">
|
||||
<div class="table-mobile-header" role="rowheader">{{ s__('Pipeline|Key') }}</div>
|
||||
<div class="table-mobile-content append-right-10">
|
||||
<div class="table-mobile-content gl-mr-3">
|
||||
<input
|
||||
ref="inputKey"
|
||||
v-model="key"
|
||||
|
@ -161,7 +161,7 @@ export default {
|
|||
|
||||
<div class="table-section section-50">
|
||||
<div class="table-mobile-header" role="rowheader">{{ s__('Pipeline|Value') }}</div>
|
||||
<div class="table-mobile-content append-right-10">
|
||||
<div class="table-mobile-content gl-mr-3">
|
||||
<input
|
||||
ref="inputSecretValue"
|
||||
v-model="secretValue"
|
||||
|
|
|
@ -161,7 +161,6 @@ export default {
|
|||
...mapState('monitoringDashboard', [
|
||||
'dashboard',
|
||||
'emptyState',
|
||||
'showEmptyState',
|
||||
'expandedPanel',
|
||||
'variables',
|
||||
'links',
|
||||
|
@ -169,6 +168,9 @@ export default {
|
|||
'hasDashboardValidationWarnings',
|
||||
]),
|
||||
...mapGetters('monitoringDashboard', ['selectedDashboard', 'getMetricStates']),
|
||||
shouldShowEmptyState() {
|
||||
return Boolean(this.emptyState);
|
||||
},
|
||||
shouldShowVariablesSection() {
|
||||
return Boolean(this.variables.length);
|
||||
},
|
||||
|
@ -277,6 +279,14 @@ export default {
|
|||
}
|
||||
return null;
|
||||
},
|
||||
/**
|
||||
* Return true if the entire group is loading.
|
||||
* @param {String} groupKey - Identifier for group
|
||||
* @returns {boolean}
|
||||
*/
|
||||
isGroupLoading(groupKey) {
|
||||
return this.groupSingleEmptyState(groupKey) === metricStates.LOADING;
|
||||
},
|
||||
/**
|
||||
* A group should be not collapsed if any metric is loaded (OK)
|
||||
*
|
||||
|
@ -412,9 +422,9 @@ export default {
|
|||
@dateTimePickerInvalid="onDateTimePickerInvalid"
|
||||
@setRearrangingPanels="onSetRearrangingPanels"
|
||||
/>
|
||||
<variables-section v-if="shouldShowVariablesSection && !showEmptyState" />
|
||||
<links-section v-if="shouldShowLinksSection && !showEmptyState" />
|
||||
<div v-if="!showEmptyState">
|
||||
<template v-if="!shouldShowEmptyState">
|
||||
<variables-section v-if="shouldShowVariablesSection" />
|
||||
<links-section v-if="shouldShowLinksSection" />
|
||||
<dashboard-panel
|
||||
v-show="expandedPanel.panel"
|
||||
ref="expandedPanel"
|
||||
|
@ -449,6 +459,7 @@ export default {
|
|||
:key="`${groupData.group}.${groupData.priority}`"
|
||||
:name="groupData.group"
|
||||
:show-panels="showPanels"
|
||||
:is-loading="isGroupLoading(groupData.key)"
|
||||
:collapse-group="collapseGroup(groupData.key)"
|
||||
>
|
||||
<vue-draggable
|
||||
|
@ -506,7 +517,7 @@ export default {
|
|||
</div>
|
||||
</graph-group>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<empty-state
|
||||
v-else
|
||||
:selected-state="emptyState"
|
||||
|
|
|
@ -119,10 +119,10 @@ export default {
|
|||
},
|
||||
computed: {
|
||||
...mapState('monitoringDashboard', [
|
||||
'emptyState',
|
||||
'environmentsLoading',
|
||||
'currentEnvironmentName',
|
||||
'isUpdatingStarredValue',
|
||||
'showEmptyState',
|
||||
'dashboardTimezone',
|
||||
'projectPath',
|
||||
'canAccessOperationsSettings',
|
||||
|
@ -132,13 +132,16 @@ export default {
|
|||
isOutOfTheBoxDashboard() {
|
||||
return this.selectedDashboard?.out_of_the_box_dashboard;
|
||||
},
|
||||
shouldShowEmptyState() {
|
||||
return Boolean(this.emptyState);
|
||||
},
|
||||
shouldShowEnvironmentsDropdownNoMatchedMsg() {
|
||||
return !this.environmentsLoading && this.filteredEnvironments.length === 0;
|
||||
},
|
||||
addingMetricsAvailable() {
|
||||
return (
|
||||
this.customMetricsAvailable &&
|
||||
!this.showEmptyState &&
|
||||
!this.shouldShowEmptyState &&
|
||||
// Custom metrics only avaialble on system dashboards because
|
||||
// they are stored in the database. This can be improved. See:
|
||||
// https://gitlab.com/gitlab-org/gitlab/-/issues/28241
|
||||
|
@ -146,7 +149,7 @@ export default {
|
|||
);
|
||||
},
|
||||
showRearrangePanelsBtn() {
|
||||
return !this.showEmptyState && this.rearrangePanelsAvailable;
|
||||
return !this.shouldShowEmptyState && this.rearrangePanelsAvailable;
|
||||
},
|
||||
displayUtc() {
|
||||
return this.dashboardTimezone === timezones.UTC;
|
||||
|
|
|
@ -1,13 +1,19 @@
|
|||
<script>
|
||||
import { GlEmptyState } from '@gitlab/ui';
|
||||
import { GlLoadingIcon, GlEmptyState } from '@gitlab/ui';
|
||||
import { __ } from '~/locale';
|
||||
import { dashboardEmptyStates } from '../constants';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
GlLoadingIcon,
|
||||
GlEmptyState,
|
||||
},
|
||||
props: {
|
||||
selectedState: {
|
||||
type: String,
|
||||
required: true,
|
||||
validator: state => Object.values(dashboardEmptyStates).includes(state),
|
||||
},
|
||||
documentationPath: {
|
||||
type: String,
|
||||
required: true,
|
||||
|
@ -22,10 +28,6 @@ export default {
|
|||
required: false,
|
||||
default: '',
|
||||
},
|
||||
selectedState: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
emptyGettingStartedSvgPath: {
|
||||
type: String,
|
||||
required: true,
|
||||
|
@ -54,52 +56,49 @@ export default {
|
|||
},
|
||||
data() {
|
||||
return {
|
||||
/**
|
||||
* Possible empty states.
|
||||
* Keys in each state must match GlEmptyState props
|
||||
*/
|
||||
states: {
|
||||
[dashboardEmptyStates.GETTING_STARTED]: {
|
||||
svgUrl: this.emptyGettingStartedSvgPath,
|
||||
svgPath: this.emptyGettingStartedSvgPath,
|
||||
title: __('Get started with performance monitoring'),
|
||||
description: __(`Stay updated about the performance and health
|
||||
of your environment by configuring Prometheus to monitor your deployments.`),
|
||||
buttonText: __('Install on clusters'),
|
||||
buttonPath: this.clustersPath,
|
||||
primaryButtonText: __('Install on clusters'),
|
||||
primaryButtonLink: this.clustersPath,
|
||||
secondaryButtonText: __('Configure existing installation'),
|
||||
secondaryButtonPath: this.settingsPath,
|
||||
},
|
||||
[dashboardEmptyStates.LOADING]: {
|
||||
svgUrl: this.emptyLoadingSvgPath,
|
||||
title: __('Waiting for performance data'),
|
||||
description: __(`Creating graphs uses the data from the Prometheus server.
|
||||
If this takes a long time, ensure that data is available.`),
|
||||
buttonText: __('View documentation'),
|
||||
buttonPath: this.documentationPath,
|
||||
secondaryButtonText: '',
|
||||
secondaryButtonPath: '',
|
||||
secondaryButtonLink: this.settingsPath,
|
||||
},
|
||||
[dashboardEmptyStates.NO_DATA]: {
|
||||
svgUrl: this.emptyNoDataSvgPath,
|
||||
svgPath: this.emptyNoDataSvgPath,
|
||||
title: __('No data found'),
|
||||
description: __(`You are connected to the Prometheus server, but there is currently
|
||||
no data to display.`),
|
||||
buttonText: __('Configure Prometheus'),
|
||||
buttonPath: this.settingsPath,
|
||||
primaryButtonText: __('Configure Prometheus'),
|
||||
primaryButtonLink: this.settingsPath,
|
||||
secondaryButtonText: '',
|
||||
secondaryButtonPath: '',
|
||||
secondaryButtonLink: '',
|
||||
},
|
||||
[dashboardEmptyStates.UNABLE_TO_CONNECT]: {
|
||||
svgUrl: this.emptyUnableToConnectSvgPath,
|
||||
svgPath: this.emptyUnableToConnectSvgPath,
|
||||
title: __('Unable to connect to Prometheus server'),
|
||||
description: __(
|
||||
'Ensure connectivity is available from the GitLab server to the Prometheus server',
|
||||
),
|
||||
buttonText: __('View documentation'),
|
||||
buttonPath: this.documentationPath,
|
||||
primaryButtonText: __('View documentation'),
|
||||
primaryButtonLink: this.documentationPath,
|
||||
secondaryButtonText: __('Configure Prometheus'),
|
||||
secondaryButtonPath: this.settingsPath,
|
||||
secondaryButtonLink: this.settingsPath,
|
||||
},
|
||||
},
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
isLoading() {
|
||||
return this.selectedState === dashboardEmptyStates.LOADING;
|
||||
},
|
||||
currentState() {
|
||||
return this.states[this.selectedState];
|
||||
},
|
||||
|
@ -108,14 +107,8 @@ export default {
|
|||
</script>
|
||||
|
||||
<template>
|
||||
<gl-empty-state
|
||||
:title="currentState.title"
|
||||
:description="currentState.description"
|
||||
:primary-button-text="currentState.buttonText"
|
||||
:primary-button-link="currentState.buttonPath"
|
||||
:secondary-button-text="currentState.secondaryButtonText"
|
||||
:secondary-button-link="currentState.secondaryButtonPath"
|
||||
:svg-path="currentState.svgUrl"
|
||||
:compact="compact"
|
||||
/>
|
||||
<div>
|
||||
<gl-loading-icon v-if="isLoading" size="xl" class="gl-my-9" />
|
||||
<gl-empty-state v-if="currentState" v-bind="currentState" :compact="compact" />
|
||||
</div>
|
||||
</template>
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
<script>
|
||||
import Icon from '~/vue_shared/components/icon.vue';
|
||||
import { GlLoadingIcon, GlIcon } from '@gitlab/ui';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
Icon,
|
||||
GlLoadingIcon,
|
||||
GlIcon,
|
||||
},
|
||||
props: {
|
||||
name: {
|
||||
|
@ -15,6 +16,11 @@ export default {
|
|||
required: false,
|
||||
default: true,
|
||||
},
|
||||
isLoading: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
default: false,
|
||||
},
|
||||
/**
|
||||
* Initial value of collapse on mount.
|
||||
*/
|
||||
|
@ -55,15 +61,18 @@ export default {
|
|||
<div v-if="showPanels" ref="graph-group" class="card prometheus-panel">
|
||||
<div class="card-header d-flex align-items-center">
|
||||
<h4 class="flex-grow-1">{{ name }}</h4>
|
||||
<gl-loading-icon v-if="isLoading" name="loading" />
|
||||
<a
|
||||
data-testid="group-toggle-button"
|
||||
:aria-label="__('Toggle collapse')"
|
||||
:icon="caretIcon"
|
||||
role="button"
|
||||
class="js-graph-group-toggle gl-text-gray-900"
|
||||
class="js-graph-group-toggle gl-display-flex gl-ml-2 gl-text-gray-900"
|
||||
tabindex="0"
|
||||
@click="collapse"
|
||||
@keyup.enter="collapse"
|
||||
>
|
||||
<icon :size="16" :aria-label="__('Toggle collapse')" :name="caretIcon" />
|
||||
<gl-icon :name="caretIcon" />
|
||||
</a>
|
||||
</div>
|
||||
<div
|
||||
|
|
|
@ -40,7 +40,6 @@ export const SET_ALL_DASHBOARDS = 'SET_ALL_DASHBOARDS';
|
|||
export const SET_ENDPOINTS = 'SET_ENDPOINTS';
|
||||
export const SET_INITIAL_STATE = 'SET_INITIAL_STATE';
|
||||
export const SET_GETTING_STARTED_EMPTY_STATE = 'SET_GETTING_STARTED_EMPTY_STATE';
|
||||
export const SET_NO_DATA_EMPTY_STATE = 'SET_NO_DATA_EMPTY_STATE';
|
||||
export const SET_SHOW_ERROR_BANNER = 'SET_SHOW_ERROR_BANNER';
|
||||
export const SET_PANEL_GROUP_METRICS = 'SET_PANEL_GROUP_METRICS';
|
||||
export const SET_ENVIRONMENTS_FILTER = 'SET_ENVIRONMENTS_FILTER';
|
||||
|
|
|
@ -59,7 +59,6 @@ export default {
|
|||
*/
|
||||
[types.REQUEST_METRICS_DASHBOARD](state) {
|
||||
state.emptyState = dashboardEmptyStates.LOADING;
|
||||
state.showEmptyState = true;
|
||||
},
|
||||
[types.RECEIVE_METRICS_DASHBOARD_SUCCESS](state, dashboardYML) {
|
||||
const { dashboard, panelGroups, variables, links } = mapToDashboardViewModel(dashboardYML);
|
||||
|
@ -72,13 +71,14 @@ export default {
|
|||
|
||||
if (!state.dashboard.panelGroups.length) {
|
||||
state.emptyState = dashboardEmptyStates.NO_DATA;
|
||||
} else {
|
||||
state.emptyState = null;
|
||||
}
|
||||
},
|
||||
[types.RECEIVE_METRICS_DASHBOARD_FAILURE](state, error) {
|
||||
state.emptyState = error
|
||||
? dashboardEmptyStates.UNABLE_TO_CONNECT
|
||||
: dashboardEmptyStates.NO_DATA;
|
||||
state.showEmptyState = true;
|
||||
},
|
||||
|
||||
[types.REQUEST_DASHBOARD_STARRING](state) {
|
||||
|
@ -152,9 +152,6 @@ export default {
|
|||
const metric = findMetricInDashboard(metricId, state.dashboard);
|
||||
metric.loading = false;
|
||||
|
||||
state.showEmptyState = false;
|
||||
state.emptyState = null;
|
||||
|
||||
if (!data.result || data.result.length === 0) {
|
||||
metric.state = metricStates.NO_DATA;
|
||||
metric.result = null;
|
||||
|
@ -184,13 +181,8 @@ export default {
|
|||
state.timeRange = timeRange;
|
||||
},
|
||||
[types.SET_GETTING_STARTED_EMPTY_STATE](state) {
|
||||
state.showEmptyState = true;
|
||||
state.emptyState = dashboardEmptyStates.GETTING_STARTED;
|
||||
},
|
||||
[types.SET_NO_DATA_EMPTY_STATE](state) {
|
||||
state.showEmptyState = true;
|
||||
state.emptyState = dashboardEmptyStates.NO_DATA;
|
||||
},
|
||||
[types.SET_ALL_DASHBOARDS](state, dashboards) {
|
||||
state.allDashboards = dashboards || [];
|
||||
},
|
||||
|
|
|
@ -21,8 +21,13 @@ export default () => ({
|
|||
|
||||
// Dashboard data
|
||||
hasDashboardValidationWarnings: false,
|
||||
|
||||
/**
|
||||
* {?String} If set, dashboard should display a global
|
||||
* empty state, there is no way to interact (yet)
|
||||
* with the dashboard.
|
||||
*/
|
||||
emptyState: dashboardEmptyStates.GETTING_STARTED,
|
||||
showEmptyState: true,
|
||||
showErrorBanner: true,
|
||||
isUpdatingStarredValue: false,
|
||||
dashboard: {
|
||||
|
|
|
@ -419,7 +419,7 @@ export default {
|
|||
</gl-alert>
|
||||
<div class="note-form-actions">
|
||||
<div
|
||||
class="btn-group append-right-10 comment-type-dropdown js-comment-type-dropdown droplab-dropdown"
|
||||
class="btn-group gl-mr-3 comment-type-dropdown js-comment-type-dropdown droplab-dropdown"
|
||||
>
|
||||
<button
|
||||
:disabled="isSubmitButtonDisabled"
|
||||
|
|
|
@ -410,7 +410,7 @@ export default {
|
|||
</button>
|
||||
<button
|
||||
v-if="discussion.resolvable"
|
||||
class="btn btn-nr btn-default append-right-10 js-comment-resolve-button"
|
||||
class="btn btn-nr btn-default gl-mr-3 js-comment-resolve-button"
|
||||
@click.prevent="handleUpdate(true)"
|
||||
>
|
||||
{{ resolveButtonTitle }}
|
||||
|
|
|
@ -56,7 +56,7 @@ export default {
|
|||
v-gl-tooltip
|
||||
category="primary"
|
||||
variant="default"
|
||||
class="append-right-10 js-edit-button ml-2 pb-2"
|
||||
class="gl-mr-3 js-edit-button ml-2 pb-2"
|
||||
:title="__('Edit this release')"
|
||||
:href="editLink"
|
||||
>
|
||||
|
|
|
@ -114,7 +114,12 @@ export default {
|
|||
class="mr-widget-section grouped-security-reports mr-report"
|
||||
>
|
||||
<template v-if="showViewFullReport" #actionButtons>
|
||||
<gl-button :href="testTabURL" icon="external-link" data-testid="group-test-reports-full-link">
|
||||
<gl-button
|
||||
:href="testTabURL"
|
||||
icon="external-link"
|
||||
data-testid="group-test-reports-full-link"
|
||||
class="gl-mr-3"
|
||||
>
|
||||
{{ s__('ciReport|View full report') }}
|
||||
</gl-button>
|
||||
</template>
|
||||
|
|
|
@ -62,7 +62,7 @@ export default {
|
|||
|
||||
<template>
|
||||
<div class="sidebar-item-warning-message-actions">
|
||||
<button type="button" class="btn btn-default append-right-10" @click="closeForm">
|
||||
<button type="button" class="btn btn-default gl-mr-3" @click="closeForm">
|
||||
{{ __('Cancel') }}
|
||||
</button>
|
||||
<button
|
||||
|
|
|
@ -41,7 +41,7 @@ export default {
|
|||
|
||||
<template>
|
||||
<div class="sidebar-item-warning-message-actions">
|
||||
<button type="button" class="btn btn-default append-right-10" @click="closeForm">
|
||||
<button type="button" class="btn btn-default gl-mr-3" @click="closeForm">
|
||||
{{ __('Cancel') }}
|
||||
</button>
|
||||
|
||||
|
|
|
@ -87,7 +87,7 @@ export default {
|
|||
<status-icon status="success" />
|
||||
<div class="media-body">
|
||||
<h4 class="d-flex align-items-start">
|
||||
<span class="append-right-10">
|
||||
<span class="gl-mr-3">
|
||||
<span class="js-status-text-before-author">{{ statusTextBeforeAuthor }}</span>
|
||||
<mr-widget-author :author="mr.setToAutoMergeBy" />
|
||||
<span class="js-status-text-after-author">{{ statusTextAfterAuthor }}</span>
|
||||
|
@ -113,9 +113,7 @@ export default {
|
|||
{{ s__('mrWidget|The source branch will be deleted') }}
|
||||
</p>
|
||||
<p v-else class="d-flex align-items-start">
|
||||
<span class="append-right-10">{{
|
||||
s__('mrWidget|The source branch will not be deleted')
|
||||
}}</span>
|
||||
<span class="gl-mr-3">{{ s__('mrWidget|The source branch will not be deleted') }}</span>
|
||||
<a
|
||||
v-if="canRemoveSourceBranch"
|
||||
:disabled="isRemovingSourceBranch"
|
||||
|
|
|
@ -384,7 +384,7 @@ export default {
|
|||
v-if="mr.testResultsPath"
|
||||
class="js-reports-container"
|
||||
:endpoint="mr.testResultsPath"
|
||||
:pipeline-path="mr.mergeRequestAddCiConfigPath"
|
||||
:pipeline-path="mr.pipeline.path"
|
||||
/>
|
||||
|
||||
<terraform-plan v-if="mr.terraformReportsPath" :endpoint="mr.terraformReportsPath" />
|
||||
|
|
|
@ -56,7 +56,7 @@ export default {
|
|||
@click="onClick"
|
||||
>
|
||||
<icon
|
||||
class="prepend-left-10 append-right-10 flex-shrink-0 position-top-0 js-selected-icon"
|
||||
class="prepend-left-10 gl-mr-3 flex-shrink-0 position-top-0 js-selected-icon"
|
||||
:class="{ 'js-selected visible': selected, 'js-unselected invisible': !selected }"
|
||||
name="mobile-issue-close"
|
||||
/>
|
||||
|
|
|
@ -404,7 +404,6 @@ img.emoji {
|
|||
.prepend-left-15 { margin-left: 15px; }
|
||||
.prepend-left-20 { margin-left: 20px; }
|
||||
.prepend-left-64 { margin-left: 64px; }
|
||||
.append-right-10 { margin-right: 10px; }
|
||||
.append-right-15 { margin-right: 15px; }
|
||||
.append-right-20 { margin-right: 20px; }
|
||||
.append-bottom-10 { margin-bottom: 10px; }
|
||||
|
|
|
@ -171,7 +171,7 @@ $gray-500: #a7a7a7 !default;
|
|||
$gray-600: #919191 !default;
|
||||
$gray-700: #707070 !default;
|
||||
$gray-800: #4f4f4f !default;
|
||||
$gray-900: #2e2e2e !default;
|
||||
$gray-900: #303030 !default;
|
||||
$gray-950: #1f1f1f !default;
|
||||
|
||||
$greens: (
|
||||
|
|
|
@ -45,8 +45,7 @@
|
|||
color: $gl-text-color-secondary;
|
||||
}
|
||||
|
||||
.fa-pause,
|
||||
.fa-play {
|
||||
.fa-pause {
|
||||
font-size: 11px;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,6 +18,11 @@ module Mutations
|
|||
required: true,
|
||||
description: copy_field_description(Types::Notes::NoteType, :body)
|
||||
|
||||
argument :confidential,
|
||||
GraphQL::BOOLEAN_TYPE,
|
||||
required: false,
|
||||
description: 'The confidentiality flag of a note. Default is false.'
|
||||
|
||||
def resolve(args)
|
||||
noteable = authorized_find!(id: args[:noteable_id])
|
||||
|
||||
|
@ -40,7 +45,8 @@ module Mutations
|
|||
def create_note_params(noteable, args)
|
||||
{
|
||||
noteable: noteable,
|
||||
note: args[:body]
|
||||
note: args[:body],
|
||||
confidential: args[:confidential]
|
||||
}
|
||||
end
|
||||
end
|
||||
|
|
|
@ -85,9 +85,9 @@ module Mutations
|
|||
|
||||
def create_params(args)
|
||||
args.tap do |create_args|
|
||||
# We need to rename `files` into `snippet_files` because
|
||||
# We need to rename `files` into `snippet_actions` because
|
||||
# it's the expected key param
|
||||
create_args[:snippet_files] = create_args.delete(:files)&.map(&:to_h)
|
||||
create_args[:snippet_actions] = create_args.delete(:files)&.map(&:to_h)
|
||||
|
||||
# We need to rename `uploaded_files` into `files` because
|
||||
# it's the expected key param
|
||||
|
|
|
@ -56,9 +56,9 @@ module Mutations
|
|||
|
||||
def update_params(args)
|
||||
args.tap do |update_args|
|
||||
# We need to rename `files` into `snippet_files` because
|
||||
# We need to rename `files` into `snippet_actions` because
|
||||
# it's the expected key param
|
||||
update_args[:snippet_files] = update_args.delete(:files)&.map(&:to_h)
|
||||
update_args[:snippet_actions] = update_args.delete(:files)&.map(&:to_h)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -24,7 +24,7 @@ module EnvironmentsHelper
|
|||
def metrics_data(project, environment)
|
||||
metrics_data = {}
|
||||
metrics_data.merge!(project_metrics_data(project)) if project
|
||||
metrics_data.merge!(environment_metrics_data(environment)) if environment
|
||||
metrics_data.merge!(environment_metrics_data(environment, project)) if environment
|
||||
metrics_data.merge!(project_and_environment_metrics_data(project, environment)) if project && environment
|
||||
metrics_data.merge!(static_metrics_data)
|
||||
|
||||
|
@ -66,11 +66,11 @@ module EnvironmentsHelper
|
|||
}
|
||||
end
|
||||
|
||||
def environment_metrics_data(environment)
|
||||
def environment_metrics_data(environment, project = nil)
|
||||
return {} unless environment
|
||||
|
||||
{
|
||||
'metrics-dashboard-base-path' => environment_metrics_path(environment),
|
||||
'metrics-dashboard-base-path' => metrics_dashboard_base_path(environment, project),
|
||||
'current-environment-name' => environment.name,
|
||||
'has-metrics' => "#{environment.has_metrics?}",
|
||||
'prometheus-status' => "#{environment.prometheus_status}",
|
||||
|
@ -78,6 +78,17 @@ module EnvironmentsHelper
|
|||
}
|
||||
end
|
||||
|
||||
def metrics_dashboard_base_path(environment, project)
|
||||
# This is needed to support our transition from environment scoped metric paths to project scoped.
|
||||
if project
|
||||
path = project_metrics_dashboard_path(project)
|
||||
|
||||
return path if request.path.include?(path)
|
||||
end
|
||||
|
||||
environment_metrics_path(environment)
|
||||
end
|
||||
|
||||
def project_and_environment_metrics_data(project, environment)
|
||||
return {} unless project && environment
|
||||
|
||||
|
|
|
@ -76,9 +76,11 @@ module Clusters
|
|||
'clusters-path': clusterable.index_path,
|
||||
'dashboard-endpoint': clusterable.metrics_dashboard_path(cluster),
|
||||
'documentation-path': help_page_path('user/project/clusters/index', anchor: 'monitoring-your-kubernetes-cluster-ultimate'),
|
||||
'add-dashboard-documentation-path': help_page_path('user/project/integrations/prometheus.md', anchor: 'adding-a-new-dashboard-to-your-project'),
|
||||
'empty-getting-started-svg-path': image_path('illustrations/monitoring/getting_started.svg'),
|
||||
'empty-loading-svg-path': image_path('illustrations/monitoring/loading.svg'),
|
||||
'empty-no-data-svg-path': image_path('illustrations/monitoring/no_data.svg'),
|
||||
'empty-no-data-small-svg-path': image_path('illustrations/chart-empty-state-small.svg'),
|
||||
'empty-unable-to-connect-svg-path': image_path('illustrations/monitoring/unable_to_connect.svg'),
|
||||
'settings-path': '',
|
||||
'project-path': '',
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
# frozen_string_literal: true
|
||||
module IncidentManagement
|
||||
module Settings
|
||||
include Gitlab::Utils::StrongMemoize
|
||||
|
||||
def incident_management_setting
|
||||
strong_memoize(:incident_management_setting) do
|
||||
project.incident_management_setting ||
|
||||
|
|
|
@ -0,0 +1,72 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module IncidentManagement
|
||||
module PagerDuty
|
||||
class CreateIncidentIssueService < BaseService
|
||||
include IncidentManagement::Settings
|
||||
|
||||
def initialize(project, incident_payload)
|
||||
super(project, User.alert_bot, incident_payload)
|
||||
end
|
||||
|
||||
def execute
|
||||
return forbidden unless webhook_available?
|
||||
|
||||
issue = create_issue
|
||||
return error(issue.errors.full_messages.to_sentence, issue) unless issue.valid?
|
||||
|
||||
success(issue)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
alias_method :incident_payload, :params
|
||||
|
||||
def create_issue
|
||||
label_result = find_or_create_incident_label
|
||||
|
||||
# Create an unlabelled issue if we couldn't create the label
|
||||
# due to a race condition.
|
||||
# See https://gitlab.com/gitlab-org/gitlab-foss/issues/65042
|
||||
extra_params = label_result.success? ? { label_ids: [label_result.payload[:label].id] } : {}
|
||||
|
||||
Issues::CreateService.new(
|
||||
project,
|
||||
current_user,
|
||||
title: issue_title,
|
||||
description: issue_description,
|
||||
**extra_params
|
||||
).execute
|
||||
end
|
||||
|
||||
def webhook_available?
|
||||
Feature.enabled?(:pagerduty_webhook, project) &&
|
||||
incident_management_setting.pagerduty_active?
|
||||
end
|
||||
|
||||
def forbidden
|
||||
ServiceResponse.error(message: 'Forbidden', http_status: :forbidden)
|
||||
end
|
||||
|
||||
def find_or_create_incident_label
|
||||
::IncidentManagement::CreateIncidentLabelService.new(project, current_user).execute
|
||||
end
|
||||
|
||||
def issue_title
|
||||
incident_payload['title']
|
||||
end
|
||||
|
||||
def issue_description
|
||||
Gitlab::IncidentManagement::PagerDuty::IncidentIssueDescription.new(incident_payload).to_s
|
||||
end
|
||||
|
||||
def success(issue)
|
||||
ServiceResponse.success(payload: { issue: issue })
|
||||
end
|
||||
|
||||
def error(message, issue = nil)
|
||||
ServiceResponse.error(payload: { issue: issue }, message: message)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -6,15 +6,15 @@ module Snippets
|
|||
|
||||
CreateRepositoryError = Class.new(StandardError)
|
||||
|
||||
attr_reader :uploaded_assets, :snippet_files
|
||||
attr_reader :uploaded_assets, :snippet_actions
|
||||
|
||||
def initialize(project, user = nil, params = {})
|
||||
super
|
||||
|
||||
@uploaded_assets = Array(@params.delete(:files).presence)
|
||||
|
||||
input_actions = Array(@params.delete(:snippet_files).presence)
|
||||
@snippet_files = SnippetInputActionCollection.new(input_actions, allowed_actions: restricted_files_actions)
|
||||
input_actions = Array(@params.delete(:snippet_actions).presence)
|
||||
@snippet_actions = SnippetInputActionCollection.new(input_actions, allowed_actions: restricted_files_actions)
|
||||
|
||||
filter_spam_check_params
|
||||
end
|
||||
|
@ -32,18 +32,18 @@ module Snippets
|
|||
end
|
||||
|
||||
def valid_params?
|
||||
return true if snippet_files.empty?
|
||||
return true if snippet_actions.empty?
|
||||
|
||||
(params.keys & [:content, :file_name]).none? && snippet_files.valid?
|
||||
(params.keys & [:content, :file_name]).none? && snippet_actions.valid?
|
||||
end
|
||||
|
||||
def invalid_params_error(snippet)
|
||||
if snippet_files.valid?
|
||||
if snippet_actions.valid?
|
||||
[:content, :file_name].each do |key|
|
||||
snippet.errors.add(key, 'and snippet files cannot be used together') if params.key?(key)
|
||||
end
|
||||
else
|
||||
snippet.errors.add(:snippet_files, 'have invalid data')
|
||||
snippet.errors.add(:snippet_actions, 'have invalid data')
|
||||
end
|
||||
|
||||
snippet_error_response(snippet, 403)
|
||||
|
@ -75,7 +75,7 @@ module Snippets
|
|||
end
|
||||
|
||||
def files_to_commit(snippet)
|
||||
snippet_files.to_commit_actions.presence || build_actions_from_params(snippet)
|
||||
snippet_actions.to_commit_actions.presence || build_actions_from_params(snippet)
|
||||
end
|
||||
|
||||
def build_actions_from_params(snippet)
|
||||
|
|
|
@ -37,13 +37,13 @@ module Snippets
|
|||
end
|
||||
end
|
||||
|
||||
# If the snippet_files param is present
|
||||
# If the snippet_actions param is present
|
||||
# we need to fill content and file_name from
|
||||
# the model
|
||||
def create_params
|
||||
return params if snippet_files.empty?
|
||||
return params if snippet_actions.empty?
|
||||
|
||||
params.merge(content: snippet_files[0].content, file_name: snippet_files[0].file_path)
|
||||
params.merge(content: snippet_actions[0].content, file_name: snippet_actions[0].file_path)
|
||||
end
|
||||
|
||||
def save_and_commit
|
||||
|
|
|
@ -37,9 +37,9 @@ module Snippets
|
|||
# is implemented.
|
||||
# Once we can perform different operations through this service
|
||||
# we won't need to keep track of the `content` and `file_name` fields
|
||||
if snippet_files.any?
|
||||
params[:content] = snippet_files[0].content if snippet_files[0].content
|
||||
params[:file_name] = snippet_files[0].file_path
|
||||
if snippet_actions.any?
|
||||
params[:content] = snippet_actions[0].content if snippet_actions[0].content
|
||||
params[:file_name] = snippet_actions[0].file_path
|
||||
end
|
||||
|
||||
snippet.assign_attributes(params)
|
||||
|
@ -109,7 +109,7 @@ module Snippets
|
|||
end
|
||||
|
||||
def committable_attributes?
|
||||
(params.stringify_keys.keys & COMMITTABLE_ATTRIBUTES).present? || snippet_files.any?
|
||||
(params.stringify_keys.keys & COMMITTABLE_ATTRIBUTES).present? || snippet_actions.any?
|
||||
end
|
||||
|
||||
def build_actions_from_params(snippet)
|
||||
|
|
|
@ -72,8 +72,8 @@
|
|||
= link_to [:pause, :admin, runner], method: :get, class: 'btn btn-default has-tooltip', title: _('Pause'), ref: 'tooltip', aria: { label: _('Pause') }, data: { placement: 'top', container: 'body', confirm: _('Are you sure?') } do
|
||||
= icon('pause')
|
||||
- else
|
||||
= link_to [:resume, :admin, runner], method: :get, class: 'btn btn-default has-tooltip', title: _('Resume'), ref: 'tooltip', aria: { label: _('Resume') }, data: { placement: 'top', container: 'body'} do
|
||||
= icon('play')
|
||||
= link_to [:resume, :admin, runner], method: :get, class: 'btn btn-default has-tooltip gl-px-3', title: _('Resume'), ref: 'tooltip', aria: { label: _('Resume') }, data: { placement: 'top', container: 'body'} do
|
||||
= sprite_icon('play')
|
||||
.btn-group
|
||||
= link_to [:admin, runner], method: :delete, class: 'btn btn-danger has-tooltip', title: _('Remove'), ref: 'tooltip', aria: { label: _('Remove') }, data: { placement: 'top', container: 'body', confirm: _('Are you sure?') } do
|
||||
= icon('remove')
|
||||
|
|
|
@ -6,8 +6,8 @@
|
|||
= render 'ci/group_variables/variable_header'
|
||||
- variables.each do |variable|
|
||||
.group-variable-row.d-flex.w-100.border-bottom.pt-2.pb-2
|
||||
.table-section.section-40.append-right-10.key
|
||||
.table-section.section-40.gl-mr-3.key
|
||||
= variable.key
|
||||
.table-section.section-40.append-right-10
|
||||
.table-section.section-40.gl-mr-3
|
||||
%a.group-origin-link{ href: group_settings_ci_cd_path(variable.group) }
|
||||
= variable.group.name
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
.group-variable-keys.d-flex.w-100.align-items-center.pb-2.border-bottom
|
||||
.bold.table-section.section-40.append-right-10
|
||||
.bold.table-section.section-40.gl-mr-3
|
||||
= s_('Key')
|
||||
.bold.table-section.section-40.append-right-10
|
||||
.bold.table-section.section-40.gl-mr-3
|
||||
= s_('Origin')
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
.bold.table-section.section-15.append-right-10
|
||||
.bold.table-section.section-15.gl-mr-3
|
||||
= s_('CiVariables|Scope')
|
||||
|
|
|
@ -2,11 +2,11 @@
|
|||
|
||||
%li.ci-variable-row.m-0.d-none.d-sm-block
|
||||
.d-flex.w-100.align-items-center.pb-2
|
||||
.bold.table-section.section-15.append-right-10
|
||||
.bold.table-section.section-15.gl-mr-3
|
||||
= s_('CiVariables|Type')
|
||||
.bold.table-section.section-15.append-right-10
|
||||
.bold.table-section.section-15.gl-mr-3
|
||||
= s_('CiVariables|Key')
|
||||
.bold.table-section.section-15.append-right-10
|
||||
.bold.table-section.section-15.gl-mr-3
|
||||
= s_('CiVariables|Value')
|
||||
- unless only_key_value
|
||||
.bold.table-section.section-20
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
- is_current_session = active_session.current?(session)
|
||||
|
||||
%li.list-group-item
|
||||
.float-left.append-right-10{ data: { toggle: 'tooltip' }, title: active_session.human_device_type }
|
||||
.float-left.gl-mr-3{ data: { toggle: 'tooltip' }, title: active_session.human_device_type }
|
||||
= active_session_device_type_icon(active_session)
|
||||
|
||||
.description.float-left
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
%li.key-list-item
|
||||
.float-left.append-right-10
|
||||
.float-left.gl-mr-3
|
||||
= icon 'key', class: "settings-list-icon d-none d-sm-block"
|
||||
.key-list-item-info
|
||||
- key.emails_with_verified_status.map do |email, verified|
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
%li.d-flex.align-items-center.key-list-item
|
||||
.append-right-10
|
||||
.gl-mr-3
|
||||
- if key.valid?
|
||||
- if key.expired?
|
||||
%span.d-inline-block.has-tooltip{ title: s_('Profiles|Your key has expired') }
|
||||
|
@ -17,10 +17,10 @@
|
|||
= key.fingerprint
|
||||
|
||||
.key-list-item-dates.d-flex.align-items-start.justify-content-between
|
||||
%span.last-used-at.append-right-10
|
||||
%span.last-used-at.gl-mr-3
|
||||
= s_('Profiles|Last used:')
|
||||
= key.last_used_at ? time_ago_with_tooltip(key.last_used_at) : _('Never')
|
||||
%span.expires.append-right-10
|
||||
%span.expires.gl-mr-3
|
||||
= s_('Profiles|Expires:')
|
||||
= key.expires_at ? key.expires_at.to_date : _('Never')
|
||||
%span.key-created-at
|
||||
|
|
|
@ -30,6 +30,6 @@
|
|||
= f.label :password_confirmation, _('Password confirmation'), class: 'label-bold'
|
||||
= f.password_field :password_confirmation, required: true, class: 'form-control', data: { qa_selector: 'confirm_password_field' }
|
||||
.gl-mt-3.gl-mb-3
|
||||
= f.submit _('Save password'), class: "btn btn-success append-right-10", data: { qa_selector: 'save_password_button' }
|
||||
= f.submit _('Save password'), class: "btn btn-success gl-mr-3", data: { qa_selector: 'save_password_button' }
|
||||
- unless @user.password_automatically_set?
|
||||
= link_to _('I forgot my password'), reset_profile_password_path, method: :put
|
||||
|
|
|
@ -9,5 +9,5 @@
|
|||
%span.monospace= code
|
||||
|
||||
.d-flex
|
||||
= link_to _('Proceed'), profile_account_path, class: 'btn btn-success append-right-10', data: { qa_selector: 'proceed_button' }
|
||||
= link_to _('Proceed'), profile_account_path, class: 'btn btn-success gl-mr-3', data: { qa_selector: 'proceed_button' }
|
||||
= link_to _('Download codes'), "data:text/plain;charset=utf-8,#{CGI.escape(@codes.join("\n"))}", download: "gitlab-recovery-codes.txt", class: 'btn btn-default'
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
= link_to _('Disable two-factor authentication'), profile_two_factor_auth_path,
|
||||
method: :delete,
|
||||
data: { confirm: _('Are you sure? This will invalidate your registered applications and U2F devices.') },
|
||||
class: 'btn btn-danger append-right-10'
|
||||
class: 'btn btn-danger gl-mr-3'
|
||||
= form_tag codes_profile_two_factor_auth_path, {style: 'display: inline-block', method: :post} do |f|
|
||||
= submit_tag _('Regenerate recovery codes'), class: 'btn'
|
||||
|
||||
|
|
|
@ -8,13 +8,13 @@
|
|||
= sprite_icon('fork', size: 12)
|
||||
= ref
|
||||
- if current_action?(:edit) || current_action?(:update)
|
||||
%span.pull-left.append-right-10
|
||||
%span.pull-left.gl-mr-3
|
||||
= text_field_tag 'file_path', (params[:file_path] || @path),
|
||||
class: 'form-control new-file-path js-file-path-name-input'
|
||||
= render 'template_selectors'
|
||||
|
||||
- if current_action?(:new) || current_action?(:create)
|
||||
%span.pull-left.append-right-10
|
||||
%span.pull-left.gl-mr-3
|
||||
\/
|
||||
= text_field_tag 'file_name', params[:file_name], placeholder: "File name",
|
||||
required: true, class: 'form-control new-file-name js-file-path-name-input', value: params[:file_name] || (should_suggest_gitlab_ci_yml? ? '.gitlab-ci.yml' : '')
|
||||
|
|
|
@ -22,10 +22,10 @@
|
|||
|
||||
.header-action-buttons
|
||||
- if defined?(@notes_count) && @notes_count > 0
|
||||
%span.btn.disabled.btn-grouped.d-none.d-sm-block.append-right-10.has-tooltip{ title: n_("%d comment on this commit", "%d comments on this commit", @notes_count) % @notes_count }
|
||||
%span.btn.disabled.btn-grouped.d-none.d-sm-block.gl-mr-3.has-tooltip{ title: n_("%d comment on this commit", "%d comments on this commit", @notes_count) % @notes_count }
|
||||
= sprite_icon('comment')
|
||||
= @notes_count
|
||||
= link_to project_tree_path(@project, @commit), class: "btn btn-default append-right-10 d-none d-sm-none d-md-inline" do
|
||||
= link_to project_tree_path(@project, @commit), class: "btn btn-default gl-mr-3 d-none d-sm-none d-md-inline" do
|
||||
#{ _('Browse files') }
|
||||
.dropdown.inline
|
||||
%a.btn.btn-default.dropdown-toggle.qa-options-button.d-md-inline{ data: { toggle: "dropdown" } }
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
= render 'projects/issues/import_csv/button'
|
||||
|
||||
- if @can_bulk_update
|
||||
= button_tag _("Edit issues"), class: "btn btn-default append-right-10 js-bulk-update-toggle"
|
||||
= button_tag _("Edit issues"), class: "btn btn-default gl-mr-3 js-bulk-update-toggle"
|
||||
- if show_new_issue_link?(@project)
|
||||
= link_to _("New issue"), new_project_issue_path(@project,
|
||||
issue: { assignee_id: finder.assignee.try(:id),
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
- if @merge_request.reopenable?
|
||||
= link_to 'Reopen merge request', merge_request_path(@merge_request, merge_request: { state_event: :reopen }), method: :put, class: "btn btn-nr btn-comment btn-reopen reopen-mr-link js-note-target-close js-note-target-reopen", title: "Reopen merge request", data: { original_text: "Reopen merge request", alternative_text: "Comment & reopen merge request"}
|
||||
%comment-and-resolve-btn{ "inline-template" => true }
|
||||
%button.btn.btn-nr.btn-default.append-right-10.js-comment-resolve-button{ "v-if" => "showButton", type: "submit", data: { project_path: "#{project_path(@merge_request.project)}" } }
|
||||
%button.btn.btn-nr.btn-default.gl-mr-3.js-comment-resolve-button{ "v-if" => "showButton", type: "submit", data: { project_path: "#{project_path(@merge_request.project)}" } }
|
||||
{{ buttonText }}
|
||||
|
||||
#notes= render "shared/notes/notes_with_form", :autocomplete => true
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
- if @can_bulk_update
|
||||
= button_tag "Edit merge requests", class: "btn append-right-10 js-bulk-update-toggle"
|
||||
= button_tag "Edit merge requests", class: "btn gl-mr-3 js-bulk-update-toggle"
|
||||
- if merge_project
|
||||
= link_to new_merge_request_path, class: "btn btn-success", title: "New merge request" do
|
||||
New merge request
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
- verified_at = mirror.ssh_known_hosts_verified_at
|
||||
|
||||
.form-group.js-ssh-host-keys-section{ class: ('collapse' unless mirror.ssh_mirror_url?) }
|
||||
%button.btn.btn-inverted.btn-secondary.inline.js-detect-host-keys.append-right-10{ type: 'button', data: { qa_selector: 'detect_host_keys' } }
|
||||
%button.btn.btn-inverted.btn-secondary.inline.js-detect-host-keys.gl-mr-3{ type: 'button', data: { qa_selector: 'detect_host_keys' } }
|
||||
.js-spinner.d-none.spinner.mr-1
|
||||
= _('Detect host keys')
|
||||
.fingerprint-ssh-info.js-fingerprint-ssh-info.prepend-top-10.append-bottom-10{ class: ('collapse' unless mirror.ssh_mirror_url?) }
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
= link_to project_repository_path(@project), method: :post, class: 'btn btn-primary' do
|
||||
#{ _('Create empty repository') }
|
||||
|
||||
%strong.prepend-left-10.append-right-10 or
|
||||
%strong.prepend-left-10.gl-mr-3 or
|
||||
|
||||
= link_to new_project_import_path(@project), class: 'btn' do
|
||||
#{ _('Import repository') }
|
||||
|
|
|
@ -27,8 +27,8 @@
|
|||
%td
|
||||
.float-right.btn-group
|
||||
- if can?(current_user, :play_pipeline_schedule, pipeline_schedule)
|
||||
= link_to play_pipeline_schedule_path(pipeline_schedule), method: :post, title: s_('Play'), class: 'btn' do
|
||||
= icon('play')
|
||||
= link_to play_pipeline_schedule_path(pipeline_schedule), method: :post, title: s_('Play'), class: 'btn btn-svg gl-display-flex gl-align-items-center gl-justify-content-center' do
|
||||
= sprite_icon('play')
|
||||
- if can?(current_user, :take_ownership_pipeline_schedule, pipeline_schedule)
|
||||
= link_to take_ownership_pipeline_schedule_path(pipeline_schedule), method: :post, title: s_('PipelineSchedules|Take ownership'), class: 'btn' do
|
||||
= s_('PipelineSchedules|Take ownership')
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
- Gitlab::ProjectTemplate.all.each do |template|
|
||||
.template-option.d-flex.align-items-center{ data: { qa_selector: 'template_option_row' } }
|
||||
.logo.append-right-10.px-1
|
||||
.logo.gl-mr-3.px-1
|
||||
= image_tag template.logo, size: 32, class: "btn-template-icon icon-#{template.name}"
|
||||
.description
|
||||
%strong
|
||||
|
@ -9,7 +9,7 @@
|
|||
.text-muted
|
||||
= template.description
|
||||
.controls.d-flex.align-items-center
|
||||
%a.btn.btn-default.append-right-10{ href: template.preview, rel: 'noopener noreferrer', target: '_blank', data: { track_label: "template_preview", track_property: template.name, track_event: "click_button", track_value: "" } }
|
||||
%a.btn.btn-default.gl-mr-3{ href: template.preview, rel: 'noopener noreferrer', target: '_blank', data: { track_label: "template_preview", track_property: template.name, track_event: "click_button", track_value: "" } }
|
||||
= _("Preview")
|
||||
%label.btn.btn-success.template-button.choose-template.gl-mb-0{ for: template.name }
|
||||
%input{ type: "radio", autocomplete: "off", name: "project[template_name]", id: template.name, value: template.name, data: { track_label: "template_use", track_property: template.name, track_event: "click_button", track_value: "" } }
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
.input-group.template-input-group
|
||||
.input-group-prepend
|
||||
.input-group-text
|
||||
.selected-icon.append-right-10
|
||||
.selected-icon.gl-mr-3
|
||||
.selected-template
|
||||
.input-group-append
|
||||
%button.btn.btn-default.change-template{ type: "button" }
|
||||
|
|
|
@ -15,5 +15,5 @@
|
|||
|
||||
%p
|
||||
= link_to _('Unsubscribe'), unsubscribe_sent_notification_path(@sent_notification, force: true),
|
||||
class: 'btn btn-primary append-right-10'
|
||||
= link_to _('Cancel'), new_user_session_path, class: 'btn append-right-10'
|
||||
class: 'btn btn-primary gl-mr-3'
|
||||
= link_to _('Cancel'), new_user_session_path, class: 'btn gl-mr-3'
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
- else
|
||||
- default_sort_by = sort_value_recently_created
|
||||
|
||||
.dropdown.inline.js-group-filter-dropdown-wrap.append-right-10
|
||||
.dropdown.inline.js-group-filter-dropdown-wrap.gl-mr-3
|
||||
%button.dropdown-menu-toggle{ type: 'button', 'data-toggle' => 'dropdown' }
|
||||
%span.dropdown-label
|
||||
= options_hash[default_sort_by]
|
||||
|
|
|
@ -69,7 +69,7 @@
|
|||
= link_to 'Delete', polymorphic_path([@project.namespace.becomes(Namespace), @project, issuable], params: { destroy_confirm: true }), data: { confirm: "#{issuable.human_class_name} will be removed! Are you sure?" }, method: :delete, class: 'btn btn-danger btn-grouped'
|
||||
= link_to 'Cancel', polymorphic_path([@project.namespace.becomes(Namespace), @project, issuable]), class: 'btn btn-grouped btn-cancel'
|
||||
|
||||
%span.append-right-10
|
||||
%span.gl-mr-3
|
||||
- if issuable.new_record?
|
||||
= form.submit "Submit #{issuable.class.model_name.human.downcase}", class: 'btn btn-success qa-issuable-create-button'
|
||||
- else
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
.banner-callout.compact.milestone-deprecation-message.js-milestone-deprecation-message.prepend-top-20
|
||||
.banner-graphic= image_tag 'illustrations/milestone_removing-page.svg'
|
||||
.banner-body.prepend-left-10.append-right-10
|
||||
.banner-body.prepend-left-10.gl-mr-3
|
||||
%h5.banner-title.gl-mt-0= _('This page will be removed in a future release.')
|
||||
%p.milestone-banner-text= _('Use group milestones to manage issues from multiple projects in the same milestone.')
|
||||
= button_tag _('Promote these project milestones into a group milestone.'), class: 'btn btn-link js-popover-link text-align-left milestone-banner-link'
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
- noteable_name = @note.noteable.human_class_name
|
||||
|
||||
.float-left.btn-group.append-right-10.droplab-dropdown.comment-type-dropdown.js-comment-type-dropdown
|
||||
.float-left.btn-group.gl-mr-3.droplab-dropdown.comment-type-dropdown.js-comment-type-dropdown
|
||||
%input.btn.btn-nr.btn-success.js-comment-button.js-comment-submit-button{ type: 'submit', value: _('Comment'), data: { qa_selector: 'comment_button' } }
|
||||
|
||||
- if @note.can_be_discussion_note?
|
||||
|
|
|
@ -39,11 +39,11 @@
|
|||
%span.project-name<
|
||||
= project.name
|
||||
|
||||
%span.metadata-info.visibility-icon.append-right-10.gl-mt-3.text-secondary.has-tooltip{ data: { container: 'body', placement: 'top' }, title: visibility_icon_description(project) }
|
||||
%span.metadata-info.visibility-icon.gl-mr-3.gl-mt-3.text-secondary.has-tooltip{ data: { container: 'body', placement: 'top' }, title: visibility_icon_description(project) }
|
||||
= visibility_level_icon(project.visibility_level, fw: true)
|
||||
|
||||
- if explore_projects_tab? && project_license_name(project)
|
||||
%span.metadata-info.d-inline-flex.align-items-center.append-right-10.gl-mt-3
|
||||
%span.metadata-info.d-inline-flex.align-items-center.gl-mr-3.gl-mt-3
|
||||
= sprite_icon('scale', size: 14, css_class: 'gl-mr-2')
|
||||
= project_license_name(project)
|
||||
|
||||
|
|
|
@ -691,6 +691,14 @@
|
|||
:weight: 2
|
||||
:idempotent: true
|
||||
:tags: []
|
||||
- :name: incident_management:incident_management_pager_duty_process_incident
|
||||
:feature_category: :incident_management
|
||||
:has_external_dependencies:
|
||||
:urgency: :low
|
||||
:resource_boundary: :unknown
|
||||
:weight: 2
|
||||
:idempotent:
|
||||
:tags: []
|
||||
- :name: incident_management:incident_management_process_alert
|
||||
:feature_category: :incident_management
|
||||
:has_external_dependencies:
|
||||
|
|
|
@ -0,0 +1,42 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module IncidentManagement
|
||||
module PagerDuty
|
||||
class ProcessIncidentWorker # rubocop:disable Scalability/IdempotentWorker
|
||||
include ApplicationWorker
|
||||
|
||||
queue_namespace :incident_management
|
||||
feature_category :incident_management
|
||||
|
||||
def perform(project_id, incident_payload)
|
||||
return unless project_id
|
||||
|
||||
project = find_project(project_id)
|
||||
return unless project
|
||||
|
||||
result = create_issue(project, incident_payload)
|
||||
|
||||
log_error(result) if result.error?
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def find_project(project_id)
|
||||
Project.find_by_id(project_id)
|
||||
end
|
||||
|
||||
def create_issue(project, incident_payload)
|
||||
::IncidentManagement::PagerDuty::CreateIncidentIssueService
|
||||
.new(project, incident_payload)
|
||||
.execute
|
||||
end
|
||||
|
||||
def log_error(result)
|
||||
Gitlab::AppLogger.warn(
|
||||
message: 'Cannot create issue for PagerDuty incident',
|
||||
issue_errors: result.message
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Add confidential attribute to graphQL for notes creation
|
||||
merge_request: 36799
|
||||
author:
|
||||
type: added
|
|
@ -0,0 +1,6 @@
|
|||
---
|
||||
title: Replace initial dashboard loading state with a loading spinner, show dashboard
|
||||
skeleton earlier with smaller loading indicators
|
||||
merge_request: 36399
|
||||
author:
|
||||
type: changed
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Replace FA play icon with svg in pipeline schedule and admin runner page
|
||||
merge_request: 36379
|
||||
author:
|
||||
type: other
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Update to Grape v1.4.0
|
||||
merge_request: 36628
|
||||
author:
|
||||
type: fixed
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Fix for test report link in MR widget
|
||||
merge_request:
|
||||
author:
|
||||
type: fixed
|
|
@ -0,0 +1,31 @@
|
|||
# frozen_string_literal: true
|
||||
# Monkey patch for Grape v1.4.0: https://github.com/ruby-grape/grape/pull/2088
|
||||
|
||||
require 'grape'
|
||||
|
||||
# rubocop:disable Gitlab/ModuleWithInstanceVariables
|
||||
module Grape
|
||||
module DSL
|
||||
module InsideRoute
|
||||
def stream(value = nil)
|
||||
return if value.nil? && @stream.nil?
|
||||
|
||||
header 'Content-Length', nil
|
||||
header 'Transfer-Encoding', nil
|
||||
header 'Cache-Control', 'no-cache' # Skips ETag generation (reading the response up front)
|
||||
|
||||
if value.is_a?(String)
|
||||
file_body = Grape::ServeStream::FileBody.new(value)
|
||||
@stream = Grape::ServeStream::StreamResponse.new(file_body)
|
||||
elsif value.respond_to?(:each)
|
||||
@stream = Grape::ServeStream::StreamResponse.new(value)
|
||||
elsif !value.is_a?(NilClass)
|
||||
raise ArgumentError, 'Stream object must respond to :each.'
|
||||
else
|
||||
@stream
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
# rubocop:enable Gitlab/ModuleWithInstanceVariables
|
|
@ -0,0 +1,13 @@
|
|||
---
|
||||
# Error: gitlab.AlertBoxStyle
|
||||
#
|
||||
# Makes sure alert boxes follow standard formatting.
|
||||
#
|
||||
# For a list of all options, see https://errata-ai.gitbook.io/vale/getting-started/styles
|
||||
extends: existence
|
||||
message: 'Alert box "%s" must use the formatting detailed in the documentation style guide.'
|
||||
link: https://docs.gitlab.com/ee/development/documentation/styleguide.html#alert-boxes
|
||||
level: error
|
||||
scope: raw
|
||||
raw:
|
||||
- 'NOTE: \*\*[^:]*\*\*'
|
|
@ -53,7 +53,7 @@ are already logged in or are using Git over SSH will still be able to access
|
|||
GitLab for up to one hour. Manually block the user in the GitLab Admin Area to
|
||||
immediately block all access.
|
||||
|
||||
NOTE: **Note**:
|
||||
NOTE: **Note:**
|
||||
GitLab Enterprise Edition Starter supports a
|
||||
[configurable sync time](#adjusting-ldap-user-sync-schedule-starter-only).
|
||||
|
||||
|
|
|
@ -473,7 +473,7 @@ nodes (including the Gitaly node using the certificate) and on all client nodes
|
|||
that communicate with it following the procedure described in
|
||||
[GitLab custom certificate configuration](https://docs.gitlab.com/omnibus/settings/ssl.html#install-custom-public-certificates).
|
||||
|
||||
NOTE: **Note**
|
||||
NOTE: **Note:**
|
||||
The self-signed certificate must specify the address you use to access the
|
||||
Gitaly server. If you are addressing the Gitaly server by a hostname, you can
|
||||
either use the Common Name field for this, or add it as a Subject Alternative
|
||||
|
|
|
@ -57,7 +57,7 @@ This configuration relies on valid AWS credentials to be configured already.
|
|||
|
||||
[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
|
||||
|
||||
|
|
|
@ -452,7 +452,7 @@ POST /projects/:id/boards/:board_id/lists
|
|||
| `assignee_id` **(PREMIUM)** | integer | no | The ID of a user |
|
||||
| `milestone_id` **(PREMIUM)** | integer | no | The ID of a milestone |
|
||||
|
||||
NOTE: **Note**:
|
||||
NOTE: **Note:**
|
||||
Label, assignee and milestone arguments are mutually exclusive,
|
||||
that is, only one of them are accepted in a request.
|
||||
Check the [Issue Board docs](../user/project/issue_board.md#summary-of-features-per-tier)
|
||||
|
|
|
@ -42,7 +42,7 @@ CAUTION: **Deprecation**
|
|||
> `reference` attribute in response is deprecated in favour of `references`.
|
||||
> Introduced [GitLab 12.6](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20354)
|
||||
|
||||
NOTE: **Note**
|
||||
NOTE: **Note:**
|
||||
> `references.relative` is relative to the group that the epic is being requested. When epic is fetched from its origin group
|
||||
> `relative` format would be the same as `short` format and when requested cross groups it is expected to be the same as `full` format.
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
NOTE: **Note**
|
||||
NOTE: **Note:**
|
||||
This API is behind a [feature flag](../operations/feature_flags.md#enable-or-disable-feature-flag-strategies).
|
||||
If this flag is not enabled in your environment, you can use the [legacy feature flags API](feature_flags_legacy.md).
|
||||
|
||||
|
|
|
@ -1691,6 +1691,11 @@ input CreateDiffNoteInput {
|
|||
"""
|
||||
clientMutationId: String
|
||||
|
||||
"""
|
||||
The confidentiality flag of a note. Default is false.
|
||||
"""
|
||||
confidential: Boolean
|
||||
|
||||
"""
|
||||
The global id of the resource to add a note to
|
||||
"""
|
||||
|
@ -1816,6 +1821,11 @@ input CreateImageDiffNoteInput {
|
|||
"""
|
||||
clientMutationId: String
|
||||
|
||||
"""
|
||||
The confidentiality flag of a note. Default is false.
|
||||
"""
|
||||
confidential: Boolean
|
||||
|
||||
"""
|
||||
The global id of the resource to add a note to
|
||||
"""
|
||||
|
@ -1916,6 +1926,11 @@ input CreateNoteInput {
|
|||
"""
|
||||
clientMutationId: String
|
||||
|
||||
"""
|
||||
The confidentiality flag of a note. Default is false.
|
||||
"""
|
||||
confidential: Boolean
|
||||
|
||||
"""
|
||||
The global id of the discussion this note is in reply to
|
||||
"""
|
||||
|
|
|
@ -4496,6 +4496,16 @@
|
|||
},
|
||||
"defaultValue": null
|
||||
},
|
||||
{
|
||||
"name": "confidential",
|
||||
"description": "The confidentiality flag of a note. Default is false.",
|
||||
"type": {
|
||||
"kind": "SCALAR",
|
||||
"name": "Boolean",
|
||||
"ofType": null
|
||||
},
|
||||
"defaultValue": null
|
||||
},
|
||||
{
|
||||
"name": "position",
|
||||
"description": "The position of this note on a diff",
|
||||
|
@ -4834,6 +4844,16 @@
|
|||
},
|
||||
"defaultValue": null
|
||||
},
|
||||
{
|
||||
"name": "confidential",
|
||||
"description": "The confidentiality flag of a note. Default is false.",
|
||||
"type": {
|
||||
"kind": "SCALAR",
|
||||
"name": "Boolean",
|
||||
"ofType": null
|
||||
},
|
||||
"defaultValue": null
|
||||
},
|
||||
{
|
||||
"name": "position",
|
||||
"description": "The position of this note on a diff",
|
||||
|
@ -5106,6 +5126,16 @@
|
|||
},
|
||||
"defaultValue": null
|
||||
},
|
||||
{
|
||||
"name": "confidential",
|
||||
"description": "The confidentiality flag of a note. Default is false.",
|
||||
"type": {
|
||||
"kind": "SCALAR",
|
||||
"name": "Boolean",
|
||||
"ofType": null
|
||||
},
|
||||
"defaultValue": null
|
||||
},
|
||||
{
|
||||
"name": "discussionId",
|
||||
"description": "The global id of the discussion this note is in reply to",
|
||||
|
|
|
@ -20,7 +20,7 @@ CAUTION: **Deprecation**
|
|||
> `reference` attribute in response is deprecated in favour of `references`.
|
||||
> Introduced [GitLab 12.6](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20354)
|
||||
|
||||
NOTE: **Note**
|
||||
NOTE: **Note:**
|
||||
> `references.relative` is relative to the group / project that the issue is being requested. When issue is fetched from its project
|
||||
> `relative` format would be the same as `short` format and when requested across groups / projects it is expected to be the same as `full` format.
|
||||
|
||||
|
@ -877,10 +877,10 @@ the `weight` parameter:
|
|||
NOTE: **Note:**
|
||||
At least one of following parameters is required to be passed for the request to be successful: `:assignee_id`, `:assignee_ids`, `:confidential`, `:created_at`, `:description`, `:discussion_locked`, `:due_date`, `:labels`, `:milestone_id`, `:state_event`, or `:title`.
|
||||
|
||||
NOTE: **Note**:
|
||||
NOTE: **Note:**
|
||||
`assignee` column is deprecated. We now show it as a single-sized array `assignees` to conform to the GitLab EE API.
|
||||
|
||||
NOTE: **Note**:
|
||||
NOTE: **Note:**
|
||||
The `closed_by` attribute was [introduced in GitLab 10.6](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/17042). This value will only be present for issues which were closed after GitLab 10.6 and when the user account that closed the issue still exists.
|
||||
|
||||
## Delete an issue
|
||||
|
|
|
@ -6,7 +6,7 @@ CAUTION: **Deprecation**
|
|||
> `reference` attribute in response is deprecated in favour of `references`.
|
||||
> Introduced [GitLab 12.6](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20354)
|
||||
|
||||
NOTE: **Note**
|
||||
NOTE: **Note:**
|
||||
> `references.relative` is relative to the group / project that the merge request is being requested. When merge request is fetched from its project
|
||||
> `relative` format would be the same as `short` format and when requested across groups / projects it is expected to be the same as `full` format.
|
||||
|
||||
|
|
|
@ -138,7 +138,7 @@ PUT /projects/:id/releases/:tag_name/assets/links/:link_id
|
|||
| `url` | string | no | The URL of the link. |
|
||||
| `link_type` | string | no | The type of the link: `other`, `runbook`, `image`, `package`. Defaults to `other`. |
|
||||
|
||||
NOTE: **NOTE**
|
||||
NOTE: **Note:**
|
||||
You have to specify at least one of `name` or `url`
|
||||
|
||||
Example request:
|
||||
|
|
|
@ -16,9 +16,9 @@ through the [continuous methodologies](introduction/index.md#introduction-to-cic
|
|||
- Continuous Delivery (CD)
|
||||
- Continuous Deployment (CD)
|
||||
|
||||
NOTE: **Out-of-the-box management systems can decrease hours spent on maintaining toolchains by 10% or more.**
|
||||
Watch our
|
||||
["Mastering continuous software development"](https://about.gitlab.com/webcast/mastering-ci-cd/)
|
||||
NOTE: **Note:**
|
||||
Out-of-the-box management systems can decrease hours spent on maintaining toolchains by 10% or more.
|
||||
Watch our ["Mastering continuous software development"](https://about.gitlab.com/webcast/mastering-ci-cd/)
|
||||
webcast to learn about continuous methods and how GitLab’s built-in CI can help you simplify and scale software development.
|
||||
|
||||
## Overview
|
||||
|
|
|
@ -149,7 +149,7 @@ released.
|
|||
|
||||
#### TLS enabled
|
||||
|
||||
NOTE: **Note**
|
||||
NOTE: **Note:**
|
||||
Requires GitLab Runner 11.11 or later, but is not supported if GitLab
|
||||
Runner is installed using the [Helm
|
||||
chart](https://docs.gitlab.com/runner/install/kubernetes.html). See the
|
||||
|
|
|
@ -22,7 +22,7 @@ specific environments are "protected" to prevent unauthorized people from affect
|
|||
By default, a protected environment does one thing: it ensures that only people
|
||||
with the right privileges can deploy to it, thus keeping it safe.
|
||||
|
||||
NOTE: **Note**:
|
||||
NOTE: **Note:**
|
||||
A GitLab admin is always allowed to use environments, even if they are protected.
|
||||
|
||||
To protect, update, or unprotect an environment, you need to have at least
|
||||
|
|
|
@ -12,9 +12,9 @@ In this document, we'll present an overview of the concepts of Continuous Integr
|
|||
Continuous Delivery, and Continuous Deployment, as well as an introduction to
|
||||
GitLab CI/CD.
|
||||
|
||||
NOTE: **Out-of-the-box management systems can decrease hours spent on maintaining toolchains by 10% or more.**
|
||||
Watch our
|
||||
["Mastering continuous software development"](https://about.gitlab.com/webcast/mastering-ci-cd/)
|
||||
NOTE: **Note:**
|
||||
Out-of-the-box management systems can decrease hours spent on maintaining toolchains by 10% or more.
|
||||
Watch our ["Mastering continuous software development"](https://about.gitlab.com/webcast/mastering-ci-cd/)
|
||||
webcast to learn about continuous methods and how GitLab’s built-in CI can help you simplify and scale software development.
|
||||
|
||||
## Introduction to CI/CD methodologies
|
||||
|
|
|
@ -24,7 +24,7 @@ can run a pipeline for merge requests.
|
|||
|
||||
![Merge request page](img/merge_request.png)
|
||||
|
||||
NOTE: **Note**:
|
||||
NOTE: **Note:**
|
||||
If you use this feature with [merge when pipeline succeeds](../../user/project/merge_requests/merge_when_pipeline_succeeds.md),
|
||||
pipelines for merge requests take precedence over the other regular pipelines.
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@ in `.gitlab-ci.yml`.
|
|||
|
||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/28919) in GitLab 12.0.
|
||||
|
||||
NOTE: **Note**:
|
||||
NOTE: **Note:**
|
||||
As of GitLab 12.0, newly created projects will automatically have a default
|
||||
`git depth` value of `50`.
|
||||
|
||||
|
|
|
@ -4086,7 +4086,7 @@ You can set them globally or per-job in the [`variables`](#variables) section.
|
|||
|
||||
> Introduced in GitLab 8.9 as an experimental feature.
|
||||
|
||||
NOTE: **Note**:
|
||||
NOTE: **Note:**
|
||||
As of GitLab 12.0, newly created projects will automatically have a [default `git depth` value of `50`](../pipelines/settings.md#git-shallow-clone).
|
||||
|
||||
You can specify the depth of fetching and cloning using `GIT_DEPTH`. This allows
|
||||
|
|
|
@ -42,10 +42,9 @@ the `author` field. GitLab team members **should not**.
|
|||
Example: "Fixed a typo on the search results page."
|
||||
- Any docs-only changes **should not** have a changelog entry.
|
||||
- Any change behind a feature flag **should not** have a changelog entry - unless
|
||||
the feature flag has been defaulted to true. The entry should be added
|
||||
[in the merge request removing the feature flags](feature_flags/development.md).
|
||||
If the change includes a database migration (regular, post, or data migration),
|
||||
there should be a changelog entry for the migration change.
|
||||
the feature flag has been defaulted to true.
|
||||
- A change that [removes a feature flag](feature_flags/development.md) **should** have a changelog entry -
|
||||
only if the feature flag did not default to true already.
|
||||
- A fix for a regression introduced and then fixed in the same release (i.e.,
|
||||
fixing a bug introduced during a monthly release candidate) **should not**
|
||||
have a changelog entry.
|
||||
|
|
|
@ -800,7 +800,7 @@ To link to internal documentation:
|
|||
- `../../issues/tags.md`
|
||||
- `../../issues/tags.md#stages`
|
||||
|
||||
NOTE: **Note**:
|
||||
NOTE: **Note:**
|
||||
Using the Markdown extension is necessary for the [`/help`](index.md#gitlab-help) section of GitLab.
|
||||
|
||||
### Links to external documentation
|
||||
|
|
|
@ -60,7 +60,7 @@ The `whitespace` tokenizer was selected in order to have more control over how t
|
|||
|
||||
Please see the `code` filter for an explanation on how tokens are split.
|
||||
|
||||
NOTE: **Known Issues**:
|
||||
NOTE: **Note:**
|
||||
Currently the [Elasticsearch code_analyzer doesn't account for all code cases](../integration/elasticsearch.md#known-issues).
|
||||
|
||||
#### `code_search_analyzer`
|
||||
|
@ -157,7 +157,8 @@ The global configurations per version are now in the `Elastic::(Version)::Config
|
|||
|
||||
### Creating new version of schema
|
||||
|
||||
NOTE: **Note:** this is not applicable yet as multiple indices functionality is not fully implemented.
|
||||
NOTE: **Note:**
|
||||
This is not applicable yet as multiple indices functionality is not fully implemented.
|
||||
|
||||
Folders like `ee/lib/elastic/v12p1` contain snapshots of search logic from different versions. To keep a continuous Git history, the latest version lives under `ee/lib/elastic/latest`, but its classes are aliased under an actual version (e.g. `ee/lib/elastic/v12p3`). When referencing these classes, never use the `Latest` namespace directly, but use the actual version (e.g. `V12p3`).
|
||||
|
||||
|
|
|
@ -7,7 +7,7 @@ type: howto
|
|||
This page offers a walkthrough of a common configuration
|
||||
for GitLab on AWS. You should customize it to accommodate your needs.
|
||||
|
||||
NOTE: **Note**
|
||||
NOTE: **Note:**
|
||||
For organizations with 1,000 users or less, the recommended AWS installation method is to launch an EC2 single box [Omnibus Installation](https://about.gitlab.com/install/) and implement a snapshot strategy for backing up the data. See the [1,000 user reference architecture](../../administration/reference_architectures/1k_users.md) for more.
|
||||
|
||||
## Introduction
|
||||
|
@ -739,7 +739,7 @@ To back up GitLab:
|
|||
sudo gitlab-backup create
|
||||
```
|
||||
|
||||
NOTE: **Note**
|
||||
NOTE: **Note:**
|
||||
For GitLab 12.1 and earlier, use `gitlab-rake gitlab:backup:create`.
|
||||
|
||||
### Restoring GitLab from a backup
|
||||
|
@ -760,7 +760,7 @@ released, you can update your GitLab instance:
|
|||
sudo gitlab-backup create
|
||||
```
|
||||
|
||||
NOTE: **Note**
|
||||
NOTE: **Note:**
|
||||
For GitLab 12.1 and earlier, use `gitlab-rake gitlab:backup:create`.
|
||||
|
||||
1. Update the repositories and install GitLab:
|
||||
|
|
|
@ -545,7 +545,7 @@ Here are some common pitfalls and how to overcome them:
|
|||
|
||||
If you see `"Kaminari::PaginatableArray"` you are using Elasticsearch.
|
||||
|
||||
NOTE: **Note**:
|
||||
NOTE: **Note:**
|
||||
The above instructions are used to verify that GitLab is using Elasticsearch only when indexing all namespaces. This is not to be used for scenarios that only index a [subset of namespaces](#limiting-namespaces-and-projects).
|
||||
|
||||
- **I updated GitLab and now I can't find anything**
|
||||
|
@ -568,7 +568,7 @@ Here are some common pitfalls and how to overcome them:
|
|||
pp s.search_objects.to_a
|
||||
```
|
||||
|
||||
NOTE: **Note**:
|
||||
NOTE: **Note:**
|
||||
The above instructions are not to be used for scenarios that only index a [subset of namespaces](#limiting-namespaces-and-projects).
|
||||
|
||||
See [Elasticsearch Index Scopes](#elasticsearch-index-scopes) for more information on searching for specific types of data.
|
||||
|
|
|
@ -16,7 +16,7 @@ A top-level GitLab group is one that does not have any parent group itself. All
|
|||
as well as projects of the top-level group's subgroups nesting down, are connected. Alternatively, you can specify
|
||||
a GitLab personal namespace in the Jira configuration, which will then connect the projects in that personal namespace to Jira.
|
||||
|
||||
NOTE: **Note**:
|
||||
NOTE: **Note:**
|
||||
Note this is different from the [existing Jira](../user/project/integrations/jira.md) project integration, where the mapping
|
||||
is one GitLab project to the entire Jira instance.
|
||||
|
||||
|
@ -55,7 +55,7 @@ There are no special requirements if you are using GitLab.com.
|
|||
replacing `<your-gitlab-instance-domain>` appropriately. So for example, if you are using GitLab.com,
|
||||
this would be `https://gitlab.com/login/oauth/callback`.
|
||||
|
||||
NOTE: **Note**:
|
||||
NOTE: **Note:**
|
||||
If using a GitLab version earlier than 11.3, the `Redirect URI` must be
|
||||
`https://<your-gitlab-instance-domain>/-/jira/login/oauth/callback`. If you want Jira
|
||||
to have access to all projects, GitLab recommends an administrator creates the
|
||||
|
@ -90,7 +90,7 @@ There are no special requirements if you are using GitLab.com.
|
|||
replacing `<your-gitlab-instance-domain>` appropriately. So for example, if you are using GitLab.com,
|
||||
this would be `https://gitlab.com/`.
|
||||
|
||||
NOTE: **Note**:
|
||||
NOTE: **Note:**
|
||||
If using a GitLab version earlier than 11.3 the `Host URL` value should be `https://<your-gitlab-instance-domain>/-/jira`
|
||||
|
||||
For the `Client ID` field, use the `Application ID` value from the previous section.
|
||||
|
|
|
@ -77,7 +77,7 @@ sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production SKIP=r
|
|||
If this fails you need to fix it before upgrading to 8.0. Also see
|
||||
<https://about.gitlab.com/get-help/>
|
||||
|
||||
NOTE: **Note**
|
||||
NOTE: **Note:**
|
||||
For GitLab 12.1 and earlier, use `gitlab-rake gitlab:backup:create`.
|
||||
|
||||
### 2. Check source and target database types
|
||||
|
|
|
@ -94,7 +94,7 @@ receivers:
|
|||
|
||||
In order for GitLab to associate your alerts with an [environment](../../ci/environments/index.md), you need to configure a `gitlab_environment_name` label on the alerts you set up in Prometheus. The value of this should match the name of your Environment in GitLab.
|
||||
|
||||
NOTE: **Note**
|
||||
NOTE: **Note:**
|
||||
In GitLab versions 13.1 and greater, you can configure your manually configured Prometheus server to use the [Generic alerts integration](../../user/project/integrations/generic_alerts.md).
|
||||
|
||||
## Taking action on incidents **(ULTIMATE)**
|
||||
|
|
|
@ -66,7 +66,7 @@ one major version. For example, it is safe to:
|
|||
- `9.5.5` -> `9.5.9`
|
||||
- `8.9.2` -> `8.9.6`
|
||||
|
||||
NOTE: **Note** Version specific changes in Omnibus GitLab Linux packages can be found in [the Omnibus GitLab documentation](https://docs.gitlab.com/omnibus/update/README.html#version-specific-changes).
|
||||
NOTE: **Note:** Version specific changes in Omnibus GitLab Linux packages can be found in [the Omnibus GitLab documentation](https://docs.gitlab.com/omnibus/update/README.html#version-specific-changes).
|
||||
|
||||
NOTE: **Note:**
|
||||
Instructions are available for downloading an Omnibus GitLab Linux package locally and [manually installing](https://docs.gitlab.com/omnibus/manual_install.html) it.
|
||||
|
|
|
@ -67,7 +67,7 @@ Use this command if you've installed GitLab with the Omnibus package:
|
|||
sudo gitlab-backup create
|
||||
```
|
||||
|
||||
NOTE: **Note**
|
||||
NOTE: **Note:**
|
||||
For GitLab 12.1 and earlier, use `gitlab-rake gitlab:backup:create`.
|
||||
|
||||
Use this if you've installed GitLab from source:
|
||||
|
@ -82,7 +82,7 @@ If you are running GitLab within a Docker container, you can run the backup from
|
|||
docker exec -t <container name> gitlab-backup create
|
||||
```
|
||||
|
||||
NOTE: **Note**
|
||||
NOTE: **Note:**
|
||||
For GitLab 12.1 and earlier, use `gitlab-rake gitlab:backup:create`.
|
||||
|
||||
If you are using the [GitLab Helm chart](https://gitlab.com/gitlab-org/charts/gitlab) on a
|
||||
|
@ -198,7 +198,7 @@ To use the `copy` strategy instead of the default streaming strategy, specify
|
|||
sudo gitlab-backup create STRATEGY=copy
|
||||
```
|
||||
|
||||
NOTE: **Note**
|
||||
NOTE: **Note:**
|
||||
For GitLab 12.1 and earlier, use `gitlab-rake gitlab:backup:create`.
|
||||
|
||||
#### Backup filename
|
||||
|
@ -213,7 +213,7 @@ By default a backup file is created according to the specification in [the Backu
|
|||
sudo gitlab-backup create BACKUP=dump
|
||||
```
|
||||
|
||||
NOTE: **Note**
|
||||
NOTE: **Note:**
|
||||
For GitLab 12.1 and earlier, use `gitlab-rake gitlab:backup:create`.
|
||||
|
||||
The resulting file will then be `dump_gitlab_backup.tar`. This is useful for systems that make use of rsync and incremental backups, and will result in considerably faster transfer speeds.
|
||||
|
@ -228,7 +228,7 @@ Note that the `--rsyncable` option in `gzip` is not guaranteed to be available o
|
|||
sudo gitlab-backup create BACKUP=dump GZIP_RSYNCABLE=yes
|
||||
```
|
||||
|
||||
NOTE: **Note**
|
||||
NOTE: **Note:**
|
||||
For GitLab 12.1 and earlier, use `gitlab-rake gitlab:backup:create`.
|
||||
|
||||
#### Excluding specific directories from the backup
|
||||
|
@ -256,7 +256,7 @@ For Omnibus GitLab packages:
|
|||
sudo gitlab-backup create SKIP=db,uploads
|
||||
```
|
||||
|
||||
NOTE: **Note**
|
||||
NOTE: **Note:**
|
||||
For GitLab 12.1 and earlier, use `gitlab-rake gitlab:backup:create`.
|
||||
|
||||
For installations from source:
|
||||
|
@ -497,7 +497,7 @@ sudo gitlab-backup create DIRECTORY=daily
|
|||
sudo gitlab-backup create DIRECTORY=weekly
|
||||
```
|
||||
|
||||
NOTE: **Note**
|
||||
NOTE: **Note:**
|
||||
For GitLab 12.1 and earlier, use `gitlab-rake gitlab:backup:create`.
|
||||
|
||||
#### Uploading to locally mounted shares
|
||||
|
@ -603,7 +603,7 @@ For Omnibus GitLab packages:
|
|||
0 2 * * * /opt/gitlab/bin/gitlab-backup create CRON=1
|
||||
```
|
||||
|
||||
NOTE: **Note**
|
||||
NOTE: **Note:**
|
||||
For GitLab 12.1 and earlier, use `gitlab-rake gitlab:backup:create`.
|
||||
|
||||
For installations from source:
|
||||
|
@ -804,7 +804,7 @@ restore:
|
|||
sudo gitlab-backup restore BACKUP=11493107454_2018_04_25_10.6.4-ce
|
||||
```
|
||||
|
||||
NOTE: **Note**
|
||||
NOTE: **Note:**
|
||||
For GitLab 12.1 and earlier, use `gitlab-rake gitlab:backup:restore`.
|
||||
|
||||
CAUTION: **Warning:**
|
||||
|
@ -826,7 +826,7 @@ If there is a GitLab version mismatch between your backup tar file and the insta
|
|||
version of GitLab, the restore command will abort with an error. Install the
|
||||
[correct GitLab version](https://packages.gitlab.com/gitlab/) and try again.
|
||||
|
||||
NOTE: **Note**
|
||||
NOTE: **Note:**
|
||||
There is currently a [known issue](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/3470) for restore not working
|
||||
with `pgbouncer`. In order to workaround the issue, the Rails node will need to bypass `pgbouncer` and connect
|
||||
directly to the primary database node. This can be done by setting `gitlab_rails['db_host']` and `gitlab_rails['port']`
|
||||
|
@ -852,7 +852,7 @@ For Docker installations, the restore task can be run from host:
|
|||
docker exec -it <name of container> gitlab-backup restore
|
||||
```
|
||||
|
||||
NOTE: **Note**
|
||||
NOTE: **Note:**
|
||||
For GitLab 12.1 and earlier, use `gitlab-rake gitlab:backup:restore`.
|
||||
|
||||
CAUTION: **Warning:**
|
||||
|
@ -881,7 +881,7 @@ export your project or group from there:
|
|||
1. After importing only the project(s) or group(s) that you wanted is complete,
|
||||
you may delete the new, temporary GitLab instance.
|
||||
|
||||
NOTE: **Note**
|
||||
NOTE: **Note:**
|
||||
A feature request to provide direct restore of individual projects or groups
|
||||
is being discussed in [issue #17517](https://gitlab.com/gitlab-org/gitlab/-/issues/17517).
|
||||
|
||||
|
|
|
@ -110,7 +110,7 @@ Auto DevOps provides great defaults for all the stages and makes use of [CI temp
|
|||
For an overview on the creation of Auto DevOps, read more
|
||||
[in this blog post](https://about.gitlab.com/blog/2017/06/29/whats-next-for-gitlab-ci/).
|
||||
|
||||
NOTE: **Note**
|
||||
NOTE: **Note:**
|
||||
Kubernetes clusters can [be used without](../../user/project/clusters/index.md)
|
||||
Auto DevOps.
|
||||
|
||||
|
|
|
@ -72,7 +72,7 @@ Heroku buildpacks, with the following caveats:
|
|||
- The `/bin/herokuish` command is not present in the resulting image, and prefixing
|
||||
commands with `/bin/herokuish procfile exec` is no longer required (nor possible).
|
||||
|
||||
NOTE: **Note**: Auto Test still uses Herokuish, as test suite detection is not
|
||||
NOTE: **Note:** Auto Test still uses Herokuish, as test suite detection is not
|
||||
yet part of the Cloud Native Buildpack specification. For more information, see
|
||||
[this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/212689).
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue