diff --git a/.gitlab/ci/gitlab-gems.gitlab-ci.yml b/.gitlab/ci/gitlab-gems.gitlab-ci.yml
index eb0c8b8536e8de7ff5e736dd6b6241e7e03565bd..aa3fff804ba626b2b211a5d250272d34a962ffc8 100644
--- a/.gitlab/ci/gitlab-gems.gitlab-ci.yml
+++ b/.gitlab/ci/gitlab-gems.gitlab-ci.yml
@@ -5,6 +5,9 @@ include:
   - local: .gitlab/ci/templates/gem.gitlab-ci.yml
     inputs:
       gem_name: "click_house-client"
+  - local: .gitlab/ci/templates/gem.gitlab-ci.yml
+    inputs:
+      gem_name: "error_tracking_open_api"
   - local: .gitlab/ci/templates/gem.gitlab-ci.yml
     inputs:
       gem_name: "gitlab-rspec"
diff --git a/.gitlab/ci/templates/gem.gitlab-ci.yml b/.gitlab/ci/templates/gem.gitlab-ci.yml
index 46c5e1342c6f5643aa3322d0ee206e00c14d5600..3e19019a4640dcc7ea750bc266bf11e9de2a7641 100644
--- a/.gitlab/ci/templates/gem.gitlab-ci.yml
+++ b/.gitlab/ci/templates/gem.gitlab-ci.yml
@@ -15,12 +15,15 @@ spec:
       changes:
         - "$[[inputs.gem_path_prefix]]$[[inputs.gem_name]]/**/*"
         - ".gitlab/ci/gitlab-gems.gitlab-ci.yml"
+        - ".gitlab/ci/vendored-gems.gitlab-ci.yml"
         - ".gitlab/ci/templates/gem.gitlab-ci.yml"
         - "gems/gem.gitlab-ci.yml"
 
 gems $[[inputs.gem_name]]:
   extends: ".gems:rules:$[[inputs.gem_name]]"
   needs: []
+  rules:
+    - exists: ["$[[inputs.gem_path_prefix]]$[[inputs.gem_name]]/.gitlab-ci.yml"]
   trigger:
     include: "$[[inputs.gem_path_prefix]]$[[inputs.gem_name]]/.gitlab-ci.yml"
     strategy: depend
diff --git a/Gemfile b/Gemfile
index 360a5616473eae56fc719c91c22375bb7b61f29b..f9111ae835653968b5e601dd701ce7739a6e04c9 100644
--- a/Gemfile
+++ b/Gemfile
@@ -599,7 +599,7 @@ gem 'ed25519', '~> 1.3.0'
 
 # Error Tracking OpenAPI client
 # See https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/development/rake_tasks.md#update-openapi-client-for-error-tracking-feature
-gem 'error_tracking_open_api', path: 'vendor/gems/error_tracking_open_api'
+gem 'error_tracking_open_api', path: 'gems/error_tracking_open_api'
 
 # Vulnerability advisories
 gem 'cvss-suite', '~> 3.0.1', require: 'cvss_suite'
diff --git a/Gemfile.lock b/Gemfile.lock
index 2039418605b58a4826f8c19ca0b2136d389e2269..d6c6f8c8a7c8d01d126edb7f1560cd6d94f41d84 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -12,6 +12,12 @@ PATH
       addressable (~> 2.8)
       json (~> 2.6.3)
 
+PATH
+  remote: gems/error_tracking_open_api
+  specs:
+    error_tracking_open_api (1.0.0)
+      typhoeus (~> 1.0, >= 1.0.1)
+
 PATH
   remote: gems/gitlab-rspec
   specs:
@@ -78,12 +84,6 @@ PATH
       devise (~> 4.0)
       devise-two-factor (~> 4.0)
 
-PATH
-  remote: vendor/gems/error_tracking_open_api
-  specs:
-    error_tracking_open_api (1.0.0)
-      typhoeus (~> 1.0, >= 1.0.1)
-
 PATH
   remote: vendor/gems/mail-smtp_pool
   specs:
diff --git a/doc/development/rake_tasks.md b/doc/development/rake_tasks.md
index 0305cbf25b484f17c0c9a39740afd6691aa81130..e8ac8e58dd832843ddcf4c21da9a14ebfc2cb56a 100644
--- a/doc/development/rake_tasks.md
+++ b/doc/development/rake_tasks.md
@@ -526,7 +526,7 @@ NOTE:
 This Rake task needs `docker` to be installed.
 
 To update generated code for OpenAPI client located in
-`vendor/gems/error_tracking_open_api` run the following commands:
+`gems/error_tracking_open_api` run the following commands:
 
 ```shell
 # Run rake task
@@ -535,7 +535,7 @@ bundle exec rake gems:error_tracking_open_api:generate
 # Review and test the changes
 
 # Commit the changes
-git commit -m 'Update ErrorTrackingOpenAPI from OpenAPI definition' vendor/gems/error_tracking_open_api
+git commit -m 'Update ErrorTrackingOpenAPI from OpenAPI definition' gems/error_tracking_open_api
 ```
 
 ## Update banned SSH keys
diff --git a/vendor/gems/error_tracking_open_api/.gitignore b/gems/error_tracking_open_api/.gitignore
similarity index 100%
rename from vendor/gems/error_tracking_open_api/.gitignore
rename to gems/error_tracking_open_api/.gitignore
diff --git a/vendor/gems/error_tracking_open_api/.openapi-generator-ignore b/gems/error_tracking_open_api/.openapi-generator-ignore
similarity index 100%
rename from vendor/gems/error_tracking_open_api/.openapi-generator-ignore
rename to gems/error_tracking_open_api/.openapi-generator-ignore
diff --git a/vendor/gems/error_tracking_open_api/.openapi-generator/FILES b/gems/error_tracking_open_api/.openapi-generator/FILES
similarity index 100%
rename from vendor/gems/error_tracking_open_api/.openapi-generator/FILES
rename to gems/error_tracking_open_api/.openapi-generator/FILES
diff --git a/vendor/gems/error_tracking_open_api/.openapi-generator/VERSION b/gems/error_tracking_open_api/.openapi-generator/VERSION
similarity index 100%
rename from vendor/gems/error_tracking_open_api/.openapi-generator/VERSION
rename to gems/error_tracking_open_api/.openapi-generator/VERSION
diff --git a/vendor/gems/error_tracking_open_api/LICENSE b/gems/error_tracking_open_api/LICENSE
similarity index 100%
rename from vendor/gems/error_tracking_open_api/LICENSE
rename to gems/error_tracking_open_api/LICENSE
diff --git a/vendor/gems/error_tracking_open_api/README.md b/gems/error_tracking_open_api/README.md
similarity index 99%
rename from vendor/gems/error_tracking_open_api/README.md
rename to gems/error_tracking_open_api/README.md
index 7591f0eb38a0cdcfb782fe120361a574c121fa12..2b5d66e59c1825a4ebd1d97671bf557d5613b91a 100644
--- a/vendor/gems/error_tracking_open_api/README.md
+++ b/gems/error_tracking_open_api/README.md
@@ -1,4 +1,4 @@
-# Generated by `rake gems:error_tracking_open_api:generate` on 2023-06-08
+# Generated by `rake gems:error_tracking_open_api:generate` on 2023-07-13
 
 See https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/development/rake_tasks.md#update-openapi-client-for-error-tracking-feature
 
