Para fornecer um exemplo prático de uma tentativa de criar uma compilação verdadeiramente repetível, considere o seguinte:
Um pipeline de construção que começa com um repositório git para o qual nenhum usuário pode reescrever o histórico ou excluir ramificações não imersas.
A primeira etapa de "compilação" depois de verificar o código-fonte é girar um contêiner que contém todas as dependências de tempo de compilação.
A saída do contêiner em tempo de construção em execução é um contêiner que contém o binário compilado.
Mais importante para a repetibilidade da construção, as seguintes tags são adicionadas ao contêiner final:
- O hash exato do código-fonte no repositório original e a URL do repositório git e um instantâneo tar ball do código que é carregado em um repositório de artefatos.
- A versão exata do contêiner de construção que foi usado para executar a construção.
- A versão exata da imagem base original na qual o binário foi carregado.
- Os valores de todas as variáveis de tempo de construção usadas para criar o binário.
- A versão da janela de encaixe na qual todos os três contêineres foram criados e a versão em que estavam sendo executados quando foram criados.
Ao adicionar todos esses metadados, podemos garantir que, em qualquer momento no futuro, possamos extrair o conjunto exato de dependências de compilação (via contêiner de compilação), compilar o binário com um conjunto exato de etapas conhecido (consagrado no contêiner de compilação ) e empacotá-lo em outra imagem base conhecida com todas as dependências em tempo de execução (usando a marca de imagem base) e tudo isso pode se basear na versão correta exata do código-fonte com base na marca no contêiner.
Teoricamente, isso deve nos dar a capacidade de reproduzir exatamente uma versão de compilação.
A importância disso é que ele nos permite analisar o que está em execução na produção e, mesmo que tudo tenha avançado significativamente, volte e retire a versão do código, imagem de base e construa o contêiner originalmente usado para que possamos, por exemplo , aplique um hotfix a essa versão antes de reconstruir exatamente como antes, para que possamos reimplementar sabendo que é exatamente o mesmo artefato, com o único delta sendo o hot fix.