Um ein praktisches Beispiel für einen Versuch zu liefern, einen wirklich wiederholbaren Build zu erstellen, beachten Sie Folgendes:
Eine Build-Pipeline, die mit einem Git-Repository beginnt, für das kein Benutzer jemals einen Verlauf neu schreiben oder nicht zusammengeführte Zweige löschen kann.
Der erste "Build" -Schritt nach dem Auschecken des Quellcodes besteht darin, einen Container hochzufahren, der alle Build-Zeit-Abhängigkeiten enthält.
Die Ausgabe des laufenden Build-Time-Containers ist ein Container, der die kompilierte Binärdatei enthält.
Wichtiger für die Wiederholbarkeit des Builds sind die folgenden Tags, die dem endgültigen Container hinzugefügt werden:
- Der genaue Hash des Quellcodes im ursprünglichen Repository und die URL des Git-Repos sowie ein Teerball-Snapshot des Codes, der in ein Artefakt-Repository hochgeladen wird.
- Die genaue Version des Build-Containers, mit dem der Build ausgeführt wurde.
- Die genaue Version des ursprünglichen Basisabbilds, in das die Binärdatei geladen wurde.
- Die Werte aller Build-Time-Variablen, die zum Erstellen der Binärdatei verwendet werden.
- Die Docker-Version, mit der alle drei Container erstellt wurden, sowie die Version, unter der sie beim Erstellen ausgeführt wurden.
Durch Hinzufügen all dieser Metadaten können wir sicherstellen, dass wir zu jedem Zeitpunkt in der Zukunft den genauen Satz von Build-Abhängigkeiten (über den Build-Container) abrufen und die Binärdatei mit einem genau bekannten Satz von Schritten kompilieren können (der im Build-Container verankert ist) ) und packen Sie dies in ein anderes bekanntes Basis-Image mit allen Laufzeitabhängigkeiten (unter Verwendung des Basis-Image-Tags). Dies kann alles auf der exakt korrekten Version des Quellcodes basieren, basierend auf dem Tag auf dem Container.
Theoretisch sollte dies uns die Möglichkeit geben, eine Build-Version exakt zu reproduzieren.
Dies ist wichtig, damit wir sehen können, was in der Produktion läuft, und selbst wenn die Versionen erheblich weiterentwickelt wurden, die ursprünglich verwendete Version von Code, Basisimage und Build-Container zurückziehen können, damit wir dies beispielsweise können Wenden Sie vor dem erneuten Erstellen genau wie zuvor einen Hotfix auf diese Version an, damit wir erneut bereitstellen können, da wir wissen, dass es sich genau um dasselbe Artefakt handelt und das einzige Delta der Hotfix ist.