Pour fournir un exemple pratique d'une tentative de création d'une construction vraiment reproductible, considérez ce qui suit -
Un pipeline de construction qui commence par un référentiel git pour lequel aucun utilisateur ne pourra jamais réécrire l'historique ou supprimer des branches non fusionnées.
La première étape de "build" après avoir extrait le code source consiste à faire tourner un conteneur qui contient toutes les dépendances de temps de build.
La sortie du conteneur de construction en cours d'exécution est un conteneur qui contient le binaire compilé.
Plus important pour la répétabilité de la construction, les balises suivantes sont ajoutées au conteneur final:
- Le hachage exact du code source dans le référentiel d'origine et l'url du référentiel git et d'un instantané tar ball du code qui est téléchargé dans un référentiel d'artefacts.
- La version exacte du conteneur de build qui a été utilisée pour exécuter la build.
- La version exacte de l'image de base d'origine dans laquelle le binaire a été chargé.
- Les valeurs de toutes les variables de construction utilisées pour créer le binaire.
- La version de docker avec laquelle les trois conteneurs ont été construits ainsi que la version sous laquelle ils fonctionnaient lorsqu'ils ont construit.
En ajoutant toutes ces métadonnées, nous pouvons nous assurer qu'à tout moment dans le futur, nous pouvons extraire l'ensemble exact des dépendances de génération (via le conteneur de génération), compiler le binaire avec un ensemble exact d'étapes connues (inscrit sur le conteneur de génération ) et l'intégrer dans une autre image de base connue avec toutes les dépendances d'exécution (en utilisant la balise d'image de base) et tout cela peut être basé sur la version exacte exacte du code source basé sur la balise sur le conteneur.
Théoriquement, cela devrait nous donner la possibilité de reproduire exactement une version de build.
L'importance de cela est qu'il nous permet de regarder ce qui fonctionne en production et, même si tout a progressé de manière significative, de revenir en arrière et de retirer la version de code, l'image de base et le conteneur de construction initialement utilisés pour que nous puissions, par exemple , appliquez un correctif à cette version avant de reconstruire exactement comme avant afin que nous puissions redéployer en sachant qu'il s'agit exactement du même artefact, le seul delta étant le correctif.