diff --git a/app/workers/admin_email_worker.rb b/app/workers/admin_email_worker.rb
index c2dc955b27c1eedb4612807ab52db79cd7fa7d98..bec0a003a1c3179d65c516585709c8091daad2d6 100644
--- a/app/workers/admin_email_worker.rb
+++ b/app/workers/admin_email_worker.rb
@@ -1,5 +1,5 @@
 class AdminEmailWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include CronjobQueue
 
   def perform
diff --git a/app/workers/authorized_projects_worker.rb b/app/workers/authorized_projects_worker.rb
index 55d8d0c69d161cc5937f4fa073bcf5b5557fcdd3..d4f334ec3b893a6e4fc50ef4db0bce5373b47d56 100644
--- a/app/workers/authorized_projects_worker.rb
+++ b/app/workers/authorized_projects_worker.rb
@@ -1,6 +1,5 @@
 class AuthorizedProjectsWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
 
   # Schedules multiple jobs and waits for them to be completed.
   def self.bulk_perform_and_wait(args_list)
diff --git a/app/workers/background_migration_worker.rb b/app/workers/background_migration_worker.rb
index 45ce49bb5c0b9432d52e4b7fe0ca0383accbe9d2..65791c4eaba5494aa28053a256329f9a5734eec9 100644
--- a/app/workers/background_migration_worker.rb
+++ b/app/workers/background_migration_worker.rb
@@ -1,6 +1,5 @@
 class BackgroundMigrationWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
 
   # Enqueues a number of jobs in bulk.
   #
diff --git a/app/workers/build_coverage_worker.rb b/app/workers/build_coverage_worker.rb
index cd4af85d047175e3c289c2ecd7784f91511ad4ab..62b212c79be56dc71da3a3946e5a48cf7d226e1e 100644
--- a/app/workers/build_coverage_worker.rb
+++ b/app/workers/build_coverage_worker.rb
@@ -1,5 +1,5 @@
 class BuildCoverageWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include PipelineQueue
 
   def perform(build_id)
diff --git a/app/workers/build_finished_worker.rb b/app/workers/build_finished_worker.rb
index c77fe074c7319606752c98a65d253f5b52700e64..0fc7a1635c88b20672a133d2c869b7f41643315e 100644
--- a/app/workers/build_finished_worker.rb
+++ b/app/workers/build_finished_worker.rb
@@ -1,5 +1,5 @@
 class BuildFinishedWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include PipelineQueue
 
   enqueue_in group: :processing
diff --git a/app/workers/build_hooks_worker.rb b/app/workers/build_hooks_worker.rb
index dedaf2835e61085dda243bfab959550fa4234b2d..6705a1c2709a025a0cb7699449fcf1434f9c8650 100644
--- a/app/workers/build_hooks_worker.rb
+++ b/app/workers/build_hooks_worker.rb
@@ -1,5 +1,5 @@
 class BuildHooksWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include PipelineQueue
 
   enqueue_in group: :hooks
diff --git a/app/workers/build_queue_worker.rb b/app/workers/build_queue_worker.rb
index e5ceb9ef71518c302a27f808b9b232fb610071ed..fc775a84dc09d85bc5f0fbe569d874a078a26c52 100644
--- a/app/workers/build_queue_worker.rb
+++ b/app/workers/build_queue_worker.rb
@@ -1,5 +1,5 @@
 class BuildQueueWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include PipelineQueue
 
   enqueue_in group: :processing
diff --git a/app/workers/build_success_worker.rb b/app/workers/build_success_worker.rb
index 20ec24bd18ab09439510dc3eb290917250a23293..ec049821ad7ae3a3f2930acf75ffa6f49297d2d2 100644
--- a/app/workers/build_success_worker.rb
+++ b/app/workers/build_success_worker.rb
@@ -1,5 +1,5 @@
 class BuildSuccessWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include PipelineQueue
 
   enqueue_in group: :processing
diff --git a/app/workers/build_trace_sections_worker.rb b/app/workers/build_trace_sections_worker.rb
index 8c57e8f767b022c517475d277a566f81dd173a52..c0f5c144e10f6881573cd5cb8a63a4fa0a5ef7db 100644
--- a/app/workers/build_trace_sections_worker.rb
+++ b/app/workers/build_trace_sections_worker.rb
@@ -1,5 +1,5 @@
 class BuildTraceSectionsWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include PipelineQueue
 
   def perform(build_id)
diff --git a/app/workers/cluster_install_app_worker.rb b/app/workers/cluster_install_app_worker.rb
index 899aed904e4c5cde3b22f4bbee3e52044bc08717..f771cb4939f9fd500a1432f572c9003e68541eb1 100644
--- a/app/workers/cluster_install_app_worker.rb
+++ b/app/workers/cluster_install_app_worker.rb
@@ -1,5 +1,5 @@
 class ClusterInstallAppWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include ClusterQueue
   include ClusterApplications
 
diff --git a/app/workers/cluster_provision_worker.rb b/app/workers/cluster_provision_worker.rb
index b01f97084246712fb43a7be0f69b41b395ab5b1f..1ab4de3b6479b6c82077acfc1f03e9d3ad8211ef 100644
--- a/app/workers/cluster_provision_worker.rb
+++ b/app/workers/cluster_provision_worker.rb
@@ -1,5 +1,5 @@
 class ClusterProvisionWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include ClusterQueue
 
   def perform(cluster_id)
diff --git a/app/workers/cluster_wait_for_app_installation_worker.rb b/app/workers/cluster_wait_for_app_installation_worker.rb
index 4bb8c293e5d61c4f9585c37058f58849b01a43de..d564d5e48bf7abeb1788cdd9fa19ef0234857324 100644
--- a/app/workers/cluster_wait_for_app_installation_worker.rb
+++ b/app/workers/cluster_wait_for_app_installation_worker.rb
@@ -1,5 +1,5 @@
 class ClusterWaitForAppInstallationWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include ClusterQueue
   include ClusterApplications
 
diff --git a/app/workers/concerns/application_worker.rb b/app/workers/concerns/application_worker.rb
new file mode 100644
index 0000000000000000000000000000000000000000..bf1ecaa0c6d22ea071f269033e9f9e183a392577
--- /dev/null
+++ b/app/workers/concerns/application_worker.rb
@@ -0,0 +1,25 @@
+Sidekiq::Worker.extend ActiveSupport::Concern
+
+module ApplicationWorker
+  extend ActiveSupport::Concern
+
+  include Sidekiq::Worker
+
+  included do
+    sidekiq_options queue: base_queue_name
+  end
+
+  module ClassMethods
+    def base_queue_name
+      name
+        .sub(/\AGitlab::/, '')
+        .sub(/Worker\z/, '')
+        .underscore
+        .tr('/', '_')
+    end
+
+    def queue
+      get_sidekiq_options['queue'].to_s
+    end
+  end
+end
diff --git a/app/workers/concerns/dedicated_sidekiq_queue.rb b/app/workers/concerns/dedicated_sidekiq_queue.rb
deleted file mode 100644
index 132bae6022b4c1da9bb22ba986ab139049c5d00a..0000000000000000000000000000000000000000
--- a/app/workers/concerns/dedicated_sidekiq_queue.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# Concern that sets the queue of a Sidekiq worker based on the worker's class
-# name/namespace.
-module DedicatedSidekiqQueue
-  extend ActiveSupport::Concern
-
-  included do
-    sidekiq_options queue: name.sub(/Worker\z/, '').underscore.tr('/', '_')
-  end
-end
diff --git a/app/workers/concerns/gitlab/github_import/object_importer.rb b/app/workers/concerns/gitlab/github_import/object_importer.rb
index 67e36c811de9c459327c3c83f96dc63b65c13149..9a9fbaad653c78a030ed8de29cef2ec3575636cd 100644
--- a/app/workers/concerns/gitlab/github_import/object_importer.rb
+++ b/app/workers/concerns/gitlab/github_import/object_importer.rb
@@ -8,7 +8,7 @@ module ObjectImporter
       extend ActiveSupport::Concern
 
       included do
-        include Sidekiq::Worker
+        include ApplicationWorker
         include GithubImport::Queue
         include ReschedulingMethods
         include NotifyUponDeath
diff --git a/app/workers/create_gpg_signature_worker.rb b/app/workers/create_gpg_signature_worker.rb
index 9b5ff17aafa300ca352185efd7f5fca9caa1cd54..f371731f68c95180e2ca547a6a0855a3ee2e19fd 100644
--- a/app/workers/create_gpg_signature_worker.rb
+++ b/app/workers/create_gpg_signature_worker.rb
@@ -1,6 +1,5 @@
 class CreateGpgSignatureWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
 
   def perform(commit_sha, project_id)
     project = Project.find_by(id: project_id)
diff --git a/app/workers/create_pipeline_worker.rb b/app/workers/create_pipeline_worker.rb
index 865ad1ba420a9c98298048ebd150946e72a4659a..00cd7b85b9f48b382ca12b7383763bb4c04a6485 100644
--- a/app/workers/create_pipeline_worker.rb
+++ b/app/workers/create_pipeline_worker.rb
@@ -1,5 +1,5 @@
 class CreatePipelineWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include PipelineQueue
 
   enqueue_in group: :creation
diff --git a/app/workers/delete_merged_branches_worker.rb b/app/workers/delete_merged_branches_worker.rb
index f870da4ecfdd43aee646777e5676d0a6fb3d2e53..07cd1f02fb59bb10923212daeebc55236e9fc60d 100644
--- a/app/workers/delete_merged_branches_worker.rb
+++ b/app/workers/delete_merged_branches_worker.rb
@@ -1,6 +1,5 @@
 class DeleteMergedBranchesWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
 
   def perform(project_id, user_id)
     begin
diff --git a/app/workers/delete_user_worker.rb b/app/workers/delete_user_worker.rb
index 3340a7be4fe2678e0de9b4bb03fe0fde2b35522b..6c431b02979dffcce4cc5e147a16c28557c06a0c 100644
--- a/app/workers/delete_user_worker.rb
+++ b/app/workers/delete_user_worker.rb
@@ -1,6 +1,5 @@
 class DeleteUserWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
 
   def perform(current_user_id, delete_user_id, options = {})
     delete_user  = User.find(delete_user_id)
diff --git a/app/workers/email_receiver_worker.rb b/app/workers/email_receiver_worker.rb
index 1afa24c8e2afbcab7c26cc2ec5b5947203b97953..fff7cf9d26ce29b953e332b3c8f1a3f17093e7e5 100644
--- a/app/workers/email_receiver_worker.rb
+++ b/app/workers/email_receiver_worker.rb
@@ -1,6 +1,5 @@
 class EmailReceiverWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
 
   def perform(raw)
     return unless Gitlab::IncomingEmail.enabled?
diff --git a/app/workers/emails_on_push_worker.rb b/app/workers/emails_on_push_worker.rb
index f5ccc84c160c8585158fbce902c279ed2c1472c9..21da27973fece784113d1021747cd5ac689f9e16 100644
--- a/app/workers/emails_on_push_worker.rb
+++ b/app/workers/emails_on_push_worker.rb
@@ -1,6 +1,5 @@
 class EmailsOnPushWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
 
   attr_reader :email, :skip_premailer
 
diff --git a/app/workers/expire_build_artifacts_worker.rb b/app/workers/expire_build_artifacts_worker.rb
index a27585fd3897aa1fe9fb9ce9885bfc77b77e4d99..73ab42110801193e022f6e2eebab5aff412fb36a 100644
--- a/app/workers/expire_build_artifacts_worker.rb
+++ b/app/workers/expire_build_artifacts_worker.rb
@@ -1,5 +1,5 @@
 class ExpireBuildArtifactsWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include CronjobQueue
 
   def perform
diff --git a/app/workers/expire_build_instance_artifacts_worker.rb b/app/workers/expire_build_instance_artifacts_worker.rb
index 7b59e976492246def1c45e7ccfef35f237cacf53..234b4357cf7fe2d5486ca126ac694992c0acaa67 100644
--- a/app/workers/expire_build_instance_artifacts_worker.rb
+++ b/app/workers/expire_build_instance_artifacts_worker.rb
@@ -1,6 +1,5 @@
 class ExpireBuildInstanceArtifactsWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
 
   def perform(build_id)
     build = Ci::Build
diff --git a/app/workers/expire_job_cache_worker.rb b/app/workers/expire_job_cache_worker.rb
index 98a7500bffe33d062a61f2caf1d7961ba7d62920..a591e2da5195835b72da3bd87a6f4c73d40da859 100644
--- a/app/workers/expire_job_cache_worker.rb
+++ b/app/workers/expire_job_cache_worker.rb
@@ -1,5 +1,5 @@
 class ExpireJobCacheWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include PipelineQueue
 
   enqueue_in group: :cache
diff --git a/app/workers/expire_pipeline_cache_worker.rb b/app/workers/expire_pipeline_cache_worker.rb
index 93b67497ba6846bd37be9607f66db9fe195fc521..211a05f120ca38ae1079a1bc703dc7db6662aceb 100644
--- a/app/workers/expire_pipeline_cache_worker.rb
+++ b/app/workers/expire_pipeline_cache_worker.rb
@@ -1,5 +1,5 @@
 class ExpirePipelineCacheWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include PipelineQueue
 
   enqueue_in group: :cache
diff --git a/app/workers/geo/base_scheduler_worker.rb b/app/workers/geo/base_scheduler_worker.rb
index 3f16e529691e10d05254ed58cc37064981b813e9..f21d71dc4dc96d963e17921f1cd3ef1d88ecc90b 100644
--- a/app/workers/geo/base_scheduler_worker.rb
+++ b/app/workers/geo/base_scheduler_worker.rb
@@ -1,6 +1,6 @@
 module Geo
   class BaseSchedulerWorker
-    include Sidekiq::Worker
+    include ApplicationWorker
     include CronjobQueue
     include ExclusiveLeaseGuard
 
diff --git a/app/workers/geo/file_download_worker.rb b/app/workers/geo/file_download_worker.rb
index 2a6a61a21da34378fe428cba3412d8d1d1a8bdfa..a4c77eb2e25dea14ebc6ec169484353070ebcf5e 100644
--- a/app/workers/geo/file_download_worker.rb
+++ b/app/workers/geo/file_download_worker.rb
@@ -1,7 +1,8 @@
 module Geo
   class FileDownloadWorker
-    include Sidekiq::Worker
-    sidekiq_options queue: :geo_file_download, retry: 3, dead: false
+    include ApplicationWorker
+
+    sidekiq_options retry: 3, dead: false
 
     def perform(object_type, object_id)
       Geo::FileDownloadService.new(object_type.to_sym, object_id).execute
diff --git a/app/workers/geo/file_removal_worker.rb b/app/workers/geo/file_removal_worker.rb
index 978a4abc91c556f485538c02e5808408344c368f..96dd438fc8b0b50978f6097ca344412a627b26b9 100644
--- a/app/workers/geo/file_removal_worker.rb
+++ b/app/workers/geo/file_removal_worker.rb
@@ -1,9 +1,8 @@
 module Geo
   class FileRemovalWorker
-    include Sidekiq::Worker
+    include ApplicationWorker
     include Gitlab::Geo::LogHelpers
-
-    sidekiq_options queue: :geo
+    include GeoQueue
 
     def perform(file_path)
       remove_file!(file_path)
diff --git a/app/workers/geo/hashed_storage_attachments_migration_worker.rb b/app/workers/geo/hashed_storage_attachments_migration_worker.rb
index 0afc1ef4a34ce49d6c26ddf3743955817031385b..a082a6d71177e34bdc9a78ac0b9ef489b494da9a 100644
--- a/app/workers/geo/hashed_storage_attachments_migration_worker.rb
+++ b/app/workers/geo/hashed_storage_attachments_migration_worker.rb
@@ -1,6 +1,6 @@
 module Geo
   class HashedStorageAttachmentsMigrationWorker
-    include Sidekiq::Worker
+    include ApplicationWorker
     include GeoQueue
 
     def perform(project_id, old_attachments_path, new_attachments_path)
diff --git a/app/workers/geo/hashed_storage_migration_worker.rb b/app/workers/geo/hashed_storage_migration_worker.rb
index 438c76d195c1e3910cbbf8b4e88c9eb1f65f8b75..54f402c4d203eac135cf223510af7a9150eab170 100644
--- a/app/workers/geo/hashed_storage_migration_worker.rb
+++ b/app/workers/geo/hashed_storage_migration_worker.rb
@@ -1,6 +1,6 @@
 module Geo
   class HashedStorageMigrationWorker
-    include Sidekiq::Worker
+    include ApplicationWorker
     include GeoQueue
 
     def perform(project_id, old_disk_path, new_disk_path, old_storage_version)
diff --git a/app/workers/geo/metrics_update_worker.rb b/app/workers/geo/metrics_update_worker.rb
index 5753dd1335b1e4fb136f7b7cb0dd6212eacfe8d9..8574297547d6b7af3c98828ecb31dfd3c751cc27 100644
--- a/app/workers/geo/metrics_update_worker.rb
+++ b/app/workers/geo/metrics_update_worker.rb
@@ -1,6 +1,6 @@
 module Geo
   class MetricsUpdateWorker
-    include Sidekiq::Worker
+    include ApplicationWorker
     include ExclusiveLeaseGuard
     include CronjobQueue
 
diff --git a/app/workers/geo/project_sync_worker.rb b/app/workers/geo/project_sync_worker.rb
index 85c667b19a529417499b07739e6cb3f503c5c8a7..da4be4bc962cbd5f5fa46dad034ee808bc546292 100644
--- a/app/workers/geo/project_sync_worker.rb
+++ b/app/workers/geo/project_sync_worker.rb
@@ -1,8 +1,8 @@
 module Geo
   class ProjectSyncWorker
-    include Sidekiq::Worker
+    include ApplicationWorker
 
-    sidekiq_options queue: :geo_project_sync, retry: 3, dead: false
+    sidekiq_options retry: 3, dead: false
 
     sidekiq_retry_in { |count| 30 * count }
 
diff --git a/app/workers/geo/prune_event_log_worker.rb b/app/workers/geo/prune_event_log_worker.rb
index eed396c0bce14b4a6f0413c250f547fd77d8a928..f3548d88f0bf2e328185827aebce7cb55ecd2535 100644
--- a/app/workers/geo/prune_event_log_worker.rb
+++ b/app/workers/geo/prune_event_log_worker.rb
@@ -1,6 +1,6 @@
 module Geo
   class PruneEventLogWorker
-    include Sidekiq::Worker
+    include ApplicationWorker
     include CronjobQueue
     include ExclusiveLeaseGuard
     include ::Gitlab::Geo::LogHelpers
diff --git a/app/workers/geo/rename_repository_worker.rb b/app/workers/geo/rename_repository_worker.rb
index 44f83b805889eacd1093819c8ec4088f3c86e49a..4cea329d0a70d0f4e98662cc100a46e982e1ac1f 100644
--- a/app/workers/geo/rename_repository_worker.rb
+++ b/app/workers/geo/rename_repository_worker.rb
@@ -1,6 +1,6 @@
 module Geo
   class RenameRepositoryWorker
-    include Sidekiq::Worker
+    include ApplicationWorker
     include GeoQueue
 
     def perform(project_id, old_disk_path, new_disk_path)
diff --git a/app/workers/geo/repositories_clean_up_worker.rb b/app/workers/geo/repositories_clean_up_worker.rb
index fc928a1f18a0e2097a1900cef374d173bb3d77d3..4448f4aa68bdcfc42b42ec27b3cb8103979adf73 100644
--- a/app/workers/geo/repositories_clean_up_worker.rb
+++ b/app/workers/geo/repositories_clean_up_worker.rb
@@ -1,6 +1,6 @@
 module Geo
   class RepositoriesCleanUpWorker
-    include Sidekiq::Worker
+    include ApplicationWorker
     include GeoQueue
     include Gitlab::ShellAdapter
     include ExclusiveLeaseGuard
diff --git a/app/workers/geo_repository_destroy_worker.rb b/app/workers/geo_repository_destroy_worker.rb
index b0a9c710f283cd5179ed5aef61fef714d7d7e036..b8efca3ebc6f79f417ee05edf98de58aaf68f778 100644
--- a/app/workers/geo_repository_destroy_worker.rb
+++ b/app/workers/geo_repository_destroy_worker.rb
@@ -1,5 +1,5 @@
 class GeoRepositoryDestroyWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include GeoQueue
   include Gitlab::ShellAdapter
 
