Skip to content
Latchkey

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.

Guias relacionados