An artifact is the final result of a build process that can be deployed on a target device or used as a dependency in other projects. Artifacts include APK and IPA files of mobile applications, Docker images, JAR/WAR libraries, and installation packages. According to the JFrog State of Software Supply Chain, 2025, organizations can store up to 10 terabytes of artifacts in a single registry, making artifact management systems critically important.
Key Takeaways
An artifact (build artifact) is the result of compiling source code, ready for deployment or use as a dependency. The build process transforms source files (Java, Kotlin, Swift, C++, and others) into binary packages that can be run on a target device or server.
The concept of an artifact extends beyond executable files. For example, a JAR library is an artifact used as a dependency in other projects. A Docker image is an artifact containing the application and its environment. Even a test coverage report can be considered an artifact in the CI/CD context.
Modern development in large companies involves managing hundreds of thousands of artifacts. Google DORA links the maturity of artifact management to overall DevOps effectiveness — teams using artifact registries release faster and encounter fewer deployment issues.
Each artifact goes through several stages: creation (build, compilation), validation (testing, security checks), storage (artifact registry), distribution (publication for download), and archiving or deletion (when the version becomes outdated).
Different platforms and technologies generate different artifact formats. Understanding the formats is essential for configuring the CI/CD pipeline correctly and choosing a storage system.
APK (Android Package Kit) is the traditional installation package format. AAB (Android App Bundle) is a modern format for publishing on Google Play, containing only the resources needed by a specific device. AAB reduces the installed application size by an average of 15-20% compared to a universal APK.
IPA (iOS App Store Package) is an archive with code and resources for iOS devices. XCArchive is an intermediate artifact created by Xcode, from which the final IPA is exported. dSYM is a debug symbol file required for crash log symbolication.
| Platform | Format | Extension | Purpose |
|---|---|---|---|
| Android | APK | .apk | Installation package |
| Android | AAB | .aab | Google Play publication |
| iOS | IPA | .ipa | Installation package |
| iOS | dSYM | .dSYM.zip | Debug symbols |
| Flutter | Bundle | .zip, .tar.gz | Web/Desktop builds |
JAR (Java ARchive) — for Java/Kotlin libraries. AAR (Android ARchive) — for Android libraries with resources. Docker images — container artifacts for microservices. Each type has its own registry and version management rules.
Artifacts are the link between pipeline stages. Each stage consumes artifacts from the previous one and produces new ones. Understanding this flow is critical for setting up an effective CI/CD pipeline.
A typical flow includes: commit -> build server compiles the code and creates an unoptimized artifact -> the test artifact is used to run tests -> on success, a release artifact is created -> it is signed and published in the artifact registry -> the artifact is pulled from the registry for deployment to staging and production. Each transition between stages is accompanied by an integrity check and requirement compliance verification.
The pipeline can create multiple artifacts at different stages. Debug artifacts contain debugging information, unoptimized ones are built quickly for testing, release artifacts are final, with optimization and obfuscation. The CI system must be able to distinguish between them and apply appropriate retention policies for each type.
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
It is important to distinguish between dependency cache and build artifacts. Cache (Gradle cache, CocoaPods cache) speeds up repeated builds but is not intended for deployment. Artifacts are the final product, ready for distribution. Set a TTL of several days for cache, and weeks or months for artifacts.
Artifacts should not be stored on the build server — specialized systems exist for this purpose. A Repository Manager provides centralized storage, indexing, access control, and integration with CI/CD tools.
JFrog Artifactory — a universal manager supporting Maven, Gradle, Docker, NuGet, npm, APT, YUM. Sonatype Nexus — an open-source alternative supporting major formats. GitHub Packages — a built-in registry in GitHub, convenient for teams already using GitHub. GitLab Container Registry — for Docker images.
Key factors: supported formats, licensing model (open-source/enterprise), integration with existing CI/CD, replication capabilities between regions, availability of automatic cleanup policies for old versions, and compliance reports.
// Jenkins pipeline — publishing APK to 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)
A proper artifact versioning strategy is critical for build reproducibility and change tracking. Without versioning, it is impossible to determine which version of the code caused a problem in production.
The MAJOR.MINOR.PATCH standard: MAJOR changes with incompatible API changes, MINOR with backward-compatible functionality additions, PATCH with backward-compatible bug fixes. For CI/CD, build metadata is added to the version: 2.4.1+build.20260703.1. This allows you to determine exactly which commit produced a specific artifact and when it was created.
Each artifact should contain metadata about its origin: commit SHA, CI build number, branch name, build date. This information is recorded in the artifact manifest and allows you to reconstruct the context of its creation at any time. Without traceability, working with artifacts becomes version guessing, which is unacceptable for production systems with audit requirements.
Naming convention: {project}-{module}-{version}.{ext}. For example: messaging-sdk-2.4.1.aar or app-release-2.4.1.apk. The build server can automatically generate a version based on a Git tag or the CI system build number.
In Maven/Gradle artifact registries, release versions (fixed, immutable) and snapshot versions (current development, can be overwritten) are distinguished. In CI/CD pipelines, snapshot artifacts are convenient for development, but only release versions should be used in production.
Artifacts are a key element of the software supply chain. Artifact compromise can lead to malicious code entering production. Artifact security includes several protection levels.
APK files are signed with jarsigner or apksigner; IPA files are signed with an Apple certificate; Docker images are signed with Content Trust (Notary) by Docker. Signing guarantees integrity and confirms the artifact author. The CI/CD pipeline should include signature verification for all third-party dependencies.
Before publication, the artifact is checked by automated scanners: Snyk, Trivy, Sonatype Nexus IQ, GitHub Dependabot. They analyze included dependencies, versions of used libraries, and known CVE vulnerabilities. If a critical vulnerability is detected, the release is immediately blocked until it is fixed by developers.
SLSA (Supply chain Levels for Software Artifacts) is a security framework defining trust levels from SLSA 1 (basic) to SLSA 4 (maximum). The build server must generate a provenance attestation — a cryptographically signed statement about how and from what code the artifact was built.
Frequently Asked Questions
APK is a universal package with all resources, while AAB is a modular format where Google Play delivers only the necessary resources for a specific device. AAB is smaller in size and is recommended by Google for new applications.
Preferably in specialized systems (Artifactory, Nexus, GitHub Packages), rather than on a CI server or in a code repository. They provide versioning, access control, CI/CD integration, and automatic cleanup of old versions.
Yes, all artifacts intended for production use must be signed. For mobile applications, signing is mandatory for installation on devices and publication in stores.
Use a Git tag or CI system build number. Automatically generate the version using the MAJOR.MINOR.PATCH+build.N template, where N is the sequential CI build number or commit SHA.
Configure an automatic cleanup policy: keep the latest 10-20 release versions and 30-50 snapshot versions. Old versions can be archived to cold storage (S3 Glacier, Google Coldline) for compliance.
Summary
We will develop a mobile application turnkey
IT Sectr creates iOS and Android applications for startups and businesses since 2017. We will advise you and propose the best solution.
Read also