diff --git a/vendor/gems/error_tracking_open_api/Rakefile b/gems/error_tracking_open_api/Rakefile
similarity index 100%
rename from vendor/gems/error_tracking_open_api/Rakefile
rename to gems/error_tracking_open_api/Rakefile
diff --git a/vendor/gems/error_tracking_open_api/docs/Error.md b/gems/error_tracking_open_api/docs/Error.md
similarity index 100%
rename from vendor/gems/error_tracking_open_api/docs/Error.md
rename to gems/error_tracking_open_api/docs/Error.md
diff --git a/vendor/gems/error_tracking_open_api/docs/ErrorEvent.md b/gems/error_tracking_open_api/docs/ErrorEvent.md
similarity index 100%
rename from vendor/gems/error_tracking_open_api/docs/ErrorEvent.md
rename to gems/error_tracking_open_api/docs/ErrorEvent.md
diff --git a/vendor/gems/error_tracking_open_api/docs/ErrorStats.md b/gems/error_tracking_open_api/docs/ErrorStats.md
similarity index 100%
rename from vendor/gems/error_tracking_open_api/docs/ErrorStats.md
rename to gems/error_tracking_open_api/docs/ErrorStats.md
diff --git a/vendor/gems/error_tracking_open_api/docs/ErrorUpdatePayload.md b/gems/error_tracking_open_api/docs/ErrorUpdatePayload.md
similarity index 100%
rename from vendor/gems/error_tracking_open_api/docs/ErrorUpdatePayload.md
rename to gems/error_tracking_open_api/docs/ErrorUpdatePayload.md
diff --git a/vendor/gems/error_tracking_open_api/docs/ErrorV2.md b/gems/error_tracking_open_api/docs/ErrorV2.md
similarity index 100%
rename from vendor/gems/error_tracking_open_api/docs/ErrorV2.md
rename to gems/error_tracking_open_api/docs/ErrorV2.md
diff --git a/vendor/gems/error_tracking_open_api/docs/ErrorsApi.md b/gems/error_tracking_open_api/docs/ErrorsApi.md
similarity index 100%
rename from vendor/gems/error_tracking_open_api/docs/ErrorsApi.md
rename to gems/error_tracking_open_api/docs/ErrorsApi.md
diff --git a/vendor/gems/error_tracking_open_api/docs/ErrorsV2Api.md b/gems/error_tracking_open_api/docs/ErrorsV2Api.md
similarity index 100%
rename from vendor/gems/error_tracking_open_api/docs/ErrorsV2Api.md
rename to gems/error_tracking_open_api/docs/ErrorsV2Api.md
diff --git a/vendor/gems/error_tracking_open_api/docs/EventsApi.md b/gems/error_tracking_open_api/docs/EventsApi.md
similarity index 100%
rename from vendor/gems/error_tracking_open_api/docs/EventsApi.md
rename to gems/error_tracking_open_api/docs/EventsApi.md
diff --git a/vendor/gems/error_tracking_open_api/docs/MessageEvent.md b/gems/error_tracking_open_api/docs/MessageEvent.md
similarity index 100%
rename from vendor/gems/error_tracking_open_api/docs/MessageEvent.md
rename to gems/error_tracking_open_api/docs/MessageEvent.md
diff --git a/vendor/gems/error_tracking_open_api/docs/MessagesApi.md b/gems/error_tracking_open_api/docs/MessagesApi.md
similarity index 100%
rename from vendor/gems/error_tracking_open_api/docs/MessagesApi.md
rename to gems/error_tracking_open_api/docs/MessagesApi.md
diff --git a/vendor/gems/error_tracking_open_api/docs/Project.md b/gems/error_tracking_open_api/docs/Project.md
similarity index 100%
rename from vendor/gems/error_tracking_open_api/docs/Project.md
rename to gems/error_tracking_open_api/docs/Project.md
diff --git a/vendor/gems/error_tracking_open_api/docs/ProjectsApi.md b/gems/error_tracking_open_api/docs/ProjectsApi.md
similarity index 100%
rename from vendor/gems/error_tracking_open_api/docs/ProjectsApi.md
rename to gems/error_tracking_open_api/docs/ProjectsApi.md
diff --git a/vendor/gems/error_tracking_open_api/docs/StatsObject.md b/gems/error_tracking_open_api/docs/StatsObject.md
similarity index 100%
rename from vendor/gems/error_tracking_open_api/docs/StatsObject.md
rename to gems/error_tracking_open_api/docs/StatsObject.md
diff --git a/vendor/gems/error_tracking_open_api/docs/StatsObjectGroupInner.md b/gems/error_tracking_open_api/docs/StatsObjectGroupInner.md
similarity index 100%
rename from vendor/gems/error_tracking_open_api/docs/StatsObjectGroupInner.md
rename to gems/error_tracking_open_api/docs/StatsObjectGroupInner.md
diff --git a/vendor/gems/error_tracking_open_api/error_tracking_open_api.gemspec b/gems/error_tracking_open_api/error_tracking_open_api.gemspec
similarity index 94%
rename from vendor/gems/error_tracking_open_api/error_tracking_open_api.gemspec
rename to gems/error_tracking_open_api/error_tracking_open_api.gemspec
index 1eed64d49adae8da6de18fe74345a90f61e2ec15..405b5ae94c0f5b78b2a5c9bdee3b218154a7d854 100644
--- a/vendor/gems/error_tracking_open_api/error_tracking_open_api.gemspec
+++ b/gems/error_tracking_open_api/error_tracking_open_api.gemspec
@@ -29,7 +29,7 @@ Gem::Specification.new do |s|
 
   s.add_runtime_dependency 'typhoeus', '~> 1.0', '>= 1.0.1'
 
