Artifact (артефакт) — это конечный результат процесса сборки, который может быть развёрнут на целевом устройстве или использован как зависимость в других проектах. К артефактам относятся APK и IPA файлы мобильных приложений, Docker-образы, JAR/WAR библиотеки и установочные пакеты. По данным JFrog State of Software Supply Chain, 2025, организации могут хранить до 10 терабайт артефактов в одном реестре, что делает системы управления ими критически важными.
Главное
Artifact (артефакт сборки) — это результат компиляции исходного кода, готовый к развёртыванию или использованию в качестве зависимости. Процесс сборки преобразует исходные файлы (Java, Kotlin, Swift, C++ и другие) в бинарные пакеты, которые можно запускать на целевом устройстве или сервере.
Понятие артефакта выходит за рамки исполняемых файлов. Например, JAR-библиотека — это артефакт, который используется как зависимость в других проектах. Docker-образ — артефакт, содержащий приложение и его окружение. Даже отчёт о покрытии тестами может считаться артефактом в контексте CI/CD.
Современная разработка в крупных компаниях включает управление сотнями тысяч артефактов. Google DORA связывает зрелость управления артефактами с общей эффективностью DevOps — команды, использующие артефактные реестры, быстрее выпускают релизы и реже сталкиваются с проблемами при деплое.
Каждый артефакт проходит несколько стадий: создание (сборка, компиляция), валидация (тестирование, проверка безопасности), хранение (реестр артефактов), распространение (публикация для загрузки) и архивация или удаление (когда версия устаревает).
Разные платформы и технологии генерируют различные форматы артефактов. Понимание форматов необходимо для правильной настройки CI/CD-пайплайна и выбора системы хранения.
APK (Android Package Kit) — традиционный формат установочного пакета. AAB (Android App Bundle) — современный формат для публикации в Google Play, содержащий только те ресурсы, которые нужны конкретному устройству. AAB уменьшает размер устанавливаемого приложения в среднем на 15-20% по сравнению с универсальным APK.
IPA (iOS App Store Package) — архив с кодом и ресурсами для iOS-устройств. XCArchive — промежуточный артефакт, создаваемый Xcode, из которого экспортируется финальный IPA. dSYM — файл отладки, необходимый для символизации crash-логов.
| Платформа | Формат | Расширение | Назначение |
|---|---|---|---|
| Android | APK | .apk | Установочный пакет |
| Android | AAB | .aab | Публикация в Google Play |
| iOS | IPA | .ipa | Установочный пакет |
| iOS | dSYM | .dSYM.zip | Debug symbols |
| Flutter | Bundle | .zip, .tar.gz | Web/Desktop сборки |
JAR (Java ARchive) — для библиотек Java/Kotlin. AAR (Android ARchive) — для Android-библиотек с ресурсами. Docker-образы — контейнерные артефакты для микросервисов. Каждый тип имеет свой реестр и правила управления версиями.
Артефакты — связующее звено между этапами пайплайна. Каждая стадия потребляет артефакты предыдущей и производит новые. Понимание этого потока критически важно для настройки эффективного CI/CD.
Типовой поток включает: коммит -> build-сервер компилирует код и создаёт неоптимизированный артефакт -> тестовый артефакт используется для прогона тестов -> при успехе создаётся релизный артефакт -> он подписывается и публикуется в артефактный реестр -> из реестра артефакт забирается для деплоя в staging и production. Каждый переход между этапами сопровождается проверкой целостности и соответствия требованиям.
Пайплайн может создавать несколько артефактов на разных этапах. Debug-артефакты содержат отладочную информацию, unoptimized — собираются быстро для тестов, release-артефакты — финальные, с оптимизацияцией и обфускацией. CI-система должна уметь различать их и применять соответствующие политики хранения для каждого типа.
name: Artifact Flow
on: [push]
jobs:
build-debug:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: ./gradlew assembleDebug
- uses: actions/upload-artifact@v4
with:
name: debug-apk
path: app/build/outputs/apk/debug/app-debug.apk
retention-days: 7
test:
needs: build-debug
runs-on: ubuntu-latest
steps:
- uses: actions/download-artifact@v4
with:
name: debug-apk
- run: ./gradlew testDebugUnitTest
build-release:
needs: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: ./gradlew assembleRelease
- uses: actions/upload-artifact@v4
with:
name: release-apk
path: app/build/outputs/apk/release/app-release.apk
retention-days: 90
Важно различать кэш зависимостей и артефакты сборки. Кэш (Gradle cache, CocoaPods cache) ускоряет повторные сборки, но не предназначен для деплоя. Артефакты — конечный продукт, готовый к распространению. Для кэша устанавливайте TTL в несколько дней, для артефактов — недели или месяцы.
Артефакты не должны храниться на build-сервере — для этого существуют специализированные системы. Repository Manager обеспечивает централизованное хранение, индексацию, контроль доступа и интеграцию с CI/CD-инструментами.
JFrog Artifactory — универсальный менеджер, поддерживающий Maven, Gradle, Docker, NuGet, npm, APT, YUM. Sonatype Nexus — open-source альтернатива с поддержкой основных форматов. GitHub Packages — встроенный реестр в GitHub, удобный для команд, уже использующих GitHub. GitLab Container Registry — для Docker-образов.
Основные факторы: поддерживаемые форматы, модель лицензирования (open-source/enterprise), интеграция с существующим CI/CD, возможность репликации между регионами, наличие политик автоматической очистки старых версий и compliance-отчётов.
// Jenkins pipeline — публикация APK в Artifactory
def server = Artifactory.newServer(
url: 'https://artifactory.company.com',
credentialsId: 'artifactory-api-key'
)
def uploadSpec = """
{
"files": [
{
"pattern": "app/build/outputs/apk/release/*.apk",
"target": "mobile-apps/android/release/""
}
]
}
"""
server.upload(uploadSpec)
Правильная стратегия версионирования артефактов критична для воспроизводимости сборок и отслеживания изменений. Без версионирования невозможно определить, какая версия кода вызвала проблему в продакшене.
Стандарт MAJOR.MINOR.PATCH: MAJOR меняется при несовместимых изменениях API, MINOR — при добавлении обратно-совместимой функциональности, PATCH — при обратно-совместимых исправлениях. Для CI/CD к версии добавляют build-метаданные: 2.4.1+build.20260703.1. Это позволяет точно определить, какой коммит породил конкретный артефакт и когда он был создан.
Каждый артефакт должен содержать метаданные о его происхождении: commit SHA, номер CI-сборки, имя ветки, дату сборки. Эта информация записывается в манифест артефакта и позволяет в любой момент восстановить контекст его создания. Без traceability работа с артефактами превращается в угадывание версий, что недопустимо для production-систем с требованиями к аудиту.
Конвенция имени: {project}-{module}-{version}.{ext}. Например: `messaging-sdk-2.4.1.aar` или `app-release-2.4.1.apk`. build-сервер может автоматически генерировать версию на основе тега Git или номера сборки CI-системы.
В артефактных реестрах Maven/Gradle различают release-версии (фиксированные, неизменяемые) и snapshot-версии (текущая разработка, могут перезаписываться). В CI/CD пайплайнах snapshot-артефакты удобны для разработки, но в продакшене должны использоваться только release-версии.
Артефакты — ключевой элемент цепочки поставки ПО (software supply chain). Компрометация артефакта может привести к попаданию вредоносного кода в продакшен. Безопасность артефактов включает несколько уровней защиты.
APK-файлы подписываются jarsigner или apksigner; IPA — Apple-сертификатом; Docker-образы — Content Trust (Notary) от Docker. Подпись гарантирует целостность и подтверждает автора артефакта. CI/CD-пайплайн должен включать проверку подписей всех сторонних зависимостей.
Перед публикацией артефакт проверяется автоматическими сканерами: Snyk, Trivy, Sonatype Nexus IQ, GitHub Dependabot. Они анализируют включённые зависимости, версии используемых библиотек и известные CVE-уязвимости. При обнаружении критической уязвимости выпуск релиза немедленно блокируется до её устранения разработчиками.
SLSA (Supply chain Levels for Software Artifacts) — фреймворк безопасности, определяющий уровни доверия от SLSA 1 (базовый) до SLSA 4 (максимальный). Build-сервер должен генерировать provenance attestation — криптографически подписанное свидетельство о том, как и из какого кода был собран артефакт.
Часто задаваемые вопросы
APK — универсальный пакет со всеми ресурсами, AAB — модульный формат, при котором Google Play доставляет только необходимые ресурсы для конкретного устройства. AAB меньше по размеру и рекомендуется Google для новых приложений.
Лучше всего в специализированных системах (Artifactory, Nexus, GitHub Packages), а не на CI-сервере или в репозитории кода. Они обеспечивают версионирование, контроль доступа, интеграцию с CI/CD и автоматическую очистку старых версий.
Да, все артефакты, предназначенные для продукционного использования, должны быть подписаны. Для мобильных приложений подпись обязательна для установки на устройства и публикации в магазинах.
Используйте Git tag или номер сборки CI-системы. Автоматически генерируйте версию по шаблону MAJOR.MINOR.PATCH+build.N, где N — последовательный номер CI-сборки или commit SHA.
Настройте политику автоматической очистки: храните последние 10-20 релизных и 30-50 snapshot-версий артефактов. Старые версии можно архивировать в холодное хранилище (S3 Glacier, Google Coldline) для compliance.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также