diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index db0ad64b4974539df266698dcb0057eae0580458..b1672236aee364dc53ee276b47f82d68af9dc57e 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,8 +1,14 @@
-stages:
-  - deploy
+include: 
+  - ci-templates/default.yml
+  - local: ci-templates/build.yml
+    only:
+      - main
+      - develop
+      
+  - local: ci-templates/build_unprotected.yml
+    except:
+      - main
+      - develop
 
-deploy:
-  stage: deploy
-  image: maven:3.9.5-ibm-semeru-17-focal
-  script:
-    - mvn deploy -s ci_settings.xml -DskipTests
+maven_build:
+  extends: .maven_build
diff --git a/ci-templates/build.yml b/ci-templates/build.yml
new file mode 100644
index 0000000000000000000000000000000000000000..bd5d8935a081899b676ff257b9813ac74f1a7fa5
--- /dev/null
+++ b/ci-templates/build.yml
@@ -0,0 +1,41 @@
+.maven_build:
+  extends: .default
+  stage: build
+  image: maven:3.9.5-ibm-semeru-17-focal
+  script:
+    - mvn deploy -s ci_settings.xml -DskipTests -Dversion=$APP_VERSION
+  artifacts:
+    paths:
+      - target/
+
+.docker_build:
+  extends: .default
+  stage: 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
+
+.angular_build:
+  extends: .default
+  stage: build
+  image: trion/ng-cli:14.2.6
+  script:
+    - |
+      if [ ! -f  "./src/assets/config/theming.scss" ]; then
+          cp ./src/assets/config/theming.default.scss ./src/assets/config/theming.scss
+      fi
+      if [ ! -f  "./src/assets/config/config.prod.json" ]; then
+          cp ./src/assets/config/config.prod.default.json ./src/assets/config/config.prod.json
+      fi
+    - npm install
+    - ng build --configuration production --deleteOutputPath=false
+  artifacts:
+    paths:
+      - dist/
diff --git a/ci-templates/build_unprotected.yml b/ci-templates/build_unprotected.yml
new file mode 100644
index 0000000000000000000000000000000000000000..369d8d99bd0c2c28bffa6d8ae02ebdbe9e200bfe
--- /dev/null
+++ b/ci-templates/build_unprotected.yml
@@ -0,0 +1,36 @@
+.maven_build:
+  extends: .default
+  stage: build
+  image: maven:3.9.5-ibm-semeru-17-focal
+  script:
+    - mvn install -s ci_settings.xml -DskipTests
+  artifacts:
+    paths:
+      - target/
+
+.docker_build:
+  extends: .default
+  stage: 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" --no-push
+
+.angular_build:
+  extends: .default
+  stage: build
+  image: trion/ng-cli:14.2.6
+  script:
+    - |
+      if [ ! -f  "./src/assets/config/theming.scss" ]; then
+          cp ./src/assets/config/theming.default.scss ./src/assets/config/theming.scss
+      fi
+      if [ ! -f  "./src/assets/config/config.prod.json" ]; then
+          cp ./src/assets/config/config.prod.default.json ./src/assets/config/config.prod.json
+      fi
+    - npm install
+    - ng build --configuration production --deleteOutputPath=false
+  artifacts:
+    paths:
+      - dist/
diff --git a/ci-templates/default.yml b/ci-templates/default.yml
new file mode 100644
index 0000000000000000000000000000000000000000..8b0f900dba882ea5ead1fd1d46c52cc33e0b579d
--- /dev/null
+++ b/ci-templates/default.yml
@@ -0,0 +1,19 @@
+stages:
+  - .pre
+  - build
+  - test
+  - post
+  - security
+
+.default:
+  variables:
+    DEFAULT_VERSION: "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_VERSION
+      fi