diff --git a/app/workers/git_garbage_collect_worker.rb b/app/workers/git_garbage_collect_worker.rb
index ec65d3ff65ea30a49658c93ab395b06146eaea15..8e26275669e36a6ffb54aa12a73ed47848fbaa5f 100644
--- a/app/workers/git_garbage_collect_worker.rb
+++ b/app/workers/git_garbage_collect_worker.rb
@@ -1,6 +1,5 @@
 class GitGarbageCollectWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
   include Gitlab::CurrentSettings
 
   sidekiq_options retry: false
diff --git a/app/workers/gitlab/github_import/advance_stage_worker.rb b/app/workers/gitlab/github_import/advance_stage_worker.rb
index 877f88c043f42ed35deccfd373c136558eada73f..400396d5755e9b545dcc78281578d574883799c8 100644
--- a/app/workers/gitlab/github_import/advance_stage_worker.rb
+++ b/app/workers/gitlab/github_import/advance_stage_worker.rb
@@ -7,7 +7,7 @@ module GithubImport
     # been completed this worker will advance the import process to the next
     # stage.
     class AdvanceStageWorker
-      include Sidekiq::Worker
+      include ApplicationWorker
 
       sidekiq_options queue: 'github_importer_advance_stage', dead: false
 
diff --git a/app/workers/gitlab/github_import/refresh_import_jid_worker.rb b/app/workers/gitlab/github_import/refresh_import_jid_worker.rb
index 45a3892722533851d9d2cfbb6980ea797fd9a5b9..7108b531bc22543f055da70b6cc1c9db90d4f5ed 100644
--- a/app/workers/gitlab/github_import/refresh_import_jid_worker.rb
+++ b/app/workers/gitlab/github_import/refresh_import_jid_worker.rb
@@ -3,7 +3,7 @@
 module Gitlab
   module GithubImport
     class RefreshImportJidWorker
-      include Sidekiq::Worker
+      include ApplicationWorker
       include GithubImport::Queue
 
       # The interval to schedule new instances of this job at.
diff --git a/app/workers/gitlab/github_import/stage/finish_import_worker.rb b/app/workers/gitlab/github_import/stage/finish_import_worker.rb
index 1a09497780aa6c397b2bc151c71a60736a0771b8..073d6608082140659a9adf91be0ddffa6ab6b6ca 100644
--- a/app/workers/gitlab/github_import/stage/finish_import_worker.rb
+++ b/app/workers/gitlab/github_import/stage/finish_import_worker.rb
@@ -4,7 +4,7 @@ module Gitlab
   module GithubImport
     module Stage
       class FinishImportWorker
-        include Sidekiq::Worker
+        include ApplicationWorker
         include GithubImport::Queue
         include StageMethods
 
diff --git a/app/workers/gitlab/github_import/stage/import_base_data_worker.rb b/app/workers/gitlab/github_import/stage/import_base_data_worker.rb
index f8a3684c6ba579c81be2d6b7bc6fb541b49b0dad..5726fbb573d8408ac0eb0e5e070c83b2cab22a30 100644
--- a/app/workers/gitlab/github_import/stage/import_base_data_worker.rb
+++ b/app/workers/gitlab/github_import/stage/import_base_data_worker.rb
@@ -4,7 +4,7 @@ module Gitlab
   module GithubImport
     module Stage
       class ImportBaseDataWorker
-        include Sidekiq::Worker
+        include ApplicationWorker
         include GithubImport::Queue
         include StageMethods
 
diff --git a/app/workers/gitlab/github_import/stage/import_issues_and_diff_notes_worker.rb b/app/workers/gitlab/github_import/stage/import_issues_and_diff_notes_worker.rb
index e110b7c1c36f755b9c9fada3049bf254647cc227..7007754ff2e6f5884d9da9797571373b2dcd64c7 100644
--- a/app/workers/gitlab/github_import/stage/import_issues_and_diff_notes_worker.rb
+++ b/app/workers/gitlab/github_import/stage/import_issues_and_diff_notes_worker.rb
@@ -4,7 +4,7 @@ module Gitlab
   module GithubImport
     module Stage
       class ImportIssuesAndDiffNotesWorker
-        include Sidekiq::Worker
+        include ApplicationWorker
         include GithubImport::Queue
         include StageMethods
 
diff --git a/app/workers/gitlab/github_import/stage/import_notes_worker.rb b/app/workers/gitlab/github_import/stage/import_notes_worker.rb
index 9810ed25cf90abf57cc0bd5b9000b171dd938467..5f4678a595f06ee3e574643b492fce49fe9831f4 100644
--- a/app/workers/gitlab/github_import/stage/import_notes_worker.rb
+++ b/app/workers/gitlab/github_import/stage/import_notes_worker.rb
@@ -4,7 +4,7 @@ module Gitlab
   module GithubImport
     module Stage
       class ImportNotesWorker
-        include Sidekiq::Worker
+        include ApplicationWorker
         include GithubImport::Queue
         include StageMethods
 
diff --git a/app/workers/gitlab/github_import/stage/import_pull_requests_worker.rb b/app/workers/gitlab/github_import/stage/import_pull_requests_worker.rb
index c531f26e89730e83642424ddd3003d5a16325660..1c5a7139802cccd62ff27f3784167a3510b8c101 100644
--- a/app/workers/gitlab/github_import/stage/import_pull_requests_worker.rb
+++ b/app/workers/gitlab/github_import/stage/import_pull_requests_worker.rb
@@ -4,7 +4,7 @@ module Gitlab
   module GithubImport
     module Stage
       class ImportPullRequestsWorker
-        include Sidekiq::Worker
+        include ApplicationWorker
         include GithubImport::Queue
         include StageMethods
 
diff --git a/app/workers/gitlab/github_import/stage/import_repository_worker.rb b/app/workers/gitlab/github_import/stage/import_repository_worker.rb
index aa5762e773d8082565d1bf6f310ded67a6877449..4d16cef1130a6ea554ecccb1d8aa89a8a75b50a4 100644
--- a/app/workers/gitlab/github_import/stage/import_repository_worker.rb
+++ b/app/workers/gitlab/github_import/stage/import_repository_worker.rb
@@ -4,7 +4,7 @@ module Gitlab
   module GithubImport
     module Stage
       class ImportRepositoryWorker
-        include Sidekiq::Worker
+        include ApplicationWorker
         include GithubImport::Queue
         include StageMethods
 
diff --git a/app/workers/gitlab_shell_worker.rb b/app/workers/gitlab_shell_worker.rb
index 0ec871e00e1694e74638130ce3238793a38921b1..a0028e41332a808228762ca7b176ad905bc0d9ef 100644
--- a/app/workers/gitlab_shell_worker.rb
+++ b/app/workers/gitlab_shell_worker.rb
@@ -1,7 +1,6 @@
 class GitlabShellWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include Gitlab::ShellAdapter
-  include DedicatedSidekiqQueue
 
   def perform(action, *arg)
     gitlab_shell.__send__(action, *arg) # rubocop:disable GitlabSecurity/PublicSend
diff --git a/app/workers/gitlab_usage_ping_worker.rb b/app/workers/gitlab_usage_ping_worker.rb
index 0a55aab63fd8a5bafbb2934068aa3de261e332a9..6dd281b1147d5d6c55f4a44bc1b491ba74e95062 100644
--- a/app/workers/gitlab_usage_ping_worker.rb
+++ b/app/workers/gitlab_usage_ping_worker.rb
@@ -1,7 +1,7 @@
 class GitlabUsagePingWorker
   LEASE_TIMEOUT = 86400
 
-  include Sidekiq::Worker
+  include ApplicationWorker
   include CronjobQueue
 
   def perform
diff --git a/app/workers/group_destroy_worker.rb b/app/workers/group_destroy_worker.rb
index bd8e212e928dade6d9539d1aa875c7f3bb74418f..f577b310b206107dfe5a602d9a5962425df30903 100644
--- a/app/workers/group_destroy_worker.rb
+++ b/app/workers/group_destroy_worker.rb
@@ -1,6 +1,5 @@
 class GroupDestroyWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
   include ExceptionBacktrace
 
   def perform(group_id, user_id)
diff --git a/app/workers/import_export_project_cleanup_worker.rb b/app/workers/import_export_project_cleanup_worker.rb
index 7957ed807ab07696915e3716b632c2c0c7863d33..9788c8df3a3fa4308a1ac664e14d4348cc312a98 100644
--- a/app/workers/import_export_project_cleanup_worker.rb
+++ b/app/workers/import_export_project_cleanup_worker.rb
@@ -1,5 +1,5 @@
 class ImportExportProjectCleanupWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include CronjobQueue
 
   def perform
diff --git a/app/workers/invalid_gpg_signature_update_worker.rb b/app/workers/invalid_gpg_signature_update_worker.rb
index db6b1ea8e8de8728a12fd7bf1cf07c52a83a5843..6774ab307c602c15a03398e105e3bc291b7a2e6d 100644
--- a/app/workers/invalid_gpg_signature_update_worker.rb
+++ b/app/workers/invalid_gpg_signature_update_worker.rb
@@ -1,6 +1,5 @@
 class InvalidGpgSignatureUpdateWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
 
   def perform(gpg_key_id)
     gpg_key = GpgKey.find_by(id: gpg_key_id)
diff --git a/app/workers/irker_worker.rb b/app/workers/irker_worker.rb
index 311fc187e49ce9f4d1a7cd6167e452a304d3005c..9ae5456be4cc3f5d51d001866ee9fe75643c216f 100644
--- a/app/workers/irker_worker.rb
+++ b/app/workers/irker_worker.rb
@@ -2,8 +2,7 @@
 require 'socket'
 
 class IrkerWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
 
   def perform(project_id, chans, colors, push_data, settings)
     project = Project.find(project_id)
diff --git a/app/workers/merge_worker.rb b/app/workers/merge_worker.rb
index 48e2da338f637a95b8ee04d9c72e5acca6c58b7d..ba832fe30c6b2baa81237c1de847063cc6087932 100644
--- a/app/workers/merge_worker.rb
+++ b/app/workers/merge_worker.rb
@@ -1,6 +1,5 @@
 class MergeWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
 
   def perform(merge_request_id, current_user_id, params)
     params = params.with_indifferent_access
