Ответ
В GitLab CI/CD артефакты — это набор файлов или директорий, которые создаются в процессе выполнения job (задачи) в пайплайне и сохраняются для последующего использования. Они не являются часть исходного кода репозитория.
Типичные примеры артефактов:
- Скомпилированные бинарные файлы или пакеты (
.jar,.exe,.deb). - Результаты выполнения тестов (логи, отчеты в JUnit XML, Allure, Cobertura форматах).
- Документация, сгенерированная из кода.
- Файлы конфигурации для деплоя.
Ключевые возможности и синтаксис:
Артефакты определяются в .gitlab-ci.yml с помощью ключа artifacts.
build_job:
stage: build
script:
- mvn clean package # Сборка Java-проекта
artifacts:
paths:
- target/*.jar # Сохраняем все JAR-файлы из target/
expire_in: 1 week # Артефакты удалятся через неделю
test_job:
stage: test
script:
- mvn test
- pytest --junitxml=report.xml # Запуск Python-тестов
artifacts:
paths:
- target/surefire-reports/ # Отчеты Maven Surefire
- report.xml # Отчет pytest
reports:
junit: report.xml # Специальный отчет для GitLab, отображается в UI
when: always # Сохранять артефакты даже если job упал
deploy_job:
stage: deploy
script:
- scp target/*.jar user@server:/app/ # Копируем артефакт с билд-джобы
dependencies:
- build_job # Указываем, что этой джобе нужны артефакты от build_job
Важные аспекты:
- Хранение: Артефакты хранятся на GitLab-сервере и доступны для скачивания через веб-интерфейс (вкладка "Job") или API. По умолчанию хранятся 30 дней (
expire_in). - Передача между джобами: Джобы в последующих стадиях (
stages) могут использовать артефакты из предыдущих джоб, если указать их вdependencies. Без этого каждая джоба начинается с чистого состояния. - Отчеты (reports): Специальные ключи, такие как
reports:junit, позволяют GitLab парсить результаты тестов и отображать статистику, графики с историей падений и т.д. в Merge Request. - Кэширование vs Артефакты: Кэш (
cache) используется для ускорения повторных сборок (например, зависимостиnode_modules/), а артефакты — для передачи результатов работы пайплайна.
Ответ 18+ 🔞
Слушай, давай разжую про артефакты в GitLab CI, а то у некоторых товарищей в голове каша, будто они впервые про пайплайны услышали. Представь, что твой пайплайн — это конвейер на заводе. На каждом этапе что-то делается: деталь точат, красят, собирают. Так вот, артефакты — это как раз эти готовые детали, которые с конвейера снимают и кладут на склад, чтобы на следующем этапе их можно было взять и прикрутить куда надо. Это НЕ исходники из гита, это то, что твои джобы наваяли в процессе.
Что обычно в эти артефакты пихают, ёпта?
- Собранные штуки: всякие
.jar,.exe, пакеты.deb— то, что потом на сервак заливать. - Отчёты от тестов: логи, XML-ки для JUnit, результаты покрытия кода. Чтобы потом не гадать, а почему всё упало, а просто посмотреть.
- Документацию, которую из кода нагенерировали.
- Конфиги для деплоя. Короче, любой файл, который нужен позже.
Как этим хозяйством рулить в .gitlab-ci.yml?
Всё через ключ artifacts делается. Смотри, примерчик:
build_job:
stage: build
script:
- mvn clean package # Классика, собираем Java-проект
artifacts:
paths:
- target/*.jar # Вот так говорим: "Сохрани-ка, дружок, все jar-ники из папки target"
expire_in: 1 week # А это чтоб хлам не копился. Через неделю самоудалится — красота.
test_job:
stage: test
script:
- mvn test
- pytest --junitxml=report.xml # Запускаем тесты на Python
artifacts:
paths:
- target/surefire-reports/ # Отчёты от Maven
- report.xml # И от pytest
reports:
junit: report.xml # А это магия! GitLab сам распарсит отчёт и красивые графики в интерфейсе нарисует.
when: always # Сохраняй артефакты ВСЕГДА, даже если джоба обосралась и тесты не прошли. Для расследования.
deploy_job:
stage: deploy
script:
- scp target/*.jar user@server:/app/ # Тут уже артефакт с билд-джобы на сервер тащим
dependencies:
- build_job # Ключевой момент! Говорим: "Эй, дай мне файлы, которые `build_job` оставила". Без этого — нихуя не получишь, будешь в пустой папке сидеть.
Важные моменты, чтобы не облажаться:
- Где лежат? На сервере GitLab, блядь. Скачать можно прямо из интерфейса в логе джобы или через API. По дефолту 30 дней валяются, но
expire_in— твой друг, не забывай про него, а то диск забьётся, доверия ебать ноль к тем, кто мусор не убирает. - Передача по цепочке: Если джоба
deployхочет взять jar-ник отbuild, она должна явно указать это вdependencies. Иначе каждая джоба стартует с чистого листа, как будто ничего и не было. Сам от себя охуеешь, когда поймёшь, что забыл эту строчку. - Отчёты (reports): Это не просто файлы. Специальные типы вроде
junitилиcoberturaGitLab умеет читать и показывать тебе прямо в Merge Request — сколько тестов упало, какое покрытие. Очень удобно, удивление пиздец, когда впервые видишь. - Не путай с кэшем! Это, блядь, частая ошибка новичков. Кэш (
cache) — это для ускорения, чтоб каждый раз зависимости (типаnode_modules/) заново не качать. А артефакты — это РЕЗУЛЬТАТ работы, который нужно передать дальше. Перепутаешь — будет тебе хитрая жопа с непонятными багами.