В чем разница между кешем и артефактами в GitLab CI/CD?

Ответ

Кеш (Cache) и Артефакты (Artifacts) — это механизмы для работы с файлами в пайплайне, но с разными целями и поведением.

Аспект Кеш (Cache) Артефакты (Artifacts)
Основная цель Ускорение последующих сборок за счет повторного использования неизменных зависимостей. Передача файлов между этапами (джобами) пайплайна и сохранение результатов сборки.
Типичное содержимое Директории с зависимостями: node_modules/, .venv/, target/, ~/.cache/. Результаты сборки: бинарники (.jar, .exe), пакеты (.deb, .rpm), отчеты тестов (junit.xml), документация.
Жизненный цикл Не гарантирован. Может быть удален GitLab Runner для экономии места, если долго не используется. Гарантированно хранятся на GitLab-сервере заданное время (определяется expire_in).
Доступность Доступен до начала выполнения джобы (распаковывается). Доступен после успешного выполнения джобы (в последующих этапах или для скачивания из UI).
Ключевое отличие Оптимизация производительности. Сохранение выходных данных.

Практический пример .gitlab-ci.yml для Python-проекта:

# Определяем кеш для виртуального окружения, чтобы не переустанавливать пакеты каждый раз
cache:
  paths:
    - .venv/
  key: $CI_COMMIT_REF_SLUG  # Разный кеш для разных веток

stages:
  - test
  - build

# Этап тестирования
run-tests:
  stage: test
  script:
    - pip install -r requirements.txt
    - pytest --junitxml=report.xml
  artifacts:
    paths:
      - report.xml  # Отчет о тестах передается дальше и сохраняется
    reports:
      junit: report.xml

# Этап сборки пакета
build-package:
  stage: build
  script:
    - python setup.py sdist bdist_wheel
  artifacts:
    paths:
      - dist/  # Собранные пакеты (.tar.gz, .whl) сохраняются для скачивания или деплоя
    expire_in: 1 week  # Храним артефакты неделю

В этом примере .venv кешируется для скорости, а report.xml и папка dist/ — это артефакты, которые являются результатом работы пайплайна.

Ответ 18+ 🔞

А, ну это же классика, ёпта! Сидишь такой, пытаешься настроить свой пайплайн, а тут тебе подсовывают два понятия — кеш и артефакты. И вроде бы оба про файлы, но разница, блядь, как между бутербродом и ударом в челюсть — фундаментальная.

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

Вот смотри, чтобы совсем не охуеть от этой каши, табличка тебе в помощь:

Штука Кеш (Cache) Артефакты (Artifacts)
Зачем оно? Ускориться, чтобы не делать одно и то же по сто раз. Передать или сохранить то, что получилось в итоге.
Что внутри? Всякая хрень вроде node_modules/, .venv/, target/. То, что скачивается и устанавливается. Результаты твоего труда: .jar, .exe, отчёты тестов (junit.xml), пакеты.
Живёт сколько? А хуй его знает. GitLab Runner может его стереть, если давно не юзали и место нужно. Гарантированно лежит столько, сколько скажешь (параметр expire_in).
Когда доступно? До того, как джоба начнёт работать. Распаковывается и готово. После того, как джоба успешно отработала. Качай из интерфейса или используй в следующем этапе.
Суть в чём? Оптимизация, скорость, лень. Результат, доказательство работы, передача данных.

Ну а теперь, чтобы волнение ебать ушло, смотри на живой пример для какого-нибудь питонячего проекта:

# Кешируем виртуальное окружение, чтобы не ставить пакеты каждый раз, как последний распиздяй
cache:
  paths:
    - .venv/
  key: $CI_COMMIT_REF_SLUG  # Для каждой ветки свой кеш, чтобы не было конфузов

stages:
  - test
  - build

# Этап, где мы всё тестируем
run-tests:
  stage: test
  script:
    - pip install -r requirements.txt  # Если .venv нет в кеше — установит
    - pytest --junitxml=report.xml
  artifacts:
    paths:
      - report.xml  # Вот этот отчёт — наш артефакт, сохраняем и передаём
    reports:
      junit: report.xml

# Этап, где мы что-то собираем
build-package:
  stage: build
  script:
    - python setup.py sdist bdist_wheel
  artifacts:
    paths:
      - dist/  # А вот и собранные пакеты — главный артефакт, который можно скачать
    expire_in: 1 week  # Храним неделю, а потом хоть трава не расти

Короче, запомни, чувак: кеш — для экономии времени и нервов (чтобы не ждать, пока npm install полчаса ползёт), а артефакты — это уже готовый продукт или отчёт, который ты либо кому-то передаёшь, либо себе на полку ставишь. Перепутать их — это как гвозди микроскопом забивать, в общем, ядрёна вошь.