diff --git a/app/workers/namespaceless_project_destroy_worker.rb b/app/workers/namespaceless_project_destroy_worker.rb
index f1cd17694211520ec976dc903ecdd0ddc84a8bf5..13d750e5876425ee2e7dd9e8e0c00e297247f38b 100644
--- a/app/workers/namespaceless_project_destroy_worker.rb
+++ b/app/workers/namespaceless_project_destroy_worker.rb
@@ -5,8 +5,7 @@
 # The worker will reject doing anything for projects that *do* have a
 # namespace. For those use ProjectDestroyWorker instead.
 class NamespacelessProjectDestroyWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
   include ExceptionBacktrace
 
   def self.bulk_perform_async(args_list)
diff --git a/app/workers/new_issue_worker.rb b/app/workers/new_issue_worker.rb
index d9a8e892e906e46b034389636e80766f7e0e707f..3bc030f9c620fa94e9635590136097f2c5d6043d 100644
--- a/app/workers/new_issue_worker.rb
+++ b/app/workers/new_issue_worker.rb
@@ -1,6 +1,5 @@
 class NewIssueWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
   include NewIssuable
 
   def perform(issue_id, user_id)
diff --git a/app/workers/new_merge_request_worker.rb b/app/workers/new_merge_request_worker.rb
index 1910c49015958b6e908f281613d75aa2f305528e..bda2a0ab59da61b7f64ccbbb70a52e89d1dea051 100644
--- a/app/workers/new_merge_request_worker.rb
+++ b/app/workers/new_merge_request_worker.rb
@@ -1,6 +1,5 @@
 class NewMergeRequestWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
   include NewIssuable
 
   def perform(merge_request_id, user_id)
diff --git a/app/workers/new_note_worker.rb b/app/workers/new_note_worker.rb
index 926162b8c53a9eadcae6d8bb364981b2fa487419..67c54fbf10e05a127386c8129bd7cdc02fbd19ab 100644
--- a/app/workers/new_note_worker.rb
+++ b/app/workers/new_note_worker.rb
@@ -1,6 +1,5 @@
 class NewNoteWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
 
   # Keep extra parameter to preserve backwards compatibility with
   # old `NewNoteWorker` jobs (can remove later)
diff --git a/app/workers/pages_worker.rb b/app/workers/pages_worker.rb
index 64788da72999bf1754840b4a2e85920d7790a161..62f733c02fc43e8c5c15fc3c208ff10dee06f567 100644
--- a/app/workers/pages_worker.rb
+++ b/app/workers/pages_worker.rb
@@ -1,5 +1,5 @@
 class PagesWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
 
   sidekiq_options queue: :pages, retry: false
 
diff --git a/app/workers/pipeline_hooks_worker.rb b/app/workers/pipeline_hooks_worker.rb
index 30a75ec8435df5756d05858fea3ff8ad3332efae..661c29efe8868157e5db85dee06bc2e6a546ece6 100644
--- a/app/workers/pipeline_hooks_worker.rb
+++ b/app/workers/pipeline_hooks_worker.rb
@@ -1,5 +1,5 @@
 class PipelineHooksWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include PipelineQueue
 
   enqueue_in group: :hooks
diff --git a/app/workers/pipeline_metrics_worker.rb b/app/workers/pipeline_metrics_worker.rb
index 070943f1ecc956e3e6f899fd23b91b2f7b0afed7..d46d1f122fcfa72624fed7e5aba2ab53475029a3 100644
--- a/app/workers/pipeline_metrics_worker.rb
+++ b/app/workers/pipeline_metrics_worker.rb
@@ -1,5 +1,5 @@
 class PipelineMetricsWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include PipelineQueue
 
   def perform(pipeline_id)
diff --git a/app/workers/pipeline_notification_worker.rb b/app/workers/pipeline_notification_worker.rb
index cdb860b66758056253cff38cfb2883cbfe620d41..a9a1168a6e3a0d8cddee5790c4ea1c0b38a4f2bf 100644
--- a/app/workers/pipeline_notification_worker.rb
+++ b/app/workers/pipeline_notification_worker.rb
@@ -1,5 +1,5 @@
 class PipelineNotificationWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include PipelineQueue
 
   def perform(pipeline_id, recipients = nil)
diff --git a/app/workers/pipeline_process_worker.rb b/app/workers/pipeline_process_worker.rb
index 8c067d0508120a973a225d0e2e1fcb0b68e072ca..07dbf6a971eb575bbef9281559a7c6e68a4b0392 100644
--- a/app/workers/pipeline_process_worker.rb
+++ b/app/workers/pipeline_process_worker.rb
@@ -1,5 +1,5 @@
 class PipelineProcessWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include PipelineQueue
 
   enqueue_in group: :processing
diff --git a/app/workers/pipeline_schedule_worker.rb b/app/workers/pipeline_schedule_worker.rb
index 7320db1065eb26b074c68c7f36151a80378d5acc..c49758878a4cc5a036cd62902cfbee8be1d8ccda 100644
--- a/app/workers/pipeline_schedule_worker.rb
+++ b/app/workers/pipeline_schedule_worker.rb
@@ -1,5 +1,5 @@
 class PipelineScheduleWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include CronjobQueue
 
   def perform
diff --git a/app/workers/pipeline_success_worker.rb b/app/workers/pipeline_success_worker.rb
index cb8bb2ffe757d64418d67e158a2c3380b7d1a440..68c40a259e174924062e620181575562f5f75b11 100644
--- a/app/workers/pipeline_success_worker.rb
+++ b/app/workers/pipeline_success_worker.rb
@@ -1,5 +1,5 @@
 class PipelineSuccessWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include PipelineQueue
 
   enqueue_in group: :processing
diff --git a/app/workers/pipeline_update_worker.rb b/app/workers/pipeline_update_worker.rb
index 5fa399dff4c89b31ab25400d2ebb0ab335d7d18e..24a8a9fbed531a7f858fc02e119c9ae8b575a190 100644
--- a/app/workers/pipeline_update_worker.rb
+++ b/app/workers/pipeline_update_worker.rb
@@ -1,5 +1,5 @@
 class PipelineUpdateWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include PipelineQueue
 
   enqueue_in group: :processing
diff --git a/app/workers/post_receive.rb b/app/workers/post_receive.rb
index 627a78d1e78877f0a2140b6e5be703db92f6dcca..adbc1373a4b065260660d514f5b4c1a2c6d9cad4 100644
--- a/app/workers/post_receive.rb
+++ b/app/workers/post_receive.rb
@@ -1,6 +1,5 @@
 class PostReceive
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
   prepend EE::PostReceive
 
   def perform(gl_repository, identifier, changes)
diff --git a/app/workers/process_commit_worker.rb b/app/workers/process_commit_worker.rb
index c0c03848a403b7d937a53ea5ba7cd6699ac8653a..52eebe475ecb3cbf51e38fec5de0c9c053ed5482 100644
--- a/app/workers/process_commit_worker.rb
+++ b/app/workers/process_commit_worker.rb
@@ -5,8 +5,7 @@
 # Consider using an extra worker if you need to add any extra (and potentially
 # slow) processing of commits.
 class ProcessCommitWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
 
   # project_id - The ID of the project this commit belongs to.
   # user_id - The ID of the user that pushed the commit.
diff --git a/app/workers/project_cache_worker.rb b/app/workers/project_cache_worker.rb
index 19736076938f1b6bf00d325134af325907cdf10f..ca7dd480322343947ecc8bdff9cb1753401ecd0b 100644
--- a/app/workers/project_cache_worker.rb
+++ b/app/workers/project_cache_worker.rb
@@ -1,7 +1,6 @@
 # Worker for updating any project specific caches.
 class ProjectCacheWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
   prepend EE::Workers::ProjectCacheWorker
 
   LEASE_TIMEOUT = 15.minutes.to_i
diff --git a/app/workers/project_destroy_worker.rb b/app/workers/project_destroy_worker.rb
index 3be7e686609a9a40eaace6cff70948b22ce780fc..1ba854ca4cb6c4b4d0b103189c5aa0bc41b12982 100644
--- a/app/workers/project_destroy_worker.rb
+++ b/app/workers/project_destroy_worker.rb
@@ -1,6 +1,5 @@
 class ProjectDestroyWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
   include ExceptionBacktrace
 
   def perform(project_id, user_id, params)
diff --git a/app/workers/project_export_worker.rb b/app/workers/project_export_worker.rb
index f13ac9e5db2896b9f10b7c2bd2c3c7b1ad1ad801..c100852374a1e05be0f4611e6a48aabbebc5353e 100644
--- a/app/workers/project_export_worker.rb
+++ b/app/workers/project_export_worker.rb
@@ -1,6 +1,5 @@
 class ProjectExportWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
   include ExceptionBacktrace
 
   sidekiq_options retry: 3
diff --git a/app/workers/project_migrate_hashed_storage_worker.rb b/app/workers/project_migrate_hashed_storage_worker.rb
index 127aa6b9d7def76436216c1cd48c3f81cc8ea440..d01eb744e5d5bcbd11bd263ee8a796f907b2211f 100644
--- a/app/workers/project_migrate_hashed_storage_worker.rb
+++ b/app/workers/project_migrate_hashed_storage_worker.rb
@@ -1,6 +1,5 @@
 class ProjectMigrateHashedStorageWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
 
   LEASE_TIMEOUT = 30.seconds.to_i
 
diff --git a/app/workers/project_service_worker.rb b/app/workers/project_service_worker.rb
index 4883d848c53b6fa39b356830c976448d551a3db3..75c4b8b36632e231a7bf363a3e44c923b1ff8158 100644
--- a/app/workers/project_service_worker.rb
+++ b/app/workers/project_service_worker.rb
@@ -1,6 +1,5 @@
 class ProjectServiceWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
 
   sidekiq_options dead: false
 
diff --git a/app/workers/propagate_service_template_worker.rb b/app/workers/propagate_service_template_worker.rb
index 6b607451c7ab8c826b07df888cc2709837e9d48d..635a97c99afc89e394489b81f25771bf633f5149 100644
--- a/app/workers/propagate_service_template_worker.rb
+++ b/app/workers/propagate_service_template_worker.rb
@@ -1,7 +1,6 @@
 # Worker for updating any project specific caches.
 class PropagateServiceTemplateWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
 
   LEASE_TIMEOUT = 4.hours.to_i
 
diff --git a/app/workers/prune_old_events_worker.rb b/app/workers/prune_old_events_worker.rb
index 2b43bb19ad1a3b97de1283d09bb71aa242fee691..5ff62ab1369e7ce9c8386ab3ca184f2b28dafa8d 100644
--- a/app/workers/prune_old_events_worker.rb
+++ b/app/workers/prune_old_events_worker.rb
@@ -1,5 +1,5 @@
 class PruneOldEventsWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include CronjobQueue
 
   def perform
