'Configure cache on GitLab runner

I don't manage to configure a cache directory, but somehow it does not work. I'm not even sure it takes the config.toml file.

my config.toml:

concurrent = 1
check_interval = 0

[session_server]
  session_timeout = 1800

[[runners]]
  cache_dir = /tmp/gitlab-runner-cache

... both on /etc/gitlab-runner/config.toml and in ~/.gitlab-runner/config.toml

my .gitlab-ci.yml:

image: docker:latest
services:
  - docker:dind

cache:
  key: "myCache"
  paths:
    - ${CI_PROJECT_DIR]/.m2/

variables:
  DOCKER_DRIVER: overlay
  MAVEN_OPTS: -Dmaven.repo.local=${CI_PROJECT_DIR}/.m2

stages:
  - build
  - acceptance

maven-build:
  image: maven:3.3-jdk-8
  stage: build
  script: "mvn clean package"
  artifacts:
    paths:
      - target/*.jar

maven-acceptance:
  dependencies:
    - maven-build
  image: maven:3.3-jdk-8
  stage: acceptance
  script: "mvn verify"

When I try: gitlab-runner exec shell maven-build

I get the error:

ERROR: Could not create cache adapter               error=cache factory not found: factory for cache adapter "" was not registered

The build is successful, but the .m2 repository is not cached...

Therefore, I have 2 questions:

  1. How to know if gitlab-runner actually takes my config.yml?
  2. What is a correct config for caching?

Thanks in advance!



Solution 1:[1]

I ran into the same issue just now. I am not sure which version of Gitlab you use, but version 12 supports either an S3-compatible storage or GCS as the cache provider (see thes docs), but no local cache folder like cache_dir = /tmp/gitlab-runner-cache.

The issue I had was, that I forgot to add Type = "s3" to the [runners.cache]section of the Runner configuration:

  [runners.cache]
    Type = "s3"
    Shared = true
    [runners.cache.s3]
      ServerAddress = ...

Solution 2:[2]

I had the same error ("cache factory not found") and the problem was that the value of cache_dir was not included in the [runners.docker] / volumes config.

The doc about cache_dir says:

If the docker executor is used, this directory needs to be included in its volumes parameter.

After adding the path to volumes the cache works without S3 or other distributed cache.

Here are the relevant parts of the working /etc/gitlab-runner/config.toml:

[[runners]]
  executor = "docker"
  cache_dir = "/home/gitlab-runner/cache"
  [runners.docker]
    volumes = ["/cache", "/home/gitlab-runner/cache"]

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Kevin Woblick
Solution 2 Michaël Witrant