Что такое кеш в GitLab CI/CD?

«Что такое кеш в GitLab CI/CD?» — вопрос из категории CI/CD, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Кеш в GitLab CI/CD — это механизм для сохранения файлов и директорий между разными запусками пайплайнов или даже между разными этапами (jobs) одного запуска. Его основная цель — ускорить выполнение, избегая повторной загрузки или генерации одних и тех же данных (например, зависимостей пакетов).

Как это работает на практике:

В файле .gitlab-ci.yml вы определяете, какие пути нужно кешировать. GitLab Runner сохраняет их как архив и загружает при последующих запусках, если ключ кеша совпадает.

# Пример кеширования зависимостей Node.js и кэша компилятора Rust
cache:
  key: "$CI_COMMIT_REF_SLUG" # Ключ, часто привязанный к ветке
  paths:
    - node_modules/          # Зависимости npm
    - target/                # Кэш сборки Cargo (Rust)
    - .gradle/caches/        # Кэш Gradle

stages:
  - build
  - test

build-job:
  stage: build
  script:
    - npm ci                 # Быстрая установка, т.к. node_modules закеширован
    - npm run build
  cache:                     # Можно переопределить кеш для конкретного job
    policy: pull             # Только загрузить кеш, не сохранять
    key: "$CI_COMMIT_REF_SLUG"
    paths:
      - node_modules/

test-job:
  stage: test
  script:
    - npm test
  cache:                     # Job тестирования также использует закешированные зависимости
    policy: pull
    key: "$CI_COMMIT_REF_SLUG"
    paths:
      - node_modules/

Ключевые особенности и best practices:

  • Ключ (key): Определяет версию кеша. Использование $CI_COMMIT_REF_SLUG (имя ветки) — распространённая практика. Для зависимостей, общих для всего проекта, можно использовать статический ключ, например key: "global-cache".
  • Политика (policy): pull-push (по умолчанию), pull (только загрузка), push (только сохранение). На этапе деплоя часто используют policy: pull, чтобы не перезаписывать кеш.
  • Кеш vs Артефакты (artifacts): Кеш — для ускорения (не гарантируется сохранность). Артефакты — для передачи файлов между этапами (например, собранный JAR-файл) и их хранения.
  • Размер и инвалидация: Большие кеши замедляют пайплайн. Важно очищать кеш при изменении ключа (например, при обновлении package.json нужно изменить ключ, добавив хэш файла: key: "$CI_COMMIT_REF_SLUG-$CI_PROJECT_DIR/package.json").