diff --git a/app/workers/reactive_caching_worker.rb b/app/workers/reactive_caching_worker.rb
index 18b8daf4e1e7571e1a786e285b4224a74d7cf7fc..ef3ddb9024bacf8106a0ff33f40de5e50bdcc607 100644
--- a/app/workers/reactive_caching_worker.rb
+++ b/app/workers/reactive_caching_worker.rb
@@ -1,6 +1,5 @@
 class ReactiveCachingWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
 
   def perform(class_name, id, *args)
     klass = begin
diff --git a/app/workers/remove_expired_group_links_worker.rb b/app/workers/remove_expired_group_links_worker.rb
index 2a619f834100cf278d74dab2a81482673a425069..7e64c3070a89cf33cd587dedf97276bc32a8bd8b 100644
--- a/app/workers/remove_expired_group_links_worker.rb
+++ b/app/workers/remove_expired_group_links_worker.rb
@@ -1,5 +1,5 @@
 class RemoveExpiredGroupLinksWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include CronjobQueue
 
   def perform
diff --git a/app/workers/remove_expired_members_worker.rb b/app/workers/remove_expired_members_worker.rb
index 31f652e5f9bc11f177393ff2c9f3761adfb17d20..d80b3b15840a1ac05853c54bd28e9ea80fa36783 100644
--- a/app/workers/remove_expired_members_worker.rb
+++ b/app/workers/remove_expired_members_worker.rb
@@ -1,5 +1,5 @@
 class RemoveExpiredMembersWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include CronjobQueue
 
   def perform
diff --git a/app/workers/remove_old_web_hook_logs_worker.rb b/app/workers/remove_old_web_hook_logs_worker.rb
index 555e1bb86919dc8ad0e2b3925cada873038e23ec..87fed42d7ce203107c4f2c2547c14ce8ca38a7c0 100644
--- a/app/workers/remove_old_web_hook_logs_worker.rb
+++ b/app/workers/remove_old_web_hook_logs_worker.rb
@@ -1,5 +1,5 @@
 class RemoveOldWebHookLogsWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include CronjobQueue
 
   WEB_HOOK_LOG_LIFETIME = 2.days
diff --git a/app/workers/remove_unreferenced_lfs_objects_worker.rb b/app/workers/remove_unreferenced_lfs_objects_worker.rb
index b80f131d5f7cd445703cef508b6ed9545cac8995..8daf079fc3160179cf43a6fa06f8dd6bfc7e5bc9 100644
--- a/app/workers/remove_unreferenced_lfs_objects_worker.rb
+++ b/app/workers/remove_unreferenced_lfs_objects_worker.rb
@@ -1,5 +1,5 @@
 class RemoveUnreferencedLfsObjectsWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include CronjobQueue
 
   def perform
diff --git a/app/workers/repository_archive_cache_worker.rb b/app/workers/repository_archive_cache_worker.rb
index e47069df189069efb8ddf2f20c718242d30c9c62..86a258cf94f3f6fc05cb38c77ae48be38c124696 100644
--- a/app/workers/repository_archive_cache_worker.rb
+++ b/app/workers/repository_archive_cache_worker.rb
@@ -1,5 +1,5 @@
 class RepositoryArchiveCacheWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include CronjobQueue
 
   def perform
diff --git a/app/workers/repository_check/batch_worker.rb b/app/workers/repository_check/batch_worker.rb
index b94d83bd7098313d4fea32df3f39b661114e20c2..76688cf51c1b001e6c2373ef2c015b1b5ee4d953 100644
--- a/app/workers/repository_check/batch_worker.rb
+++ b/app/workers/repository_check/batch_worker.rb
@@ -1,6 +1,6 @@
 module RepositoryCheck
   class BatchWorker
-    include Sidekiq::Worker
+    include ApplicationWorker
     include CronjobQueue
 
     RUN_TIME = 3600
diff --git a/app/workers/repository_check/clear_worker.rb b/app/workers/repository_check/clear_worker.rb
index 85bc9103538dd3f3a61499d326aa8d85741ad5bc..97b89dc3db5413c9a055a0b009a77c85b9a4fe16 100644
--- a/app/workers/repository_check/clear_worker.rb
+++ b/app/workers/repository_check/clear_worker.rb
@@ -1,6 +1,6 @@
 module RepositoryCheck
   class ClearWorker
-    include Sidekiq::Worker
+    include ApplicationWorker
     include RepositoryCheckQueue
 
     def perform
diff --git a/app/workers/repository_check/single_repository_worker.rb b/app/workers/repository_check/single_repository_worker.rb
index 164586cf0b742b8b0b9e491b414a05f565b384b6..bf0ae7751c723b691f5aefcc9d5f9bbc79f7072c 100644
--- a/app/workers/repository_check/single_repository_worker.rb
+++ b/app/workers/repository_check/single_repository_worker.rb
@@ -1,6 +1,6 @@
 module RepositoryCheck
   class SingleRepositoryWorker
-    include Sidekiq::Worker
+    include ApplicationWorker
     include RepositoryCheckQueue
 
     def perform(project_id)
diff --git a/app/workers/repository_fork_worker.rb b/app/workers/repository_fork_worker.rb
index 001c11b73e1612b8a3e00e649eff2a25de6d086c..a07ef1705a156cf0567b6b942237b77c35733ad1 100644
--- a/app/workers/repository_fork_worker.rb
+++ b/app/workers/repository_fork_worker.rb
@@ -1,9 +1,8 @@
 class RepositoryForkWorker
   ForkError = Class.new(StandardError)
 
-  include Sidekiq::Worker
+  include ApplicationWorker
   include Gitlab::ShellAdapter
-  include DedicatedSidekiqQueue
   include ProjectStartImport
 
   sidekiq_options status_expiration: StuckImportJobsWorker::IMPORT_JOBS_EXPIRATION
diff --git a/app/workers/repository_import_worker.rb b/app/workers/repository_import_worker.rb
index abe5c7ab391d233461a5594ee2292687d38da3ee..c0eb47b1e4dc3e3576a4d190aafe86670c21974a 100644
--- a/app/workers/repository_import_worker.rb
+++ b/app/workers/repository_import_worker.rb
@@ -1,8 +1,7 @@
 class RepositoryImportWorker
   ImportError = Class.new(StandardError)
 
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
   include ExceptionBacktrace
   include ProjectStartImport
 
diff --git a/app/workers/requests_profiles_worker.rb b/app/workers/requests_profiles_worker.rb
index 703b025d76e86fd3d59a7d10175ccd01c3a2b87f..55c236e9e9de37d76f3114e4fa3e1d0835b7ac1f 100644
--- a/app/workers/requests_profiles_worker.rb
+++ b/app/workers/requests_profiles_worker.rb
@@ -1,5 +1,5 @@
 class RequestsProfilesWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include CronjobQueue
 
   def perform
diff --git a/app/workers/schedule_update_user_activity_worker.rb b/app/workers/schedule_update_user_activity_worker.rb
index 6c2c3e437f31d536f85e906c50794fd0cfcd7ee5..d93765775970cc0bd7905c423e48cd8d98c089c7 100644
--- a/app/workers/schedule_update_user_activity_worker.rb
+++ b/app/workers/schedule_update_user_activity_worker.rb
@@ -1,5 +1,5 @@
 class ScheduleUpdateUserActivityWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include CronjobQueue
 
   def perform(batch_size = 500)
diff --git a/app/workers/stage_update_worker.rb b/app/workers/stage_update_worker.rb
index c301cea5ad6d90a9c3f3abdede4caa3efd916826..69f2318d83bb7d2838a6b688bccfd400aa4765b5 100644
--- a/app/workers/stage_update_worker.rb
+++ b/app/workers/stage_update_worker.rb
@@ -1,5 +1,5 @@
 class StageUpdateWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include PipelineQueue
 
   enqueue_in group: :processing
diff --git a/app/workers/storage_migrator_worker.rb b/app/workers/storage_migrator_worker.rb
index b48ead799b91e78f2f3a604222bdc3042d6ab62a..f92421a667d9b97134f1a9403267d6b492c5cb1e 100644
--- a/app/workers/storage_migrator_worker.rb
+++ b/app/workers/storage_migrator_worker.rb
@@ -1,6 +1,5 @@
 class StorageMigratorWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
 
   BATCH_SIZE = 100
 
diff --git a/app/workers/stuck_ci_jobs_worker.rb b/app/workers/stuck_ci_jobs_worker.rb
index 367e227f6800e8c43b875a60cf1e8bc0ef6fe085..fb26fa4c515ce34c44b650f9f76e3a3a2bd7bb17 100644
--- a/app/workers/stuck_ci_jobs_worker.rb
+++ b/app/workers/stuck_ci_jobs_worker.rb
@@ -1,5 +1,5 @@
 class StuckCiJobsWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include CronjobQueue
 
   EXCLUSIVE_LEASE_KEY = 'stuck_ci_builds_worker_lease'.freeze
diff --git a/app/workers/stuck_import_jobs_worker.rb b/app/workers/stuck_import_jobs_worker.rb
index 8461f7c0c71f403bac89797f63083d2da1a0fff8..28c2f6b8c82f69d93485488a63c92a7197446c99 100644
--- a/app/workers/stuck_import_jobs_worker.rb
+++ b/app/workers/stuck_import_jobs_worker.rb
@@ -1,5 +1,5 @@
 class StuckImportJobsWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include CronjobQueue
 
   IMPORT_JOBS_EXPIRATION = 15.hours.to_i
diff --git a/app/workers/stuck_merge_jobs_worker.rb b/app/workers/stuck_merge_jobs_worker.rb
index a396c0f27b209935780ac01f741201b522044d1f..36d2a2e6466bbc43201e68bee10f789e15b4356e 100644
--- a/app/workers/stuck_merge_jobs_worker.rb
+++ b/app/workers/stuck_merge_jobs_worker.rb
@@ -1,5 +1,5 @@
 class StuckMergeJobsWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include CronjobQueue
 
   def perform
