Что такое артефакты (artifacts) в GitLab CI/CD и для чего они используются?

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

Ответ

В GitLab CI/CD артефакты — это набор файлов или директорий, которые создаются в процессе выполнения job'а (задания) и сохраняются GitLab Runner'ом. После завершения job'а эти файлы становятся доступными для скачивания через веб-интерфейс GitLab, а также могут быть автоматически переданы в последующие job'ы того же пайплайна.

Типичные use-cases для артефактов:

  • Скомпилированные бинарники: JAR, .exe, Docker-образы (если сохранять как tarball).
  • Результаты тестирования: JUnit/XML отчеты, отчеты о покрытии кода (coverage).
  • Логи сборки и деплоя.
  • Конфигурационные файлы, сгенерированные для конкретного окружения.

Практический пример из .gitlab-ci.yml: Мы настраиваем пайплайн, где этап сборки создает артефакт, а этап тестирования и деплоя его использует.

stages:
  - build
  - test
  - deploy

build_job:
  stage: build
  script:
    - mvn clean package -DskipTests
  artifacts:
    paths:
      - target/*.jar               # Сохраняем собранный JAR-файл
    expire_in: 1 week              # Автоматически удалим через неделю
    reports:
      junit: target/surefire-reports/TEST-*.xml  # Специальный артефакт для отображения тестов в UI

test_job:
  stage: test
  script:
    - java -jar target/*.jar --test  # Используем артефакт из build_job
  dependencies:
    - build_job                     # Явно указываем, от какого job'а нужны артефакты
  artifacts:
    paths:
      - test-reports/

deploy_to_staging:
  stage: deploy
  script:
    - scp target/*.jar deploy@server:/app/  # Копируем тот же JAR на сервер
  dependencies:
    - build_job                     # Берем артефакт из build, игнорируя артефакты test_job
  only:
    - main

Ключевые особенности и best practices:

  1. dependencies: Позволяет контролировать, какие артефакты из предыдущих stages попадут в текущий job. По умолчанию job получает артефакты из всех предыдущих stages.
  2. expire_in: Критически важно для управления хранилищем. Для временных файлов (логи, промежуточные отчеты) ставим короткий срок. Для релизных бинарников можно не указывать (вечное хранение) или указать длительный срок.
  3. Именованные артефакты: Можно задать имя (name), что полезно при скачивании через API.
  4. Кэширование vs Артефакты: Кэш (cache) используется для ускорения повторных сборок (например, зависимости node_modules/). Артефакты — это конечный результат работы пайплайна, который должен быть сохранен. Путать их не стоит. В моей работе артефакты — это стандартный способ передавать результаты между этапами CI/CD и сохранять билды для последующего развертывания или отладки.