diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 7596e917ea8ae7f292919a852a7e2ffdf9fafdd1..d2f3b99ef1427e853a34f93621a141998bf546a1 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,13 +1,15 @@
-# Define global rules for when pipelines run
+# global rules for when pipelines run
 workflow:
   rules:
-    # Skip pipeline when commit message starts with "wip"
-    - if: '$CI_COMMIT_MESSAGE =~ /^wip/'
-      when: never
-    # Skip pipeline for branches that start with "docs"
+    # run pipeline for manual tag events
+    - if: $CI_COMMIT_TAG
+    # run pipeline on merge request events
+    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+    # run pipeline on commits to default branch
+    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+    # skip pipeline for branches that start with "docs"
     - if: '$CI_COMMIT_REF_NAME =~ /^docs/'
       when: never
-    - when: always
 
 # include templates
 include:
@@ -92,11 +94,6 @@ clean install:
   stage: smoke tests
   extends:
     - .k3d
-  rules:
-    # Skip on merge requests (it is ran as part of the non MR pipeline)
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: never
-    - when: always
   variables:
     CLUSTER_NAME: "clean-${CI_COMMIT_SHORT_SHA}"
   script:
@@ -115,7 +112,11 @@ upgrade:
   extends:
     - .k3d
   rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TITLE !~ /^Breaking Change/'
+    # skip job when MR title starts with 'Breaking Change'
+    - if: '$CI_MERGE_REQUEST_TITLE =~ /^Breaking Change/'
+      when: never
+    # run pipeline on merge request events
+    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
   variables:
     CLUSTER_NAME: "clean-${CI_COMMIT_SHORT_SHA}"
   script:
@@ -130,60 +131,6 @@ upgrade:
     - *deploy_bigbang
     - *test_bigbang
 
-package:
-  stage: package
-  image: registry.dsop.io/platform-one/big-bang/umbrella/synker:0.0.1
-  rules:
-    - if: '$CI_COMMIT_TAG'
-    - when: never
-  dependencies:
-    - clean install
-  before_script:
-    # Set up auth
-    - mkdir -p /root/.docker
-    - echo $DOCKER_AUTH_CONFIG > /root/.docker/config.json
-  script:
-    - cp ./scripts/package/synker.yaml ./synker.yaml
-
-    # Populate images list in synker config
-    # NOTE: This is stupid and hacky, use yq or something better to do this
-    - cat images.txt | sed -e 's/^/    - /' >> synker.yaml
-
-    - synker pull -b=1
-
-    # Tar up synker as well?
-    - cp /usr/local/bin/synker synker.yaml /var/lib/registry/
-    - tar -C /var/lib/registry -czvf $IMAGE_PKG .
-    - tar -czvf $IMAGE_PKG /var/lib/registry
-
-    # Package dependent repos
-    - ./scripts/package/gits.sh
-    - tar -czf $REPOS_PKG repos/
-
-    # Prep release
-    - mkdir -p release
-    - mv $IMAGE_LIST $IMAGE_PKG $REPOS_PKG release/
-
-    # Publish packages to s3 release
-    - aws s3 sync --quiet release/ s3://umbrella-bigbang-releases/umbrella/${CI_COMMIT_TAG}
-  after_script: []
-
-release:
-  stage: release
-  image: registry.gitlab.com/gitlab-org/release-cli:latest
-  rules:
-    - if: '$CI_COMMIT_TAG'
-    - when: never
-  variables:
-    RELEASE_ENDPOINT: https://${RELEASE_BUCKET}.s3-${AWS_DEFAULT_REGION}.amazonaws.com/umbrella/${CI_COMMIT_TAG}
-  script:
-    - |
-      release-cli create --name "Big Bang v${CI_COMMIT_TAG}" --tag-name ${CI_COMMIT_TAG} \
-        --description "Automated release notes are a WIP." \
-        --assets-link "{\"name\":\"${IMAGE_LIST}\",\"url\":\"${RELEASE_ENDPOINT}/${IMAGE_LIST}\"}" \
-        --assets-link "{\"name\":\"${IMAGE_PKG}\",\"url\":\"${RELEASE_ENDPOINT}/${IMAGE_PKG}\"}" \
-        --assets-link "{\"name\":\"${REPOS_PKG}\",\"url\":\"${RELEASE_ENDPOINT}/${REPOS_PKG}\"}"
-
 #-----------------------------------------------------------------------------------------------------------------------
 
 #-----------------------------------------------------------------------------------------------------------------------
@@ -194,33 +141,34 @@ release:
 .infra fork:
   stage: network up
   rules:
-    # Skip when branch name starts with "hotfix" or "patch"
+    # skip job when branch name starts with "hotfix" or "patch"
     - if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^(hotfix|patch)/'
       when: never
-    # Only run on merge requests when manually activated
+    # run job on merge requests when manually activated
     - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: manual
       allow_failure: false
+      when: manual
 
 # Abstract for jobs responsible for creating infrastructure
 .infra create:
   rules:
-    # Skip when branch name starts with "hotfix" or "patch"
+    # skip job when branch name starts with "hotfix" or "patch"
     - if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^(hotfix|patch)/'
       when: never
-    # Only run on merge requests
+    # run pipeline on commits to default branch
     - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-
