diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 8ee796be70c59282c4ecc27693733f0063d5b552..117743cf6dd92946067ca8e9b9ea230c8fc33799 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -19,6 +19,7 @@ workflow:
 .colorized:
   variables:
     DEFAULT: '\033[0m'
+    GREEN: '\033[0;32m'
     RED: '\033[0;31m'
 
 .ci_dir:
@@ -26,19 +27,34 @@ workflow:
     CI_GITIGNORE_DIR: ${CI_PROJECT_DIR}/.ci_dir
 
 .common_pre_commit:
-  extends: .ci_dir
+  extends:
+    - .colorized
+    - .ci_dir
   variables:
     APK_CACHE_DIR: ${CI_GITIGNORE_DIR}/apk-cache
     PRE_COMMIT_HOME: ${CI_GITIGNORE_DIR}/pre-commit
     CACHE_POLICY: pull
   before_script:
     - mkdir -p "${APK_CACHE_DIR}"
-    - apk update --cache-dir "${APK_CACHE_DIR}"
-    - apk add --cache-dir "${APK_CACHE_DIR}" git pre-commit
+    - apk --cache-dir "${APK_CACHE_DIR}" --update-cache add git pre-commit
+    - |
+      # Clean up cache
+      case ${CACHE_POLICY} in
+        *push) (
+          set -o pipefail
+          apk --cache-dir "${APK_CACHE_DIR}" cache clean
+          python3 --version | diff - "${PRE_COMMIT_HOME}/python_version.txt" 2>/dev/null || {
+            rm -rf "${PRE_COMMIT_HOME}"
+            mkdir -p "${PRE_COMMIT_HOME}"
+            python3 --version > "${PRE_COMMIT_HOME}/python_version.txt"
+          }
+        ) ;;
+        *) printf "${GREEN}Skipped due to policy.\n${DEFAULT}" ;;
+      esac
   tags:
     - alpine
   cache:
-    - key: ${CI_COMMIT_REF_SLUG}
+    - key: apk-pre-commit
       paths:
         - ${APK_CACHE_DIR}
       policy: ${CACHE_POLICY}