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

«В чем разница между кешем и артефактами в GitLab CI/CD?» — вопрос из категории DevOps, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Кеш (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/ — это артефакты, которые являются результатом работы пайплайна.