diff --git a/templates/gitlab-ci-semrel.yml b/templates/gitlab-ci-semrel.yml
index 663a3d35bb1a7144cf04ebbf25ece1819f60d129..1b0df2a55d6a6510680c367b3acc7beeb0d1db4c 100644
--- a/templates/gitlab-ci-semrel.yml
+++ b/templates/gitlab-ci-semrel.yml
@@ -621,10 +621,20 @@ stages:
       yq_version=$(github_get_latest_version mikefarah/yq)
       yq_binary=yq_linux_amd64
       yq_url="https://github.com/mikefarah/yq/releases/download/${yq_version}/${yq_binary}.tar.gz"
-      log_info "Download latest yq version: \\e[32m$yq_url\\e[0m"
-      download_file "${yq_url}" "${yq_binary}.tar.gz"
-      tar xvf "${yq_binary}.tar.gz"
-      mv "${yq_binary}" /usr/bin/yq
+      yq_cache="$XDG_CACHE_HOME/yq-$(echo "$yq_url" | md5sum | cut -d" " -f1)"
+
+      if [[ -f "$yq_cache" ]]
+      then
+        log_info "yq found in cache: reuse"
+      else
+        log_info "yq not found in cache: download"
+        log_info "Download latest yq version: \\e[32m$yq_url\\e[0m"
+        download_file "${yq_url}" "${yq_binary}.tar.gz"
+        tar xvf "${yq_binary}.tar.gz"
+        mkdir -p "$XDG_CACHE_HOME"
+        mv "${yq_binary}" "$yq_cache"
+      fi 
+      ln -s "$yq_cache" /usr/bin/yq
     fi
   }
 
@@ -755,11 +765,21 @@ stages:
     - cd "${SEMREL_CONFIG_DIR}"
     - prepare_semantic_release
     - install_semantic_release_plugins
+  variables:
+    # download cache
+    XDG_CACHE_HOME: "$CI_PROJECT_DIR/.cache"
+    # NPM cache
+    npm_config_cache: "$CI_PROJECT_DIR/.npm"
+  # Cache downloaded dependencies and plugins between builds.
+  # To keep cache across branches add 'key: "$CI_JOB_NAME"'
   cache:
     # cache shall be per branch per template
     key: "$CI_COMMIT_REF_SLUG-SEMREL"
+    when: always
     paths:
-      - .npm/
+      - "$CI_PROJECT_DIR/.npm"
+      - "$XDG_CACHE_HOME"
+
 
 semantic-release-info:
   extends: .semrel-base