diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index c6cc6e9d8a5e8d788ed9e4d927e7602a20c1854d..edb0940b90412f8d043baa247ecf4cf861a219f4 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -4,21 +4,35 @@ default:
     - docker
 
 stages:
+  - build
   - test
   - security
   - release
 
+build:
+  stage: build
+  script:
+    - npm install
+    - npm run build
+  artifacts:
+    paths:
+      - node_modules
+      - dist
+    expire_in: 1 hour
+
 lint:
   stage: test
+  dependencies:
+    - build
   script:
-    - npm install
     - npm run lint
   allow_failure: true
 
 test:
   stage: test
+  dependencies:
+    - build
   script:
-    - npm install
     - npm run coverage
   coverage: '/All files[^|]*\|[^|]*\s+([\d\.]+)/'
   artifacts:
@@ -31,6 +45,8 @@ test:
 
 release:
   stage: release
+  dependencies:
+    - build
   script:
     - |
       cat <<EOT >> .npmrc
@@ -51,8 +67,6 @@ release:
         echo "This version has already been published"
         exit 0
       fi
-    - npm install
-    - npm run build
     - sed -i "s#\"$PACKAGE\"#\"@dbogatov/$PACKAGE\"#g" package.json
     - npm publish
     - |
@@ -68,6 +82,7 @@ release:
 
 code_navigation:
   stage: release
+  dependencies: []
   script:
     - npm install -g @sourcegraph/lsif-tsc
     - apk add --update git
@@ -87,34 +102,30 @@ include:
 
 # ADJUSTMENTS
 
-gemnasium-dependency_scanning:
-  dependencies: []
+.security-template: &security-def
+  dependencies:
+    - build
   stage: security
 
+gemnasium-dependency_scanning:
+  <<: *security-def
+
 nodejs-scan-sast:
-  stage: security
-  dependencies: []
+  <<: *security-def
   before_script:
-    - npm install
-    - npm run build
     - ls
 
 license_scanning:
-  dependencies: []
-  stage: security
+  <<: *security-def
 
 retire-js-dependency_scanning:
-  dependencies: []
-  stage: security
+  <<: *security-def
 
 secret_detection:
-  dependencies: []
-  stage: security
+  <<: *security-def
 
 secrets-sast:
-  dependencies: []
-  stage: security
+  <<: *security-def
 
 tslint-sast:
-  dependencies: []
-  stage: security
+  <<: *security-def