diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index f8c417de9c090e3626da97b47a030596e033eeea..40c0fb949a8f7223d54ef5876ea064af0347c992 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -23,9 +23,43 @@ stages:
   - cluster down
   - network down
 
+#-----------------------------------------------------------------------------------------------------------------------
+# Pre Stage Jobs
+#
+
+pre vars:
+  image: registry.dsop.io/platform-one/big-bang/pipeline-templates/pipeline-templates/pre-envs:ubi8.3
+  stage: .pre
+  artifacts:
+    reports:
+      dotenv: variables.env
+  script:
+  # obtain MR and master versions
+  - CHART_MR_VERSION=$(sed -n -e 's/^version. //p' chart/Chart.yaml)
+  - git fetch && git checkout ${CI_DEFAULT_BRANCH}
+  - CHART_MA_VERSION=$(sed -n -e 's/^version. //p' chart/Chart.yaml)
+  - git fetch && git checkout ${CI_COMMIT_REF_NAME}
+  - echo "CHART_MR_VERSION=$CHART_MR_VERSION" >> variables.env
+  - echo "CHART_MA_VERSION=$CHART_MA_VERSION" >> variables.env
+  # obtain semver differences (subtract master version from mr verison)
+  - chmod +x ./scripts/semver_diff.sh
+  - CHART_VERSION_DIFF=$(./scripts/semver_diff.sh $CHART_MR_VERSION $CHART_MA_VERSION)
+  - IFS=. DIFF_ARR=(${CHART_VERSION_DIFF##*-})
+  - echo "CHART_VERSION_DIFF=$CHART_VERSION_DIFF" >> variables.env
+  # detect breaking change (first two version sections in semver diff)
+  - CHART_BREAKING_CHANGE="false"
+  - if (( ${DIFF_ARR[0]} > 0 )); then CHART_BREAKING_CHANGE="true"; fi
+  - if (( ${DIFF_ARR[1]} > 0 )); then CHART_BREAKING_CHANGE="true"; fi
+  # store variables
+  - echo "CHART_BREAKING_CHANGE=$CHART_BREAKING_CHANGE" >> variables.env
+  - cat variables.env
+
+#-----------------------------------------------------------------------------------------------------------------------
+
 #-----------------------------------------------------------------------------------------------------------------------
 # Smoke Tests
 #
+
 .bigbang:
   image: registry.dsop.io/platform-one/big-bang/pipeline-templates/pipeline-templates/k3d-builder:0.0.1
   after_script:
@@ -55,8 +89,12 @@ clean install:
   after_script:
     - kubectl get all -A
     - kubectl get helmrelease -A
+
 upgrade:
   stage: smoke tests
+  needs:
+    - job: pre vars
+      artifacts: true  
   extends:
     - .k3d
   rules:
@@ -64,11 +102,11 @@ upgrade:
   variables:
     CLUSTER_NAME: "clean-${CI_COMMIT_SHORT_SHA}"
   script:
+    - if [ ${CHART_BREAKING_CHANGE} == "true" ]; then echo "Chart Breaking Change Detected, Exiting" && exit; fi
     - echo "Install Big Bang from ${CI_DEFAULT_BRANCH}"
     - git fetch && git checkout ${CI_DEFAULT_BRANCH}
     - *deploy_bigbang
     - *test_bigbang
-
     - echo "Upgrade Big Bang from ${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME}"
     - git reset --hard && git clean -fd
     - git checkout ${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME}
@@ -230,4 +268,4 @@ aws/rke2/cluster down:
     - job: fetch umbrella templates
       artifacts: true
     - job: aws/rke2/bigbang down
-#-----------------------------------------------------------------------------------------------------------------------
+#-----------------------------------------------------------------------------------------------------------------------
\ No newline at end of file
diff --git a/scripts/semver_diff.sh b/scripts/semver_diff.sh
new file mode 100644
index 0000000000000000000000000000000000000000..dce17246cbf22a13bd194aedb70d5682c7c1729a
--- /dev/null
+++ b/scripts/semver_diff.sh
@@ -0,0 +1,21 @@
+#!/usr/bin/env bash
+
+# return sem_a - sem_b
+# sem_a and sem_b must be of same semver length
+# Ex:
+# ./hack/semver_diff.sh 1.2.3 1.1.1
+# 0.1.2
+
+sem_a=$1
+sem_b=$2
+
+IFS=. arr_a=(${sem_a##*-})
+IFS=. arr_b=(${sem_b##*-})
+
+result=()
+
+for i in "${!arr_a[@]}"; do
+    result+=($((${arr_a[$i]}-${arr_b[$i]})))
+done
+
+IFS=. echo "${result[*]}"
\ No newline at end of file