diff --git a/substrate/.gitlab-ci.yml b/substrate/.gitlab-ci.yml
index 935c5c1d40e86da7d963805e213ed5c4ab1dce2d..e218a2c1f8d3a6b84f569c6646c552311bea5dfc 100644
--- a/substrate/.gitlab-ci.yml
+++ b/substrate/.gitlab-ci.yml
@@ -89,6 +89,16 @@ default:
     - rustup +nightly show
     - cargo +nightly --version
 
+.docker-env:
+  image:                           "${CI_IMAGE}"
+  before_script:
+    - !reference [.rust-info-script, script]
+    - !reference [.rusty-cachier, before_script]
+  after_script:
+    - !reference [.rusty-cachier, after_script]
+  tags:
+    - linux-docker
+
 # rusty-cachier's hidden job. Parts of this job are used to instrument the pipeline's other real jobs with rusty-cachier
 # Description of the commands is available here - https://gitlab.parity.io/parity/infrastructure/ci_cd/rusty-cachier/client#description
 .rusty-cachier:
@@ -100,16 +110,6 @@ default:
   after_script:
     - rusty-cachier snapshot destroy
 
-.docker-env:
-  image:                           "${CI_IMAGE}"
-  before_script:
-    - !reference [.rust-info-script, script]
-    - !reference [.rusty-cachier, before_script]
-  after_script:
-    - !reference [.rusty-cachier, after_script]
-  tags:
-    - linux-docker
-
 .test-refs:
   rules:
     - if: $CI_PIPELINE_SOURCE == "web"
@@ -225,7 +225,8 @@ deploy-prometheus-alerting-rules:
 # This info is later used for the cache distribution and an overlay creation.
 rusty-cachier-notify:
   stage:                           notify
-  <<:                              *docker-env
+  extends:
+    - .docker-env
   script:
     - rusty-cachier cache notify