diff --git a/gitlab-ci.yml b/gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3e17332c0469ed166140bdb7d50ee19a01f15156
--- /dev/null
+++ b/gitlab-ci.yml
@@ -0,0 +1,56 @@
+image: docker:20.10.16  # Define the Docker image
+
+stages:  # Define stages in the pipeline
+  - prepare
+  - build
+  - deploy
+
+prepare:
+  stage: prepare
+  tags:
+    - docker
+  services:
+    - docker:20.10.16-dind
+  before_script:
+    - echo "$CI_REGISTRY_PASSWORD" | docker login $CI_REGISTRY -u $CI_REGISTRY_USER --password-stdin
+  script:
+    - docker pull $CI_REGISTRY_IMAGE:latest || true
+    - docker build
+      --cache-from $CI_REGISTRY_IMAGE:latest
+      --tag $CI_REGISTRY_IMAGE:latest .
+    - docker push $CI_REGISTRY_IMAGE:latest
+
+# Job to build documentation
+build-docs:
+  stage: build
+  dependencies:
+    - prepare
+  image:
+    name: $CI_REGISTRY_IMAGE:latest
+    entrypoint: [""]
+  tags:
+    - docker
+  script:
+    - sphinx-build docs/source docs/build  # Build the documentation
+  artifacts:
+    paths:
+      - docs/build  # Save the build output for later stages
+    expire_in: 12 month  # Optional: Set how long to keep the artifacts (default: 30 days)
+  
+# Job to deploy documentation to GitLab Pages
+pages:
+  stage: deploy
+  dependencies:
+  - build-docs
+  image:
+    name: $CI_REGISTRY_IMAGE:latest
+    entrypoint: [""]
+  tags:
+    - docker
+  script:
+    - mv docs/build public  # Move the build output to the "public" directory
+  artifacts:
+    paths:
+      - public  # Files in the "public" folder will be deployed to GitLab Pages
+  only:
+    - main  # Only deploy if the changes are in the default branch