diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 5b5527284d3856efd0626f96bb38f1f81fe5e05b..b3b6beb10680c5af2e5ca7143ea599f68d4b06a1 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -5,6 +5,7 @@ stages:
   - prepare
   - quick-test
   - test
+  - review-prepare
   - review
   - qa
   - post-test
diff --git a/.gitlab/ci/frontend.gitlab-ci.yml b/.gitlab/ci/frontend.gitlab-ci.yml
index 0720ea3e056efb5799e0733e49111577c07b6e47..a20215694c091204979568ebae272d58d3724acf 100644
--- a/.gitlab/ci/frontend.gitlab-ci.yml
+++ b/.gitlab/ci/frontend.gitlab-ci.yml
@@ -13,7 +13,9 @@
     - .default-before_script
     - .except-docs
   image: dev.gitlab.org:5005/gitlab/gitlab-build-images:ruby-2.6.3-git-2.22-chrome-73.0-node-12.x-yarn-1.16-graphicsmagick-1.3.33-docker-18.06.1
+  stage: test
   dependencies: ["setup-test-env"]
+  needs: ["setup-test-env"]
   services:
     - docker:19.03.0-dind
   variables:
@@ -42,10 +44,6 @@
     - time scripts/build_assets_image
     - scripts/clean-old-cached-assets
     - rm -f /etc/apt/sources.list.d/google*.list  # We don't need to update Chrome here
-    # Play dependent manual jobs
-    - install_api_client_dependencies_with_apt
-    - play_job "review-build-cng" || true  # this job might not exist so ignore the failure if it cannot be played
-    - play_job "schedule:review-build-cng" || true  # this job might not exist so ignore the failure if it cannot be played
   only:
     - /.+/@gitlab-org/gitlab-ce
     - /.+/@gitlab-org/gitlab-ee
@@ -186,7 +184,8 @@ jest:
     - .default-retry
     - .default-cache
     - .except-docs
-  dependencies: ["setup-test-env"]
+  dependencies: []
+  stage: test
   variables:
     SETUP_DB: "false"
   before_script:
diff --git a/.gitlab/ci/rails.gitlab-ci.yml b/.gitlab/ci/rails.gitlab-ci.yml
index 2e8b197829b4ffc7eb426b1cb2c39ed3dda5d2e1..878be25c39b85e58a8489f3ab7c40361ec41a729 100644
--- a/.gitlab/ci/rails.gitlab-ci.yml
+++ b/.gitlab/ci/rails.gitlab-ci.yml
@@ -165,7 +165,9 @@ downtime_check:
       - /^[\d-]+-stable(-ee)?$/
       - /(^docs[\/-].+|.+-docs$)/
       - /(^qa[\/-].*|.*-qa$)/
+  stage: test
   dependencies: ["setup-test-env"]
+  needs: ["setup-test-env"]
 
 ee_compat_check:
   extends: .rake-exec
@@ -195,7 +197,9 @@ db:migrate:reset:
     - .default-before_script
     - .use-pg
     - .except-docs-qa
+  stage: test
   dependencies: ["setup-test-env"]
+  needs: ["setup-test-env"]
   script:
     - bundle exec rake db:migrate:reset
 
@@ -207,7 +211,9 @@ db:check-schema:
     - .default-before_script
     - .use-pg
     - .except-docs-qa
+  stage: test
   dependencies: ["setup-test-env"]
+  needs: ["setup-test-env"]
   script:
     - source scripts/schema_changed.sh
 
@@ -219,7 +225,9 @@ db:migrate-from-v11.11.0:
     - .default-before_script
     - .use-pg
     - .except-docs-qa
+  stage: test
   dependencies: ["setup-test-env"]
+  needs: ["setup-test-env"]
   variables:
     SETUP_DB: "false"
   script:
@@ -248,7 +256,9 @@ db:rollback:
     - .default-before_script
     - .use-pg
     - .except-docs-qa
+  stage: test
   dependencies: ["setup-test-env"]
+  needs: ["setup-test-env"]
   script:
     - bundle exec rake db:migrate VERSION=20180101160629
     - bundle exec rake db:migrate SKIP_SCHEMA_VERSION_CHECK=true
@@ -261,7 +271,9 @@ gitlab:setup:
     - .default-before_script
     - .use-pg
     - .except-docs-qa
+  stage: test
   dependencies: ["setup-test-env"]
+  needs: ["setup-test-env"]
   variables:
     SETUP_DB: "false"
   script:
diff --git a/.gitlab/ci/review.gitlab-ci.yml b/.gitlab/ci/review.gitlab-ci.yml
index 6695404653c36de6fbb3072b20cf0f387aeb9647..6f1505b5c0d01950eec24b2925e90d5fbf25e613 100644
--- a/.gitlab/ci/review.gitlab-ci.yml
+++ b/.gitlab/ci/review.gitlab-ci.yml
@@ -53,8 +53,7 @@ build-qa-image:
 
 .review-build-cng-base:
   image: ruby:2.6-alpine
-  stage: test
-  when: manual
+  stage: review-prepare
   before_script:
     - source scripts/utils.sh
     - install_api_client_dependencies_with_apk
@@ -67,17 +66,20 @@ review-build-cng:
   extends:
     - .review-build-cng-base
     - .review-only
+  needs: ["gitlab:assets:compile pull-cache"]
 
 schedule:review-build-cng:
   extends:
     - .review-build-cng-base
     - .review-schedules-only
+  needs: ["gitlab:assets:compile"]
 
 review-deploy:
   extends: .review-base
   allow_failure: true
   retry: 1
   stage: review
+  needs: ["review-build-cng"]
   variables:
     HOST_SUFFIX: "${CI_ENVIRONMENT_SLUG}"
     DOMAIN: "-${CI_ENVIRONMENT_SLUG}.${REVIEW_APPS_DOMAIN}"
diff --git a/.gitlab/ci/setup.gitlab-ci.yml b/.gitlab/ci/setup.gitlab-ci.yml
index d9384780356e8a614d44dfbd133880f3a4231451..cd7ca4d30bf50d467fae3127f09e8526fd795e9d 100644
--- a/.gitlab/ci/setup.gitlab-ci.yml
+++ b/.gitlab/ci/setup.gitlab-ci.yml
@@ -7,7 +7,9 @@ cache gems:
     - .default-cache
     - .default-before_script
     - .except-docs
+  stage: test
   dependencies: ["setup-test-env"]
+  needs: ["setup-test-env"]
   variables:
     SETUP_DB: "false"
   script: