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 символи |
| Flutter | Bundle | .zip, .tar.gz | Web/Desktop компилации |
JAR (Java ARchive) — за Java/Kotlin библиотеки. AAR (Android ARchive) — за Android библиотеки с ресурси. Docker образи — контейнерни артефакти за микросървиси. Всеки тип има свой регистър и правила за управление на версиите.
Артефактите — свързващото звено между етапите на пайплайна. Всеки етап използва артефактите от предишния и създава нови. Разбирането на този поток е критично за конфигуриране на ефективен CI/CD.
Типичният поток включва: commit → сървърът за компилация компилира кода и създава неоптимизиран артефакт → тестовият артефакт се използва за изпълнение на тестове → при успех се създава артефакт за версия → подписва се и се публикува в регистъра за артефакти → от регистъра артефактът се взема за разгръщане в staging и продукция. Всеки преход между етапите е съпроводен с проверка на цялостността и съответствието с изискванията.
Пайплайнът може да създава множество артефакти на различни етапи. Debug артефактите съдържат информация за отстраняване на грешки, неоптимизираните — се компилират бързо за тестове, артефактите за версия — крайни, с оптимизация и объркване. 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 от няколко дни, за артефакти — седмици или месеци.
Артефактите не трябва да се съхраняват на сървъра за компилация — за това съществуват специализирани системи. Repository Manager осигурява централизирано съхранение, индексиране, контрол на достъпа и интеграция с CI/CD инструменти.
JFrog Artifactory — универсален мениджър, поддържащ Maven, Gradle, Docker, NuGet, npm, APT, YUM. Sonatype Nexus — алтернатива с отворен код с поддръжка на основните формати. GitHub Packages — вграден регистър в GitHub, удобен за екипи, които вече използват GitHub. GitLab Container Registry — за Docker образи.
Основни фактори: поддържани формати, модел на лицензиране (open-source/enterprise), интеграция със съществуващия CI/CD, възможност за репликация между региони, наличие на политики за автоматично почистване на стари версии и отчети за съответствие.
// 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 към версията се добавят метаданни за компилация: 2.4.1+build.20260703.1. Това позволява точно определяне кой commit е създал конкретния артефакт и кога е бил компилиран.
Всеки артефакт трябва да съдържа метаданни за своя произход: commit SHA, номер на CI компилация, име на клон, дата на компилация. Тази информация се записва в манифеста на артефакта и позволява по всяко време да се реконструира контекстът на неговото създаване. Без проследимост работата с артефакти се превръща в познаене на версии, което е недопустимо за продукционни системи с изисквания за одит.
Конвенция за имена: {project}-{module}-{version}.{ext}. Например: `messaging-sdk-2.4.1.aar` или `app-release-2.4.1.apk`. Сървърът за компилация може автоматично да генерира версия въз основа на 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 (максимално). Сървърът за компилация трябва да генерира provenance attestation — криптографски подписано свидетелство за това как и от какъв код е компилиран артефактът.
Често задавани въпроси
APK — универсален пакет с всички ресурси, AAB — модулен формат, при който Google Play доставя само необходимите ресурси за конкретното устройство. AAB е по-малък по размер и се препоръчва от Google за нови приложения.
Най-добре в специализирани системи (Artifactory, Nexus, GitHub Packages), а не на CI сървъра или в хранилището за код. Те осигуряват версиониране, контрол на достъпа, интеграция с CI/CD и автоматично почистване на стари версии.
Да, всички артефакти, предназначени за продукционна употреба, трябва да бъдат подписани. За мобилни приложения подписът е задължителен за инсталиране на устройства и публикуване в магазини.
Използвайте Git таг или номер на CI компилация. Автоматично генерирайте версия по шаблон MAJOR.MINOR.PATCH+build.N, където N е поредният номер на CI компилация или commit SHA.
Конфигурирайте политика за автоматично почистване: съхранявайте последните 10-20 release и 30-50 snapshot версии. Старите версии могат да бъдат архивирани в студено хранилище (S3 Glacier, Google Coldline) за съответствие.
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също