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.yml with status: rollout and feature_flag: vue3_migrate_stress_test to every page entry (a directory with an index.js under app/assets/javascripts/pages, ee/app/assets/javascripts/pages or jh/...) 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 :js specs (spec/support/vue3_stress_global_bundles_off.rb). Under @vue/compat, a Vue.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"
done

What to check when the pipeline finishes

  • compile-production-assets and compile-production-assets vue3 pass or fail, and their duration.
  • Which rspec system, rspec-ee system and jest jobs fail, and which pages cause them.
  • Every [vue3-compat] message in the system job logs: each names an app or component that misses a Vue.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

🤖 Generated with Claude Code

Edited by Miguel Rincon

Merge request reports

Loading
Loading