From 89245154567c6ea01821606f3127bef766462d5e Mon Sep 17 00:00:00 2001
From: GitLab Bot
Date: Wed, 30 Mar 2022 21:09:29 +0000
Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master
---
.gitlab/ci/frontend.gitlab-ci.yml | 8 +-
Gemfile.lock | 2 +-
.../javascripts/persistent_user_callouts.js | 1 +
.../admin_runners/admin_runners_app.vue | 24 +++-
.../javascripts/runner/admin_runners/index.js | 8 +-
.../runner/components/runner_bulk_delete.vue | 111 ++++++++++++++++
.../runner/components/runner_list.vue | 76 +++++++++--
.../list/checked_runner_ids.query.graphql | 3 +
.../runner/graphql/list/local_state.js | 63 ++++++++++
.../runner/graphql/list/typedefs.graphql | 3 +
app/assets/javascripts/runner/utils.js | 3 +-
.../security_configuration/components/app.vue | 8 +-
.../security_configuration/index.js | 2 +
.../vue_shared/components/help_popover.vue | 2 +-
app/controllers/admin/runners_controller.rb | 3 +
.../projects/security/configuration_helper.rb | 4 +
app/helpers/users/group_callouts_helper.rb | 2 +
app/models/users/group_callout.rb | 3 +-
app/presenters/issue_presenter.rb | 16 ++-
.../groups/group_members/index.html.haml | 2 +
app/views/groups/show.html.haml | 1 +
app/views/layouts/_page.html.haml | 1 +
app/views/projects/empty.html.haml | 1 +
app/views/projects/no_repo.html.haml | 2 +
.../projects/project_members/index.html.haml | 2 +
.../security/configuration/show.html.haml | 1 +
app/views/projects/show.html.haml | 1 +
.../development/admin_runners_bulk_delete.yml | 8 ++
data/removals/15_0/15-0-rerequest-review.yml | 16 +++
doc/.vale/gitlab/Wordy.yml | 1 +
doc/install/installation.md | 8 +-
.../img/incident_list_v13_5.png | Bin 43685 -> 0 bytes
doc/operations/metrics/dashboards/default.md | 2 +-
doc/operations/metrics/dashboards/develop.md | 2 +-
doc/operations/metrics/dashboards/index.md | 2 +-
.../metrics/dashboards/panel_types.md | 2 +-
doc/operations/metrics/dashboards/settings.md | 2 +-
.../dashboards/templating_variables.md | 2 +-
.../metrics/dashboards/variables.md | 2 +-
doc/operations/metrics/dashboards/yaml.md | 2 +-
doc/update/removals.md | 6 +
.../img/vsa_filter_bar_v13_12.png | Bin 36706 -> 0 bytes
.../img/vsa_overview_stage_v13_11.png | Bin 21148 -> 0 bytes
.../img/vsa_path_nav_v13_11.png | Bin 22421 -> 0 bytes
.../img/vsa_stage_table_v14_7.png | Bin 79595 -> 0 bytes
.../img/vsa_time_metrics_v13_12.png | Bin 18354 -> 0 bytes
doc/user/permissions.md | 2 +-
.../deploy_keys/img/deploy_keys_v13_0.png | Bin 27295 -> 0 bytes
.../prometheus_library/cloudwatch.md | 2 +-
.../prometheus_library/haproxy.md | 2 +-
.../integrations/prometheus_library/index.md | 2 +-
.../prometheus_library/kubernetes.md | 2 +-
.../integrations/prometheus_library/nginx.md | 2 +-
.../prometheus_library/nginx_ingress.md | 2 +-
.../prometheus_library/nginx_ingress_vts.md | 2 +-
.../project/merge_requests/reviews/index.md | 8 +-
locale/gitlab.pot | 41 ++++++
qa/qa/tools/test_resources_handler.rb | 7 +-
spec/factories/issues.rb | 5 +
spec/factories/work_items/work_item_types.rb | 5 +
.../grouped_codequality_reports_app_spec.js | 4 +-
.../admin_runners/admin_runners_app_spec.js | 64 ++++++++--
.../components/runner_bulk_delete_spec.js | 103 +++++++++++++++
.../runner/components/runner_list_spec.js | 31 ++++-
.../runner/graphql/local_state_spec.js | 72 +++++++++++
spec/frontend/runner/utils_spec.js | 4 +
.../components/app_spec.js | 6 +-
.../components/help_popover_spec.js | 2 +-
.../security/configuration_helper_spec.rb | 6 +
spec/presenters/issue_presenter_spec.rb | 61 +++++++--
spec/views/groups/show.html.haml_spec.rb | 118 ------------------
71 files changed, 769 insertions(+), 192 deletions(-)
create mode 100644 app/assets/javascripts/runner/components/runner_bulk_delete.vue
create mode 100644 app/assets/javascripts/runner/graphql/list/checked_runner_ids.query.graphql
create mode 100644 app/assets/javascripts/runner/graphql/list/local_state.js
create mode 100644 app/assets/javascripts/runner/graphql/list/typedefs.graphql
create mode 100644 config/feature_flags/development/admin_runners_bulk_delete.yml
create mode 100644 data/removals/15_0/15-0-rerequest-review.yml
delete mode 100644 doc/operations/incident_management/img/incident_list_v13_5.png
delete mode 100644 doc/user/group/value_stream_analytics/img/vsa_filter_bar_v13_12.png
delete mode 100644 doc/user/group/value_stream_analytics/img/vsa_overview_stage_v13_11.png
delete mode 100644 doc/user/group/value_stream_analytics/img/vsa_path_nav_v13_11.png
delete mode 100644 doc/user/group/value_stream_analytics/img/vsa_stage_table_v14_7.png
delete mode 100644 doc/user/group/value_stream_analytics/img/vsa_time_metrics_v13_12.png
delete mode 100644 doc/user/project/deploy_keys/img/deploy_keys_v13_0.png
create mode 100644 spec/frontend/runner/components/runner_bulk_delete_spec.js
create mode 100644 spec/frontend/runner/graphql/local_state_spec.js
delete mode 100644 spec/views/groups/show.html.haml_spec.rb
diff --git a/.gitlab/ci/frontend.gitlab-ci.yml b/.gitlab/ci/frontend.gitlab-ci.yml
index 5d4521b3f36..6e84d4f3914 100644
--- a/.gitlab/ci/frontend.gitlab-ci.yml
+++ b/.gitlab/ci/frontend.gitlab-ci.yml
@@ -293,14 +293,14 @@ coverage-frontend:
- *yarn-install
- run_timed_command "retry yarn run webpack-prod"
-qa-frontend-node:12:
- extends: .qa-frontend-node
- image: ${GITLAB_DEPENDENCY_PROXY}node:12
-
qa-frontend-node:14:
extends: .qa-frontend-node
image: ${GITLAB_DEPENDENCY_PROXY}node:14
+qa-frontend-node:16:
+ extends: .qa-frontend-node
+ image: ${GITLAB_DEPENDENCY_PROXY}node:16
+
qa-frontend-node:latest:
extends:
- .qa-frontend-node
diff --git a/Gemfile.lock b/Gemfile.lock
index c4b952d8216..7fc00cd0004 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1252,7 +1252,7 @@ GEM
actionpack (>= 4.0)
activesupport (>= 4.0)
sprockets (>= 3.0.0)
- sqlite3 (1.3.13)
+ sqlite3 (1.4.2)
ssh_data (1.2.0)
ssrf_filter (1.0.7)
stackprof (0.2.15)
diff --git a/app/assets/javascripts/persistent_user_callouts.js b/app/assets/javascripts/persistent_user_callouts.js
index f6de21ec0c5..dee832c01d5 100644
--- a/app/assets/javascripts/persistent_user_callouts.js
+++ b/app/assets/javascripts/persistent_user_callouts.js
@@ -12,6 +12,7 @@ const PERSISTENT_USER_CALLOUTS = [
'.js-security-newsletter-callout',
'.js-approaching-seats-count-threshold',
'.js-storage-enforcement-banner',
+ '.js-user-over-limit-free-plan-alert',
];
const initCallouts = () => {
diff --git a/app/assets/javascripts/runner/admin_runners/admin_runners_app.vue b/app/assets/javascripts/runner/admin_runners/admin_runners_app.vue
index 9abd45424e7..3853a7d8666 100644
--- a/app/assets/javascripts/runner/admin_runners/admin_runners_app.vue
+++ b/app/assets/javascripts/runner/admin_runners/admin_runners_app.vue
@@ -4,9 +4,11 @@ import { createAlert } from '~/flash';
import { updateHistory } from '~/lib/utils/url_utility';
import { formatNumber } from '~/locale';
import { fetchPolicies } from '~/lib/graphql';
+import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import RegistrationDropdown from '../components/registration/registration_dropdown.vue';
import RunnerFilteredSearchBar from '../components/runner_filtered_search_bar.vue';
+import RunnerBulkDelete from '../components/runner_bulk_delete.vue';
import RunnerList from '../components/runner_list.vue';
import RunnerName from '../components/runner_name.vue';
import RunnerStats from '../components/stat/runner_stats.vue';
@@ -53,6 +55,7 @@ export default {
GlLink,
RegistrationDropdown,
RunnerFilteredSearchBar,
+ RunnerBulkDelete,
RunnerList,
RunnerName,
RunnerStats,
@@ -60,6 +63,8 @@ export default {
RunnerTypeTabs,
RunnerActionsCell,
},
+ mixins: [glFeatureFlagMixin()],
+ inject: ['localMutations'],
props: {
registrationToken: {
type: String,
@@ -180,6 +185,11 @@ export default {
},
];
},
+ isBulkDeleteEnabled() {
+ // Feature flag: admin_runners_bulk_delete
+ // Rollout issue: https://gitlab.com/gitlab-org/gitlab/-/issues/353981
+ return this.glFeatures.adminRunnersBulkDelete;
+ },
},
watch: {
search: {
@@ -238,6 +248,12 @@ export default {
reportToSentry(error) {
captureException({ error, component: this.$options.name });
},
+ onChecked({ runner, isChecked }) {
+ this.localMutations.setRunnerChecked({
+ runner,
+ isChecked,
+ });
+ },
},
filteredSearchNamespace: ADMIN_FILTERED_SEARCH_NAMESPACE,
INSTANCE_TYPE,
@@ -286,7 +302,13 @@ export default {
{{ __('No runners found') }}
-
+
+
diff --git a/app/assets/javascripts/runner/admin_runners/index.js b/app/assets/javascripts/runner/admin_runners/index.js
index 3b8a8fe9cd1..2405bab7957 100644
--- a/app/assets/javascripts/runner/admin_runners/index.js
+++ b/app/assets/javascripts/runner/admin_runners/index.js
@@ -1,9 +1,10 @@
import { GlToast } from '@gitlab/ui';
import Vue from 'vue';
import VueApollo from 'vue-apollo';
-import createDefaultClient from '~/lib/graphql';
import { visitUrl } from '~/lib/utils/url_utility';
import { updateOutdatedUrl } from '~/runner/runner_search_utils';
+import createDefaultClient from '~/lib/graphql';
+import { createLocalState } from '../graphql/list/local_state';
import AdminRunnersApp from './admin_runners_app.vue';
Vue.use(GlToast);
@@ -27,8 +28,10 @@ export const initAdminRunners = (selector = '#js-admin-runners') => {
const { runnerInstallHelpPage, registrationToken } = el.dataset;
+ const { cacheConfig, typeDefs, localMutations } = createLocalState();
+
const apolloProvider = new VueApollo({
- defaultClient: createDefaultClient(),
+ defaultClient: createDefaultClient({}, { cacheConfig, typeDefs }),
});
return new Vue({
@@ -36,6 +39,7 @@ export const initAdminRunners = (selector = '#js-admin-runners') => {
apolloProvider,
provide: {
runnerInstallHelpPage,
+ localMutations,
},
render(h) {
return h(AdminRunnersApp, {
diff --git a/app/assets/javascripts/runner/components/runner_bulk_delete.vue b/app/assets/javascripts/runner/components/runner_bulk_delete.vue
new file mode 100644
index 00000000000..50791de0bda
--- /dev/null
+++ b/app/assets/javascripts/runner/components/runner_bulk_delete.vue
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+
+
+ {{ content }}
+
+
+
+
+ {{
+ s__('Runners|Clear selection')
+ }}
+ {{
+ s__('Runners|Delete selected')
+ }}
+
+
+
+
diff --git a/app/assets/javascripts/runner/components/runner_list.vue b/app/assets/javascripts/runner/components/runner_list.vue
index 819b6951e13..05cd1879d9d 100644
--- a/app/assets/javascripts/runner/components/runner_list.vue
+++ b/app/assets/javascripts/runner/components/runner_list.vue
@@ -4,11 +4,22 @@ import TooltipOnTruncate from '~/vue_shared/components/tooltip_on_truncate/toolt
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { __, s__ } from '~/locale';
import TimeAgo from '~/vue_shared/components/time_ago_tooltip.vue';
+import checkedRunnerIdsQuery from '../graphql/list/checked_runner_ids.query.graphql';
import { formatJobCount, tableField } from '../utils';
import RunnerSummaryCell from './cells/runner_summary_cell.vue';
import RunnerStatusCell from './cells/runner_status_cell.vue';
import RunnerTags from './runner_tags.vue';
+const defaultFields = [
+ tableField({ key: 'status', label: s__('Runners|Status') }),
+ tableField({ key: 'summary', label: s__('Runners|Runner'), thClasses: ['gl-lg-w-25p'] }),
+ tableField({ key: 'version', label: __('Version') }),
+ tableField({ key: 'jobCount', label: __('Jobs') }),
+ tableField({ key: 'tagList', label: __('Tags'), thClasses: ['gl-lg-w-25p'] }),
+ tableField({ key: 'contactedAt', label: __('Last contact') }),
+ tableField({ key: 'actions', label: '' }),
+];
+
export default {
components: {
GlTableLite,
@@ -22,7 +33,20 @@ export default {
directives: {
GlTooltip: GlTooltipDirective,
},
+ apollo: {
+ checkedRunnerIds: {
+ query: checkedRunnerIdsQuery,
+ skip() {
+ return !this.checkable;
+ },
+ },
+ },
props: {
+ checkable: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
loading: {
type: Boolean,
required: false,
@@ -33,6 +57,10 @@ export default {
required: true,
},
},
+ emits: ['checked'],
+ data() {
+ return { checkedRunnerIds: [] };
+ },
computed: {
tableClass() {
// does not provide a busy state, add
@@ -42,6 +70,18 @@ export default {
'gl-opacity-6': this.loading,
};
},
+ fields() {
+ if (this.checkable) {
+ const checkboxField = tableField({
+ key: 'checkbox',
+ label: s__('Runners|Checkbox'),
+ thClasses: ['gl-w-9'],
+ tdClass: ['gl-text-center'],
+ });
+ return [checkboxField, ...defaultFields];
+ }
+ return defaultFields;
+ },
},
methods: {
formatJobCount(jobCount) {
@@ -55,16 +95,16 @@ export default {
}
return {};
},
+ onCheckboxChange(runner, isChecked) {
+ this.$emit('checked', {
+ runner,
+ isChecked,
+ });
+ },
+ isChecked(runner) {
+ return this.checkedRunnerIds.includes(runner.id);
+ },
},
- fields: [
- tableField({ key: 'status', label: s__('Runners|Status') }),
- tableField({ key: 'summary', label: s__('Runners|Runner'), thClasses: ['gl-lg-w-25p'] }),
- tableField({ key: 'version', label: __('Version') }),
- tableField({ key: 'jobCount', label: __('Jobs') }),
- tableField({ key: 'tagList', label: __('Tags'), thClasses: ['gl-lg-w-25p'] }),
- tableField({ key: 'contactedAt', label: __('Last contact') }),
- tableField({ key: 'actions', label: '' }),
- ],
};
@@ -73,13 +113,29 @@ export default {
:aria-busy="loading"
:class="tableClass"
:items="runners"
- :fields="$options.fields"
+ :fields="fields"
:tbody-tr-attr="runnerTrAttr"
data-testid="runner-list"
stacked="md"
primary-key="id"
fixed
>
+
+
+
+
+
+
+
+
+
diff --git a/app/assets/javascripts/runner/graphql/list/checked_runner_ids.query.graphql b/app/assets/javascripts/runner/graphql/list/checked_runner_ids.query.graphql
new file mode 100644
index 00000000000..c01f1edb451
--- /dev/null
+++ b/app/assets/javascripts/runner/graphql/list/checked_runner_ids.query.graphql
@@ -0,0 +1,3 @@
+query getCheckedRunnerIds {
+ checkedRunnerIds @client
+}
diff --git a/app/assets/javascripts/runner/graphql/list/local_state.js b/app/assets/javascripts/runner/graphql/list/local_state.js
new file mode 100644
index 00000000000..e87bc72c86a
--- /dev/null
+++ b/app/assets/javascripts/runner/graphql/list/local_state.js
@@ -0,0 +1,63 @@
+import { makeVar } from '@apollo/client/core';
+import typeDefs from './typedefs.graphql';
+
+/**
+ * Local state for checkable runner items.
+ *
+ * Usage:
+ *
+ * ```
+ * import { createLocalState } from '~/runner/graphql/list/local_state';
+ *
+ * // initialize local state
+ * const { cacheConfig, typeDefs, localMutations } = createLocalState();
+ *
+ * // configure the client
+ * apolloClient = createApolloClient({}, { cacheConfig, typeDefs });
+ *
+ * // modify local state
+ * localMutations.setRunnerChecked( ... )
+ * ```
+ *
+ * Note: Currently only in use behind a feature flag:
+ * admin_runners_bulk_delete for the admin list, rollout issue:
+ * https://gitlab.com/gitlab-org/gitlab/-/issues/353981
+ *
+ * @returns {Object} An object to configure an Apollo client:
+ * contains cacheConfig, typeDefs, localMutations.
+ */
+export const createLocalState = () => {
+ const checkedRunnerIdsVar = makeVar({});
+
+ const cacheConfig = {
+ typePolicies: {
+ Query: {
+ fields: {
+ checkedRunnerIds() {
+ return Object.entries(checkedRunnerIdsVar())
+ .filter(([, isChecked]) => isChecked)
+ .map(([key]) => key);
+ },
+ },
+ },
+ },
+ };
+
+ const localMutations = {
+ setRunnerChecked({ runner, isChecked }) {
+ checkedRunnerIdsVar({
+ ...checkedRunnerIdsVar(),
+ [runner.id]: isChecked,
+ });
+ },
+ clearChecked() {
+ checkedRunnerIdsVar({});
+ },
+ };
+
+ return {
+ cacheConfig,
+ typeDefs,
+ localMutations,
+ };
+};
diff --git a/app/assets/javascripts/runner/graphql/list/typedefs.graphql b/app/assets/javascripts/runner/graphql/list/typedefs.graphql
new file mode 100644
index 00000000000..24e9e20cc8c
--- /dev/null
+++ b/app/assets/javascripts/runner/graphql/list/typedefs.graphql
@@ -0,0 +1,3 @@
+extend type Query {
+ checkedRunnerIds: [ID!]!
+}
diff --git a/app/assets/javascripts/runner/utils.js b/app/assets/javascripts/runner/utils.js
index 6e4c8c45e7b..1f7794720de 100644
--- a/app/assets/javascripts/runner/utils.js
+++ b/app/assets/javascripts/runner/utils.js
@@ -24,7 +24,7 @@ export const formatJobCount = (jobCount) => {
* @param {Object} options
* @returns Field object to add to GlTable fields
*/
-export const tableField = ({ key, label = '', thClasses = [] }) => {
+export const tableField = ({ key, label = '', thClasses = [], ...options }) => {
return {
key,
label,
@@ -32,6 +32,7 @@ export const tableField = ({ key, label = '', thClasses = [] }) => {
tdAttr: {
'data-testid': `td-${key}`,
},
+ ...options,
};
};
diff --git a/app/assets/javascripts/security_configuration/components/app.vue b/app/assets/javascripts/security_configuration/components/app.vue
index 3d4074fbb02..6892404322f 100644
--- a/app/assets/javascripts/security_configuration/components/app.vue
+++ b/app/assets/javascripts/security_configuration/components/app.vue
@@ -4,7 +4,6 @@ import { __, s__ } from '~/locale';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
import UserCalloutDismisser from '~/vue_shared/components/user_callout_dismisser.vue';
-import { helpPagePath } from '~/helpers/help_page_helper';
import AutoDevOpsAlert from './auto_dev_ops_alert.vue';
import AutoDevOpsEnabledAlert from './auto_dev_ops_enabled_alert.vue';
import { AUTO_DEVOPS_ENABLED_ALERT_DISMISSED_STORAGE_KEY } from './constants';
@@ -52,7 +51,7 @@ export default {
TrainingProviderList,
},
mixins: [glFeatureFlagsMixin()],
- inject: ['projectFullPath'],
+ inject: ['projectFullPath', 'vulnerabilityTrainingDocsPath'],
props: {
augmentedSecurityFeatures: {
type: Array,
@@ -127,9 +126,6 @@ export default {
},
},
autoDevopsEnabledAlertStorageKey: AUTO_DEVOPS_ENABLED_ALERT_DISMISSED_STORAGE_KEY,
- securityTraininDocLink: helpPagePath('user/application_security/vulnerabilities/index', {
- anchor: 'enable-security-training-for-vulnerabilities',
- }),
};
@@ -268,7 +264,7 @@ export default {
{{ $options.i18n.securityTrainingDescription }}
- {{
+ {{
$options.i18n.securityTrainingDoc
}}
diff --git a/app/assets/javascripts/security_configuration/index.js b/app/assets/javascripts/security_configuration/index.js
index 8416692dd27..65cf1ec27a3 100644
--- a/app/assets/javascripts/security_configuration/index.js
+++ b/app/assets/javascripts/security_configuration/index.js
@@ -25,6 +25,7 @@ export const initSecurityConfiguration = (el) => {
gitlabCiHistoryPath,
autoDevopsHelpPagePath,
autoDevopsPath,
+ vulnerabilityTrainingDocsPath,
} = el.dataset;
const { augmentedSecurityFeatures, augmentedComplianceFeatures } = augmentFeatures(
@@ -41,6 +42,7 @@ export const initSecurityConfiguration = (el) => {
upgradePath,
autoDevopsHelpPagePath,
autoDevopsPath,
+ vulnerabilityTrainingDocsPath,
},
render(createElement) {
return createElement(SecurityConfigurationApp, {
diff --git a/app/assets/javascripts/vue_shared/components/help_popover.vue b/app/assets/javascripts/vue_shared/components/help_popover.vue
index f3b871c91b6..1568337cd93 100644
--- a/app/assets/javascripts/vue_shared/components/help_popover.vue
+++ b/app/assets/javascripts/vue_shared/components/help_popover.vue
@@ -25,7 +25,7 @@ export default {
-
+
diff --git a/app/controllers/admin/runners_controller.rb b/app/controllers/admin/runners_controller.rb
index 2744be0150c..06880ace899 100644
--- a/app/controllers/admin/runners_controller.rb
+++ b/app/controllers/admin/runners_controller.rb
@@ -4,6 +4,9 @@ class Admin::RunnersController < Admin::ApplicationController
include RunnerSetupScripts
before_action :runner, except: [:index, :tag_list, :runner_setup_scripts]
+ before_action only: [:index] do
+ push_frontend_feature_flag(:admin_runners_bulk_delete, default_enabled: :yaml)
+ end
feature_category :runner
diff --git a/app/helpers/projects/security/configuration_helper.rb b/app/helpers/projects/security/configuration_helper.rb
index 8281b1f8522..efc77550c90 100644
--- a/app/helpers/projects/security/configuration_helper.rb
+++ b/app/helpers/projects/security/configuration_helper.rb
@@ -6,6 +6,10 @@ module Projects
def security_upgrade_path
"https://#{ApplicationHelper.promo_host}/pricing/"
end
+
+ def vulnerability_training_docs_path
+ help_page_path('user/application_security/vulnerabilities/index', anchor: 'enable-security-training-for-vulnerabilities')
+ end
end
end
end
diff --git a/app/helpers/users/group_callouts_helper.rb b/app/helpers/users/group_callouts_helper.rb
index 0aa4eb89499..9a9fce4d7e3 100644
--- a/app/helpers/users/group_callouts_helper.rb
+++ b/app/helpers/users/group_callouts_helper.rb
@@ -31,3 +31,5 @@ module Users
end
end
end
+
+Users::GroupCalloutsHelper.prepend_mod
diff --git a/app/models/users/group_callout.rb b/app/models/users/group_callout.rb
index 839be8d2a48..7c0a756733c 100644
--- a/app/models/users/group_callout.rb
+++ b/app/models/users/group_callout.rb
@@ -14,7 +14,8 @@ module Users
storage_enforcement_banner_first_enforcement_threshold: 3,
storage_enforcement_banner_second_enforcement_threshold: 4,
storage_enforcement_banner_third_enforcement_threshold: 5,
- storage_enforcement_banner_fourth_enforcement_threshold: 6
+ storage_enforcement_banner_fourth_enforcement_threshold: 6,
+ preview_user_over_limit_free_plan_alert: 7 # EE-only
}
validates :group, presence: true
diff --git a/app/presenters/issue_presenter.rb b/app/presenters/issue_presenter.rb
index 72fe14d224d..75f6d749acb 100644
--- a/app/presenters/issue_presenter.rb
+++ b/app/presenters/issue_presenter.rb
@@ -4,7 +4,9 @@ class IssuePresenter < Gitlab::View::Presenter::Delegated
presents ::Issue, as: :issue
def issue_path
- url_builder.build(issue, only_path: true)
+ return url_builder.build(issue, only_path: true) unless use_work_items_path?
+
+ project_work_items_path(issue.project, work_items_path: issue.id)
end
delegator_override :subscribed?
@@ -15,6 +17,18 @@ class IssuePresenter < Gitlab::View::Presenter::Delegated
def project_emails_disabled?
issue.project.emails_disabled?
end
+
+ def web_url
+ return super unless use_work_items_path?
+
+ project_work_items_url(issue.project, work_items_path: issue.id)
+ end
+
+ private
+
+ def use_work_items_path?
+ issue.issue_type == 'task' && issue.project.work_items_feature_flag_enabled?
+ end
end
IssuePresenter.prepend_mod_with('IssuePresenter')
diff --git a/app/views/groups/group_members/index.html.haml b/app/views/groups/group_members/index.html.haml
index 5c579cf6488..3e619096d4e 100644
--- a/app/views/groups/group_members/index.html.haml
+++ b/app/views/groups/group_members/index.html.haml
@@ -1,6 +1,8 @@
- add_page_specific_style 'page_bundles/members'
- page_title _('Group members')
+= render_if_exists 'shared/user_over_limit_free_plan_alert', source: @group
+
.row.gl-mt-3
.col-lg-12
.gl-display-flex.gl-flex-wrap
diff --git a/app/views/groups/show.html.haml b/app/views/groups/show.html.haml
index 0f91ecae3c9..65613efbf63 100644
--- a/app/views/groups/show.html.haml
+++ b/app/views/groups/show.html.haml
@@ -7,6 +7,7 @@
= render_if_exists 'shared/thanks_for_purchase_banner', plan_title: plan_title, quantity: params[:purchased_quantity].to_i
= render_if_exists 'shared/qrtly_reconciliation_alert', group: @group
+= render_if_exists 'shared/user_over_limit_free_plan_alert', source: @group
- if show_invite_banner?(@group)
= content_for :group_invite_members_banner do
diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml
index a656b61dc8f..3c4b612f33f 100644
--- a/app/views/layouts/_page.html.haml
+++ b/app/views/layouts/_page.html.haml
@@ -20,6 +20,7 @@
= dispensable_render_if_exists "shared/namespace_user_cap_reached_alert"
= dispensable_render_if_exists "shared/new_user_signups_cap_reached_alert"
= yield :page_level_alert
+ = yield :user_over_limit_free_plan_alert
= yield :group_invite_members_banner
- unless @hide_breadcrumbs
= render "layouts/nav/breadcrumbs"
diff --git a/app/views/projects/empty.html.haml b/app/views/projects/empty.html.haml
index 6a54eedf6c8..b2338fa6c55 100644
--- a/app/views/projects/empty.html.haml
+++ b/app/views/projects/empty.html.haml
@@ -3,6 +3,7 @@
- escaped_default_branch_name = default_branch_name.shellescape
- @skip_current_level_breadcrumb = true
+= render_if_exists 'shared/user_over_limit_free_plan_alert', source: @project
= render partial: 'flash_messages', locals: { project: @project }
= render "home_panel"
diff --git a/app/views/projects/no_repo.html.haml b/app/views/projects/no_repo.html.haml
index e3f46d601a3..1331ed24307 100644
--- a/app/views/projects/no_repo.html.haml
+++ b/app/views/projects/no_repo.html.haml
@@ -1,6 +1,8 @@
- page_title _('No repository')
- @skip_current_level_breadcrumb = true
+= render_if_exists 'shared/user_over_limit_free_plan_alert', source: @project
+
%h2.gl-display-flex
.gl-display-flex.gl-align-items-center.gl-justify-content-center
= sprite_icon('warning-solid', size: 24, css_class: 'gl-mr-2')
diff --git a/app/views/projects/project_members/index.html.haml b/app/views/projects/project_members/index.html.haml
index f97b9a2b02f..298c2074062 100644
--- a/app/views/projects/project_members/index.html.haml
+++ b/app/views/projects/project_members/index.html.haml
@@ -1,6 +1,8 @@
- add_page_specific_style 'page_bundles/members'
- page_title _("Members")
+= render_if_exists 'shared/user_over_limit_free_plan_alert', source: @project
+
.row.gl-mt-3
.col-lg-12
- if can_invite_members_for_project?(@project)
diff --git a/app/views/projects/security/configuration/show.html.haml b/app/views/projects/security/configuration/show.html.haml
index df14bd09a4d..4b82f74d035 100644
--- a/app/views/projects/security/configuration/show.html.haml
+++ b/app/views/projects/security/configuration/show.html.haml
@@ -3,5 +3,6 @@
- @content_class = "limit-container-width" unless fluid_layout
#js-security-configuration{ data: { **@configuration.to_html_data_attribute,
+ vulnerability_training_docs_path: vulnerability_training_docs_path,
upgrade_path: security_upgrade_path,
project_full_path: @project.full_path } }
diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml
index d840ea01b89..dad2822feb4 100644
--- a/app/views/projects/show.html.haml
+++ b/app/views/projects/show.html.haml
@@ -6,6 +6,7 @@
= content_for :meta_tags do
= auto_discovery_link_tag(:atom, project_path(@project, rss_url_options), title: "#{@project.name} activity")
+= render_if_exists 'shared/user_over_limit_free_plan_alert', source: @project
= render partial: 'flash_messages', locals: { project: @project }
= render "projects/last_push"
diff --git a/config/feature_flags/development/admin_runners_bulk_delete.yml b/config/feature_flags/development/admin_runners_bulk_delete.yml
new file mode 100644
index 00000000000..ff285855e96
--- /dev/null
+++ b/config/feature_flags/development/admin_runners_bulk_delete.yml
@@ -0,0 +1,8 @@
+---
+name: admin_runners_bulk_delete
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81894
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/353981
+milestone: '14.9'
+type: development
+group: group::runner
+default_enabled: false
diff --git a/data/removals/15_0/15-0-rerequest-review.yml b/data/removals/15_0/15-0-rerequest-review.yml
new file mode 100644
index 00000000000..e692df05670
--- /dev/null
+++ b/data/removals/15_0/15-0-rerequest-review.yml
@@ -0,0 +1,16 @@
+- name: "Request a new review" # the name of the feature being removed. Avoid the words `deprecation`, `deprecate`, `removal`, and `remove` in this field because these are implied.
+ announcement_milestone: "15.0" # The milestone when this feature was deprecated.
+ announcement_date: "2022-05-22" # The date of the milestone release when this feature was deprecated. This should almost always be the 22nd of a month (YYYY-MM-DD), unless you did an out of band blog post.
+ removal_milestone: "15.0" # The milestone when this feature is being removed.
+ removal_date: "2022-05-22" # This should almost always be the 22nd of a month (YYYY-MM-DD), the date of the milestone release when this feature will be removed.
+ breaking_change: false # Change to true if this removal is a breaking change.
+ reporter: phikai # GitLab username of the person reporting the removal
+ body: | # Do not modify this line, instead modify the lines below.
+ The ability to [request a new review](https://docs.gitlab.com/ee/user/project/merge_requests/reviews/#request-a-new-review) has been removed in GitLab 15.0. This feature is replaced with [requesting attention](https://docs.gitlab.com/ee/user/project/merge_requests/#request-attention-to-a-merge-request) to a merge request.
+# The following items are not published on the docs page, but may be used in the future.
+ stage: Create # (optional - may be required in the future) String value of the stage that the feature was created in. e.g., Growth
+ tiers: # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate]
+ issue_url: # (optional) This is a link to the deprecation issue in GitLab
+ documentation_url: https://docs.gitlab.com/ee/user/project/merge_requests/reviews/#request-a-new-review # (optional) This is a link to the current documentation page
+ image_url: # (optional) This is a link to a thumbnail image depicting the feature
+ video_url: # (optional) Use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg
diff --git a/doc/.vale/gitlab/Wordy.yml b/doc/.vale/gitlab/Wordy.yml
index 716fdc6c38d..7888d16dadb 100644
--- a/doc/.vale/gitlab/Wordy.yml
+++ b/doc/.vale/gitlab/Wordy.yml
@@ -14,3 +14,4 @@ swap:
needs? to: "Rewrite the sentence, or use 'must', instead of"
note that: "Be concise: rewrite the sentence to not use"
please: "Remove this word from the sentence: "
+ respectively: "Rewrite the sentence to be more precise, instead of using "
diff --git a/doc/install/installation.md b/doc/install/installation.md
index 733a0344d51..c03c600fe0b 100644
--- a/doc/install/installation.md
+++ b/doc/install/installation.md
@@ -51,7 +51,7 @@ If the highest number stable branch is unclear, check the [GitLab blog](https://
| [Ruby](#2-ruby) | `2.7` | From GitLab 13.6, Ruby 2.7 is required. Ruby 3.0 is not supported yet (see [the relevant epic](https://gitlab.com/groups/gitlab-org/-/epics/5149) for the current status). You must use the standard MRI implementation of Ruby. We love [JRuby](https://www.jruby.org/) and [Rubinius](https://github.com/rubinius/rubinius#the-rubinius-language-platform), but GitLab needs several Gems that have native extensions. |
| [Go](#3-go) | `1.16` | |
| [Git](#git) | `2.33.x` | From GitLab 14.4, Git 2.33.x and later is required. It's highly recommended that you use the [Git version provided by Gitaly](#git). |
-| [Node.js](#4-node) | `12.22.1` | GitLab uses [webpack](https://webpack.js.org/) to compile frontend assets. Node.js 14.x is recommended, as it's faster. You can check which version you're running with `node -v`. You need to update it to a newer version if needed. |
+| [Node.js](#4-node) | `14.15.0` | GitLab uses [webpack](https://webpack.js.org/) to compile frontend assets. Node.js 16.x is recommended, as it's faster. You can check which version you're running with `node -v`. You need to update it to a newer version if needed. |
## GitLab directory structure
@@ -263,7 +263,7 @@ GitLab requires the use of Node to compile JavaScript
assets, and Yarn to manage JavaScript dependencies. The current minimum
requirements for these are:
-- `node` >= v12.22.1. (We recommend node 14.x as it is faster)
+- `node` >= v14.15.0. (We recommend node 16.x as it is faster)
- `yarn` = v1.22.x (Yarn 2 is not supported yet)
In many distributions,
@@ -271,8 +271,8 @@ the versions provided by the official package repositories are out of date, so
we need to install through the following commands:
```shell
-# install node v14.x
-curl --location "https://deb.nodesource.com/setup_14.x" | sudo bash -
+# install node v16.x
+curl --location "https://deb.nodesource.com/setup_16.x" | sudo bash -
sudo apt-get install -y nodejs
npm install --global yarn
diff --git a/doc/operations/incident_management/img/incident_list_v13_5.png b/doc/operations/incident_management/img/incident_list_v13_5.png
deleted file mode 100644
index 88942a70e8899947df1cc87a1163b5ba8b8993b1..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 43685
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 Qr?WB0Z#*3!J
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
diff --git a/doc/operations/metrics/dashboards/default.md b/doc/operations/metrics/dashboards/default.md
index 3e14917209a..1b494a7385d 100644
--- a/doc/operations/metrics/dashboards/default.md
+++ b/doc/operations/metrics/dashboards/default.md
@@ -10,7 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING:
This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541)
-for use in GitLab 14.7, and is planned for removal in GitLab 15.0.
+for use in GitLab 14.7, and is planned for removal in GitLab 16.0.
GitLab provides some dashboards out-of-the-box for any project with
[Prometheus available](../../../user/project/integrations/prometheus.md). You can
diff --git a/doc/operations/metrics/dashboards/develop.md b/doc/operations/metrics/dashboards/develop.md
index fc7686c8f86..3525584aa15 100644
--- a/doc/operations/metrics/dashboards/develop.md
+++ b/doc/operations/metrics/dashboards/develop.md
@@ -10,7 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING:
This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541)
-for use in GitLab 14.7, and is planned for removal in GitLab 15.0.
+for use in GitLab 14.7, and is planned for removal in GitLab 16.0.
GitLab provides a template to make it easier for you to create templates for
[custom dashboards](index.md). Templates provide helpful guidance and
diff --git a/doc/operations/metrics/dashboards/index.md b/doc/operations/metrics/dashboards/index.md
index a8ca23b7002..3d444b5512b 100644
--- a/doc/operations/metrics/dashboards/index.md
+++ b/doc/operations/metrics/dashboards/index.md
@@ -11,7 +11,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING:
This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541)
-for use in GitLab 14.7, and is planned for removal in GitLab 15.0.
+for use in GitLab 14.7, and is planned for removal in GitLab 16.0.
By default, all projects include a [GitLab-defined Prometheus dashboard](default.md), which
includes a few key metrics, but you can also define your own custom dashboards.
diff --git a/doc/operations/metrics/dashboards/panel_types.md b/doc/operations/metrics/dashboards/panel_types.md
index 734b560bf13..999431c7104 100644
--- a/doc/operations/metrics/dashboards/panel_types.md
+++ b/doc/operations/metrics/dashboards/panel_types.md
@@ -10,7 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING:
This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541)
-for use in GitLab 14.7, and is planned for removal in GitLab 15.0.
+for use in GitLab 14.7, and is planned for removal in GitLab 16.0.
The below panel types are supported in monitoring dashboards.
diff --git a/doc/operations/metrics/dashboards/settings.md b/doc/operations/metrics/dashboards/settings.md
index 14da5cf4a04..ff268a5a4fe 100644
--- a/doc/operations/metrics/dashboards/settings.md
+++ b/doc/operations/metrics/dashboards/settings.md
@@ -10,7 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING:
This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541)
-for use in GitLab 14.7, and is planned for removal in GitLab 15.0.
+for use in GitLab 14.7, and is planned for removal in GitLab 16.0.
You can configure your [Monitoring dashboard](../index.md) to
display the time zone of your choice, and the links of your choice.
diff --git a/doc/operations/metrics/dashboards/templating_variables.md b/doc/operations/metrics/dashboards/templating_variables.md
index d751a96f379..0fc49668c43 100644
--- a/doc/operations/metrics/dashboards/templating_variables.md
+++ b/doc/operations/metrics/dashboards/templating_variables.md
@@ -11,7 +11,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING:
This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541)
-for use in GitLab 14.7, and is planned for removal in GitLab 15.0.
+for use in GitLab 14.7, and is planned for removal in GitLab 16.0.
Templating variables can be used to make your metrics dashboard more versatile.
diff --git a/doc/operations/metrics/dashboards/variables.md b/doc/operations/metrics/dashboards/variables.md
index 369bcd1ddeb..1b98fcabae6 100644
--- a/doc/operations/metrics/dashboards/variables.md
+++ b/doc/operations/metrics/dashboards/variables.md
@@ -10,7 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING:
This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541)
-for use in GitLab 14.7, and is planned for removal in GitLab 15.0.
+for use in GitLab 14.7, and is planned for removal in GitLab 16.0.
## Query variables
diff --git a/doc/operations/metrics/dashboards/yaml.md b/doc/operations/metrics/dashboards/yaml.md
index 81f1354d3c0..37f960498a4 100644
--- a/doc/operations/metrics/dashboards/yaml.md
+++ b/doc/operations/metrics/dashboards/yaml.md
@@ -10,7 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING:
This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541)
-for use in GitLab 14.7, and is planned for removal in GitLab 15.0.
+for use in GitLab 14.7, and is planned for removal in GitLab 16.0.
Dashboards have several components:
diff --git a/doc/update/removals.md b/doc/update/removals.md
index 7e2b4f84fa1..80f5006982e 100644
--- a/doc/update/removals.md
+++ b/doc/update/removals.md
@@ -28,6 +28,12 @@ For removal reviewers (Technical Writers only):
https://about.gitlab.com/handbook/marketing/blog/release-posts/#update-the-removals-doc
-->
+## 15.0
+
+### Request a new review
+
+The ability to [request a new review](https://docs.gitlab.com/ee/user/project/merge_requests/reviews/#request-a-new-review) has been removed in GitLab 15.0. This feature is replaced with [requesting attention](https://docs.gitlab.com/ee/user/project/merge_requests/#request-attention-to-a-merge-request) to a merge request.
+
## 14.9
### Integrated error tracking disabled by default
diff --git a/doc/user/group/value_stream_analytics/img/vsa_filter_bar_v13_12.png b/doc/user/group/value_stream_analytics/img/vsa_filter_bar_v13_12.png
deleted file mode 100644
index 834556df051820f31595ce04a07b1e4ed55698b7..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 36706
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