diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index ea907c428bd4ed87fc429f268ee1c9eb9692330f..3bda080065fe3e9593743eb284a41c2639f9d42a 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,49 +1,45 @@
-name: CI/CD - Build & Deploy
-
-on:
-  push:
-    branches:
-      - main
-  workflow_dispatch:
-
-jobs:
-  build-and-deploy:
-    runs-on: ubuntu-latest
-
-    env:
-      DOCKER_IMAGE: ${{ secrets.DOCKER_USERNAME }}/neo4j-populator
-      KUBE_NAMESPACE: ${{ secrets.KUBE_NAMESPACE }}
-
-    steps:
-      - name: Checkout repository
-        uses: actions/checkout@v4
-
-      - name: Set up Docker Buildx
-        uses: docker/setup-buildx-action@v3
-
-      - name: Login to Docker Hub
-        uses: docker/login-action@v3
-        with:
-          username: ${{ secrets.DOCKER_USERNAME }}
-          password: ${{ secrets.DOCKER_PASSWORD }}
-
-      - name: Build and push image to Docker Hub
-        uses: docker/build-push-action@v5
-        with:
-          context: .
-          file: ./Dockerfile
-          push: true
-          tags: ${{ env.DOCKER_IMAGE }}:latest
-
-      - name: Delete old resources
-        run: |
-          kubectl -n $KUBE_NAMESPACE delete -f ./deployment-neo4j.yml --kubeconfig=.kube/config.yml --ignore-not-found
-          kubectl -n $KUBE_NAMESPACE delete -f ./neo4j-service.yml   --kubeconfig=.kube/config.yml --ignore-not-found
-          kubectl -n $KUBE_NAMESPACE delete -f ./job-db-populator.yml --kubeconfig=.kube/config.yml --ignore-not-found
-
- 
-      - name: Deploy to Kubernetes
-        run: |
-          kubectl -n $KUBE_NAMESPACE apply -f ./deployment-neo4j.yml --kubeconfig=.kube/config.yml
-          kubectl -n $KUBE_NAMESPACE apply -f ./neo4j-service.yml --kubeconfig=.kube/config.yml
-          kubectl -n $KUBE_NAMESPACE apply -f ./job-db-populator.yml --kubeconfig=.kube/config.yml
\ No newline at end of file
+stages:
+  - build
+  - deploy
+
+variables:
+  DOCKER_IMAGE: $DOCKER_USERNAME/neo4j-populator
+  KUBE_NAMESPACE: $KUBE_NAMESPACE
+
+.default-docker:
+  image: docker:24.0
+  services:
+    - docker:24.0-dind
+  before_script:
+    - docker login -u "$DOCKER_USERNAME" -p "$DOCKER_PASSWORD"
+
+build_and_push:
+  stage: build
+  extends: .default-docker
+  script:
+    - docker build -t $DOCKER_IMAGE:latest .
+    - docker push $DOCKER_IMAGE:latest
+
+setup_kubeconfig:
+  stage: deploy
+  image: bitnami/kubectl:latest
+  script:
+    - mkdir -p ~/.kube
+    - echo "$KUBECONFIG_CONTENT" > ~/.kube/config
+    - chmod 600 ~/.kube/config
+  artifacts:
+    paths:
+      - ~/.kube/config
+
+deploy_to_kubernetes:
+  stage: deploy
+  image: bitnami/kubectl:latest
+  dependencies:
+    - setup_kubeconfig
+  script:
+    - kubectl -n "$KUBE_NAMESPACE" delete -f ./deployment-neo4j.yml --ignore-not-found
+    - kubectl -n "$KUBE_NAMESPACE" delete -f ./neo4j-service.yml --ignore-not-found
+    - kubectl -n "$KUBE_NAMESPACE" delete -f ./job-db-populator.yml --ignore-not-found
+    - kubectl -n "$KUBE_NAMESPACE" apply -f ./deployment-neo4j.yml
+    - kubectl -n "$KUBE_NAMESPACE" apply -f ./neo4j-service.yml
+    - kubectl -n "$KUBE_NAMESPACE" apply -f ./job-db-populator.yml