Артефакт сборки

Artifact — версионированный результат build, который можно проверить, хранить, передать и развернуть: JAR/WAR, container image, архив, generated documentation или checksum.

Идентичность

Для Maven artifact задают:

groupId:artifactId:version[:classifier]

Например, один module может выпускать основной JAR, sources и javadoc artifacts с classifiers. Repository хранит не “последний файл”, а координаты и metadata.

Build once, deploy many

Надёжный pipeline:

source commit
→ compile + tests
→ immutable artifact
→ checksum/signature
→ repository
→ тот же artifact в test и production

Пересборка на каждом окружении может дать другое содержимое из-за dependencies, времени, toolchain или base image. Конфигурация окружения передаётся при запуске, а не вшивается отдельной пересборкой.

Release и snapshot

Release version должна быть неизменяемой. Snapshot удобен в разработке, но одно имя может обозначать новое содержимое, поэтому он хуже для воспроизводимого deploy и rollback.

Для container image аналог координат — repository/name:tag, но tag mutable. Digest надёжнее указывает конкретное содержимое.

Provenance

Для диагностики сохраняю:

  • commit id;
  • версию JDK/Maven;
  • dependency lock/BOM;
  • checksum;
  • test results;
  • SBOM при соответствующих требованиях.

Типичные сбои

  • Перезаписать release version другим binary.
  • Собрать production artifact вручную на laptop.
  • Положить environment secret внутрь JAR/image.
  • Не связать running version с commit.
  • Откатить tag, который уже указывает на другое содержимое.

Вопросы для собеседования

Чем artifact отличается от исходников? Это результат воспроизводимого шага build, готовый к потреблению или deploy.

Почему build once? Все окружения получают ровно проверенное содержимое.

Что делает version координатой Maven? Отличает конкретный выпуск одного groupId:artifactId.

Почему digest надёжнее tag image? Digest вычислен из содержимого, tag можно переместить.

См. Основы иcпользования Maven, Jar файл Java, Docker.