Ответ
Кеш (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 полчаса ползёт), а артефакты — это уже готовый продукт или отчёт, который ты либо кому-то передаёшь, либо себе на полку ставишь. Перепутать их — это как гвозди микроскопом забивать, в общем, ядрёна вошь.