diff --git a/.gitlab/ci/rails.gitlab-ci.yml b/.gitlab/ci/rails.gitlab-ci.yml
index 7efcc4b58a36fce578bb034ac35ac4764359d696..fd4047373d7b57235f26e069a715e16c6ca44dbd 100644
--- a/.gitlab/ci/rails.gitlab-ci.yml
+++ b/.gitlab/ci/rails.gitlab-ci.yml
@@ -1223,7 +1223,6 @@ rspec-ee system pg15 es8:
   extends:
     - .rails:rules:rspec fail-fast
   stage: test
-  needs: ["setup-test-env", "retrieve-tests-metadata", "compile-test-assets", "detect-tests"]
   script:
     - !reference [.base-script, script]
     - rspec_fail_fast "${MATCHING_TESTS_PATH}" "--fail-fast=${RSPEC_FAIL_FAST_THRESHOLD} --tag ~quarantine --tag ~zoekt --tag ~click_house"
@@ -1298,7 +1297,10 @@ fail-pipeline-early:
   extends:
     - .rails:rules:rerun-previous-failed-tests
   stage: test
-  needs: ["setup-test-env", "retrieve-tests-metadata", "compile-test-assets", "detect-previous-failed-tests"]
+  needs:
+    - !reference [.rspec-base-needs, needs]
+    - job: "compile-test-assets"
+    - job: "detect-previous-failed-tests"
   script:
     - !reference [.base-script, script]
     - rspec_rerun_previous_failed_tests "${PREVIOUS_FAILED_TESTS_FILE}"
diff --git a/.gitlab/ci/rails/shared.gitlab-ci.yml b/.gitlab/ci/rails/shared.gitlab-ci.yml
index 3194ac0c26f4c917020af5d199805860a3cdf044..2492b8f69ddce59d2fabbe3ee9a47c492c306e6e 100644
--- a/.gitlab/ci/rails/shared.gitlab-ci.yml
+++ b/.gitlab/ci/rails/shared.gitlab-ci.yml
@@ -56,10 +56,18 @@ include:
   variables:
     GITALY_PRAEFECT_WITH_DB: '1'
 
+.rspec-base-needs:
+  needs:
+    - job: "clone-gitlab-repo"
+      optional: true  # Optional so easier to switch in between
+    - job: "setup-test-env"
+    - job: "retrieve-tests-metadata"
+
 .rspec-base:
   extends:
     - .rails-job-base
     - .base-artifacts
+    # - .repo-from-artifacts  # Comment this to clone instead of using artifacts
   stage: test
   variables:
     RUBY_GC_MALLOC_LIMIT: 67108864
@@ -69,8 +77,7 @@ include:
     SUCCESSFULLY_RETRIED_TEST_EXIT_CODE: 137
     EVENT_PROF: "sql.active_record"
   needs:
-    - job: "setup-test-env"
-    - job: "retrieve-tests-metadata"
+    - !reference [.rspec-base-needs, needs]
     - job: "compile-test-assets"
     - job: "detect-tests"
       optional: true
@@ -163,8 +170,7 @@ include:
     - .as-if-foss
     - .use-pg14
   needs:
-    - job: "setup-test-env"
-    - job: "retrieve-tests-metadata"
+    - !reference [.rspec-base-needs, needs]
     - job: "compile-test-assets as-if-foss"
     - job: "detect-tests"
       optional: true
diff --git a/.gitlab/ci/setup.gitlab-ci.yml b/.gitlab/ci/setup.gitlab-ci.yml
index a101901d57b3920e9d83971f380baccbcff217d4..934ddd2bffe3dd40f045f7c2e3bce182ca9418c5 100644
--- a/.gitlab/ci/setup.gitlab-ci.yml
+++ b/.gitlab/ci/setup.gitlab-ci.yml
@@ -43,6 +43,28 @@ dont-interrupt-me:
   script:
     - echo "This jobs makes sure this pipeline won't be interrupted! See https://docs.gitlab.com/ee/ci/yaml/#interruptible."
 
+clone-gitlab-repo:
+  extends:
+    - .absolutely-predictive-job
+  rules: [when: never]  # Uncomment this to clone instead of using artifacts
+  stage: sync
+  script:
+    - echo OK
+  variables:
+    GIT_STRATEGY: clone
+  artifacts:
+    paths:
+      - '*'
+    expire_in: '12 hours'
+
+.repo-from-artifacts:
+  variables:
+    GIT_STRATEGY: none
+  needs:
+    # If the job extending this also defines `needs`, make sure to update
+    # its `needs` to include `clone-gitlab-repo` because it'll be overridden.
+    - clone-gitlab-repo
+
 gitlab_git_test:
   extends:
     - .predictive-job