-  s.add_development_dependency 'rspec', '~> 3.6', '>= 3.6.0'
+
 
   s.files         = Dir.glob("lib/**/*")
   s.test_files    = []
diff --git a/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api.rb b/gems/error_tracking_open_api/lib/error_tracking_open_api.rb
similarity index 100%
rename from vendor/gems/error_tracking_open_api/lib/error_tracking_open_api.rb
rename to gems/error_tracking_open_api/lib/error_tracking_open_api.rb
diff --git a/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/api/errors_api.rb b/gems/error_tracking_open_api/lib/error_tracking_open_api/api/errors_api.rb
similarity index 100%
rename from vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/api/errors_api.rb
rename to gems/error_tracking_open_api/lib/error_tracking_open_api/api/errors_api.rb
diff --git a/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/api/errors_v2_api.rb b/gems/error_tracking_open_api/lib/error_tracking_open_api/api/errors_v2_api.rb
similarity index 100%
rename from vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/api/errors_v2_api.rb
rename to gems/error_tracking_open_api/lib/error_tracking_open_api/api/errors_v2_api.rb
diff --git a/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/api/events_api.rb b/gems/error_tracking_open_api/lib/error_tracking_open_api/api/events_api.rb
similarity index 100%
rename from vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/api/events_api.rb
rename to gems/error_tracking_open_api/lib/error_tracking_open_api/api/events_api.rb
diff --git a/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/api/messages_api.rb b/gems/error_tracking_open_api/lib/error_tracking_open_api/api/messages_api.rb
similarity index 100%
rename from vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/api/messages_api.rb
rename to gems/error_tracking_open_api/lib/error_tracking_open_api/api/messages_api.rb
diff --git a/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/api/projects_api.rb b/gems/error_tracking_open_api/lib/error_tracking_open_api/api/projects_api.rb
similarity index 100%
rename from vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/api/projects_api.rb
rename to gems/error_tracking_open_api/lib/error_tracking_open_api/api/projects_api.rb
diff --git a/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/api_client.rb b/gems/error_tracking_open_api/lib/error_tracking_open_api/api_client.rb
similarity index 100%
rename from vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/api_client.rb
rename to gems/error_tracking_open_api/lib/error_tracking_open_api/api_client.rb
diff --git a/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/api_error.rb b/gems/error_tracking_open_api/lib/error_tracking_open_api/api_error.rb
similarity index 100%
rename from vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/api_error.rb
rename to gems/error_tracking_open_api/lib/error_tracking_open_api/api_error.rb
diff --git a/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/configuration.rb b/gems/error_tracking_open_api/lib/error_tracking_open_api/configuration.rb
similarity index 100%
rename from vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/configuration.rb
rename to gems/error_tracking_open_api/lib/error_tracking_open_api/configuration.rb
diff --git a/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/models/error.rb b/gems/error_tracking_open_api/lib/error_tracking_open_api/models/error.rb
similarity index 100%
rename from vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/models/error.rb
rename to gems/error_tracking_open_api/lib/error_tracking_open_api/models/error.rb
diff --git a/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/models/error_event.rb b/gems/error_tracking_open_api/lib/error_tracking_open_api/models/error_event.rb
similarity index 100%
rename from vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/models/error_event.rb
rename to gems/error_tracking_open_api/lib/error_tracking_open_api/models/error_event.rb
diff --git a/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/models/error_stats.rb b/gems/error_tracking_open_api/lib/error_tracking_open_api/models/error_stats.rb
similarity index 100%
rename from vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/models/error_stats.rb
rename to gems/error_tracking_open_api/lib/error_tracking_open_api/models/error_stats.rb
diff --git a/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/models/error_update_payload.rb b/gems/error_tracking_open_api/lib/error_tracking_open_api/models/error_update_payload.rb
similarity index 100%
rename from vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/models/error_update_payload.rb
rename to gems/error_tracking_open_api/lib/error_tracking_open_api/models/error_update_payload.rb
diff --git a/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/models/error_v2.rb b/gems/error_tracking_open_api/lib/error_tracking_open_api/models/error_v2.rb
similarity index 100%
rename from vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/models/error_v2.rb
rename to gems/error_tracking_open_api/lib/error_tracking_open_api/models/error_v2.rb
diff --git a/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/models/message_event.rb b/gems/error_tracking_open_api/lib/error_tracking_open_api/models/message_event.rb
similarity index 100%
rename from vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/models/message_event.rb
rename to gems/error_tracking_open_api/lib/error_tracking_open_api/models/message_event.rb
diff --git a/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/models/project.rb b/gems/error_tracking_open_api/lib/error_tracking_open_api/models/project.rb
similarity index 100%
rename from vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/models/project.rb
rename to gems/error_tracking_open_api/lib/error_tracking_open_api/models/project.rb
diff --git a/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/models/stats_object.rb b/gems/error_tracking_open_api/lib/error_tracking_open_api/models/stats_object.rb
similarity index 100%
rename from vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/models/stats_object.rb
rename to gems/error_tracking_open_api/lib/error_tracking_open_api/models/stats_object.rb
diff --git a/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/models/stats_object_group_inner.rb b/gems/error_tracking_open_api/lib/error_tracking_open_api/models/stats_object_group_inner.rb
similarity index 100%
rename from vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/models/stats_object_group_inner.rb
rename to gems/error_tracking_open_api/lib/error_tracking_open_api/models/stats_object_group_inner.rb
diff --git a/vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/version.rb b/gems/error_tracking_open_api/lib/error_tracking_open_api/version.rb
similarity index 100%
rename from vendor/gems/error_tracking_open_api/lib/error_tracking_open_api/version.rb
rename to gems/error_tracking_open_api/lib/error_tracking_open_api/version.rb
diff --git a/lib/tasks/gems.rake b/lib/tasks/gems.rake
index fc70048ea6da59b39a38651a20f5c091fe3cc371..0c4cbbfe3f8984892688fa373df271dd74640128 100644
--- a/lib/tasks/gems.rake
+++ b/lib/tasks/gems.rake
@@ -29,7 +29,7 @@ namespace :gems do
     end
 
     def root_directory
