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

Ответ

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

Базовый пример конфигурации в .gitlab-ci.yml:

cache:
  key: ${CI_COMMIT_REF_SLUG}           # Уникальный ключ (часто по ветке)
  paths:
    - node_modules/                    # Кешируемые пути
    - .gradle/caches/
  policy: pull-push                    # Политика: скачать и обновить кеш

build_job:
  script:
    - npm ci                           # Быстрая установка из кешированных node_modules

Ключевые особенности и практика:

  • Ключ (key): Определяет версию кеша. Использование $CI_COMMIT_REF_SLUG создает отдельный кеш для каждой ветки.
  • Политики (policy):
    • pull-push (по умолчанию): job скачивает существующий кеш и обновляет его.
    • pull: job только использует кеш, но не обновляет его (полезно для deploy-стадий).
    • push: job только создает/обновляет кеш.
  • Кеш vs Артефакты: Кеш не гарантирует сохранность и предназначен для ускорения сборки. Для передачи билдов между стадиями используйте artifacts.
  • Очистка: Кеш может быть удален администратором или при нехватке места, поэтому критичные данные в нем хранить нельзя.

Ответ 18+ 🔞

А, слушай, про кеш в GitLab CI/CD. Ну это такая штука, чтобы не собирать всё с нуля каждый раз, как будто ты только что родился. Представь: ты каждый раз качаешь одни и те же пакеты, компилируешь одно и то же — это же пиздец как долго и тупо. Так вот, кеш — это типа твоя кладовка между запусками пайплайнов. Туда можно сложить node_modules, всякие кэши сборщиков, чтобы в следующий раз не начинать с пустого места.

Вот смотри, как это выглядит в конфиге, простейший пример:

cache:
  key: ${CI_COMMIT_REF_SLUG}           # Ключ, обычно по ветке. Для каждой ветки свой мешок с хламом.
  paths:
    - node_modules/                    # Вот эту папку с зависимостями кешируем
    - .gradle/caches/                  # И эту тоже, чтоб Gradle не охуевал каждый раз
  policy: pull-push                    # Политика: сначала забрал из кладовки, потом обратно запихнул

build_job:
  script:
    - npm ci                           # И вот тут уже npm не будет качать овердохуища пакетов, если они в кеше

Теперь по полочкам, а то подозрение ёбать чувствую, что запутаешься.

Ключ (key) — это самое важное. Это как бирка на твоём мешке. Если пишешь $CI_COMMIT_REF_SLUG, то для ветки main будет один мешок, для feature/ebany — совсем другой. Не смешаются. Можно и по-другому, но это классика.

Политики (policy) — тут три варианта, как вести себя с этой кладовкой:

  • pull-push — дефолтный, жадный. Зашёл в job, взял из кеша что есть (pull), поработал, и обратно засунул обновлённое (push). Стандарт для сборки.
  • pull — только забрал. Как стянул старые node_modules — и всё, ничего не кладёшь обратно. Идеально для стадии деплоя, где тебе ничего обновлять не надо.
  • push — только положил. Редко, но бывает, когда job специально готовит кеш для других.

А теперь, блядь, важнейший момент! Не путай кеш с артефактами (artifacts). Это две большие разницы, ёпта!

  • Кеш — это для скорости, для экономии времени. Он ненадёжный, его могут в любой момент выкинуть, если место кончится. Хранить в нём что-то ценное — идея хуйовая. Это просто временная подпорка.
  • Артефакты — это для передачи результатов работы между стадиями. Собрал бинарник в одной job — положил в артефакты, а на следующей стадии его заберёшь и задеплоишь. Вот это — гарантированно сохранится на время пайплайна.

И последнее: очистка. Не рассчитывай на кеш как на каменную стену. Админ может его почистить, система сама может затереть, если переполнится. Поэтому если твой пайплайн без кеша не работает — это пизда рулю, чувак. Дизайн кривой. Кеш — это ускоритель, а не фундамент. Запомни это, и волнение ёбать отпадёт.