diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 6c97f353d33932730e2b39d47b12601101f821c7..6552d4aeab9a2340c50726a7cf24af1eedeaad9c 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -4,6 +4,23 @@ stages:
   - test
   - deploy
 
+cache: &global_cache
+  key: ${CI_COMMIT_REF_SLUG}  # Share cache between all jobs on one branch/tag
+  paths:
+    - .cargo/bin
+    - .cargo/registry/index
+    - .cargo/registry/cache
+    - .rustup
+    - target/debug/deps
+    - target/debug/build
+    - target/thumbv7m-none-eabi/release/deps
+    - target/thumbv7m-none-eabi/release/build
+  policy: pull-push
+
+variables:
+  RUSTUP_HOME: ${CI_PROJECT_DIR}/.rustup
+  CARGO_HOME: ${CI_PROJECT_DIR}/.cargo
+
 rust-lint:
   image: rust
   stage: check
@@ -19,7 +36,9 @@ python-lint:
   stage: check
   script:
   - apk add py3-flake8
-  - flake8
+  - flake8 controller/python
+  cache:
+    paths:
 
 build-rust:
   image: rust
@@ -47,6 +66,8 @@ deploy:
   - mkdir firmware
   - cp target/thumbv7m-none-eabi/release/dc-motor-driver-hat firmware/
   - cp controller/python/controller.py firmware/
+  cache:
+    paths:
   artifacts:
     paths:
       - firmware/