+    
 # Abstract for jobs responsible for cleaning up infrastructure
 .infra cleanup:
   rules:
-    # Skip when branch name starts with "hotfix" or "patch"
+    # skip job when branch name starts with "hotfix" or "patch"
     - if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^(hotfix|patch)/'
       when: never
-    # Always run on merge requests
+    # run job on merge requests regardless of failure
     - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
       allow_failure: true
       when: always
+
 #-----------------------------------------------------------------------------------------------------------------------
 
 #-----------------------------------------------------------------------------------------------------------------------
@@ -243,6 +191,7 @@ aws/network down:
   environment:
     name: review/aws-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}
     action: stop
+
 #-----------------------------------------------------------------------------------------------------------------------
 
 #-----------------------------------------------------------------------------------------------------------------------
@@ -257,6 +206,8 @@ aws/rke2/cluster up:
     - .rke2 up
   needs:
     - job: aws/network up
+  environment:
+    name: review/aws-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}
 
 # Install BigBang on RKE2 cluster on AWS
 aws/rke2/bigbang up:
@@ -274,6 +225,8 @@ aws/rke2/bigbang up:
     - kubectl apply -f ${CI_PROJECT_DIR}/.gitlab-ci/jobs/rke2/dependencies/k8s-resources/aws/default-ebs-sc.yaml
   script:
     - *deploy_bigbang
+  environment:
+    name: review/aws-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}
 
 # Run tests on BigBang on RKE2 cluster on AWS
 aws/rke2/bigbang test:
@@ -294,6 +247,8 @@ aws/rke2/bigbang test:
     - yum install bind-utils -y
     - ./scripts/hosts.sh
     - *test_bigbang
+  environment:
+    name: review/aws-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}
 
 # Uninstall BigBang on RKE2 cluster on AWS
 aws/rke2/bigbang down:
@@ -312,6 +267,8 @@ aws/rke2/bigbang down:
     - helm un -n bigbang bigbang
     # TODO: Smarter wait
     - sleep 180
+  environment:
+    name: review/aws-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}
 
 # Destroy RKE2 cluster on AWS
 aws/rke2/cluster down:
@@ -321,4 +278,65 @@ aws/rke2/cluster down:
     - .rke2 down
   needs:
     - job: aws/rke2/bigbang down
+  environment:
+    name: review/aws-${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}
+
+#-----------------------------------------------------------------------------------------------------------------------
+
+#-----------------------------------------------------------------------------------------------------------------------
+# Release Jobs
+#
+
+package:
+  stage: package
+  image: registry.dsop.io/platform-one/big-bang/umbrella/synker:0.0.1
+  rules:
+    # run job for manual tag events
+    - if: $CI_COMMIT_TAG
+    #   when: never
+    # # run job on commits to default branch
+    # - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+  before_script:
+    # Set up auth
+    - mkdir -p /root/.docker
+    - echo $DOCKER_AUTH_CONFIG > /root/.docker/config.json
+  script:
+    - cp ./scripts/package/synker.yaml ./synker.yaml
+    # Populate images list in synker config
+    # NOTE: This is stupid and hacky, use yq or something better to do this
+    - cat images.txt | sed -e 's/^/    - /' >> synker.yaml
+    - synker pull -b=1
+    # Tar up synker as well?
+    - cp /usr/local/bin/synker synker.yaml /var/lib/registry/
+    - tar -C /var/lib/registry -czvf $IMAGE_PKG .
+    - tar -czvf $IMAGE_PKG /var/lib/registry
+    # Package dependent repos
+    - ./scripts/package/gits.sh
+    - tar -czf $REPOS_PKG repos/
+    # Prep release
+    - mkdir -p release
+    - mv $IMAGE_LIST $IMAGE_PKG $REPOS_PKG release/
+    # Publish packages to s3 release
+    - aws s3 sync --quiet release/ s3://umbrella-bigbang-releases/umbrella/${CI_COMMIT_TAG}
+  after_script: []
+
+release:
+  stage: release
+  image: registry.gitlab.com/gitlab-org/release-cli:latest
+  rules:
+    # run job for manual tag events
+    - if: $CI_COMMIT_TAG
+    #   when: never
+    # # run job on commits to default branch
+    # - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+  variables:
+    RELEASE_ENDPOINT: https://${RELEASE_BUCKET}.s3-${AWS_DEFAULT_REGION}.amazonaws.com/umbrella/${CI_COMMIT_TAG}
+  script:
+    - |
+      release-cli create --name "Big Bang v${CI_COMMIT_TAG}" --tag-name ${CI_COMMIT_TAG} \
+        --description "Automated release notes are a WIP." \
+        --assets-link "{\"name\":\"${IMAGE_LIST}\",\"url\":\"${RELEASE_ENDPOINT}/${IMAGE_LIST}\"}" \
+        --assets-link "{\"name\":\"${IMAGE_PKG}\",\"url\":\"${RELEASE_ENDPOINT}/${IMAGE_PKG}\"}" \
+        --assets-link "{\"name\":\"${REPOS_PKG}\",\"url\":\"${RELEASE_ENDPOINT}/${REPOS_PKG}\"}"
+
 #-----------------------------------------------------------------------------------------------------------------------
\ No newline at end of file