diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 752e918417b8149b6b12e2b13d705c9df29e3ea2..3df905884ae1fa48d8b96cea20f1a8353f0137c6 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -94,10 +94,15 @@ build-aarch64-darwin:
     TARBALL_ARCHIVE_SUFFIX: aarch64-darwin
     TARBALL_EXT: tar.xz
     ADD_CABAL_ARGS: ""
+    # Update periodically.
+    BREW_VERSION: 4.0.5
   artifacts:
     expire_in: 2 week
     paths:
       - out/*
+  cache:
+    paths:
+      - .brew
 
 build-x86_64-windows:
   extends: .build
diff --git a/.gitlab/brew.sh b/.gitlab/brew.sh
index de769632e6fa362e038b6092099a78ad37fd04ea..a7bc602412481343d0dde4516059184725428bfc 100644
--- a/.gitlab/brew.sh
+++ b/.gitlab/brew.sh
@@ -1,10 +1,18 @@
 #!/usr/bin/env bash
 
-set -Eeuxo pipefail
+set -Eeuo pipefail
 
 # Install brew locally in the project dir. Packages will also be installed here.
-[ -e "$CI_PROJECT_DIR/.brew" ] || git clone --depth=1 https://github.com/Homebrew/brew $CI_PROJECT_DIR/.brew
-export PATH="$CI_PROJECT_DIR/.brew/bin:$CI_PROJECT_DIR/.brew/sbin:$PATH"
+# FIXME: Use brew in supported way. See
+# https://docs.brew.sh/Installation#untar-anywhere-unsupported
+brew_dir="${CI_PROJECT_DIR}/.brew"
+
+if [ ! -e "${brew_dir}" ]; then
+    mkdir -p "${brew_dir}"
+    curl -L "https://github.com/Homebrew/brew/archive/refs/tags/${BREW_VERSION}.tar.gz" | tar xz --strip 1 -C "${brew_dir}"
+fi
+
+export PATH="${brew_dir}/bin:${brew_dir}/sbin:$PATH"
 
 # make sure to not pollute the machine with temp files etc
 mkdir -p $CI_PROJECT_DIR/.brew_cache