Чем отличаются кэш (cache) и артефакты (artifacts) в GitLab CI/CD?

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

Ответ

В GitLab CI/CD это два разных механизма с разными целями:

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

Артефакты (Artifacts) — это результаты работы джобы (собранные бинарники, отчеты тестирования, логи), которые должны быть сохранены, переданы между стадиями или доступны для скачивания после выполнения пайплайна. Они имеют явный срок хранения.

Практический пример в .gitlab-ci.yml:

variables:
  NODE_VERSION: "18"

# КЭШ: Сохраняем node_modules между запусками, чтобы не скачивать зависимости каждый раз
cache:
  key: "node-modules-$CI_COMMIT_REF_SLUG" # Ключ для инвалидации кэша
  paths:
    - node_modules/
  policy: pull-push # Скачиваем и обновляем кэш

stages:
  - build
  - test

build-job:
  stage: build
  image: node:$NODE_VERSION
  script:
    - npm ci --cache .npm --prefer-offline # Используем кэшированные npm-пакеты
    - npm run build
  # АРТЕФАКТЫ: Сохраняем результат сборки для следующих стадий и для скачивания
  artifacts:
    paths:
      - dist/ # Папка со скомпилированным приложением
      - coverage/ # Отчет о покрытии кода
    expire_in: 1 week
    when: on_success

test-job:
  stage: test
  image: node:$NODE_VERSION
  script:
    - npm test
  # Эта джоба автоматически скачает артефакты (dist/, coverage/) из build-job
  dependencies:
    - build-job

Ключевое отличие: Кэш — для скорости (оптимизация), артефакты — для сохранения и передачи выходных данных работы (результат).