Draft: [Do not merge] Stress test: promote every page entry to Vue 3 rollout
What does this MR do and why?
Do not merge. This MR stays open on purpose. It simulates the state of the codebase after every team has finished its Vue 3 migration, and shows how the CI pipeline fares in that state.
The Vue 3 dual compilation builds a second copy of every module reachable from a page entry whose vue3_migration.yml has status: rollout. Feature flags without a persisted value are enabled in RSpec, so the rspec system and frontend-fixture jobs render every page in the Vue 3 realm. Failures in those jobs show which pages are not ready for Vue 3 yet.
Since 2026-10-08 this MR is stacked on !260635 (merged). That MR makes a Vue 3 app or component fail in development and test builds when it gets an apolloProvider, router, store or apollo option before the matching Vue.use() ran. With every page on Vue 3, the system specs list every app that misses a plugin install.
What the branch contains (three commits):
- Commit 1: adds a
vue3_migration.ymlwithstatus: rolloutandfeature_flag: vue3_migrate_stress_testto every page entry (a directory with anindex.jsunderapp/assets/javascripts/pages,ee/app/assets/javascripts/pagesorjh/...) that does not already have one. 268 files as of the regeneration on 2026-10-08. The count goes down as teams add their own ymls. - Commit 2: defines the shared flag in
config/feature_flags/beta/vue3_migrate_stress_test.yml. Multiple entries may share one flag. - Commit 3: keeps the super sidebar and performance bar bundles on Vue 2 in
:jsspecs (spec/support/vue3_stress_global_bundles_off.rb). Under@vue/compat, aVue.use()in one Vue 3 bundle reaches every app created later on the page. The Vue 3 super sidebar installs VueApollo, so it hides pages that miss their own install. A local run confirmed this on the Geo replicables pages.
How this branch is maintained
The branch is regenerated, not merge-rebased. On each refresh: reset the branch onto the branch of !260635 (merged) (vue3-assert-plugins-installed), or onto origin/master once that MR merges. Then re-run the generator, recreate the commits and force-push. Retarget this MR before the force-push.
Rule: anything master adds wins. If master adds or changes a vue3_migration.yml or a feature flag for an entry, master's version is kept and the stress yml for that entry is dropped. New entries in master that lack a yml get a stress yml.
Generator, kept out of the commit:
for f in $(find app/assets/javascripts/pages ee/app/assets/javascripts/pages jh/app/assets/javascripts/pages -name index.js 2>/dev/null); do
d=$(dirname "$f")
[ -f "$d/vue3_migration.yml" ] || printf 'status: rollout\nfeature_flag: vue3_migrate_stress_test\n' > "$d/vue3_migration.yml"
doneWhat to check when the pipeline finishes
compile-production-assetsandcompile-production-assets vue3pass or fail, and their duration.- Which
rspec system,rspec-ee systemandjestjobs fail, and which pages cause them. - Every
[vue3-compat]message in the system job logs: each names an app or component that misses aVue.use().
Results so far
| Pipeline | compile-production-assets | compile-production-assets vue3 | rspec system jobs | Other blocking failures |
|---|---|---|---|---|
| 2026-09-14, https://gitlab.com/gitlab-org/gitlab/-/pipelines/2847726052 | success | success | 34 of 96 failed | 2 rspec unit jobs |
| 2026-09-16, after rebase, https://gitlab.com/gitlab-org/gitlab/-/pipelines/2854683919 | success, 19 min, heap limit 16384 MB | success, 8.4 min | 0 of 99 failed | 2 rspec unit jobs |
| 2026-09-24, after regeneration on master (349 stress ymls), https://gitlab.com/gitlab-org/gitlab/-/pipelines/2878769417 | success, 17.7 min, heap limit 16384 MB | success, 12 min | 0 of 89 failed | 2 rspec unit jobs; all 10 cng-instance-ff-inverse e2e jobs passed |
Details of the 2026-09-14 failures: !255334 (comment 3842920332)
The only failing example in every pipeline is spec/helpers/webpack_helper_spec.rb:219 (line 198 before 2026-09-24). It is an artefact of the stress setup. The test stubs a page with no bundle in this build and expects the helper to walk up to the ancestor entry without tracking an exception. With a yml on every entry, pages.projects.vue3 is expected to exist, so the helper reports AssetMissingError.
The system spec failures of 2026-09-14 went away because !255534 (merged) merged on 2026-09-15. It adds Vue.use(VueApollo) to the list and import page inits.
Screenshots or screen recordings
CI tooling experiment, no UI.
How to set up and validate locally
Not applicable. The point of this MR is the CI pipeline.
MR acceptance checklist
Not applicable. This MR is not meant to merge.
References
- Stacked on, the plugin install checks: !260635 (merged)
- Origin of this branch, the compile memory budget: !255332 (merged)
- Fix that cleared the 2026-09-14 system spec failures: !255534 (merged)
- Vue 3 migration epic: &23285
- ci-health incident: gitlab-org/quality/analytics/ci-health-systemic#232
- Request to look into it: gitlab-org/quality/analytics/ci-health-systemic#232 (comment 3829291654)