Search code examples
gitlabgitlab-cigitlab-ci-runner

cache is not working on all runners and branches


i have an angular app adn i have wrote a pipline for it like this :


image: node:16.13.2
variables:
  DOCKER_HOST: myurl
  GIT_STRATEGY: clone
  TAG_LATEST: latest
  TAG_COMMIT: $CI_COMMIT_REF_NAME-$CI_COMMIT_SHORT_SHA

.login_into_nexus: &login_into_nexus
  - echo "Login Into Nexus...."
  - docker login -u $NEXUS_USERNAME -p $NEXUS_PASS $NEXUS_URL

services:
  - docker:dind

stages:
  - build

install-dependency:
  stage: .pre
  script:
    - npm i --prefer-offline # install dependencies
  cache:
    key: "{$CI_JOB_NAME}"
    paths:
      - node_modules
    policy: pull-push
  artifacts:
    paths:
      - node_modules/

build:
  stage: build
  needs:
    - job: install-dependency
      artifacts: true
  script:
    - npm run build:aot
  rules:
    - if: '$CI_PIPELINE_SOURCE == "push"'
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
    - if: '$CI_PIPELINE_SOURCE != "push" && $CI_PIPELINE_SOURCE != "merge_request_event" && $CI_COMMIT_REF_NAME == "master"'
    - if: '$CI_PIPELINE_SOURCE != "push" && $CI_PIPELINE_SOURCE != "merge_request_event" && $CI_COMMIT_REF_NAME == "develop"'

config.toml:


concurrent = 1
check_interval = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = "runner-global-1"
  output_limit = 10000000
  url = "myurl"
  token = "QmeDZw6u2Qa48n6asVHE"
  executor = "docker"
  cache_dir = "/tmp/build-cache"
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]
  [runners.docker]
    tls_verify = false
    image = "alpine"
    privileged = true
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/tmp/build-cache:/cache:rw"]
  shm_size = 0

[[runners]]
  name = "runner-global-2"
  output_limit = 10000000
  url = "myurl"
  token = "YYaXwQfLZ-2zSL8eHMGP"
  executor = "docker"
  cache_dir = "/tmp/build-cache"
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]
  [runners.docker]
    tls_verify = false
    image = "alpine"
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/tmp/build-cache:/cache:rw"]
    shm_size = 0

[[runners]]
  name = "runner-global-3"
  output_limit = 10000000
  url = "myurl"
  token = "-EUSye1c7h7tQyEk2VfH"
  executor = "docker"
  cache_dir = "/tmp/build-cache"
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]
  [runners.docker]
    tls_verify = false
    image = "alpine"
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/tmp/build-cache:/cache:rw"]
    shm_size = 0

[[runners]]
  name = "runner-global-4"
  output_limit = 10000000
  url = "myurl"
  token = "S7gPu3r2xVzc2CTZzy7z"
  executor = "docker"
  cache_dir = "/tmp/build-cache"
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]
  [runners.docker]
    tls_verify = false
    image = "ruby:2.6"
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/tmp/build-cache:/cache:rw"]
    shm_size = 0

[[runners]]
  name = "runner-global-6"
  output_limit = 10000000
  url = "myurl"
  token = "U_VQCMkj_AN5AfVuWyCR"
  executor = "docker"
  cache_dir = "/tmp/build-cache"
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]
  [runners.docker]
    tls_verify = false
    image = "ruby:2.6"
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/tmp/build-cache:/cache:rw"]
    shm_size = 0




as seen above the pipeline downloads node modules from my nexus and installs it in the install-dependency job

i also have 5 runners on this project and each one of them can pick the job . but each runner saves the cache for itself and when i run the pipeline on another branch it wont use the saved cache on the other branch

my gitlab version is : 13.3.5-ee


Solution

  • You must enable distributed caching in order for all your runners to share the same cache. Otherwise, the default is that the cache is local to the runner.