Короткий ответ
Артефакт — это результат стадии сборки (бинарник, jar/zip-архив, Docker-образ, собранный frontend-бандл), который сохраняется и передаётся между стадиями и окружениями, чтобы не пересобирать код заново и гарантировать, что в прод попадёт именно то, что было протестировано.
Как это работает подробнее
стадия `build` компилирует и упаковывает код в файл или образ, который CI-система сохраняет во внутреннем хранилище артефактов или внешнем репозитории (registry, Nexus, Artifactory). Последующие стадии (`test`, `deploy`) скачивают этот же артефакт вместо повторной сборки.
Пример кода
example.yaml
build:
stage: build
script: docker build -t myapp:$CI_COMMIT_SHORT_SHA .
artifacts:
paths:
- image.tar
expire_in: 1 week
deploy:
stage: deploy
script: docker load -i image.tar && ./deploy.sh myapp:$CI_COMMIT_SHORT_SHAЧто использовать на практике
- На практике. принцип «собери один раз — разверни много раз» (build once, deploy many) важен для надёжности: если пересобирать код отдельно для каждого окружения, можно случайно получить разные версии зависимостей из-за недетерминированной сборки или изменений в реестре пакетов между запусками.
- Пример. Ожидаемое поведение: стадия `deploy` использует тот же образ `myapp:$CI_COMMIT_SHORT_SHA`, который был собран и протестирован ранее, а не создаёт новый.
Подводные камни
- Частые ошибки. хранят артефакты бессрочно, не настраивая политику очистки, из-за чего хранилище переполняется; пересобирают образ перед каждым деплоем «для простоты», теряя гарантию идентичности протестированного и выпущенного артефакта.