Per fornire un esempio pratico di un tentativo di creare una build veramente ripetibile, considerare quanto segue:
Una pipeline di build che inizia con un repository git per il quale nessun utente può mai riscrivere la cronologia o eliminare i rami non uniti.
Il primo passo "build" dopo aver verificato il codice sorgente è far girare un container che contiene tutte le dipendenze del tempo di build.
L'output del contenitore del tempo di compilazione in esecuzione è un contenitore che contiene il file binario compilato.
Più importante per la ripetibilità della build, i seguenti tag vengono aggiunti al contenitore finale:
- L'hash esatto del codice sorgente nel repository originale e l'URL sia del repository git che di un'istantanea tar ball del codice che viene caricato in un repository di artefatti.
- La versione esatta del contenitore build utilizzato per eseguire la build.
- La versione esatta dell'immagine di base originale in cui è stato caricato il file binario.
- I valori di tutte le variabili di build-time utilizzate per creare il binario.
- La versione della finestra mobile con cui sono stati creati tutti e tre i contenitori, nonché la versione in cui erano in esecuzione durante la creazione.
Aggiungendo tutti questi metadati possiamo garantire che in qualsiasi momento in futuro possiamo estrarre l'esatta serie di dipendenze di compilazione (tramite il contenitore di compilazione), compilare il binario con un esatto set di passaggi noti (racchiuso nel contenitore di compilazione ) e impacchettarlo in un'altra immagine di base nota con tutte le dipendenze di runtime (utilizzando il tag immagine di base) e tutto ciò può basarsi sull'esatta versione corretta del codice sorgente in base al tag sul contenitore.
Teoricamente questo dovrebbe darci la possibilità di riprodurre esattamente una versione di build.
L'importanza di ciò è che ci consente di guardare a ciò che è in esecuzione in produzione e, anche se tutto ha progredito significativamente le versioni, tornare indietro ed estrarre la versione del codice, l'immagine di base e il contenitore di compilazione originariamente utilizzato in modo che possiamo, ad esempio , applica una correzione rapida a quella versione prima di ricostruire esattamente come prima in modo che possiamo ridistribuire sapendo che è esattamente lo stesso artefatto con l'unico delta che è la correzione rapida.