Artifact (artefact) — is het eindresultaat van het buildproces dat kan worden geïmplementeerd op het doelapparaat of kan worden gebruikt als afhankelijkheid in andere projecten. Artefacten omvatten APK- en IPA-bestanden van mobiele apps, Docker-images, JAR/WAR-bibliotheken en installatiepakketten. Volgens JFrog State of Software Supply Chain, 2025 kunnen organisaties tot 10 terabyte aan artefacten opslaan in één register, wat beheersystemen cruciaal maakt.
Belangrijkste punten
Artifact (build-artefact) — is het resultaat van het compileren van broncode, klaar voor implementatie of gebruik als afhankelijkheid. Het buildproces zet bronbestanden (Java, Kotlin, Swift, C++ en andere) om in binaire pakketten die kunnen worden uitgevoerd op het doelapparaat of de server.
Het concept van artefact gaat verder dan uitvoerbare bestanden. Bijvoorbeeld JAR-bibliotheek — is een artefact dat als afhankelijkheid in andere projecten wordt gebruikt. Docker-image — een artefact dat de app en zijn omgeving bevat. Zelfs een testdekkingsrapport kan als artefact worden beschouwd in de context van CI/CD.
Moderne ontwikkeling in grote bedrijven omvat het beheer van honderdduizenden artefacten. Google DORA koppelt de volwassenheid van artefactbeheer aan de algehele DevOps-effectiviteit — teams die artefactregisters gebruiken, brengen sneller releases uit en hebben minder vaak problemen bij implementatie.
Elk artefact doorloopt verschillende fasen: creatie (build, compilatie), validatie (testen, beveiligingscontrole), opslag (artefactregister), distributie (publicatie voor download) en archivering of verwijdering (wanneer een versie verouderd raakt).
Verschillende platforms en technologieën genereren verschillende artefactformaten. Inzicht in formaten is noodzakelijk voor het correct configureren van de CI/CD-pipeline en het kiezen van een opslagsysteem.
APK (Android Package Kit) — traditioneel installatiepakketformaat. AAB (Android App Bundle) — modern formaat voor publicatie in Google Play, dat alleen de bronnen bevat die een specifiek apparaat nodig heeft. AAB vermindert de grootte van de geïnstalleerde app met gemiddeld 15-20% in vergelijking met universele APK.
IPA (iOS App Store Package) — archief met code en bronnen voor iOS-apparaten. XCArchive — tussenartefact gemaakt door Xcode, waaruit de definitieve IPA wordt geëxporteerd. dSYM — debugbestand dat nodig is voor het symboliseren van crashlogs.
| Platform | Formaat | Extensie | Doel |
|---|---|---|---|
| Android | APK | .apk | Installatiepakket |
| Android | AAB | .aab | Publicatie in Google Play |
| iOS | IPA | .ipa | Installatiepakket |
| iOS | dSYM | .dSYM.zip | Debugsymbolen |
| Flutter | Bundle | .zip, .tar.gz | Web/Desktop-builds |
JAR (Java ARchive) — voor Java/Kotlin-bibliotheken. AAR (Android ARchive) — voor Android-bibliotheken met bronnen. Docker-images — containerartefacten voor microservices. Elk type heeft zijn eigen register en regels voor versiebeheer.
Artefacten — de verbindende schakel tussen pijplijnfasen. Elke fase verbruikt artefacten van de vorige en produceert nieuwe. Inzicht in deze stroom is cruciaal voor het configureren van effectieve CI/CD.
Typische stroom omvat: commit → buildserver compileert code en maakt een niet-geoptimaliseerd artefact → testartefact wordt gebruikt voor het uitvoeren van tests → bij succes wordt een release-artefact gemaakt → het wordt ondertekend en gepubliceerd in het artefactregister → uit het register wordt het artefact opgehaald voor implementatie naar staging en productie. Elke overgang tussen fasen gaat gepaard met integriteits- en conformiteitscontrole.
De pipeline kan meerdere artefacten in verschillende fasen maken. Debug-artefacten bevatten debug-informatie, niet-geoptimaliseerde — worden snel gebouwd voor tests, release-artefacten — definitief, met optimalisatie en obfuscatie. Het CI-systeem moet ze kunnen onderscheiden en geschikte opslagbeleidsregels toepassen voor elk 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
Het is belangrijk onderscheid te maken tussen afhankelijkheidscache en build-artefacten. Cache (Gradle cache, CocoaPods cache) versnelt herhaalde builds, maar is niet bedoeld voor implementatie. Artefacten — eindproduct klaar voor distributie. Stel voor cache een TTL in van enkele dagen, voor artefacten — weken of maanden.
Artefacten mogen niet op de buildserver worden opgeslagen — hiervoor bestaan gespecialiseerde systemen. Repository Manager biedt gecentraliseerde opslag, indexering, toegangscontrole en integratie met CI/CD-tools.
JFrog Artifactory — universele manager die Maven, Gradle, Docker, NuGet, npm, APT, YUM ondersteunt. Sonatype Nexus — open-source alternatief met ondersteuning voor de belangrijkste formaten. GitHub Packages — ingebouwd register in GitHub, handig voor teams die al GitHub gebruiken. GitLab Container Registry — voor Docker-images.
Belangrijkste factoren: ondersteunde formaten, licentiemodel (open-source/enterprise), integratie met bestaande CI/CD, replicatiemogelijkheid tussen regio's, aanwezigheid van automatisch opschoningsbeleid voor oude versies en compliancerapporten.
// Jenkins pipeline — publicatie van APK in 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)
Een juiste strategie voor versiebeheer van artefacten is cruciaal voor reproduceerbaarheid van builds en het volgen van wijzigingen. Zonder versiebeheer is het onmogelijk te bepalen welke codeversie een probleem in productie heeft veroorzaakt.
Standaard MAJOR.MINOR.PATCH: MAJOR verandert bij incompatibele API-wijzigingen, MINOR — bij toevoeging van achterwaarts compatibele functionaliteit, PATCH — bij achterwaarts compatibele fixes. Voor CI/CD worden build-metadata aan de versie toegevoegd: 2.4.1+build.20260703.1. Dit maakt het mogelijk om precies te bepalen welke commit een specifiek artefact heeft gegenereerd en wanneer het is gemaakt.
Elk artefact moet metadata bevatten over zijn oorsprong: commit SHA, CI-buildnummer, branchnaam, builddatum. Deze informatie wordt vastgelegd in het manifest van het artefact en maakt het mogelijk om op elk moment de context van zijn creatie te reconstrueren. Zonder traceerbaarheid wordt werken met artefacten een gokwerk, wat onacceptabel is voor productiesystemen met auditeisen.
Naamconventie: {project}-{module}-{version}.{ext}. Bijvoorbeeld: `messaging-sdk-2.4.1.aar` of `app-release-2.4.1.apk`. De buildserver kan automatisch een versie genereren op basis van een Git-tag of CI-buildnummer.
In Maven/Gradle artefactregisters wordt onderscheid gemaakt tussen release-versies (vast, onveranderlijk) en snapshot-versies (huidige ontwikkeling, kunnen worden overschreven). In CI/CD-pipelines zijn snapshot-artefacten handig voor ontwikkeling, maar in productie mogen alleen release-versies worden gebruikt.
Artefacten — een sleutelelement van de software supply chain. Compromittering van een artefact kan leiden tot het binnendringen van kwaadaardige code in productie. De beveiliging van artefacten omvat verschillende beschermingsniveaus.
APK-bestanden worden ondertekend met jarsigner of apksigner; IPA — met Apple-certificaat; Docker-images — met Content Trust (Notary) van Docker. Ondertekening garandeert integriteit en bevestigt de auteur van het artefact. De CI/CD-pipeline moet verificatie van alle externe afhankelijkheden omvatten.
Voor publicatie wordt het artefact gecontroleerd door automatische scanners: Snyk, Trivy, Sonatype Nexus IQ, GitHub Dependabot. Ze analyseren opgenomen afhankelijkheden, versies van gebruikte bibliotheken en bekende CVE-kwetsbaarheden. Bij detectie van een kritieke kwetsbaarheid wordt de release onmiddellijk geblokkeerd totdat deze door ontwikkelaars is verholpen.
SLSA (Supply chain Levels for Software Artifacts) — beveiligingsraamwerk dat vertrouwensniveaus definieert van SLSA 1 (basis) tot SLSA 4 (maximaal). De buildserver moet provenance attestation genereren — een cryptografisch ondertekend bewijs van hoe en uit welke code het artefact is gebouwd.
Veelgestelde vragen
APK — een universeel pakket met alle bronnen, AAB — een modulair formaat waarbij Google Play alleen de benodigde bronnen levert voor een specifiek apparaat. AAB is kleiner en wordt door Google aanbevolen voor nieuwe apps.
Het beste in gespecialiseerde systemen (Artifactory, Nexus, GitHub Packages), niet op de CI-server of in de coderepository. Ze bieden versiebeheer, toegangscontrole, integratie met CI/CD en automatische opschoning van oude versies.
Ja, alle artefacten bestemd voor productiegebruik moeten worden ondertekend. Voor mobiele apps is ondertekening verplicht voor installatie op apparaten en publicatie in winkels.
Gebruik Git-tag of CI-buildnummer. Genereer automatisch een versie volgens het sjabloon MAJOR.MINOR.PATCH+build.N, waarbij N het opeenvolgende CI-buildnummer of commit SHA is.
Configureer een automatisch opschoningsbeleid: bewaar de laatste 10-20 release- en 30-50 snapshot-versies. Oude versies kunnen worden gearchiveerd in cold storage (S3 Glacier, Google Coldline) voor compliance.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook