CI: Use caching

Change-Id: I4c70241b122c915195d3dbf10ef6758444c35126
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 23bd552..340ec01 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,13 +1,41 @@
 image: metacpan/metacpan-api
 
+variables:
+  # Set `CCACHE_BASEDIR` and `CCACHE_DIR` to point `ccache` towards the cached
+  # path on the gitlab-runner. This enables to cache the output of `ccache`
+  # between various runs.
+  CCACHE_BASEDIR: "${CI_PROJECT_DIR}"
+  CCACHE_DIR: "${CI_PROJECT_DIR}/ccache"
+  # Set `ccache` to `content` to prevent rebuilding of the CI/CD containers to
+  # trigger a recreate of the cache. By using `content` the compiler's `mtime`
+  # is not considered as part of the hash.
+  CCACHE_COMPILERCHECK: "content"
+  # Enable caching for `apt-get`.
+  APT_CACHE_DIR: "${CI_PROJECT_DIR}/apt-cache"
+  # Export `noninteractive` frontend to prevent requesting user input.
+  DEBIAN_FRONTEND: "noninteractive"
+  PERL_LOCAL_LIB_ROOT: ./perl5
+  PERL5LIB: ./perl5/lib/perl5
+
 build-and-test:
   stage: build
+  cache:
+    # Cache is shared between branches, but has a unique cache per job.
+    key: derekovecs
+    paths:
+      # Note: directories should align with `$APT_CACHE_DIR` and `$CCACHE_DIR`.
+      - apt-cache/
+      - ccache/
+      - perl5/
   before_script:
     - pwd
     - source `find .. -name section_helper.sh`
 
     - start_section install_linux_packages "Installing missing Linux packages"
-    - apt update && apt -y install cmake libgflags-dev libsnappy-dev zlib1g-dev libbz2-dev liblz4-dev libzstd-dev libomp-dev
+    - mkdir -pv $APT_CACHE_DIR ccache
+    - apt-get update && apt-get -o dir::cache::archives="$APT_CACHE_DIR" -y install ccache cmake libgflags-dev libsnappy-dev zlib1g-dev libbz2-dev liblz4-dev libzstd-dev libomp-dev
+    - ln -s $(which ccache) /usr/local/sbin/gcc
+    - ln -s $(which ccache) /usr/local/sbin/g++
     - end_section install_linux_packages
 
     - start_section install_rocksdb_static "Building and installing rocksdb-static"
@@ -15,6 +43,7 @@
     - cd rocksdb-5.11.3
     - export PROCS=$(nproc)
     - make -j $PROCS static_lib DISABLE_WARNING_AS_ERROR=1 WARNING_FLAGS=-w
+    - ccache --show-stats
     - make install-static DISABLE_WARNING_AS_ERROR=1 WARNING_FLAGS=-w
     - end_section install_rocksdb_static
 
@@ -30,8 +59,9 @@
     - cd collocatordb
     - mkdir -p build
     - cd build
-    - cmake ..
+    - cmake -DCMAKE_C_COMPILER_LAUNCHER=ccache ..
     - make
+    - ccache --show-stats
     - make install # && ctest --extra-verbose
     - ldconfig
     - end_section install_collocatordb
@@ -39,8 +69,8 @@
 
   script:
     - start_section build_perl_dependencies "Installing Perl dependencies"
-    - cpanm https://github.com/Akron/Mojolicious-Plugin-Localize.git
-    - cpanm --installdeps .
+    - cpanm -n -l $PERL_LOCAL_LIB_ROOT https://github.com/Akron/Mojolicious-Plugin-Localize.git
+    - cpanm -n -l $PERL_LOCAL_LIB_ROOT --installdeps .
     - end_section build_perl_dependencies
 
     - start_section  build_derekovecs-server "Building DeReKoVecs server"