Add Vue 3 rollout flag for the Kubernetes cluster pages
Adds the vue3_migrate_clusters feature flag and a vue3_migration.yml for 13
Kubernetes cluster page entrypoints. This opts them into the Vue 3 migration
with Option 1. The bundler builds both a Vue 2 and a Vue 3 chunk. Rails serves
the Vue 3 chunk only when the flag is on. The flag is default-off.
Scope
This covers 13 of the 16 cluster entrypoints. The three */clusters/destroy
bundles are excluded. That action only redirects and never renders HTML, so
those bundles can never load. A companion merge request removes them.
Most of these pages sit behind the certificate_based_clusters ops flag, which
defaults to off. Every admin/clusters page returns 404 while it is off. The
exception is the agent tab on */clusters/index, which always renders and is
linked from three sidebars. Grouping the deprecated pages under the same flag
stops them being stranded on Vue 2 when the certificate flag is removed.
Risk
~/clusters/clusters_bundle.js:104 mounts with the raw new Vue({ el, ... })
constructor instead of initVueApp. That root carries no
data-gitlab-vue3-app marker, so a silent fallback to Vue 2 there is
invisible. It needs a manual check before the flag is ramped.
Verification
bundle exec rspec spec/lib/gitlab/vue3_migration_files_spec.rb— 1161 examples, 0 failures (after rebase onto master, 2026-09-10)node scripts/frontend/vue3_migration_stats.mjs --ownersreports 13 entrypoints undervue3_migrate_clusters
Local verification
A temporary feature spec loaded each page with vue3_migrate_clusters stubbed on. It asserted that the page HTML included a <script> whose src contains the .vue3.js entrypoint, and, where the page mounts with initVueApp, that a [data-gitlab-vue3-app] element exists. Then it saved a screenshot.
| Page | Entrypoint served | Vue 3 root marker |
|---|---|---|
| Project clusters index (agents tab) | pages.projects.clusters.index.vue3.js |
ClustersMainViewRoot |
| Project certificate cluster show (Details tab) | pages.projects.clusters.show.vue3.js |
None. clusters_bundle.js mounts with the raw Vue constructor, so no marker is stamped. The details form rendered. |
![]() |
![]() |