-      File.expand_path('../../vendor/gems', __dir__)
+      File.expand_path('../../gems', __dir__)
     end
 
     def generate_gem(vendor_gem_dir:, api_url:, gem_name:, module_name:, docker_image:)
@@ -53,14 +53,18 @@ namespace :gems do
       write_file(gem_dir / 'LICENSE', license)
       write_file(gem_dir / "#{gem_name}.gemspec") do |content|
         replace_string(content, 'Unlicense', 'MIT')
+        replace_string(content, /.*add_development_dependency 'rspec'.*/, '')
         replace_string(content, /(\.files\s*=).*/, '\1 Dir.glob("lib/**/*")')
         replace_string(content, /(\.test_files\s*=).*/, '\1 []')
       end
 
+      # This is gem is supposed to be generated. No developer should change code.
       remove_entry_secure(gem_dir / 'Gemfile')
+      # The generated code doesn't align well with `gitlab-styles` configuration.
       remove_entry_secure(gem_dir / '.rubocop.yml')
       remove_entry_secure(gem_dir / '.travis.yml')
       remove_entry_secure(gem_dir / 'git_push.sh')
+      # The RSpec examples are stubs and have no value.
       remove_entry_secure(gem_dir / 'spec')
       remove_entry_secure(gem_dir / '.rspec')
     end
@@ -78,14 +82,16 @@ namespace :gems do
     end
 
     def readme_banner(task)
-      # rubocop:disable Rails/TimeZone
       <<~BANNER
-        # Generated by `rake #{task.name}` on #{Time.now.strftime('%Y-%m-%d')}
+        # #{generated_by(task)}
 
         See https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/development/rake_tasks.md#update-openapi-client-for-error-tracking-feature
 
       BANNER
-      # rubocop:enable Rails/TimeZone
+    end
+
+    def generated_by(task)
+      "Generated by `rake #{task.name}` on #{Time.now.strftime('%Y-%m-%d')}" # rubocop:disable Rails/TimeZone
     end
 
     def license