diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 19dca0b2fcd53c4d5beee4e505c832c64c8a46bc..cf8551989cb092435039c14354f1958ce6cf79e0 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -3,6 +3,7 @@ image: "registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.6.5-golang-1.1
 stages:
   - sync
   - prepare
+  - fixtures
   - test
   - post-test
   - review-prepare
diff --git a/.gitlab/ci/frontend.gitlab-ci.yml b/.gitlab/ci/frontend.gitlab-ci.yml
index f9db35592aa4a2ddf5f63ed87604721a7fd4ebc6..b0db0823dbd817c650185c1d973010c9eaef4e7a 100644
--- a/.gitlab/ci/frontend.gitlab-ci.yml
+++ b/.gitlab/ci/frontend.gitlab-ci.yml
@@ -120,6 +120,40 @@ compile-assets pull-cache as-if-foss:
     policy: pull
     key: "assets-compile:v9:foss"
 
+.frontend-fixtures-base:
+  extends:
+    - .default-tags
+    - .default-retry
+    - .default-cache
+    - .default-before_script
+    - .use-pg9
+  stage: fixtures
+  needs: ["setup-test-env", "compile-assets pull-cache"]
+  script:
+    - date
+    - scripts/gitaly-test-spawn
+    - date
+    - bundle exec rake frontend:fixtures
+  artifacts:
+    name: frontend-fixtures
+    expire_in: 31d
+    when: always
+    paths:
+      - node_modules
+      - public/assets
+      - tmp/tests/frontend/
+
+frontend-fixtures:
+  extends:
+    - .frontend-fixtures-base
+    - .frontend:rules:default-frontend-jobs
+
+frontend-fixtures-as-if-foss:
+  extends:
+    - .frontend-fixtures-base
+    - .frontend:rules:default-frontend-jobs-as-if-foss
+    - .as-if-foss
+
 .frontend-job-base:
   extends:
     - .default-tags
@@ -128,7 +162,6 @@ compile-assets pull-cache as-if-foss:
     - .default-before_script
     - .use-pg9
   stage: test
-  needs: ["setup-test-env", "compile-assets pull-cache"]
 
 .karma-base:
   extends: .frontend-job-base
@@ -167,9 +200,6 @@ karma-as-if-foss:
 .jest-base:
   extends: .frontend-job-base
   script:
-    - scripts/gitaly-test-spawn
-    - date
-    - bundle exec rake frontend:fixtures
     - date
     - yarn jest --ci --coverage
   cache:
@@ -182,6 +212,7 @@ jest:
   extends:
     - .jest-base
     - .frontend:rules:default-frontend-jobs
+  needs: ["frontend-fixtures"]
   artifacts:
     name: coverage-frontend
     expire_in: 31d
@@ -198,6 +229,7 @@ jest-as-if-foss:
     - .jest-base
     - .frontend:rules:default-frontend-jobs-as-if-foss
     - .as-if-foss
+  needs: ["frontend-fixtures-as-if-foss"]
   cache:
     policy: pull