Aby podać praktyczny przykład próby stworzenia prawdziwie powtarzalnej kompilacji, rozważ następujące kwestie:
Potok kompilacji, który zaczyna się od repozytorium git, dla którego żaden użytkownik nie może przepisać historii ani usunąć nie połączonych gałęzi.
Pierwszym krokiem po kompilacji po sprawdzeniu kodu źródłowego jest rozpakowanie kontenera zawierającego wszystkie zależności czasu kompilacji.
Dane wyjściowe uruchomionego kontenera czasu kompilacji to kontener zawierający skompilowany plik binarny.
Co ważniejsze dla powtarzalności kompilacji, do końcowego kontenera dodawane są następujące tagi:
- Dokładny skrót kodu źródłowego w oryginalnym repozytorium oraz adres URL zarówno repozytorium git, jak i migawki tar tar kodu, który jest przesyłany do repozytorium artefaktów.
- Dokładna wersja kontenera kompilacji, która została użyta do uruchomienia kompilacji.
- Dokładna wersja oryginalnego obrazu podstawowego, do którego załadowano plik binarny.
- Wartości wszystkich zmiennych czasu kompilacji użytych do utworzenia pliku binarnego.
- Wersja dokera, w którym zbudowano wszystkie trzy kontenery, a także wersja, w której działały, gdy budowano.
Dodając wszystkie te metadane, możemy zapewnić, że w dowolnym momencie w przyszłości możemy wyciągnąć dokładny zestaw zależności kompilacji (za pośrednictwem kontenera kompilacji), skompilować plik binarny z dokładnie znanym zestawem kroków (zapisanym w kontenerze kompilacji ) i spakuj do innego znanego obrazu podstawowego ze wszystkimi zależnościami w czasie wykonywania (przy użyciu znacznika obrazu podstawowego), a wszystko to może być oparte na dokładnej poprawnej wersji kodu źródłowego opartego na znaczniku na kontenerze.
Teoretycznie powinno to dać nam możliwość dokładnego odtworzenia wersji kompilacji.
Ważne jest to, że pozwala nam spojrzeć na to, co działa w produkcji, i nawet jeśli wszystko znacznie się rozwinęło, cofnij się i wyciągnij wersję kodu, obrazu podstawowego i kontenera kompilacji pierwotnie użytego, abyśmy mogli na przykład , zastosuj poprawkę do tej wersji przed przebudowaniem dokładnie tak jak poprzednio, abyśmy mogli wdrożyć ponownie wiedząc, że jest to dokładnie ten sam artefakt, a jedyną różnicą jest poprawka.