Un artifact (artefatto) è il risultato finale di un processo di build che può essere distribuito su un dispositivo target o utilizzato come dipendenza in altri progetti. Gli artefatti includono file APK e IPA di applicazioni mobili, immagini Docker, librerie JAR/WAR e pacchetti di installazione. Secondo il JFrog State of Software Supply Chain, 2025, le organizzazioni possono memorizzare fino a 10 terabyte di artefatti in un unico registro, rendendo i sistemi di gestione degli artefatti criticamente importanti.
Punti chiave
Un artifact (artefatto di build) è il risultato della compilazione del codice sorgente, pronto per la distribuzione o l'uso come dipendenza. Il processo di build trasforma i file sorgente (Java, Kotlin, Swift, C++ e altri) in pacchetti binari che possono essere eseguiti su un dispositivo o server target.
Il concetto di artefatto va oltre i file eseguibili. Ad esempio, una libreria JAR è un artefatto utilizzato come dipendenza in altri progetti. Un'immagine Docker è un artefatto che contiene l'applicazione e il suo ambiente. Anche un rapporto di copertura dei test può essere considerato un artefatto nel contesto CI/CD.
Lo sviluppo moderno nelle grandi aziende implica la gestione di centinaia di migliaia di artefatti. Google DORA collega la maturità della gestione degli artefatti all'efficacia complessiva del DevOps — i team che utilizzano registri di artefatti rilasciano versioni più velocemente e incontrano meno problemi di distribuzione.
Ogni artefatto attraversa diverse fasi: creazione (build, compilazione), validazione (test, controlli di sicurezza), archiviazione (registro artefatti), distribuzione (pubblicazione per download) e archiviazione o eliminazione (quando la versione diventa obsoleta).
Piattaforme e tecnologie diverse generano formati di artefatti diversi. Comprendere i formati è essenziale per configurare correttamente la pipeline CI/CD e scegliere un sistema di archiviazione.
APK (Android Package Kit) è il formato tradizionale di pacchetto di installazione. AAB (Android App Bundle) è un formato moderno per la pubblicazione su Google Play, che contiene solo le risorse necessarie per un dispositivo specifico. AAB riduce le dimensioni dell'applicazione installata in media del 15-20% rispetto a un APK universale.
IPA (iOS App Store Package) è un archivio con codice e risorse per dispositivi iOS. XCArchive è un artefatto intermedio creato da Xcode, dal quale viene esportato l'IPA finale. dSYM è un file di simboli di debug necessario per la simbolizzazione dei registri di crash.
| Piattaforma | Formato | Estensione | Scopo |
|---|---|---|---|
| Android | APK | .apk | Pacchetto di installazione |
| Android | AAB | .aab | Pubblicazione Google Play |
| iOS | IPA | .ipa | Pacchetto di installazione |
| iOS | dSYM | .dSYM.zip | Simboli di debug |
| Flutter | Bundle | .zip, .tar.gz | Build Web/Desktop |
JAR (Java ARchive) — per librerie Java/Kotlin. AAR (Android ARchive) — per librerie Android con risorse. Immagini Docker — artefatti contenitore per microservizi. Ogni tipo ha il proprio registro e regole di gestione delle versioni.
Gli artefatti sono il collegamento tra le fasi della pipeline. Ogni fase consuma artefatti della precedente e ne produce di nuovi. Comprendere questo flusso è fondamentale per impostare una pipeline CI/CD efficace.
Un flusso tipico include: commit -> il server di build compila il codice e crea un artefatto non ottimizzato -> l'artefatto di test viene utilizzato per eseguire i test -> in caso di successo, viene creato un artefatto di rilascio -> viene firmato e pubblicato nel registro degli artefatti -> l'artefatto viene prelevato dal registro per la distribuzione in staging e produzione. Ogni transizione tra le fasi è accompagnata da un controllo di integrità e conformità ai requisiti.
La pipeline può creare più artefatti in fasi diverse. Gli artefatti di debug contengono informazioni di debug, quelli non ottimizzati vengono costruiti rapidamente per i test, gli artefatti di rilascio sono finali, con ottimizzazione e offuscamento. Il sistema CI deve essere in grado di distinguerli e applicare politiche di conservazione appropriate per ogni tipo.
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
È importante distinguere tra cache delle dipendenze e artefatti di build. La cache (cache di Gradle, cache di CocoaPods) accelera le build ripetute ma non è destinata alla distribuzione. Gli artefatti sono il prodotto finale, pronti per la distribuzione. Imposta un TTL di diversi giorni per la cache e di settimane o mesi per gli artefatti.
Gli artefatti non dovrebbero essere memorizzati sul server di build — esistono sistemi specializzati per questo scopo. Un Repository Manager fornisce archiviazione centralizzata, indicizzazione, controllo degli accessi e integrazione con strumenti CI/CD.
JFrog Artifactory — un gestore universale che supporta Maven, Gradle, Docker, NuGet, npm, APT, YUM. Sonatype Nexus — un'alternativa open source che supporta i formati principali. GitHub Packages — un registro integrato in GitHub, comodo per i team che già utilizzano GitHub. GitLab Container Registry — per immagini Docker.
Fattori chiave: formati supportati, modello di licenza (open source/enterprise), integrazione con CI/CD esistente, capacità di replica tra regioni, disponibilità di politiche di pulizia automatica delle versioni vecchie e report di conformità.
// Pipeline Jenkins — pubblicazione 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)
Una strategia adeguata di versionamento degli artefatti è fondamentale per la riproducibilità delle build e il tracciamento delle modifiche. Senza versionamento, è impossibile determinare quale versione del codice ha causato un problema in produzione.
Lo standard MAJOR.MINOR.PATCH: MAJOR cambia con modifiche API incompatibili, MINOR con aggiunte di funzionalità retrocompatibili, PATCH con correzioni di bug retrocompatibili. Per CI/CD, vengono aggiunti metadati di build alla versione: 2.4.1+build.20260703.1. Ciò consente di determinare esattamente quale commit ha prodotto un artefatto specifico e quando è stato creato.
Ogni artefatto dovrebbe contenere metadati sulla sua origine: SHA del commit, numero di build CI, nome del ramo, data di build. Queste informazioni vengono registrate nel manifesto dell'artefatto e consentono di ricostruire il contesto della sua creazione in qualsiasi momento. Senza tracciabilità, lavorare con gli artefatti diventa un'indovinare le versioni, il che è inaccettabile per i sistemi di produzione con requisiti di audit.
Convenzione di denominazione: {project}-{module}-{version}.{ext}. Ad esempio: messaging-sdk-2.4.1.aar o app-release-2.4.1.apk. Il server di build può generare automaticamente una versione basata su un tag Git o sul numero di build del sistema CI.
Nei registri di artefatti Maven/Gradle, si distinguono versioni di rilascio (fisse, immutabili) e versioni snapshot (sviluppo corrente, possono essere sovrascritte). Nelle pipeline CI/CD, gli artefatti snapshot sono comodi per lo sviluppo, ma in produzione dovrebbero essere utilizzate solo versioni di rilascio.
Gli artefatti sono un elemento chiave della catena di fornitura del software. La compromissione di un artefatto può portare all'introduzione di codice dannoso in produzione. La sicurezza degli artefatti include diversi livelli di protezione.
I file APK vengono firmati con jarsigner o apksigner; gli IPA vengono firmati con un certificato Apple; le immagini Docker vengono firmate con Content Trust (Notary) di Docker. La firma garantisce l'integrità e conferma l'autore dell'artefatto. La pipeline CI/CD dovrebbe includere la verifica delle firme di tutte le dipendenze di terze parti.
Prima della pubblicazione, l'artefatto viene verificato da scanner automatici: Snyk, Trivy, Sonatype Nexus IQ, GitHub Dependabot. Analizzano le dipendenze incluse, le versioni delle librerie utilizzate e le vulnerabilità CVE note. Se viene rilevata una vulnerabilità critica, il rilascio viene immediatamente bloccato fino alla sua correzione da parte degli sviluppatori.
SLSA (Supply chain Levels for Software Artifacts) è un framework di sicurezza che definisce livelli di fiducia da SLSA 1 (base) a SLSA 4 (massimo). Il server di build deve generare un'attestazione di provenienza — una dichiarazione firmata crittograficamente su come e da quale codice l'artefatto è stato costruito.
Domande frequenti
APK è un pacchetto universale con tutte le risorse, mentre AAB è un formato modulare in cui Google Play fornisce solo le risorse necessarie per un dispositivo specifico. AAB è più piccolo ed è raccomandato da Google per le nuove applicazioni.
Preferibilmente in sistemi specializzati (Artifactory, Nexus, GitHub Packages), piuttosto che su un server CI o in un repository di codice. Forniscono versionamento, controllo accessi, integrazione CI/CD e pulizia automatica delle versioni vecchie.
Sì, tutti gli artefatti destinati a uso in produzione devono essere firmati. Per le applicazioni mobili, la firma è obbligatoria per l'installazione sui dispositivi e la pubblicazione nei negozi.
Usa un tag Git o il numero di build del sistema CI. Genera automaticamente la versione con il modello MAJOR.MINOR.PATCH+build.N, dove N è il numero di build CI sequenziale o lo SHA del commit.
Configura una politica di pulizia automatica: mantieni le ultime 10-20 versioni di rilascio e 30-50 versioni snapshot. Le versioni vecchie possono essere archiviate in storage a freddo (S3 Glacier, Google Coldline) per conformità.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche