diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 21c9c53ee7bc7f279ec13cbef800ca0981e531ed..8be13ac43f6e09405c89a615f880fdac8cbe49ea 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -10,7 +10,6 @@ variables:
 stages:
     - buildbucket_build
     - gridded_glm_build
-    - gridded_glm_tester_build
     - test
     - release
 
@@ -38,13 +37,42 @@ create the Gridded GLM package:
     # Creates the gridded GLM package
     - docker run --rm -v "${PWD}":/dock -v $PWD:/work/cspp-geo-gridded-glm $BUILDBUCKET_IMAGE:$CI_COMMIT_SHORT_SHA ./package.sh $CI_COMMIT_SHORT_SHA
     # Create a simple Docker image with the gridded GLM package included
-    # TODO: this should probably be its own stage?
+    # (the below Dockerfile is created by ./package.sh)
     - docker build . -f Dockerfile -t $GRIDDED_GLM_IMAGE:$CI_COMMIT_SHORT_SHA
     - docker push $GRIDDED_GLM_IMAGE:$CI_COMMIT_SHORT_SHA
 # worry about this later; rsync isn't available in busybox. we probably need some refactoring to use a build image more directly & upload from there.
 #    # upload the package to /apollo/ via a limited-use key on espresso
 #    - rsync -auv -e "ssh -T -o StrictHostKeyChecking=no -o IdentitiesOnly=yes -o ForwardAgent=no -i $NICKB_UPLOAD_KEY" cspp-geo-gridded-glm-$CI_COMMIT_SHORT_SHA.tar.xz nickb@espresso:/apollo/csppgeo/packages/gridded-glm/ci/cspp-geo-gridded-glm-$CI_COMMIT_SHORT_SHA.tar.xz
 
+run tests:
+  stage: test
+  image: $GRIDDED_GLM_IMAGE:$CI_COMMIT_SHORT_SHA
+  tags:
+    - docker
+  script:
+    # $CSPP_GEO_GGLM_HOME is set in 
+    - $CSPP_GEO_GGLM_HOME/bin/cspp-geo-gglm.sh --help # smoke test
+
+push our images with version tags:
+  stage: release
+  image: docker:19.03.1
+  tags:
+    - docker
+  services:
+    - docker:19.03.1-dind
+  rules:
+    - if: '$CI_COMMIT_TAG'
+  script:
+    - docker login --username $CI_REGISTRY_USER --password $CI_REGISTRY_PASSWORD $CI_REGISTRY
+# buildbucket
+    - docker pull $BUILDBUCKET_IMAGE:$CI_COMMIT_SHORT_SHA
+    - if [ $CI_COMMIT_TAG != '' ]; then docker tag $BUILDBUCKET_IMAGE:$CI_COMMIT_SHORT_SHA $BUILDBUCKET_IMAGE:$CI_COMMIT_TAG; fi
+    - if [ $CI_COMMIT_TAG != '' ]; then docker push $BUILDBUCKET_IMAGE:$CI_COMMIT_TAG; fi
+# gridded_glm
+    - docker pull $GRIDDED_GLM_IMAGE:$CI_COMMIT_SHORT_SHA
+    - if [ $CI_COMMIT_TAG != '' ]; then docker tag $GRIDDED_GLM_IMAGE:$CI_COMMIT_SHORT_SHA $GRIDDED_GLM_IMAGE:$CI_COMMIT_TAG; fi
+    - if [ $CI_COMMIT_TAG != '' ]; then docker push $GRIDDED_GLM_IMAGE:$CI_COMMIT_TAG; fi
+
 push our images as latest tags:
   stage: release
   image: docker:19.03.1