diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 9af4b5fc7ae6c938b1749cf703326690b727f2c2..e331984365655a4848c5b2682a3c8a1313464d16 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -21,7 +21,7 @@ before_script:
   - source ./scripts/prepare_build.sh
   - cp config/gitlab.yml.example config/gitlab.yml
   - bundle --version
-  - retry bundle install --without postgres production --jobs $(nproc) "${FLAGS[@]}"
+  - '[ "$USE_BUNDLE_INSTALL" != "true" ] || retry bundle install --without postgres production --jobs $(nproc) "${FLAGS[@]}"'
   - retry gem install knapsack
   - '[ "$USE_DB" != "true" ] || bundle exec rake db:drop db:create db:schema:load db:migrate'
 
@@ -31,18 +31,26 @@ stages:
 - post-test
 - notifications
 
-prepare:
+precompile:
   stage: prepare
   variables:
     USE_DB: "false"
   script:
     - bundle exec rake assets:precompile
-    - mkdir -p knapsack/
-    - echo "{}" > knapsack/rspec_report.json
-    - echo "{}" > knapsack/spinach_report.json
   artifacts:
     paths:
     - public/assets/
+
+.knapsack_state: &knapsack_state
+  variables:
+    USE_DB: "false"
+    USE_BUNDLE_INSTALL: "false"
+  cache:
+    key: "knapsack"
+    paths:
+    - knapsack/
+  artifacts:
+    paths:
     - knapsack/
 
 .knapsack: &knapsack
@@ -59,21 +67,21 @@ prepare:
     paths:
     - knapsack/
 
-post-tests:
+knapsack:
+  <<: *knapsack_state
+  stage: prepare
+  script:
+    - mkdir -p knapsack/
+    - '[[ -f knapsack/rspec_report.json ]] || echo "{}" > knapsack/rspec_report.json'
+    - '[[ -f knapsack/spinach_report.json ]] || echo "{}" > knapsack/spinach_report.json'
+
+update-knapsack:
+  <<: *knapsack_state
   stage: post-test
-  variables:
-    USE_DB: "false"
   script:
     - scripts/merge-reports knapsack/rspec_report.json knapsack/rspec_node_*.json
     - scripts/merge-reports knapsack/spinach_report.json knapsack/spinach_node_*.json
     - rm -f knapsack/*_node_*.json
-  cache:
-    key: "knapsack"
-    paths:
-    - knapsack/
-  artifacts:
-    paths:
-    - knapsack/
 
 .exec: &exec
   stage: test