Артефакт сборки
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 можно переместить.