diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index db0ad64b4974539df266698dcb0057eae0580458..87ea8797019b637fa796a38ffa7127800dcbc575 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,8 +1,46 @@
 stages:
-  - deploy
+  - java_build
+  - docker_build
 
-deploy:
-  stage: deploy
+.default_rules: &default_rules
+  rules:
+    - if: '$CI_COMMIT_REF_NAME == "main"'
+    - if: '$CI_COMMIT_REF_NAME == "develop"'
+    - if: '$CI_COMMIT_REF_NAME == "12-create-a-pipeline-to-build-and-publish-the-docker-image-in-gitlab-registry"'
+
+variables:
+  DEFAULT_TAG: "1.2.0-SNAPSHOT"
+
+before_script:
+  - |
+    if [ "$CI_COMMIT_REF_NAME" = "main" ] && [ -n "$CI_COMMIT_TAG" ]; then
+      export APP_VERSION=$CI_COMMIT_TAG
+    elif [ "$CI_COMMIT_REF_NAME" = "develop" ]; then
+      export APP_VERSION="develop"
+    else
+      export APP_VERSION=$DEFAULT_TAG
+    fi
+
+java_build:
+  stage: java_build
   image: maven:3.9.5-ibm-semeru-17-focal
   script:
-    - mvn deploy -s ci_settings.xml -DskipTests
+    - mvn deploy -s ci_settings.xml -DskipTests -Dversion=$APP_VERSION
+  artifacts:
+    paths:
+      - target/
+  <<: *default_rules
+
+.docker_build:
+  stage: docker_build
+  image:
+    name: gcr.io/kaniko-project/executor:debug
+    entrypoint: [""]
+  script:
+    - /kaniko/executor --context "${CI_PROJECT_DIR}" --dockerfile "${CI_PROJECT_DIR}/Dockerfile" --destination "${CI_REGISTRY_IMAGE}:$APP_VERSION"
+    - |
+      if [ "$CI_COMMIT_REF_NAME" = "main" ]; then
+        echo "Pushing Docker image with tag 'latest'"
+        /kaniko/executor --context "${CI_PROJECT_DIR}" --dockerfile "${CI_PROJECT_DIR}/Dockerfile" --destination "${CI_REGISTRY_IMAGE}:latest"
+      fi
+  <<: *default_rules