diff --git a/app/workers/system_hook_push_worker.rb b/app/workers/system_hook_push_worker.rb
index e43bbe35de916dee79d9ae5e327894a409a3ce1b..ceeaaf8d18994a778679cba4a7f774a260fe2a0b 100644
--- a/app/workers/system_hook_push_worker.rb
+++ b/app/workers/system_hook_push_worker.rb
@@ -1,6 +1,5 @@
 class SystemHookPushWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
 
   def perform(push_data, hook_id)
     SystemHooksService.new.execute_hooks(push_data, hook_id)
diff --git a/app/workers/trending_projects_worker.rb b/app/workers/trending_projects_worker.rb
index 0531630d13a7b8de98387384201629e5a8840ea1..7eb65452a7dcfc604432213efb401ca61ec8cdc1 100644
--- a/app/workers/trending_projects_worker.rb
+++ b/app/workers/trending_projects_worker.rb
@@ -1,5 +1,5 @@
 class TrendingProjectsWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include CronjobQueue
 
   def perform
diff --git a/app/workers/update_merge_requests_worker.rb b/app/workers/update_merge_requests_worker.rb
index afc47fc63d65d5cb371462619848f23c53c22d8b..74bb999327501bd02e15401df047e75b389b16c9 100644
--- a/app/workers/update_merge_requests_worker.rb
+++ b/app/workers/update_merge_requests_worker.rb
@@ -1,6 +1,5 @@
 class UpdateMergeRequestsWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
 
   LOG_TIME_THRESHOLD = 90 # seconds
 
diff --git a/app/workers/update_user_activity_worker.rb b/app/workers/update_user_activity_worker.rb
index 31bbdb69edb18112e756ecd0012f43082d6b2b40..27ec5cd33fb52ae24f98e1fa366316c21664a639 100644
--- a/app/workers/update_user_activity_worker.rb
+++ b/app/workers/update_user_activity_worker.rb
@@ -1,6 +1,5 @@
 class UpdateUserActivityWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
 
   def perform(pairs)
     pairs = cast_data(pairs)
diff --git a/app/workers/upload_checksum_worker.rb b/app/workers/upload_checksum_worker.rb
index 78931f1258fbeddc37a1f23dd470b8e8efa68437..9222760c0316a11aa47515e4448005ab45c35f16 100644
--- a/app/workers/upload_checksum_worker.rb
+++ b/app/workers/upload_checksum_worker.rb
@@ -1,6 +1,5 @@
 class UploadChecksumWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
 
   def perform(upload_id)
     upload = Upload.find(upload_id)
diff --git a/app/workers/wait_for_cluster_creation_worker.rb b/app/workers/wait_for_cluster_creation_worker.rb
index 241ed3901dc18478b3b068059e45b39b0e8b67f9..19cdb279aaaf929edae868f7febb2f9ad0a7741e 100644
--- a/app/workers/wait_for_cluster_creation_worker.rb
+++ b/app/workers/wait_for_cluster_creation_worker.rb
@@ -1,5 +1,5 @@
 class WaitForClusterCreationWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include ClusterQueue
 
   def perform(cluster_id)
diff --git a/app/workers/web_hook_worker.rb b/app/workers/web_hook_worker.rb
index 713c022804044c4ff0312dfb704f92500c579c21..dfc3f33ad9d4b439c069086ef0600e78306ab29a 100644
--- a/app/workers/web_hook_worker.rb
+++ b/app/workers/web_hook_worker.rb
@@ -1,6 +1,5 @@
 class WebHookWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
 
   sidekiq_options retry: 4, dead: false
 
diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb
index ee2f44d2b9ce5ccbe2df34186cc8030f9da40ddb..9db9eeafbfda33155ce1a6a5d1178579d453cc60 100644
--- a/config/initializers/sidekiq.rb
+++ b/config/initializers/sidekiq.rb
@@ -76,12 +76,14 @@
 # The Sidekiq client API always adds the queue to the Sidekiq queue
 # list, but mail_room and gitlab-shell do not. This is only necessary
 # for monitoring.
-queues = Gitlab::SidekiqConfig.queues
-
 begin
+  queues = Gitlab::SidekiqConfig.worker_queues
+
   Sidekiq.redis do |conn|
     conn.pipelined do
-      queues.each { |queue| conn.sadd('queues', queue) }
+      queues.each do |queue|
+        conn.sadd('queues', queue)
+      end
     end
   end
 rescue Redis::BaseError, SocketError, Errno::ENOENT, Errno::EADDRNOTAVAIL, Errno::EAFNOSUPPORT, Errno::ECONNRESET, Errno::ECONNREFUSED
diff --git a/doc/development/sidekiq_style_guide.md b/doc/development/sidekiq_style_guide.md
index 1e9fdbc65e28c953f03f1cf53d805a3b5c9a6ade..a120f3e4771918a857024228e8ddd4616bcea1f2 100644
--- a/doc/development/sidekiq_style_guide.md
+++ b/doc/development/sidekiq_style_guide.md
@@ -18,8 +18,7 @@ include the `DedicatedSidekiqQueue` concern as follows:
 
 ```ruby
 class ProcessSomethingWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
 end
 ```
 
diff --git a/ee/app/workers/admin_emails_worker.rb b/ee/app/workers/admin_emails_worker.rb
index b1f3d62cfab954a2ddb8946df20daac9f13accdb..ae6c92f0261a8cd036101a043299df4cba654001 100644
--- a/ee/app/workers/admin_emails_worker.rb
+++ b/ee/app/workers/admin_emails_worker.rb
@@ -1,6 +1,5 @@
 class AdminEmailsWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
 
   def perform(recipient_id, subject, body)
     recipient_list(recipient_id).pluck(:id).uniq.each do |user_id|
diff --git a/ee/app/workers/clear_shared_runners_minutes_worker.rb b/ee/app/workers/clear_shared_runners_minutes_worker.rb
index 10465d5057933a90934954abc83e29edbd8020b4..11fc0c848567862aa84a84ff5d1153cf19e802a7 100644
--- a/ee/app/workers/clear_shared_runners_minutes_worker.rb
+++ b/ee/app/workers/clear_shared_runners_minutes_worker.rb
@@ -1,7 +1,7 @@
 class ClearSharedRunnersMinutesWorker
   LEASE_TIMEOUT = 3600
 
-  include Sidekiq::Worker
+  include ApplicationWorker
   include CronjobQueue
 
   def perform
diff --git a/ee/app/workers/elastic_batch_project_indexer_worker.rb b/ee/app/workers/elastic_batch_project_indexer_worker.rb
index daa3f35fe849a5f07084b9a12230c5f0479629e8..43d330cbff6739d12282d0bb4c573075de82bd25 100644
--- a/ee/app/workers/elastic_batch_project_indexer_worker.rb
+++ b/ee/app/workers/elastic_batch_project_indexer_worker.rb
@@ -1,10 +1,9 @@
 class ElasticBatchProjectIndexerWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include Gitlab::CurrentSettings
 
   # Batch indexing is a generally a onetime option, so give finer control over
   # queuing and concurrency
-  include DedicatedSidekiqQueue
 
   # This worker is long-running, but idempotent, so retry many times if
   # necessary
diff --git a/ee/app/workers/elastic_commit_indexer_worker.rb b/ee/app/workers/elastic_commit_indexer_worker.rb
index 39dc68cb5703bb1002363991e7ae206e631b839c..c580ed72ca971f6ba5fd6dac12dd86b9ede7ab83 100644
--- a/ee/app/workers/elastic_commit_indexer_worker.rb
+++ b/ee/app/workers/elastic_commit_indexer_worker.rb
@@ -1,6 +1,5 @@
 class ElasticCommitIndexerWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
   include Gitlab::CurrentSettings
 
   sidekiq_options retry: 2
diff --git a/ee/app/workers/elastic_indexer_worker.rb b/ee/app/workers/elastic_indexer_worker.rb
index 52c1ea1d431a6a4e70d06266d800144e93e7c755..7eb9e4384bb508f6594ce7467f2382dfa72b9c40 100644
--- a/ee/app/workers/elastic_indexer_worker.rb
+++ b/ee/app/workers/elastic_indexer_worker.rb
@@ -1,6 +1,5 @@
 class ElasticIndexerWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
   include Elasticsearch::Model::Client::ClassMethods
   include Gitlab::CurrentSettings
 
diff --git a/ee/app/workers/export_csv_worker.rb b/ee/app/workers/export_csv_worker.rb
index 40ad758063c14f85acb2a0d4137d3a5e88b1ab11..565489c1e19ae93ba83f3bc9a69b8071e88cbedc 100644
--- a/ee/app/workers/export_csv_worker.rb
+++ b/ee/app/workers/export_csv_worker.rb
@@ -1,6 +1,5 @@
 class ExportCsvWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
 
   def perform(current_user_id, project_id, params)
     @current_user = User.find(current_user_id)
diff --git a/ee/app/workers/historical_data_worker.rb b/ee/app/workers/historical_data_worker.rb
index c94cb27fcf668016254d021ca4f3da864ae07b1e..05fb979a823f51a196cc31cfa1d9ba0a5d1f3695 100644
--- a/ee/app/workers/historical_data_worker.rb
+++ b/ee/app/workers/historical_data_worker.rb
@@ -1,5 +1,5 @@
 class HistoricalDataWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include CronjobQueue
 
   def perform
diff --git a/ee/app/workers/ldap_all_groups_sync_worker.rb b/ee/app/workers/ldap_all_groups_sync_worker.rb
index aa1bd27540f26b1ab36b56edca96a949dbe53399..515fdb08ea72318c8dd5968c8e4ed940a82b888e 100644
--- a/ee/app/workers/ldap_all_groups_sync_worker.rb
+++ b/ee/app/workers/ldap_all_groups_sync_worker.rb
@@ -1,5 +1,5 @@
 class LdapAllGroupsSyncWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include CronjobQueue
 
   def perform
diff --git a/ee/app/workers/ldap_group_sync_worker.rb b/ee/app/workers/ldap_group_sync_worker.rb
index 6c778051dcee9ffcd50c53916ae444ba1c08ead6..ca83dc4dad804794e7f2a12f1a080bd806d07f15 100644
--- a/ee/app/workers/ldap_group_sync_worker.rb
+++ b/ee/app/workers/ldap_group_sync_worker.rb
@@ -1,6 +1,5 @@
 class LdapGroupSyncWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
 
   def perform(group_ids, provider = nil)
     return unless Gitlab::LDAP::Config.group_sync_enabled?
diff --git a/ee/app/workers/ldap_sync_worker.rb b/ee/app/workers/ldap_sync_worker.rb
index 7b4f13b3a865b127ab9eb12fcc06efade29d2526..2b7653cbc60a4e7049fdd70aa5996f7d3c405e1d 100644
--- a/ee/app/workers/ldap_sync_worker.rb
+++ b/ee/app/workers/ldap_sync_worker.rb
@@ -1,5 +1,5 @@
 class LdapSyncWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include CronjobQueue
 
   def perform
diff --git a/ee/app/workers/object_storage_upload_worker.rb b/ee/app/workers/object_storage_upload_worker.rb
index 0a374c4323f1040487b2a10e4aca5b242a9bf620..f0e0dc6ade09162043b02cd4c6cb0cda909fba1a 100644
--- a/ee/app/workers/object_storage_upload_worker.rb
+++ b/ee/app/workers/object_storage_upload_worker.rb
@@ -1,6 +1,5 @@
 class ObjectStorageUploadWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
 
   def perform(uploader_class_name, subject_class_name, file_field, subject_id)
     uploader_class = uploader_class_name.constantize
diff --git a/ee/app/workers/project_update_repository_storage_worker.rb b/ee/app/workers/project_update_repository_storage_worker.rb
index a52025c3f21daedf162bbd6b744506c2ef1277a2..6e668230d3ba72abd19c2e2d7bb14dba0a207ce1 100644
--- a/ee/app/workers/project_update_repository_storage_worker.rb
+++ b/ee/app/workers/project_update_repository_storage_worker.rb
@@ -1,6 +1,5 @@
 class ProjectUpdateRepositoryStorageWorker
-  include Sidekiq::Worker
-  include DedicatedSidekiqQueue
+  include ApplicationWorker
 
   def perform(project_id, new_repository_storage_key)
     project = Project.find(project_id)
diff --git a/ee/app/workers/rebase_worker.rb b/ee/app/workers/rebase_worker.rb
index b29226070194949f98ad3c81b2917e519df0b42b..83414d9729dca8ff8ed4f21041484fcc2b826d5a 100644
--- a/ee/app/workers/rebase_worker.rb
+++ b/ee/app/workers/rebase_worker.rb
@@ -1,5 +1,5 @@
 class RebaseWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
 
   sidekiq_options queue: :merge
 
diff --git a/ee/app/workers/repository_update_mirror_worker.rb b/ee/app/workers/repository_update_mirror_worker.rb
index a9cf43f1f97e3034a889b20973d28f296232afc9..f01d9faba7490f4041d6a03fc9bb09282b507180 100644
--- a/ee/app/workers/repository_update_mirror_worker.rb
+++ b/ee/app/workers/repository_update_mirror_worker.rb
@@ -1,9 +1,8 @@
 class RepositoryUpdateMirrorWorker
   UpdateError = Class.new(StandardError)
 
-  include Sidekiq::Worker
+  include ApplicationWorker
   include Gitlab::ShellAdapter
-  include DedicatedSidekiqQueue
   include ProjectStartImport
 
   LEASE_KEY = 'repository_update_mirror_worker_start_scheduler'.freeze
diff --git a/ee/app/workers/repository_update_remote_mirror_worker.rb b/ee/app/workers/repository_update_remote_mirror_worker.rb
index 2fe7796a9d891ed5eddc7002c21e8fceecf7fce7..bb963979e88c47537587e7cd8da47fcbb7bbda3c 100644
--- a/ee/app/workers/repository_update_remote_mirror_worker.rb
+++ b/ee/app/workers/repository_update_remote_mirror_worker.rb
@@ -2,9 +2,8 @@ class RepositoryUpdateRemoteMirrorWorker
   UpdateAlreadyInProgressError = Class.new(StandardError)
   UpdateError = Class.new(StandardError)
 
-  include Sidekiq::Worker
+  include ApplicationWorker
   include Gitlab::ShellAdapter
-  include DedicatedSidekiqQueue
 
   sidekiq_options retry: 3, dead: false
 
diff --git a/ee/app/workers/update_all_mirrors_worker.rb b/ee/app/workers/update_all_mirrors_worker.rb
index d66e0751f3b819bba72ed08296d5603f743883c6..de39249df92ab29d2dd1d95d38a1e84766348191 100644
--- a/ee/app/workers/update_all_mirrors_worker.rb
+++ b/ee/app/workers/update_all_mirrors_worker.rb
@@ -1,5 +1,5 @@
 class UpdateAllMirrorsWorker
-  include Sidekiq::Worker
+  include ApplicationWorker
   include CronjobQueue
 
   LEASE_TIMEOUT = 5.minutes
diff --git a/lib/gitlab/sidekiq_cluster/cli.rb b/lib/gitlab/sidekiq_cluster/cli.rb
index d2efeb22ed55efc7b1f20f77227524f10fda8f4a..3f8e3a746a9ef264558c39769af0902042d137fb 100644
--- a/lib/gitlab/sidekiq_cluster/cli.rb
+++ b/lib/gitlab/sidekiq_cluster/cli.rb
@@ -30,18 +30,16 @@ def run(argv = ARGV)
 
         option_parser.parse!(argv)
 
-        parsed_queues = SidekiqCluster.parse_queues(argv)
+        queue_groups = SidekiqCluster.parse_queues(argv)
 
-        queues =
-          if @negate_queues
-            parsed_queues.map { |queues| SidekiqConfig.queues(@rails_path, except: queues) }
-          else
-            parsed_queues
-          end
+        if @negate_queues
+          all_queues = SidekiqConfig.config_queues(@rails_path)
+          queue_groups.map! { |queues| all_queues - queues }
+        end
 
-        @logger.info("Starting cluster with #{queues.length} processes")
+        @logger.info("Starting cluster with #{queue_groups.length} processes")
 
-        @processes = SidekiqCluster.start(queues, @environment, @rails_path)
+        @processes = SidekiqCluster.start(queue_groups, @environment, @rails_path)
 
         write_pid
         trap_signals
diff --git a/lib/gitlab/sidekiq_config.rb b/lib/gitlab/sidekiq_config.rb
index cb51200232e03408ec6986df1168832863d78d78..02b71e12d28be761da0bcd18ee6fb338f3a444bb 100644
--- a/lib/gitlab/sidekiq_config.rb
+++ b/lib/gitlab/sidekiq_config.rb
@@ -2,13 +2,51 @@
 
 module Gitlab
   module SidekiqConfig
-    def self.queues(rails_path = Rails.root.to_s, except: [])
-      queues_file_path = File.join(rails_path, 'config', 'sidekiq_queues.yml')
+    def self.redis_queues
+      @redis_queues ||= Sidekiq::Queue.all.map(&:name)
+    end
+
+    # This method is called by `bin/sidekiq-cluster` in EE, which runs outside
+    # of bundler/Rails context, so we cannot use any gem or Rails methods.
+    def self.config_queues(rails_path = Rails.root.to_s)
+      @config_queues ||= begin
+        config = YAML.load_file(File.join(rails_path, 'config', 'sidekiq_queues.yml'))
+        config[:queues].map(&:first)
+      end
+    end
+
+    def self.cron_workers
+      @cron_workers ||= Settings.cron_jobs.map { |job_name, options| options['job_class'].constantize }
+    end
+
+    def self.workers
+      @workers ||=
+        find_workers(Rails.root.join('app', 'workers')) +
+        find_workers(Rails.root.join('ee', 'app', 'workers'))
+    end
+
+    def self.default_queues
+      [ActionMailer::DeliveryJob.queue_name, 'default']
+    end
+
+    def self.worker_queues
+      @worker_queues ||= (workers.map(&:queue) + default_queues).uniq
+    end
+
+    def self.find_workers(root)
+      concerns = root.join('concerns').to_s
+
+      workers = Dir[root.join('**', '*.rb')]
+        .reject { |path| path.start_with?(concerns) }
+
+      workers.map! do |path|
+        ns = Pathname.new(path).relative_path_from(root).to_s.gsub('.rb', '')
 
-      @queues_file = {}
-      @queues_file[queues_file_path] ||= YAML.load_file(queues_file_path)
+        ns.camelize.constantize
+      end
 
-      @queues_file[queues_file_path].fetch(:queues).map { |queue, _| queue } - except
+      # Skip concerns
+      workers.select { |w| w < Sidekiq::Worker }
     end
   end
 end
diff --git a/spec/lib/gitlab/sidekiq_cluster/cli_spec.rb b/spec/lib/gitlab/sidekiq_cluster/cli_spec.rb
index 56740340ecc173660bf37db27033033b886c4c2d..6ee8448fd3380d146ab19872698c1461307724d5 100644
--- a/spec/lib/gitlab/sidekiq_cluster/cli_spec.rb
+++ b/spec/lib/gitlab/sidekiq_cluster/cli_spec.rb
@@ -22,7 +22,7 @@
 
       context 'with --negate flag' do
         it 'starts Sidekiq workers for all queues on sidekiq_queues.yml except the ones on argv' do
-          expect(Gitlab::SidekiqConfig).to receive(:queues).and_return(['baz'])
+          expect(Gitlab::SidekiqConfig).to receive(:config_queues).and_return(['baz'])
           expect(Gitlab::SidekiqCluster).to receive(:start)
                                               .with([['baz']], 'test', Dir.pwd)
                                               .and_return([])
diff --git a/spec/lib/gitlab/sidekiq_config_spec.rb b/spec/lib/gitlab/sidekiq_config_spec.rb
index 8fc5b1a2c6b852cd949e88f18ea4fed866cb6208..70a8644a276854b6e342f91ce00a0ebfaca98005 100644
--- a/spec/lib/gitlab/sidekiq_config_spec.rb
+++ b/spec/lib/gitlab/sidekiq_config_spec.rb
@@ -1,24 +1,38 @@
 require 'rails_helper'
 
 describe Gitlab::SidekiqConfig do
-  describe '.queues' do
-    let(:queues_file_path) { Rails.root.join('config', 'sidekiq_queues.yml') }
+  describe '.workers' do
+    it 'includes all workers' do
+      workers = described_class.workers
 
-    context 'without except argument' do
-      it 'returns all queues defined on config/sidekiq_queues.yml file' do
-        expected_queues = YAML.load_file(queues_file_path)[:queues].map { |queue, _| queue }
+      expect(workers).to include(PostReceive)
+      expect(workers).to include(MergeWorker)
+    end
+
+    it 'includes EE workers' do
+      workers = described_class.workers
+
+      expect(workers).to include(RepositoryUpdateMirrorWorker)
+      expect(workers).to include(LdapGroupSyncWorker)
+    end
+  end
+
+  describe '.worker_queues' do
+    it 'includes all queues' do
+      queues = described_class.worker_queues
 
-        expect(described_class.queues).to eq(expected_queues)
-      end
+      expect(queues).to include('post_receive')
+      expect(queues).to include('merge')
+      expect(queues).to include('cronjob')
+      expect(queues).to include('mailers')
+      expect(queues).to include('default')
     end
 
-    context 'with except argument' do
-      it 'returns queues on config/sidekiq_queues.yml filtering out excluded ones' do
-        expected_queues =
-          YAML.load_file(queues_file_path)[:queues].map { |queue, _| queue } - ['webhook']
+    it 'includes EE queues' do
+      queues = described_class.worker_queues
 
-        expect(described_class.queues(except: ['webhook'])).to eq(expected_queues)
-      end
+      expect(queues).to include('repository_update_mirror')
+      expect(queues).to include('ldap_group_sync')
     end
   end
 end
diff --git a/spec/workers/concerns/application_worker_spec.rb b/spec/workers/concerns/application_worker_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..fd434f5860239e7e9953f1aa06ae4a46932083ec
--- /dev/null
+++ b/spec/workers/concerns/application_worker_spec.rb
@@ -0,0 +1,27 @@
+require 'spec_helper'
+
+describe ApplicationWorker do
+  let(:worker) do
+    Class.new do
+      def self.name
+        'Gitlab::Foo::Bar::DummyWorker'
+      end
+
+      include ApplicationWorker
+    end
+  end
+
+  describe 'Sidekiq options' do
+    it 'sets the queue name based on the class name' do
+      expect(worker.sidekiq_options['queue']).to eq('foo_bar_dummy')
+    end
+  end
+
+  describe '.queue' do
+    it 'returns the queue name' do
+      worker.sidekiq_options queue: :some_queue
+
+      expect(worker.queue).to eq('some_queue')
+    end
+  end
+end
diff --git a/spec/workers/concerns/cluster_queue_spec.rb b/spec/workers/concerns/cluster_queue_spec.rb
index 1050651fa51c39d6fd2c56329ae5f418b8084647..5049886b55c73cf15093dff0f3609b954312ddb5 100644
--- a/spec/workers/concerns/cluster_queue_spec.rb
+++ b/spec/workers/concerns/cluster_queue_spec.rb
@@ -3,7 +3,11 @@
 describe ClusterQueue do
   let(:worker) do
     Class.new do
-      include Sidekiq::Worker
+      def self.name
+        'DummyWorker'
+      end
+
+      include ApplicationWorker
       include ClusterQueue
     end
   end
diff --git a/spec/workers/concerns/cronjob_queue_spec.rb b/spec/workers/concerns/cronjob_queue_spec.rb
index 5d1336c21a6b71c5def5d4ebab873cdddcfb05ae..3ae1c5f54d8eba0b8e83340a681b5b45bb2688ec 100644
--- a/spec/workers/concerns/cronjob_queue_spec.rb
+++ b/spec/workers/concerns/cronjob_queue_spec.rb
@@ -3,7 +3,11 @@
 describe CronjobQueue do
   let(:worker) do
     Class.new do
-      include Sidekiq::Worker
+      def self.name
+        'DummyWorker'
+      end
+
+      include ApplicationWorker
       include CronjobQueue
     end
   end
diff --git a/spec/workers/concerns/dedicated_sidekiq_queue_spec.rb b/spec/workers/concerns/dedicated_sidekiq_queue_spec.rb
deleted file mode 100644
index 512baec8b7e1de795f544fb75603a3b138a7e1a7..0000000000000000000000000000000000000000
--- a/spec/workers/concerns/dedicated_sidekiq_queue_spec.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-require 'spec_helper'
-
-describe DedicatedSidekiqQueue do
-  let(:worker) do
-    Class.new do
-      def self.name
-        'Foo::Bar::DummyWorker'
-      end
-
-      include Sidekiq::Worker
-      include DedicatedSidekiqQueue
-    end
-  end
-
-  describe 'queue names' do
-    it 'sets the queue name based on the class name' do
-      expect(worker.sidekiq_options['queue']).to eq('foo_bar_dummy')
-    end
-  end
-end
diff --git a/spec/workers/concerns/geo_queue_spec.rb b/spec/workers/concerns/geo_queue_spec.rb
index 58afe52d7d2a3757e81711955000a51d3310d464..3be916e28c983a61e222bb7ce286ad0886862564 100644
--- a/spec/workers/concerns/geo_queue_spec.rb
+++ b/spec/workers/concerns/geo_queue_spec.rb
@@ -3,7 +3,11 @@
 describe GeoQueue do
   let(:worker) do
     Class.new do
-      include Sidekiq::Worker
+      def self.name
+        'DummyWorker'
+      end
+
+      include ApplicationWorker
       include GeoQueue
     end
   end
diff --git a/spec/workers/concerns/gitlab/github_import/object_importer_spec.rb b/spec/workers/concerns/gitlab/github_import/object_importer_spec.rb
index 3ccf06f2d7d11b8e26b5003025271955d5acb372..68cfe9d5545eed4540e72b90c6f57630fba2149a 100644
--- a/spec/workers/concerns/gitlab/github_import/object_importer_spec.rb
+++ b/spec/workers/concerns/gitlab/github_import/object_importer_spec.rb
@@ -3,6 +3,10 @@
 describe Gitlab::GithubImport::ObjectImporter do
   let(:worker) do
     Class.new do
+      def self.name
+        'DummyWorker'
+      end
+
       include(Gitlab::GithubImport::ObjectImporter)
 
       def counter_name
diff --git a/spec/workers/concerns/gitlab/github_import/queue_spec.rb b/spec/workers/concerns/gitlab/github_import/queue_spec.rb
index 321ae3fe9787762d6e0c047b71c3c5d333dac2a7..9c69ee32da1d9fff8c3a7f6237d1203bb2895dcc 100644
--- a/spec/workers/concerns/gitlab/github_import/queue_spec.rb
+++ b/spec/workers/concerns/gitlab/github_import/queue_spec.rb
@@ -3,7 +3,11 @@
 describe Gitlab::GithubImport::Queue do
   it 'sets the Sidekiq options for the worker' do
     worker = Class.new do
-      include Sidekiq::Worker
+      def self.name
+        'DummyWorker'
+      end
+
+      include ApplicationWorker
       include Gitlab::GithubImport::Queue
     end
 
diff --git a/spec/workers/concerns/pipeline_queue_spec.rb b/spec/workers/concerns/pipeline_queue_spec.rb
index eac5a770e5fc4d022aed59872cbcbae62df5737c..dd91176094813ea8fb5e286d83f97794d49b750c 100644
--- a/spec/workers/concerns/pipeline_queue_spec.rb
+++ b/spec/workers/concerns/pipeline_queue_spec.rb
@@ -3,7 +3,11 @@
 describe PipelineQueue do
   let(:worker) do
     Class.new do
-      include Sidekiq::Worker
+      def self.name
+        'DummyWorker'
+      end
+
+      include ApplicationWorker
       include PipelineQueue
     end
   end
diff --git a/spec/workers/concerns/repository_check_queue_spec.rb b/spec/workers/concerns/repository_check_queue_spec.rb
index 8868e9698293a82ed2162cf06261db4cca1189c8..fdbbfcc90a59bbdfa366ec24c6ff182f573b3564 100644
--- a/spec/workers/concerns/repository_check_queue_spec.rb
+++ b/spec/workers/concerns/repository_check_queue_spec.rb
@@ -3,7 +3,11 @@
 describe RepositoryCheckQueue do
   let(:worker) do
     Class.new do
-      include Sidekiq::Worker
+      def self.name
+        'DummyWorker'
+      end
+
+      include ApplicationWorker
       include RepositoryCheckQueue
     end
   end
diff --git a/spec/workers/every_sidekiq_worker_spec.rb b/spec/workers/every_sidekiq_worker_spec.rb
index 009bdd24383f42ef67da48566d1f9829a0cff10e..7ee0a51a263d5bb07b64881be433fe3065def340 100644
--- a/spec/workers/every_sidekiq_worker_spec.rb
+++ b/spec/workers/every_sidekiq_worker_spec.rb
@@ -1,45 +1,21 @@
 require 'spec_helper'
 
 describe 'Every Sidekiq worker' do
-  let(:workers) do
-    root = Rails.root.join('app', 'workers')
-    concerns = root.join('concerns').to_s
-    ee_modules = root.join('ee').to_s
-
-    workers = Dir[root.join('**', '*.rb')]
-      .reject { |path| path.start_with?(concerns, ee_modules) }
-
-    workers.map do |path|
-      ns = Pathname.new(path).relative_path_from(root).to_s.gsub('.rb', '')
-
-      ns.camelize.constantize
-    end
+  it 'includes ApplicationWorker' do
+    expect(Gitlab::SidekiqConfig.workers).to all(include(ApplicationWorker))
   end
 
   it 'does not use the default queue' do
-    workers.each do |worker|
-      expect(worker.sidekiq_options['queue'].to_s).not_to eq('default')
-    end
+    expect(Gitlab::SidekiqConfig.workers.map(&:queue)).not_to include('default')
   end
 
   it 'uses the cronjob queue when the worker runs as a cronjob' do
-    cron_workers = Settings.cron_jobs
-      .map { |job_name, options| options['job_class'].constantize }
-      .to_set
-
-    workers.each do |worker|
-      next unless cron_workers.include?(worker)
-
-      expect(worker.sidekiq_options['queue'].to_s).to eq('cronjob')
-    end
+    expect(Gitlab::SidekiqConfig.cron_workers.map(&:queue)).to all(eq('cronjob'))
   end
 
   it 'defines the queue in the Sidekiq configuration file' do
-    config = YAML.load_file(Rails.root.join('config', 'sidekiq_queues.yml').to_s)
-    queue_names = config[:queues].map { |(queue, _)| queue }.to_set
+    config_queue_names = Gitlab::SidekiqConfig.config_queues.to_set
 
-    workers.each do |worker|
-      expect(queue_names).to include(worker.sidekiq_options['queue'].to_s)
-    end
+    expect(Gitlab::SidekiqConfig.worker_queues).to all(be_in(config_queue_names))
   end
 end