diff --git a/spec/lib/plugin/instance_spec.rb b/spec/lib/plugin/instance_spec.rb
index de983da141e..ce202acb5a8 100644
--- a/spec/lib/plugin/instance_spec.rb
+++ b/spec/lib/plugin/instance_spec.rb
@@ -243,8 +243,7 @@ RSpec.describe Plugin::Instance do
     end
 
     it "can activate plugins correctly" do
-      plugin = Plugin::Instance.new
-      plugin.path = "#{Rails.root}/spec/fixtures/plugins/my_plugin/plugin.rb"
+      plugin = plugin_from_fixtures("my_plugin")
       junk_file = "#{plugin.auto_generated_path}/junk"
 
       plugin.ensure_directory(junk_file)
@@ -260,8 +259,7 @@ RSpec.describe Plugin::Instance do
     end
 
     it "registers auth providers correctly" do
-      plugin = Plugin::Instance.new
-      plugin.path = "#{Rails.root}/spec/fixtures/plugins/my_plugin/plugin.rb"
+      plugin = plugin_from_fixtures("my_plugin")
       plugin.activate!
       expect(DiscoursePluginRegistry.auth_providers.count).to eq(0)
       plugin.notify_before_auth
@@ -271,8 +269,7 @@ RSpec.describe Plugin::Instance do
     end
 
     it "finds all the custom assets" do
-      plugin = Plugin::Instance.new
-      plugin.path = "#{Rails.root}/spec/fixtures/plugins/my_plugin/plugin.rb"
+      plugin = plugin_from_fixtures("my_plugin")
 
       plugin.register_asset("test.css")
       plugin.register_asset("test2.scss")
@@ -397,8 +394,8 @@ RSpec.describe Plugin::Instance do
   end
 
   describe "locales" do
-    let(:plugin_path) { "#{Rails.root}/spec/fixtures/plugins/custom_locales" }
-    let!(:plugin) { Plugin::Instance.new(nil, "#{plugin_path}/plugin.rb") }
+    let!(:plugin) { plugin_from_fixtures("custom_locales") }
+    let(:plugin_path) { File.dirname(plugin.path) }
     let(:plural) do
       {
         keys: %i[one few other],
diff --git a/spec/lib/stylesheet/compiler_spec.rb b/spec/lib/stylesheet/compiler_spec.rb
index 753c54a3104..c6902eb1757 100644
--- a/spec/lib/stylesheet/compiler_spec.rb
+++ b/spec/lib/stylesheet/compiler_spec.rb
@@ -56,15 +56,13 @@ RSpec.describe Stylesheet::Compiler do
 
     context "with a plugin" do
       let :plugin1 do
-        plugin1 = Plugin::Instance.new
-        plugin1.path = "#{Rails.root}/spec/fixtures/plugins/my_plugin/plugin.rb"
+        plugin1 = plugin_from_fixtures("my_plugin")
         plugin1.register_css "body { background: $primary }"
         plugin1
       end
 
       let :plugin2 do
-        plugin2 = Plugin::Instance.new
-        plugin2.path = "#{Rails.root}/spec/fixtures/plugins/scss_plugin/plugin.rb"
+        plugin2 = plugin_from_fixtures("scss_plugin")
         plugin2
       end
 
@@ -183,8 +181,7 @@ RSpec.describe Stylesheet::Compiler do
 
     context "with a plugin" do
       before do
-        plugin = Plugin::Instance.new
-        plugin.path = "#{Rails.root}/spec/fixtures/plugins/color_definition/plugin.rb"
+        plugin = plugin_from_fixtures("color_definition")
         Discourse.plugins << plugin
         plugin.activate!
       end
diff --git a/spec/lib/stylesheet/manager_spec.rb b/spec/lib/stylesheet/manager_spec.rb
index 433f99decbe..b63cbdad9d0 100644
--- a/spec/lib/stylesheet/manager_spec.rb
+++ b/spec/lib/stylesheet/manager_spec.rb
@@ -1014,15 +1014,13 @@ RSpec.describe Stylesheet::Manager do
 
     context "when there are enabled plugins" do
       let(:plugin1) do
-        plugin1 = Plugin::Instance.new
-        plugin1.path = "#{Rails.root}/spec/fixtures/plugins/my_plugin/plugin.rb"
+        plugin1 = plugin_from_fixtures("my_plugin")
         plugin1.register_css "body { padding: 1px 2px 3px 4px; }"
         plugin1
       end
 
       let(:plugin2) do
-        plugin2 = Plugin::Instance.new
-        plugin2.path = "#{Rails.root}/spec/fixtures/plugins/scss_plugin/plugin.rb"
+        plugin2 = plugin_from_fixtures("scss_plugin")
         plugin2
       end
 
diff --git a/spec/lib/svg_sprite/svg_sprite_spec.rb b/spec/lib/svg_sprite/svg_sprite_spec.rb
index e657921f900..e928280b7c1 100644
--- a/spec/lib/svg_sprite/svg_sprite_spec.rb
+++ b/spec/lib/svg_sprite/svg_sprite_spec.rb
@@ -238,8 +238,7 @@ RSpec.describe SvgSprite do
 
     context "with a plugin" do
       let :plugin1 do
-        plugin1 = Plugin::Instance.new
-        plugin1.path = "#{Rails.root}/spec/fixtures/plugins/my_plugin/plugin.rb"
+        plugin1 = plugin_from_fixtures("my_plugin")
         plugin1
       end
 
diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb
index 69665d0bbd0..086c068a88e 100644
--- a/spec/rails_helper.rb
+++ b/spec/rails_helper.rb
@@ -346,7 +346,7 @@ RSpec.configure do |config|
   end
 
   config.after(:suite) do
-    FileUtils.remove_dir(file_from_fixtures_tmp_folder, true) if SpecSecureRandom.value
+    FileUtils.remove_dir(concurrency_safe_tmp_dir, true) if SpecSecureRandom.value
   end
 
   config.before :each, &TestSetup.method(:test_setup)
@@ -559,15 +559,27 @@ def unfreeze_time
 end
 
 def file_from_fixtures(filename, directory = "images")
-  SpecSecureRandom.value ||= SecureRandom.hex
-  FileUtils.mkdir_p(file_from_fixtures_tmp_folder) unless Dir.exist?(file_from_fixtures_tmp_folder)
-  tmp_file_path = File.join(file_from_fixtures_tmp_folder, SecureRandom.hex << filename)
+  tmp_file_path = File.join(concurrency_safe_tmp_dir, SecureRandom.hex << filename)
   FileUtils.cp("#{Rails.root}/spec/fixtures/#{directory}/#{filename}", tmp_file_path)
   File.new(tmp_file_path)
 end
 
-def file_from_fixtures_tmp_folder
-  File.join(Dir.tmpdir, "rspec_#{Process.pid}_#{SpecSecureRandom.value}")
+def plugin_from_fixtures(plugin_name)
+  tmp_plugins_dir = File.join(concurrency_safe_tmp_dir, "plugins")
+
+  FileUtils.mkdir(tmp_plugins_dir) if !Dir.exist?(tmp_plugins_dir)
+  FileUtils.cp_r("#{Rails.root}/spec/fixtures/plugins/#{plugin_name}", tmp_plugins_dir)
+
+  plugin = Plugin::Instance.new
+  plugin.path = File.join(tmp_plugins_dir, plugin_name, "plugin.rb")
+  plugin
+end
+
+def concurrency_safe_tmp_dir
+  SpecSecureRandom.value ||= SecureRandom.hex
+  dir_path = File.join(Dir.tmpdir, "rspec_#{Process.pid}_#{SpecSecureRandom.value}")
+  FileUtils.mkdir_p(dir_path) unless Dir.exist?(dir_path)
+  dir_path
 end
 
 def has_trigger?(trigger_name)
diff --git a/spec/requests/bootstrap_controller_spec.rb b/spec/requests/bootstrap_controller_spec.rb
index 194fc15659c..e229f47f866 100644
--- a/spec/requests/bootstrap_controller_spec.rb
+++ b/spec/requests/bootstrap_controller_spec.rb
@@ -93,8 +93,7 @@ RSpec.describe BootstrapController do
 
   context "with a plugin asset filter" do
     let :plugin do
-      plugin = Plugin::Instance.new
-      plugin.path = "#{Rails.root}/spec/fixtures/plugins/my_plugin/plugin.rb"
+      plugin = plugin_from_fixtures("my_plugin")
       plugin.register_asset_filter do |type, request|
         next true if request.path == "/mypluginroute"
         false
diff --git a/spec/requests/stylesheets_controller_spec.rb b/spec/requests/stylesheets_controller_spec.rb
index 38a03e4706d..ffaf9e8e3cc 100644
--- a/spec/requests/stylesheets_controller_spec.rb
+++ b/spec/requests/stylesheets_controller_spec.rb
@@ -64,8 +64,7 @@ RSpec.describe StylesheetsController do
     fab!(:user) { Fabricate(:user) }
 
     let(:plugin) do
-      plugin = Plugin::Instance.new
-      plugin.path = "#{Rails.root}/spec/fixtures/plugins/my_plugin/plugin.rb"
+      plugin = plugin_from_fixtures("my_plugin")
       plugin.register_css "body { padding: 1px 2px 3px 4px; }"
       plugin
     end