diff --git a/app/assets/javascripts/pages/groups/runners/index.js b/app/assets/javascripts/pages/groups/runners/index.js new file mode 100644 index 00000000000..ca1a6bdab75 --- /dev/null +++ b/app/assets/javascripts/pages/groups/runners/index.js @@ -0,0 +1,3 @@ +import { initGroupRunners } from '~/runner/group_runners'; + +initGroupRunners(); diff --git a/app/assets/javascripts/runner/group_runners/group_runners_app.vue b/app/assets/javascripts/runner/group_runners/group_runners_app.vue new file mode 100644 index 00000000000..92d881c43ea --- /dev/null +++ b/app/assets/javascripts/runner/group_runners/group_runners_app.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/assets/javascripts/runner/group_runners/index.js b/app/assets/javascripts/runner/group_runners/index.js new file mode 100644 index 00000000000..5a72b09de3a --- /dev/null +++ b/app/assets/javascripts/runner/group_runners/index.js @@ -0,0 +1,17 @@ +import Vue from 'vue'; +import GroupRunnersApp from './group_runners_app.vue'; + +export const initGroupRunners = (selector = '#js-group-runners') => { + const el = document.querySelector(selector); + + if (!el) { + return null; + } + + return new Vue({ + el, + render(h) { + return h(GroupRunnersApp); + }, + }); +}; diff --git a/app/assets/stylesheets/framework/files.scss b/app/assets/stylesheets/framework/files.scss index 465b1a80fa4..ab1fbf6d4ce 100644 --- a/app/assets/stylesheets/framework/files.scss +++ b/app/assets/stylesheets/framework/files.scss @@ -548,3 +548,18 @@ span.idiff { // will always be expanded to the maximum needed width. .blob-viewer[data-loading] .file-content.code .line:nth-of-type(1n+70):not(:last-of-type), .blob-viewer[data-loading] .file-content.code .file-line-num:nth-of-type(1n+70):not(:last-of-type) {display: none !important;} + +.blob-viewer[data-loading] .file-content.code .line:nth-of-type(69):not(:last-of-type), +.blob-viewer[data-loading] .file-content.code .file-line-num:nth-of-type(69):not(:last-of-type) { + &::after { + @include gl-display-block; + @include gl-font-weight-bold; + content: '\2026'; + } +} + +.blob-viewer[data-loading] .file-content.code .line:nth-of-type(69):not(:last-of-type) { + &::after { + @include gl-text-center; + } +} diff --git a/app/controllers/groups/runners_controller.rb b/app/controllers/groups/runners_controller.rb index 1cff658dd52..dbbfdd76fe8 100644 --- a/app/controllers/groups/runners_controller.rb +++ b/app/controllers/groups/runners_controller.rb @@ -1,14 +1,21 @@ # frozen_string_literal: true class Groups::RunnersController < Groups::ApplicationController - # Proper policies should be implemented per - # https://gitlab.com/gitlab-org/gitlab-foss/issues/45894 + # TODO Proper policies, such as `read_group_runners, should be implemented per + # https://gitlab.com/gitlab-org/gitlab/-/issues/334802 before_action :authorize_admin_group! - + before_action :runner_list_group_view_vue_ui_enabled, only: [:index] before_action :runner, only: [:edit, :update, :destroy, :pause, :resume, :show] feature_category :runner + def index + end + + def runner_list_group_view_vue_ui_enabled + return render_404 unless Feature.enabled?(:runner_list_group_view_vue_ui, group, default_enabled: :yaml) + end + def show end diff --git a/app/helpers/groups_helper.rb b/app/helpers/groups_helper.rb index 956d767e9b8..34d1e951980 100644 --- a/app/helpers/groups_helper.rb +++ b/app/helpers/groups_helper.rb @@ -237,6 +237,12 @@ module GroupsHelper can?(current_user, "read_group_#{resource}".to_sym, @group) end + # TODO Proper policies, such as `read_group_runners, should be implemented per + # See https://gitlab.com/gitlab-org/gitlab/-/issues/334802 + if can?(current_user, :admin_group, @group) && Feature.enabled?(:runner_list_group_view_vue_ui, @group, default_enabled: :yaml) + links << :runners + end + if can?(current_user, :read_cluster, @group) links << :kubernetes end diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb index aa7d4969077..b9901c2f729 100644 --- a/app/models/ci/build.rb +++ b/app/models/ci/build.rb @@ -39,7 +39,6 @@ module Ci has_one :pending_state, class_name: 'Ci::BuildPendingState', inverse_of: :build has_one :queuing_entry, class_name: 'Ci::PendingBuild', foreign_key: :build_id has_one :runtime_metadata, class_name: 'Ci::RunningBuild', foreign_key: :build_id - has_many :trace_sections, class_name: 'Ci::BuildTraceSection' has_many :trace_chunks, class_name: 'Ci::BuildTraceChunk', foreign_key: :build_id, inverse_of: :build has_many :report_results, class_name: 'Ci::BuildReportResult', inverse_of: :build @@ -644,12 +643,6 @@ module Ci update(coverage: coverage) if coverage.present? end - # rubocop: disable CodeReuse/ServiceClass - def parse_trace_sections! - ExtractSectionsFromBuildTraceService.new(project, user).execute(self) - end - # rubocop: enable CodeReuse/ServiceClass - def trace Gitlab::Ci::Trace.new(self) end diff --git a/app/models/ci/build_trace_section.rb b/app/models/ci/build_trace_section.rb deleted file mode 100644 index 036f611a61c..00000000000 --- a/app/models/ci/build_trace_section.rb +++ /dev/null @@ -1,17 +0,0 @@ -# frozen_string_literal: true - -module Ci - class BuildTraceSection < ApplicationRecord - extend SuppressCompositePrimaryKeyWarning - extend Gitlab::Ci::Model - include IgnorableColumns - - belongs_to :build, class_name: 'Ci::Build' - belongs_to :project - belongs_to :section_name, class_name: 'Ci::BuildTraceSectionName' - - validates :section_name, :build, :project, presence: true, allow_blank: false - - ignore_column :build_id_convert_to_bigint, remove_with: '14.2', remove_after: '2021-08-22' - end -end diff --git a/app/models/ci/build_trace_section_name.rb b/app/models/ci/build_trace_section_name.rb deleted file mode 100644 index c065cfea14e..00000000000 --- a/app/models/ci/build_trace_section_name.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -module Ci - class BuildTraceSectionName < ApplicationRecord - extend Gitlab::Ci::Model - - belongs_to :project - has_many :trace_sections, class_name: 'Ci::BuildTraceSection', foreign_key: :section_name_id - - validates :name, :project, presence: true, allow_blank: false - validates :name, uniqueness: { scope: :project_id } - end -end diff --git a/app/models/issuable_severity.rb b/app/models/issuable_severity.rb index 35d03a544bd..928301e1da6 100644 --- a/app/models/issuable_severity.rb +++ b/app/models/issuable_severity.rb @@ -10,6 +10,14 @@ class IssuableSeverity < ApplicationRecord critical: 'Critical - S1' }.freeze + SEVERITY_QUICK_ACTION_PARAMS = { + unknown: %w(Unknown 0), + low: %w(Low S4 4), + medium: %w(Medium S3 3), + high: %w(High S2 2), + critical: %w(Critical S1 1) + }.freeze + belongs_to :issue validates :issue, presence: true, uniqueness: true diff --git a/app/models/project.rb b/app/models/project.rb index 6a90ae9038a..7032cd3a32c 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -317,7 +317,6 @@ class Project < ApplicationRecord # still using `dependent: :destroy` here. has_many :builds, class_name: 'Ci::Build', inverse_of: :project, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent has_many :processables, class_name: 'Ci::Processable', inverse_of: :project - has_many :build_trace_section_names, class_name: 'Ci::BuildTraceSectionName' has_many :build_trace_chunks, class_name: 'Ci::BuildTraceChunk', through: :builds, source: :trace_chunks has_many :build_report_results, class_name: 'Ci::BuildReportResult', inverse_of: :project has_many :job_artifacts, class_name: 'Ci::JobArtifact' diff --git a/app/policies/group_policy.rb b/app/policies/group_policy.rb index 0b0edc7c452..7e07cd12ede 100644 --- a/app/policies/group_policy.rb +++ b/app/policies/group_policy.rb @@ -117,6 +117,7 @@ class GroupPolicy < BasePolicy enable :delete_metrics_dashboard_annotation enable :update_metrics_dashboard_annotation enable :create_custom_emoji + enable :create_package enable :create_package_settings end @@ -134,6 +135,7 @@ class GroupPolicy < BasePolicy end rule { maintainer }.policy do + enable :destroy_package enable :create_projects enable :admin_pipeline enable :admin_build diff --git a/app/services/ci/extract_sections_from_build_trace_service.rb b/app/services/ci/extract_sections_from_build_trace_service.rb deleted file mode 100644 index c756e376901..00000000000 --- a/app/services/ci/extract_sections_from_build_trace_service.rb +++ /dev/null @@ -1,34 +0,0 @@ -# frozen_string_literal: true - -module Ci - class ExtractSectionsFromBuildTraceService < BaseService - def execute(build) - return false unless build.trace_sections.empty? - - Gitlab::Database.bulk_insert(BuildTraceSection.table_name, extract_sections(build)) # rubocop:disable Gitlab/BulkInsert - true - end - - private - - # rubocop: disable CodeReuse/ActiveRecord - def find_or_create_name(name) - project.build_trace_section_names.find_or_create_by!(name: name) - rescue ActiveRecord::RecordInvalid - project.build_trace_section_names.find_by!(name: name) - end - # rubocop: enable CodeReuse/ActiveRecord - - def extract_sections(build) - build.trace.extract_sections.map do |attr| - name = attr.delete(:name) - name_record = find_or_create_name(name) - - attr.merge( - build_id: build.id, - project_id: project.id, - section_name_id: name_record.id) - end - end - end -end diff --git a/app/views/groups/runners/index.html.haml b/app/views/groups/runners/index.html.haml new file mode 100644 index 00000000000..08be0f93d82 --- /dev/null +++ b/app/views/groups/runners/index.html.haml @@ -0,0 +1,6 @@ +- page_title s_('Runners|Runners') + +%h2.page-title + = s_('Runners|Group Runners') + +#js-group-runners diff --git a/app/views/layouts/nav/sidebar/_group_menus.html.haml b/app/views/layouts/nav/sidebar/_group_menus.html.haml index ef98c11cafe..8e5e2322e55 100644 --- a/app/views/layouts/nav/sidebar/_group_menus.html.haml +++ b/app/views/layouts/nav/sidebar/_group_menus.html.haml @@ -56,6 +56,23 @@ = render_if_exists "layouts/nav/ee/push_rules_link" # EE-specific +- if group_sidebar_link?(:runners) + = nav_link(path: 'groups/runners#index') do + = link_to group_runners_path(@group), title: _('CI/CD'), class: 'has-sub-items' do + .nav-icon-container + = sprite_icon('rocket') + %span.nav-item-name + = _('CI/CD') + %ul.sidebar-sub-level-items + = nav_link(path: 'groups/runners#index', html_options: { class: "fly-out-top-item" } ) do + = link_to group_runners_path(@group), title: _('CI/CD') do + %strong.fly-out-top-item-name + = _('CI/CD') + %li.divider.fly-out-top-item + = nav_link(path: 'groups/runners#index') do + = link_to group_runners_path(@group), title: s_('Runners|Runners') do + %span= s_('Runners|Runners') + - if group_sidebar_link?(:kubernetes) = nav_link(controller: [:clusters]) do = link_to group_clusters_path(@group) do @@ -109,7 +126,7 @@ %span = _('Repository') - = nav_link(controller: [:ci_cd, 'groups/runners']) do + = nav_link(path: ['groups/runners#show', 'groups/runners#edit'], controller: [:ci_cd]) do = link_to group_settings_ci_cd_path(@group), title: _('CI/CD') do %span = _('CI/CD') diff --git a/app/workers/ci/build_finished_worker.rb b/app/workers/ci/build_finished_worker.rb index 15412d2eed5..3bca3015988 100644 --- a/app/workers/ci/build_finished_worker.rb +++ b/app/workers/ci/build_finished_worker.rb @@ -33,7 +33,6 @@ module Ci # @param [Ci::Build] build The build to process. def process_build(build) # We execute these in sync to reduce IO. - build.parse_trace_sections! build.update_coverage Ci::BuildReportResultService.new.execute(build) diff --git a/config/feature_flags/development/debian_group_packages.yml b/config/feature_flags/development/debian_group_packages.yml new file mode 100644 index 00000000000..bc0c2eaf8eb --- /dev/null +++ b/config/feature_flags/development/debian_group_packages.yml @@ -0,0 +1,8 @@ +--- +name: debian_group_packages +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/66188 +rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/336536 +milestone: '14.1' +type: development +group: group::package +default_enabled: false diff --git a/config/feature_flags/development/runner_list_group_view_vue_ui.yml b/config/feature_flags/development/runner_list_group_view_vue_ui.yml new file mode 100644 index 00000000000..3bda540ba5b --- /dev/null +++ b/config/feature_flags/development/runner_list_group_view_vue_ui.yml @@ -0,0 +1,8 @@ +--- +name: runner_list_group_view_vue_ui +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/66376 +rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/336405 +milestone: '14.2' +type: development +group: group::runner +default_enabled: false diff --git a/config/metrics/counts_28d/20210721042227_i_quickactions_severity_monthly.yml b/config/metrics/counts_28d/20210721042227_i_quickactions_severity_monthly.yml new file mode 100644 index 00000000000..a56e3c080bd --- /dev/null +++ b/config/metrics/counts_28d/20210721042227_i_quickactions_severity_monthly.yml @@ -0,0 +1,21 @@ +--- +key_path: redis_hll_counters.quickactions.i_quickactions_severity_monthly +description: Count of MAU using the `/severity` quick action +product_section: ops +product_stage: monitor +product_group: group::monitor +product_category: incident_management +value_type: number +status: implemented +milestone: "14.2" +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/66422 +time_frame: 28d +data_source: redis_hll +data_category: Optional +distribution: +- ce +- ee +tier: +- free +- premium +- ultimate diff --git a/config/metrics/counts_7d/20210721042223_i_quickactions_severity_weekly.yml b/config/metrics/counts_7d/20210721042223_i_quickactions_severity_weekly.yml new file mode 100644 index 00000000000..ccf8b50ee02 --- /dev/null +++ b/config/metrics/counts_7d/20210721042223_i_quickactions_severity_weekly.yml @@ -0,0 +1,21 @@ +--- +key_path: redis_hll_counters.quickactions.i_quickactions_severity_weekly +description: Count of WAU using the `/severity` quick action +product_section: ops +product_stage: monitor +product_group: group::monitor +product_category: incident_management +value_type: number +status: implemented +milestone: "14.2" +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/66422 +time_frame: 7d +data_source: redis_hll +data_category: Optional +distribution: +- ce +- ee +tier: +- free +- premium +- ultimate diff --git a/doc/api/packages/debian.md b/doc/api/packages/debian.md index cd97bd609df..797955ea600 100644 --- a/doc/api/packages/debian.md +++ b/doc/api/packages/debian.md @@ -4,7 +4,11 @@ group: Package info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments --- -# Debian API +# Debian API **(FREE SELF)** + +> - Debian API [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/42670) in GitLab 13.5. +> - Debian group API [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/66188) in GitLab 14.2. +> - [Deployed behind a feature flag](../../user/feature_flags.md), disabled by default. This is the API documentation for [Debian](../../user/packages/debian_repository/index.md). @@ -24,8 +28,10 @@ for details on which headers and token types are supported. ## Enable the Debian API -The Debian API for GitLab is behind a feature flag that is disabled by default. GitLab -administrators with access to the GitLab Rails console can enable this API for your instance. +Debian repository support is still a work in progress. It's gated behind a feature flag that's +**disabled by default**. +[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md) +can opt to enable it. To enable it: @@ -39,6 +45,13 @@ To disable it: Feature.disable(:debian_packages) ``` +## Enable the Debian group API + +The Debian group API is behind a feature flag that is disabled by default. +[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md) +can opt to enable it. To enable it, follow the instructions in +[Enable the Debian group API](../../user/packages/debian_repository/index.md#enable-the-debian-group-api). + ## Upload a package file > [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/62028) in GitLab 14.0. diff --git a/doc/api/packages/debian_group_distributions.md b/doc/api/packages/debian_group_distributions.md index ba61bf49e01..c5d2effcf44 100644 --- a/doc/api/packages/debian_group_distributions.md +++ b/doc/api/packages/debian_group_distributions.md @@ -4,30 +4,27 @@ group: Package info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments --- -# Debian group distributions API **(FREE)** +# Debian group distributions API **(FREE SELF)** -> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/5835) in GitLab 14.0. +> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/66188) in GitLab 14.2. +> - [Deployed behind a feature flag](../../user/feature_flags.md), disabled by default. -See the [Debian package registry documentation](../../user/packages/debian_repository/index.md) -for more information about working with Debian packages. +This is the reference documentation for the Debian group distributions API. This API is behind a +feature flag that is disabled by default. To use this API, you must [enable it](#enable-the-debian-group-api). -## Enable Debian repository feature +WARNING: +This API is under development and is not meant for production use. -Debian repository support is gated behind a feature flag that is **disabled by default**. +For more information about working with Debian packages, see the +[Debian package registry documentation](../../user/packages/debian_repository/index.md). + +## Enable the Debian group API + +Debian group repository support is still a work in progress. It's gated behind a feature flag that's +**disabled by default**. [GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md) -can opt to enable it. - -To enable it: - -```ruby -Feature.enable(:debian_packages) -``` - -To disable it: - -```ruby -Feature.disable(:debian_packages) -``` +can opt to enable it. To enable it, follow the instructions in +[Enable the Debian group API](../../user/packages/debian_repository/index.md#enable-the-debian-group-api). ## List all Debian distributions in a group diff --git a/doc/api/packages/debian_project_distributions.md b/doc/api/packages/debian_project_distributions.md index aad5558dcba..16079d1c5ab 100644 --- a/doc/api/packages/debian_project_distributions.md +++ b/doc/api/packages/debian_project_distributions.md @@ -4,16 +4,24 @@ group: Package info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments --- -# Debian project distributions API **(FREE)** +# Debian project distributions API **(FREE SELF)** -> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/5835) in GitLab 14.0. +> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/42670) in GitLab 13.5. +> - [Deployed behind a feature flag](../../user/feature_flags.md), disabled by default. -See the [Debian package registry documentation](../../user/packages/debian_repository/index.md) -for more information about working with Debian packages. +This is the reference documentation for the Debian project distributions API. This API is behind a +feature flag that is disabled by default. To use this API, you must [enable the Debian API](#enable-the-debian-api). -## Enable Debian repository feature +WARNING: +This API is under development and is not meant for production use. -Debian repository support is gated behind a feature flag that is **disabled by default**. +For more information about working with Debian packages, see the +[Debian package registry documentation](../../user/packages/debian_repository/index.md). + +## Enable the Debian API + +Debian repository support is still a work in progress. It's gated behind a feature flag that's +**disabled by default**. [GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md) can opt to enable it. diff --git a/doc/development/usage_ping/dictionary.md b/doc/development/usage_ping/dictionary.md index ee86648cda4..6229f308671 100644 --- a/doc/development/usage_ping/dictionary.md +++ b/doc/development/usage_ping/dictionary.md @@ -16666,6 +16666,34 @@ Status: `data_available` Tiers: `free`, `premium`, `ultimate` +### `redis_hll_counters.quickactions.i_quickactions_severity_monthly` + +Count of MAU using the `/severity` quick action + +[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210721042227_i_quickactions_severity_monthly.yml) + +Group: `group::monitor` + +Data Category: `Optional` + +Status: `implemented` + +Tiers: `free`, `premium`, `ultimate` + +### `redis_hll_counters.quickactions.i_quickactions_severity_weekly` + +Count of WAU using the `/severity` quick action + +[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210721042223_i_quickactions_severity_weekly.yml) + +Group: `group::monitor` + +Data Category: `Optional` + +Status: `implemented` + +Tiers: `free`, `premium`, `ultimate` + ### `redis_hll_counters.quickactions.i_quickactions_shrug_monthly` Count of MAU using the `/shrug` quick action diff --git a/doc/user/packages/debian_repository/index.md b/doc/user/packages/debian_repository/index.md index 59213ccb1a0..9c731d76c4e 100644 --- a/doc/user/packages/debian_repository/index.md +++ b/doc/user/packages/debian_repository/index.md @@ -6,7 +6,9 @@ info: To determine the technical writer assigned to the Stage/Group associated w # Debian packages in the Package Registry **(FREE)** -> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/5835) in GitLab 14.1. +> - Debian API [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/42670) in GitLab 13.5. +> - Debian group API [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/66188) in GitLab 14.2. +> - [Deployed behind a feature flag](../../feature_flags.md), disabled by default. WARNING: The Debian package registry for GitLab is under development and isn't ready for production use due to @@ -20,7 +22,7 @@ Project and Group packages are supported. For documentation of the specific API endpoints that Debian package manager clients use, see the [Debian API documentation](../../../api/packages/debian.md). -## Enable Debian repository feature +## Enable the Debian API **(FREE SELF)** Debian repository support is still a work in progress. It's gated behind a feature flag that's **disabled by default**. @@ -39,6 +41,22 @@ To disable it: Feature.disable(:debian_packages) ``` +## Enable the Debian group API **(FREE SELF)** + +The Debian group repository is also behind a second feature flag that is disabled by default. + +To enable it: + +```ruby +Feature.enable(:debian_group_packages) +``` + +To disable it: + +```ruby +Feature.disable(:debian_group_packages) +``` + ## Build a Debian package Creating a Debian package is documented [on the Debian Wiki](https://wiki.debian.org/Packaging). diff --git a/doc/user/project/quick_actions.md b/doc/user/project/quick_actions.md index d8d464ce6d8..f68dc9562ea 100644 --- a/doc/user/project/quick_actions.md +++ b/doc/user/project/quick_actions.md @@ -94,6 +94,7 @@ threads. Some quick actions might not be available to all subscription tiers. | `/remove_time_spent` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Remove time spent. | | `/remove_zoom` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Remove Zoom meeting from this issue ([introduced in GitLab 12.4](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/16609)). | | `/reopen` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Reopen. | +| `/severity` | **{check-circle}** Yes | **{check-circle}** No | **{check-circle}** No | Set the severity. ([introduced in GitLab 14.2](https://gitlab.com/gitlab-org/gitlab/-/issues/334045)) | | `/shrug ` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Append the comment with `¯\_(ツ)_/¯`. | | `/spend