O Que É um Build Reproduzível?
Um build reproduzível produz uma saída idêntica bit a bit a partir da mesma fonte - não importa quem faz o build, onde ou quando.
Se você faz o build do mesmo commit duas vezes e obtém binários diferentes, não pode provar que o binário veio daquela fonte. Builds reproduzíveis removem as fontes de variação para que a saída seja determinística, o que é a base de cadeias de suprimento verificáveis.
O que quebra a reprodutibilidade
- Timestamps e datas de build embutidos.
- Ordenação não determinística (sistemas de arquivos, hash maps).
- Caminhos absolutos ou hostnames embutidos na saída.
- Dependências ou versões de toolchain não fixadas.
Como as equipes conseguem isso
Fixe cada entrada (lockfiles, versões de ferramentas fixadas), normalize timestamps (por exemplo SOURCE_DATE_EPOCH), ordene entradas de forma determinística e remova caminhos absolutos. O objetivo é que a única coisa a afetar a saída seja a fonte.
Um pequeno exemplo
Duas execuções de CI do mesmo commit produzem arquivos que diferem apenas nos timestamps embutidos. Definir SOURCE_DATE_EPOCH para o horário do commit e ordenar as entradas de arquivo faz com que os dois arquivos tenham hash idêntico - provando que a diferença era incidental, não no código.
Por que isso importa
A reprodutibilidade permite que partes independentes refaçam o build e confirmem que um artifact publicado corresponde à sua fonte - uma defesa fundamental contra pipelines de build adulterados e um pré-requisito para uma forte proveniência.
Reproduzível vs determinístico o suficiente
A reprodutibilidade total bit a bit é o padrão de excelência, mas mesmo um determinismo parcial ajuda no cache e na depuração. Muitas equipes a perseguem de forma incremental, removendo uma fonte de não determinismo de cada vez.
Principais conclusões
- Um build reproduzível gera uma saída idêntica a partir de uma fonte idêntica.
- Timestamps, ordenação e entradas não fixadas são os culpados usuais.
- Ele sustenta cadeias de suprimento verificáveis e resistentes a adulteração.