O Que É um Build Incremental?
Um build incremental reconstrói apenas o que sua mudança tocou e reutiliza saídas em cache para todo o resto, em vez de construir do zero.
Um build limpo refaz todo o trabalho toda vez. Um build incremental rastreia quais entradas mudaram e reconstrói apenas as saídas afetadas, reutilizando o restante. É a diferença entre uma reconstrução de vários minutos e alguns segundos.
Como ele decide o que reconstruir
A ferramenta de build rastreia as dependências entre entradas e saídas (seu build graph) e o estado das saídas anteriores. Quando você altera um arquivo, ela reconstrói a saída desse arquivo e tudo a jusante, deixando as saídas não relacionadas intactas.
Um pequeno exemplo
Editar um único arquivo-fonte em um projeto grande recompila apenas esse arquivo e os poucos módulos que o importam. As centenas de módulos inalterados mantêm seus arquivos-objeto existentes, então o build termina em segundos em vez de minutos.
Por que a CI dificulta isso
Builds incrementais dependem de as saídas anteriores estarem presentes. Runners de CI efêmeros começam vazios, então localmente um build é incremental, mas na CI ele é limpo toda vez - a menos que um cache remoto forneça as saídas anteriores.
Restaurando o estado anterior na CI
A solução é alimentar a CI com as saídas anteriores: um cache de build remoto (ou um cache de saída de build restaurado com a chave correta) dá ao runner o mesmo estado que a máquina de um desenvolvedor tinha, para que o build possa ser incremental mesmo em um runner novo.
Ressalva sobre correção
Builds incrementais só são corretos se a ferramenta rastrear cada entrada. Uma entrada não rastreada (uma env var, um arquivo gerado) deixa uma saída obsoleta por aí - por isso os bugs incrementais são notoriamente confusos e um build limpo "magicamente os corrige".
Principais conclusões
- Um build incremental reutiliza saídas anteriores e reconstrói apenas o que mudou.
- Os runners de CI começam vazios, então é preciso um cache remoto para torná-lo incremental.
- A correção depende de a ferramenta rastrear cada entrada.