diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 8e14dd40acceeebb7a769548df497f8aaa605b4a..0051192cb35ada7850ab4b4dc5ac0c960a4bf06b 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -14,20 +14,34 @@ variables:
   HELM_EXPERIMENTAL_OCI: "1"
   CICHART_IMAGE: "$CI_REGISTRY_IMAGE/cichart:latest"
 
-build ci:
-  stage: .pre
+
+.docker_based_job:
   image: docker:19.03.1
   tags:
     - docker
+    - kubernetes
   services:
     - docker:19.03.1-dind
   before_script:
     - docker info
     - docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY}
+
+
+.helm_based_job:
+  extends: .docker_based_job
+  image: $CICHART_IMAGE
+  before_script:
+    - docker info
+    - docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY}
+    - shopt -s expand_aliases
     - alias helm='docker run -t --rm -e HELM_EXPERIMENTAL_OCI="$HELM_EXPERIMENTAL_OCI" -v $(pwd):/apps -w /apps -v ~/.kube:/root/.kube -v ~/.helm:/root/.helm -v ~/.config/helm:/root/.config/helm -v ~/.cache/helm:/root/.cache/helm alpine/helm:3.2.3'
     - helm registry login -u ${CI_REGISTRY_USER} -p ${CI_JOB_TOKEN} ${CI_REGISTRY}
+
+
+build ci:
+  stage: .pre
+  extends: .docker_based_job
   script:
-    - docker login --username $CI_REGISTRY_USER --password $CI_REGISTRY_PASSWORD $CI_REGISTRY
     - cd cichart
     - docker build --tag $CICHART_IMAGE .
     - docker push $CICHART_IMAGE
@@ -40,23 +54,13 @@ build ci:
 
 
 .get_chart_tmpl:
+  extends: .helm_based_job
   stage: get chart
-  image: $CICHART_IMAGE
-  services:
-    - docker:19.03.1-dind
-  tags:
-    - docker
   variables:
     SUBCOMP_REPOS_BASE: "https://gitlab.ssec.wisc.edu/cspp_geo/geosphere"
     # required:
     SUBCOMP_REPOS: ""
     SUBCOMP_CHART_DIR: ""
-  before_script:
-    - docker info
-    - docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY}
-    - shopt -s expand_aliases
-    - alias helm='docker run -t --rm -e HELM_EXPERIMENTAL_OCI="$HELM_EXPERIMENTAL_OCI" -v $(pwd):/apps -w /apps -v ~/.kube:/root/.kube -v ~/.helm:/root/.helm -v ~/.config/helm:/root/.config/helm -v ~/.cache/helm:/root/.cache/helm alpine/helm:3.2.3'
-    - helm registry login -u ${CI_REGISTRY_USER} -p ${CI_JOB_TOKEN} ${CI_REGISTRY}
   script:
     - repos_url="${SUBCOMP_REPOS_BASE}/${SUBCOMP_REPOS}"
     - git clone --depth 1 $repos_url
@@ -93,18 +97,8 @@ get_chart_grb:
 # TODO: Use "environment: " to define a job for production and one for development
 #       https://docs.gitlab.com/ee/ci/yaml/#environment
 deploy_g16_grb:
+  extends: .helm_based_job
   stage: deploy GRB
-  image: $CICHART_IMAGE
-  services:
-    - docker:19.03.1-dind
-  tags:
-    - docker
-  before_script:
-    - docker info
-    - docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY}
-    - shopt -s expand_aliases
-    - alias helm='docker run -t --rm -e HELM_EXPERIMENTAL_OCI="$HELM_EXPERIMENTAL_OCI" -v $(pwd):/apps -w /apps -v ~/.kube:/root/.kube -v ~/.helm:/root/.helm -v ~/.config/helm:/root/.config/helm -v ~/.cache/helm:/root/.cache/helm alpine/helm:3.2.3'
-    - helm registry login -u ${CI_REGISTRY_USER} -p ${CI_JOB_TOKEN} ${CI_REGISTRY}
   script:
     - if [ -n "$CI_COMMIT_TAG" ]; then
         ns="geosphere";
diff --git a/helpers/build_image.yml b/helpers/build_image.yml
index 3485f1e95b3bf62a88a99782a37489aabe5d4788..814a73deaa0214a628c0793e4513a559b8e553bf 100644
--- a/helpers/build_image.yml
+++ b/helpers/build_image.yml
@@ -18,6 +18,7 @@
   stage: build image
   tags:
     - docker
+    - kubernetes
   before_script:
     - docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY}
   script: