diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index e6ff343ac89842b677c84e01baed8bfa120c0a8c..8dd337fa534c15ff261d8ea706df4acd6b4480c6 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -38,6 +38,35 @@ fmt_and_clippy:
 build_debug:
   extends: .env
   rules:
+    - if: $CI_COMMIT_TAG
+      when: never
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" || $CI_COMMIT_BRANCH == "master"'
+      changes:
+      - Cargo.lock
+    - when: manual
+  stage: build
+  script:
+    - cargo clean -p duniter
+    - cargo build --locked
+    - mkdir build
+    - mv target/debug/duniter build/duniter
+  artifacts:
+    paths:
+      - build/
+  cache:
+    - key:
+        files:
+          - Cargo.lock
+      paths:
+        - target/debug
+      policy: push
+
+build_debug_with_cache:
+  extends: .env
+  rules:
+    - changes:
+      - Cargo.lock
+      when: never
     - if: $CI_COMMIT_TAG
       when: never
     - if: '$CI_PIPELINE_SOURCE == "merge_request_event" || $CI_COMMIT_BRANCH == "master"'
@@ -45,7 +74,7 @@ build_debug:
   stage: build
   script:
     - cargo clean -p duniter
-    - cargo build
+    - cargo build --locked
     - mkdir build
     - mv target/debug/duniter build/duniter
   artifacts:
@@ -57,6 +86,7 @@ build_debug:
           - Cargo.lock
       paths:
         - target/debug
+      policy: pull
 
 build_release:
   extends: .env
@@ -65,7 +95,7 @@ build_release:
     - when: never
   stage: build
   script:
-    - cargo build --release
+    - cargo build --locked --release
     - mkdir build
     - mv target/release/duniter build/duniter
   artifacts: