diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 65b9b3b31d34ccb661c21a91448f5d060c81e39c..6e87d761b8a2877aed88fcf6f826065e548b8f9b 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -509,15 +509,36 @@ default:
     - export CI_COMMIT_TAG=${CI_COMMIT_TAG:-}
     # build packages
     # NOTE: we use xargs here because CONDA_BUILD_ARGS contains multiple spaces
-    - xargs -t conda ${CONDA_BUILD_CMD:-build}
-          recipe/
-          --dirty
-          --error-overlinking
-          --error-overdepending
-          --keep-old-work
-          --no-anaconda-upload
-          --variant-config-files .ci_support/${CONDA_CONFIG}.yaml
-          <<< ${CONDA_BUILD_ARGS}
+    # NOTE: retry if conda build fails due to corrupted $CONDA_PKGS_DIRS
+    - |
+      for n in 1 2; do
+        echo "===== conda ${CONDA_BUILD_CMD:-build}: attempt $n of 2 ====="
+        if ( \
+          set -o pipefail; \
+          xargs -t conda ${CONDA_BUILD_CMD:-build} \
+            recipe/ \
+            --dirty \
+            --error-overlinking \
+            --error-overdepending \
+            --keep-old-work \
+            --no-anaconda-upload \
+            --variant-config-files .ci_support/${CONDA_CONFIG}.yaml \
+            <<< ${CONDA_BUILD_ARGS} \
+          2>&1 | awk '{print} /appears to be corrupted/ {exit 1}' \
+        ); then
+          echo "----- conda ${CONDA_BUILD_CMD:-build}: success -----"
+          break
+        else
+          echo "... output from conda ${CONDA_BUILD_CMD:-build} truncated"
+          if [ $n -eq 1 ] && [ "X${CONDA_PKGS_DIRS}" != X ]; then
+            echo "----- conda ${CONDA_BUILD_CMD:-build}: possibly ${CONDA_PKGS_DIRS} is corrupted, deleting and retrying -----"
+            rm -rf ${CONDA_PKGS_DIRS}
+          else
+            echo "----- conda ${CONDA_BUILD_CMD:-build}: something else is corrupted, failing -----"
+            exit 1
+          fi
+        fi
+      done
   after_script:
     # clean cache of old files
     - find ${CONDA_PKGS_DIRS%:*} -atime +30 -delete