diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 94507eeb2636d3096a861543df35a590492a6f01..ed4f133d726208fc3f225fccbbd406ad41f7a202 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,15 +1,60 @@
-include:
-  - template: Security/License-Scanning.gitlab-ci.yml
+stages:
+  - "build"
+  - "deploy"
+
+build_docker_main:
+  needs: []
+  stage: "build"
+  image:
+    name: "gcr.io/kaniko-project/executor:debug"
+    entrypoint: [""]
+  script:
+    - "mkdir -p /kaniko/.docker"
+    - 'echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json'
+    - "/kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $CI_REGISTRY_IMAGE:commit-$CI_COMMIT_SHORT_SHA --destination $CI_REGISTRY_IMAGE:latest"
+  rules:
+    - if: "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH"
+
+build_docker_branches:
+  needs: []
+  stage: "build"
+  image:
+    name: "gcr.io/kaniko-project/executor:debug"
+    entrypoint: [""]
+  script:
+    - "mkdir -p /kaniko/.docker"
+    - 'echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json'
+    - "/kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $CI_REGISTRY_IMAGE:commit-$CI_COMMIT_SHORT_SHA --destination $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG-latest"
+  rules:
+    - if: "$CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH"
 
 pages:
   needs: []
-  image: node:14-alpine
-  stage: deploy
+  stage: "deploy"
+  image: "node:18-alpine"
   script:
-    - npm install
-    - npm run build
+    - "npm install"
+    - "npm run build"
   artifacts:
     paths:
-      - public
-  only:
-    - master
+      - "public"
+  rules:
+    - if: "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH"
+
+deploy_to_caprover:
+  needs:
+    - "build_docker_main"
+  stage: "deploy"
+  image:
+    name: "caprover/cli-caprover:latest"
+    entrypoint: [""]
+  variables:
+    # We don't need the files, just tell CapRover to use the built docker image:
+    GIT_STRATEGY: none
+  script:
+    - "caprover deploy -h https://captain.$CAPROVER_URL -a $CAPROVER_APP --imageName $CI_REGISTRY_IMAGE:commit-$CI_COMMIT_SHORT_SHA"
+  environment:
+    name: "production"
+    url: "https://swk-project-effort-estimation.oh14.dev/"
+  rules:
+    - if: "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CAPROVER_URL && $CAPROVER_APP_TOKEN && $CAPROVER_APP"