diff --git a/.haml-lint.yml b/.haml-lint.yml
index 39090a48d1ca51edf2c9eefd9809118e6b35160b..efbf14b2e224c2d55be00ed63342d77ff6000bf0 100644
--- a/.haml-lint.yml
+++ b/.haml-lint.yml
@@ -137,7 +137,6 @@ linters:
       - Style/ParenthesesAroundCondition
       - Style/RedundantParentheses
       - Style/SelfAssignment
-      - Style/Semicolon
       - Style/TernaryParentheses
       - Style/TrailingCommaInHashLiteral
       - Style/UnlessElse
diff --git a/app/assets/javascripts/design_management/components/design_notes/design_note.vue b/app/assets/javascripts/design_management/components/design_notes/design_note.vue
index 2b8672173279f0aa35bb705e21b88dc37f98e649..833d7081a2c45e6697a90427797d676e0d436605 100644
--- a/app/assets/javascripts/design_management/components/design_notes/design_note.vue
+++ b/app/assets/javascripts/design_management/components/design_notes/design_note.vue
@@ -1,6 +1,7 @@
 <script>
 import { GlTooltipDirective, GlIcon, GlLink, GlSafeHtmlDirective } from '@gitlab/ui';
 import { ApolloMutation } from 'vue-apollo';
+import { __ } from '~/locale';
 import TimelineEntryItem from '~/vue_shared/components/notes/timeline_entry_item.vue';
 import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
 import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
@@ -10,6 +11,9 @@ import { findNoteId, extractDesignNoteId } from '../../utils/design_management_u
 import DesignReplyForm from './design_reply_form.vue';
 
 export default {
+  i18n: {
+    editCommentLabel: __('Edit comment'),
+  },
   components: {
     UserAvatarLink,
     TimelineEntryItem,
@@ -113,7 +117,8 @@ export default {
           v-if="isEditButtonVisible"
           v-gl-tooltip
           type="button"
-          :title="__('Edit comment')"
+          :title="$options.i18n.editCommentLabel"
+          :aria-label="$options.i18n.editCommentLabel"
           class="note-action-button js-note-edit btn btn-transparent qa-note-edit-button"
           @click="isEditing = true"
         >
diff --git a/app/assets/javascripts/diffs/components/diff_discussions.vue b/app/assets/javascripts/diffs/components/diff_discussions.vue
index d0d457d858292b56d4652e9bf20a83fb3ef2e218..5e05ec87f84d1a1929a891c4e99dc4c8faf3af09 100644
--- a/app/assets/javascripts/diffs/components/diff_discussions.vue
+++ b/app/assets/javascripts/diffs/components/diff_discussions.vue
@@ -68,6 +68,7 @@ export default {
             }"
             type="button"
             class="js-diff-notes-toggle"
+            :aria-label="__('Show comments')"
             @click="toggleDiscussion({ discussionId: discussion.id })"
           >
             <gl-icon v-if="discussion.expanded" name="collapse" class="collapse-icon" />
diff --git a/app/assets/javascripts/diffs/components/image_diff_overlay.vue b/app/assets/javascripts/diffs/components/image_diff_overlay.vue
index 3d05202fb2d4706e8149effc3567152099b91888..5572338908fda497dae9fa5356b84f48a08a32e2 100644
--- a/app/assets/javascripts/diffs/components/image_diff_overlay.vue
+++ b/app/assets/javascripts/diffs/components/image_diff_overlay.vue
@@ -122,6 +122,7 @@ export default {
       :disabled="!shouldToggleDiscussion"
       class="js-image-badge"
       type="button"
+      :aria-label="__('Show comments')"
       @click="clickedToggle(discussion)"
     >
       <gl-icon v-if="showCommentIcon" name="image-comment-dark" :size="24" />
diff --git a/app/assets/javascripts/diffs/components/inline_diff_table_row.vue b/app/assets/javascripts/diffs/components/inline_diff_table_row.vue
index fd6c69e22c63010fcbc729333cb22dbe39c01fe1..25403b1547e72e3a4a638333d6e9d3646fa57e22 100644
--- a/app/assets/javascripts/diffs/components/inline_diff_table_row.vue
+++ b/app/assets/javascripts/diffs/components/inline_diff_table_row.vue
@@ -146,6 +146,7 @@ export default {
           type="button"
           class="add-diff-note note-button js-add-diff-note-button"
           :disabled="line.commentsDisabled"
+          :aria-label="addCommentTooltip"
           @click="handleCommentButton"
         >
           <gl-icon :size="12" name="comment" />
diff --git a/app/assets/javascripts/diffs/components/parallel_diff_table_row.vue b/app/assets/javascripts/diffs/components/parallel_diff_table_row.vue
index 147741fa2bbf973ee8cd3ba3715fc89f6a94f5d6..96946d0fd88398321a27d684d2f7032d8aec1ae2 100644
--- a/app/assets/javascripts/diffs/components/parallel_diff_table_row.vue
+++ b/app/assets/javascripts/diffs/components/parallel_diff_table_row.vue
@@ -195,6 +195,7 @@ export default {
             type="button"
             class="add-diff-note note-button js-add-diff-note-button qa-diff-comment"
             :disabled="line.left.commentsDisabled"
+            :aria-label="addCommentTooltipLeft"
             @click="handleCommentButton(line.left)"
           >
             <gl-icon :size="12" name="comment" />
@@ -252,6 +253,7 @@ export default {
             type="button"
             class="add-diff-note note-button js-add-diff-note-button qa-diff-comment"
             :disabled="line.right.commentsDisabled"
+            :aria-label="addCommentTooltipRight"
             @click="handleCommentButton(line.right)"
           >
             <gl-icon :size="12" name="comment" />
diff --git a/app/assets/javascripts/emoji/components/picker.vue b/app/assets/javascripts/emoji/components/picker.vue
index 156bbb28ce6e42db11924ab8b3f094cdb0e47f80..cbcc5dcff3abc2186b03b87cb9f19c90c5df9ec6 100644
--- a/app/assets/javascripts/emoji/components/picker.vue
+++ b/app/assets/javascripts/emoji/components/picker.vue
@@ -105,6 +105,7 @@ export default {
           }"
           type="button"
           class="gl-border-0 gl-border-b-2 gl-border-b-solid gl-flex-fill-1 gl-text-gray-300 gl-pt-3 gl-pb-3 gl-bg-transparent emoji-picker-category-tab"
+          :aria-label="category.name"
           @click="scrollToCategory(category.name)"
         >
           <gl-icon :name="category.icon" :size="12" />
diff --git a/app/assets/javascripts/error_tracking/components/error_tracking_actions.vue b/app/assets/javascripts/error_tracking/components/error_tracking_actions.vue
index db61957d452d9217a8c868fdc269e551dde48025..9438900c736f137b32e284928c00e06b288709de 100644
--- a/app/assets/javascripts/error_tracking/components/error_tracking_actions.vue
+++ b/app/assets/javascripts/error_tracking/components/error_tracking_actions.vue
@@ -51,6 +51,7 @@ export default {
         v-gl-tooltip.hover
         class="gl-display-block gl-mb-4 mb-md-0 gl-w-full"
         :title="ignoreBtn.title"
+        :aria-label="ignoreBtn.title"
         @click="$emit('update-issue-status', { errorId: error.id, status: ignoreBtn.status })"
       >
         <gl-icon class="gl-display-none d-md-inline gl-m-0" :name="ignoreBtn.icon" :size="12" />
@@ -62,6 +63,7 @@ export default {
         v-gl-tooltip.hover
         class="gl-display-block gl-mb-4 mb-md-0 gl-w-full"
         :title="resolveBtn.title"
+        :aria-label="resolveBtn.title"
         @click="$emit('update-issue-status', { errorId: error.id, status: resolveBtn.status })"
       >
         <gl-icon class="gl-display-none d-md-inline gl-m-0" :name="resolveBtn.icon" :size="12" />
diff --git a/app/assets/javascripts/ide/components/jobs/detail/scroll_button.vue b/app/assets/javascripts/ide/components/jobs/detail/scroll_button.vue
index f4859b9f3126b3553b369ad9887f3f75b80a8bed..6e1929a1948b331fe5be7134051f902c02ccf76a 100644
--- a/app/assets/javascripts/ide/components/jobs/detail/scroll_button.vue
+++ b/app/assets/javascripts/ide/components/jobs/detail/scroll_button.vue
@@ -55,6 +55,7 @@ export default {
       :disabled="disabled"
       class="btn-scroll btn-transparent btn-blank"
       type="button"
+      :aria-label="tooltipTitle"
       @click="clickedScroll"
     >
       <gl-icon :name="iconName" />
diff --git a/app/assets/javascripts/search/topbar/components/searchable_dropdown.vue b/app/assets/javascripts/search/topbar/components/searchable_dropdown.vue
index 5fb7217db74268c99c10c0af69d865e8d5e04141..d16850cd8899984d7992e50b77f7674d08a05077 100644
--- a/app/assets/javascripts/search/topbar/components/searchable_dropdown.vue
+++ b/app/assets/javascripts/search/topbar/components/searchable_dropdown.vue
@@ -9,10 +9,13 @@ import {
   GlSkeletonLoader,
   GlTooltipDirective,
 } from '@gitlab/ui';
-
+import { __ } from '~/locale';
 import { ANY_OPTION } from '../constants';
 
 export default {
+  i18n: {
+    clearLabel: __('Clear'),
+  },
   name: 'SearchableDropdown',
   components: {
     GlDropdown,
@@ -96,7 +99,8 @@ export default {
         v-gl-tooltip
         name="clear"
         category="tertiary"
-        :title="__('Clear')"
+        :title="$options.i18n.clearLabel"
+        :aria-label="$options.i18n.clearLabel"
         class="gl-p-0! gl-mr-2"
         @keydown.enter.stop="resetDropdown"
         @click.stop="resetDropdown"
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/deployment/deployment_action_button.vue b/app/assets/javascripts/vue_merge_request_widget/components/deployment/deployment_action_button.vue
index cc3efae565ac0aba1ae19ee2bc51d2a7d4985d41..b25c0cc0d965cd0b6a0fcdd4d65a389f72264e27 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/deployment/deployment_action_button.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/deployment/deployment_action_button.vue
@@ -68,6 +68,7 @@ export default {
       category="primary"
       size="small"
       :title="buttonTitle"
+      :aria-label="buttonTitle"
       :loading="isLoading"
       :disabled="isActionInProgress"
       :class="`inline gl-ml-2 ${containerClasses}`"
diff --git a/app/assets/javascripts/vue_shared/components/help_popover.vue b/app/assets/javascripts/vue_shared/components/help_popover.vue
index 7222bd82df08d93389cb1e69ba580386e5e4c25c..f36b9107a6e7bb03e814801e7a685601a823dc08 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 {
 </script>
 <template>
   <span>
-    <gl-button ref="popoverTrigger" variant="link" icon="question" tabindex="0" />
+    <gl-button ref="popoverTrigger" variant="link" icon="question" :aria-label="__('Help')" />
     <gl-popover :target="() => $refs.popoverTrigger.$el" v-bind="options">
       <template v-if="options.title" #title>
         <span v-safe-html="options.title"></span>
diff --git a/app/assets/javascripts/vue_shared/components/rich_content_editor/toolbar_item.vue b/app/assets/javascripts/vue_shared/components/rich_content_editor/toolbar_item.vue
index 4271f6053edbf13dce353ec5120e4f8066dbac70..85a67c087bbf29a12cbf8642c2d612520e2fcc87 100644
--- a/app/assets/javascripts/vue_shared/components/rich_content_editor/toolbar_item.vue
+++ b/app/assets/javascripts/vue_shared/components/rich_content_editor/toolbar_item.vue
@@ -21,7 +21,11 @@ export default {
 };
 </script>
 <template>
-  <button v-gl-tooltip="{ title: tooltip }" class="p-0 gl-display-flex toolbar-button">
+  <button
+    v-gl-tooltip="{ title: tooltip }"
+    :aria-label="tooltip"
+    class="p-0 gl-display-flex toolbar-button"
+  >
     <gl-icon class="gl-mx-auto gl-align-self-center" :name="icon" />
   </button>
 </template>
diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb
index 1e44321e148bcb966662cc690558ba2066d06ed4..478c7cd156ff5b5e3029c5fcfb47f22e10b67c95 100644
--- a/app/models/concerns/issuable.rb
+++ b/app/models/concerns/issuable.rb
@@ -137,14 +137,6 @@ def award_emojis_loaded?
     scope :references_project, -> { references(:project) }
     scope :non_archived, -> { join_project.where(projects: { archived: false }) }
 
-    scope :includes_for_bulk_update, -> do
-      associations = %i[author assignees epic group labels metrics project source_project target_project].select do |association|
-        reflect_on_association(association)
-      end
-
-      includes(*associations)
-    end
-
     attr_mentionable :title, pipeline: :single_line
     attr_mentionable :description
 
diff --git a/app/models/concerns/milestoneable.rb b/app/models/concerns/milestoneable.rb
index d42417bb6c17782cfb10271554fe45b475e8538f..ccb334343ff77d5b4c0b1db165a8feaf81ae2c46 100644
--- a/app/models/concerns/milestoneable.rb
+++ b/app/models/concerns/milestoneable.rb
@@ -39,13 +39,11 @@ module Milestoneable
     private
 
     def milestone_is_valid
-      errors.add(:milestone_id, 'is invalid') if respond_to?(:milestone_id) && !milestone_available?
+      errors.add(:milestone_id, 'is invalid') if respond_to?(:milestone_id) && milestone_id.present? && !milestone_available?
     end
   end
 
   def milestone_available?
-    return true if milestone_id.blank?
-
     project_id == milestone&.project_id || project.ancestors_upto.compact.include?(milestone&.group)
   end
 
diff --git a/app/services/issuable/bulk_update_service.rb b/app/services/issuable/bulk_update_service.rb
index 13e289716ef42004f491cce8234f940bd5a57b5e..d3d543edcd7ff5b0606e401be78471d9b37c12d2 100644
--- a/app/services/issuable/bulk_update_service.rb
+++ b/app/services/issuable/bulk_update_service.rb
@@ -15,7 +15,7 @@ def execute(type)
       set_update_params(type)
       items = update_issuables(type, ids)
 
-      response_success(payload: { count: items.size })
+      response_success(payload: { count: items.count })
     rescue ArgumentError => e
       response_error(e.message, 422)
     end
@@ -59,17 +59,10 @@ def update_issuables(type, ids)
 
     def find_issuables(parent, model_class, ids)
       if parent.is_a?(Project)
-        projects = parent
+        model_class.id_in(ids).of_projects(parent)
       elsif parent.is_a?(Group)
-        projects = parent.all_projects
-      else
-        return
+        model_class.id_in(ids).of_projects(parent.all_projects)
       end
-
-      model_class
-        .id_in(ids)
-        .of_projects(projects)
-        .includes_for_bulk_update
     end
 
     def response_success(message: nil, payload: nil)
diff --git a/app/views/layouts/_flash.html.haml b/app/views/layouts/_flash.html.haml
index 35fefe40d3990b247d8328905bcab87940f624a3..433337602f15459db3286cbe90ac80cdbac8de06 100644
--- a/app/views/layouts/_flash.html.haml
+++ b/app/views/layouts/_flash.html.haml
@@ -1,5 +1,5 @@
 -# We currently only support `alert`, `notice`, `success`, 'toast'
-- icons = {'alert' => 'error', 'notice' => 'information-o', 'success' => 'check-circle'};
+- icons = {'alert' => 'error', 'notice' => 'information-o', 'success' => 'check-circle'}
 .flash-container.flash-container-page.sticky{ data: { qa_selector: 'flash_container' } }
   - flash.each do |key, value|
     - if key == 'toast' && value
diff --git a/app/views/shared/blob/_markdown_buttons.html.haml b/app/views/shared/blob/_markdown_buttons.html.haml
index 085206714c64581b4b71df0b8ac123411e14f162..73f3d2a8fcd0efb97fb60130629dc6b317c97dc7 100644
--- a/app/views/shared/blob/_markdown_buttons.html.haml
+++ b/app/views/shared/blob/_markdown_buttons.html.haml
@@ -1,4 +1,4 @@
-- modifier_key = client_js_flags[:isMac] ? '⌘' : s_('KeyboardKey|Ctrl+');
+- modifier_key = client_js_flags[:isMac] ? '⌘' : s_('KeyboardKey|Ctrl+')
 
 .md-header-toolbar.active
   = markdown_toolbar_button({ icon: "bold",
diff --git a/changelogs/unreleased/21068-optimize-issueable-updates.yml b/changelogs/unreleased/21068-optimize-issueable-updates.yml
deleted file mode 100644
index 214fd3fe0abbeb6c7815c55d2b71045db36c948f..0000000000000000000000000000000000000000
--- a/changelogs/unreleased/21068-optimize-issueable-updates.yml
+++ /dev/null
@@ -1,5 +0,0 @@
----
-title: Optimize issuable updates
-merge_request: 58114
-author:
-type: performance
diff --git a/changelogs/unreleased/cngo-add-aria-labels-to-icon-only-buttons-3.yml b/changelogs/unreleased/cngo-add-aria-labels-to-icon-only-buttons-3.yml
new file mode 100644
index 0000000000000000000000000000000000000000..8e72b9c9d7cb96670d8c55b111e9dce7a08f734d
--- /dev/null
+++ b/changelogs/unreleased/cngo-add-aria-labels-to-icon-only-buttons-3.yml
@@ -0,0 +1,5 @@
+---
+title: Add aria labels to icon-only buttons
+merge_request: 59037
+author:
+type: fixed
diff --git a/doc/update/index.md b/doc/update/index.md
index 5b62e0642c8f20d07ecb1ea6e6591a23ab5c7f75..75bc1ef62f68b1a3bc5caf7b0ff902c69906b85b 100644
--- a/doc/update/index.md
+++ b/doc/update/index.md
@@ -177,7 +177,7 @@ Find where your version sits in the upgrade path below, and upgrade GitLab
 accordingly, while also consulting the
 [version-specific upgrade instructions](#version-specific-upgrading-instructions):
 
-`8.11.Z` -> `8.12.0` -> `8.17.7` -> `9.5.10` -> `10.8.7` -> `11.11.8` -> `12.0.12` -> `12.1.17` -> `12.10.14` -> `13.0.14` -> `13.1.11`  -> `13.5.4` - > [latest `13.Y.Z`](https://about.gitlab.com/releases/categories/releases/)
+`8.11.Z` -> `8.12.0` -> `8.17.7` -> `9.5.10` -> `10.8.7` -> `11.11.8` -> `12.0.12` -> `12.1.17` -> `12.10.14` -> `13.0.14` -> `13.1.11`  -> [latest `13.Y.Z`](https://about.gitlab.com/releases/categories/releases/)
 
 The following table, while not exhaustive, shows some examples of the supported
 upgrade paths.
diff --git a/ee/app/assets/javascripts/analytics/productivity_analytics/components/app.vue b/ee/app/assets/javascripts/analytics/productivity_analytics/components/app.vue
index 16d2fc4e888f4ba81e0ad2646550c4f390c7e2a5..7331e8685366e6f44b9406f9d8bdbeb6c001bcc9 100644
--- a/ee/app/assets/javascripts/analytics/productivity_analytics/components/app.vue
+++ b/ee/app/assets/javascripts/analytics/productivity_analytics/components/app.vue
@@ -326,7 +326,12 @@ export default {
                     </span>
                   </gl-dropdown-item>
                 </gl-dropdown>
-                <gl-button v-gl-tooltip.hover :title="sortTooltipTitle" @click="toggleSortOrder">
+                <gl-button
+                  v-gl-tooltip.hover
+                  :title="sortTooltipTitle"
+                  :aria-label="sortTooltipTitle"
+                  @click="toggleSortOrder"
+                >
                   <gl-icon :name="sortIcon" />
                 </gl-button>
               </div>
diff --git a/ee/app/assets/javascripts/dependencies/components/dependencies_actions.vue b/ee/app/assets/javascripts/dependencies/components/dependencies_actions.vue
index a90d4bf865f92a29e1e03b0e4eaf549fdaafbf74..ce05feeb87db9170f709b42e3de7f8128176915f 100644
--- a/ee/app/assets/javascripts/dependencies/components/dependencies_actions.vue
+++ b/ee/app/assets/javascripts/dependencies/components/dependencies_actions.vue
@@ -1,10 +1,14 @@
 <script>
 import { GlButton, GlDropdown, GlDropdownItem, GlIcon, GlTooltipDirective } from '@gitlab/ui';
 import { mapActions, mapState } from 'vuex';
+import { __ } from '~/locale';
 import { DEPENDENCY_LIST_TYPES } from '../store/constants';
 import { SORT_FIELDS, SORT_ORDER } from '../store/modules/list/constants';
 
 export default {
+  i18n: {
+    sortDirectionLabel: __('Sort direction'),
+  },
   name: 'DependenciesActions',
   components: {
     GlButton,
@@ -80,7 +84,8 @@ export default {
       </gl-dropdown>
       <gl-button
         v-gl-tooltip
-        :title="__('Sort direction')"
+        :title="$options.i18n.sortDirectionLabel"
+        :aria-label="$options.i18n.sortDirectionLabel"
         class="flex-grow-0 js-sort-order"
         @click="toggleSortOrder"
       >
diff --git a/ee/app/assets/javascripts/related_items_tree/components/tree_item.vue b/ee/app/assets/javascripts/related_items_tree/components/tree_item.vue
index ff9b19180e030604ffe03060575aeeafabc34e69..3d99267e1f80d8d0ad2d8727a403239b63284322 100644
--- a/ee/app/assets/javascripts/related_items_tree/components/tree_item.vue
+++ b/ee/app/assets/javascripts/related_items_tree/components/tree_item.vue
@@ -87,6 +87,7 @@ export default {
         v-if="!childrenFetchInProgress && hasChildren"
         v-gl-tooltip.viewport.hover
         :title="chevronTooltip"
+        :aria-label="chevronTooltip"
         :class="chevronType"
         variant="link"
         class="btn-svg btn-tree-item-chevron align-self-start"
diff --git a/ee/app/services/ee/issuable/bulk_update_service.rb b/ee/app/services/ee/issuable/bulk_update_service.rb
index a0c07f4c24f76bfbb6e539a0f0651ffe51876d09..1561f1ef5763fb24bc72c1a442cc957987261143 100644
--- a/ee/app/services/ee/issuable/bulk_update_service.rb
+++ b/ee/app/services/ee/issuable/bulk_update_service.rb
@@ -9,12 +9,9 @@ module BulkUpdateService
 
       override :find_issuables
       def find_issuables(parent, model_class, ids)
-        return super unless model_class == ::Epic
+        return model_class.id_in(ids).in_selected_groups(parent.self_and_descendants) if model_class == ::Epic
 
-        model_class
-          .id_in(ids)
-          .in_selected_groups(parent.self_and_descendants)
-          .includes_for_bulk_update
+        super
       end
 
       override :permitted_attrs
diff --git a/ee/spec/frontend/dependencies/components/__snapshots__/dependencies_actions_spec.js.snap b/ee/spec/frontend/dependencies/components/__snapshots__/dependencies_actions_spec.js.snap
index 12dfdb521618d22db1fa9bdc5a9ab352d4774643..b77e2f71babca8138f4b51bf8ea6763f6ec8ad86 100644
--- a/ee/spec/frontend/dependencies/components/__snapshots__/dependencies_actions_spec.js.snap
+++ b/ee/spec/frontend/dependencies/components/__snapshots__/dependencies_actions_spec.js.snap
@@ -83,6 +83,7 @@ exports[`DependenciesActions component matches the snapshot 1`] = `
     </gl-dropdown-stub>
      
     <gl-button-stub
+      aria-label="Sort direction"
       buttontextclasses=""
       category="primary"
       class="flex-grow-0 js-sort-order"
diff --git a/ee/spec/lib/gitlab/analytics/cycle_analytics/request_params_spec.rb b/ee/spec/lib/gitlab/analytics/cycle_analytics/request_params_spec.rb
index 4f3075e128713eeffa8ff39a273027ddd7efc1c1..4bbb1ab82835eb983ade5ed687551f4968e52d21 100644
--- a/ee/spec/lib/gitlab/analytics/cycle_analytics/request_params_spec.rb
+++ b/ee/spec/lib/gitlab/analytics/cycle_analytics/request_params_spec.rb
@@ -204,11 +204,13 @@ def json_project(project)
 
     subject { described_class.new(params).to_data_attributes }
 
-    it { expect(subject[:milestone]).to eq('title') }
-    it { expect(subject[:assignees]).to eq('["username1"]') }
-    it { expect(subject[:labels]).to eq('["label1","label2"]') }
-    it { expect(subject[:author]).to eq('author') }
-    it { expect(subject[:stage]).to eq('{"id":1,"title":"Stage #1"}') }
+    it "has the correct attributes" do
+      expect(subject[:milestone]).to eq('title')
+      expect(subject[:assignees]).to eq('["username1"]')
+      expect(subject[:labels]).to eq('["label1","label2"]')
+      expect(subject[:author]).to eq('author')
+      expect(subject[:stage]).to eq(%Q|{"id":#{stage.id},"title":"#{stage.name}"}|)
+    end
   end
 
   describe 'sorting params' do
diff --git a/ee/spec/models/concerns/ee/milestoneable_spec.rb b/ee/spec/models/concerns/ee/milestoneable_spec.rb
index d072051b99f8eb9b89bf0c3c5e10f3883999a317..48b69fbb26d82804dadb320dcb0444e4a6ac9aaa 100644
--- a/ee/spec/models/concerns/ee/milestoneable_spec.rb
+++ b/ee/spec/models/concerns/ee/milestoneable_spec.rb
@@ -4,11 +4,11 @@
 
 RSpec.describe EE::Milestoneable do
   describe '#milestone_available?' do
-    context 'for epics' do
-      let(:epic) { build(:epic) }
+    context 'no Epic' do
+      let(:issue) { create(:issue) }
 
-      it 'returns true' do
-        expect(epic.milestone_available?).to be(true)
+      it 'returns false' do
+        expect(issue.milestone_available?).to be_falsy
       end
     end
   end
@@ -21,7 +21,7 @@
       let(:epic) { build(:epic) }
 
       it 'returns false' do
-        expect(epic.supports_milestone?).to be(false)
+        expect(epic.supports_milestone?).to be_falsy
       end
     end
   end
diff --git a/spec/frontend/vue_shared/components/help_popover_spec.js b/spec/frontend/vue_shared/components/help_popover_spec.js
index cf5428ba4c3abd450e7691451db4815e7da50799..30c6fa040324e12ee92733401a7e97553676484f 100644
--- a/spec/frontend/vue_shared/components/help_popover_spec.js
+++ b/spec/frontend/vue_shared/components/help_popover_spec.js
@@ -34,7 +34,6 @@ describe('HelpPopover', () => {
       icon: 'question',
       variant: 'link',
     });
-    expect(findQuestionButton().attributes().tabindex).toBe('0');
   });
 
   it('renders popover that uses the question button as target', () => {
diff --git a/spec/models/concerns/issuable_spec.rb b/spec/models/concerns/issuable_spec.rb
index 14db9b530db6476abc4dbb77f852c718120d995b..1df70f387076948e022323de0aced28179a69608 100644
--- a/spec/models/concerns/issuable_spec.rb
+++ b/spec/models/concerns/issuable_spec.rb
@@ -65,23 +65,6 @@
     it { expect(issuable_class).to respond_to(:opened) }
     it { expect(issuable_class).to respond_to(:closed) }
     it { expect(issuable_class).to respond_to(:assigned) }
-
-    describe '.includes_for_bulk_update' do
-      before do
-        stub_const('Example', Class.new(ActiveRecord::Base))
-
-        Example.class_eval do
-          include Issuable # adds :labels and :metrics, among others
-
-          belongs_to :author
-          has_many :assignees
-        end
-      end
-
-      it 'includes available associations' do
-        expect(Example.includes_for_bulk_update.includes_values).to eq([:author, :assignees, :labels, :metrics])
-      end
-    end
   end
 
   describe 'author_name' do
diff --git a/spec/models/concerns/milestoneable_spec.rb b/spec/models/concerns/milestoneable_spec.rb
index 961eac4710d1661724bb5e0b37010dceb21359e4..5fb3b39f734546432d11cdc56a741b574c47b247 100644
--- a/spec/models/concerns/milestoneable_spec.rb
+++ b/spec/models/concerns/milestoneable_spec.rb
@@ -50,13 +50,13 @@ def build_milestoneable(milestone_id)
       it 'returns true with a milestone from the issue project' do
         milestone = create(:milestone, project: project)
 
-        expect(build_milestoneable(milestone.id).milestone_available?).to be(true)
+        expect(build_milestoneable(milestone.id).milestone_available?).to be_truthy
       end
 
       it 'returns true with a milestone from the issue project group' do
         milestone = create(:milestone, group: group)
 
-        expect(build_milestoneable(milestone.id).milestone_available?).to be(true)
+        expect(build_milestoneable(milestone.id).milestone_available?).to be_truthy
       end
 
       it 'returns true with a milestone from the the parent of the issue project group' do
@@ -64,23 +64,19 @@ def build_milestoneable(milestone_id)
         group.update!(parent: parent)
         milestone = create(:milestone, group: parent)
 
-        expect(build_milestoneable(milestone.id).milestone_available?).to be(true)
-      end
-
-      it 'returns true with a blank milestone' do
-        expect(build_milestoneable('').milestone_available?).to be(true)
+        expect(build_milestoneable(milestone.id).milestone_available?).to be_truthy
       end
 
       it 'returns false with a milestone from another project' do
         milestone = create(:milestone)
 
-        expect(build_milestoneable(milestone.id).milestone_available?).to be(false)
+        expect(build_milestoneable(milestone.id).milestone_available?).to be_falsey
       end
 
       it 'returns false with a milestone from another group' do
         milestone = create(:milestone, group: create(:group))
 
-        expect(build_milestoneable(milestone.id).milestone_available?).to be(false)
+        expect(build_milestoneable(milestone.id).milestone_available?).to be_falsey
       end
     end
   end