dbt
SeniorComo faço o CI parar de reconstruir todo o projeto dbt a cada execução?
O dbt constrói tudo por padrão. A seleção baseada em estado é o único jeito de fazer o custo do CI escalar com o que realmente mudou, não com o tamanho do projeto.
Um projeto dbt com 40 modelos e outro com 400 rodam exatamente o mesmo dbt build - e pagam contas de CI bem diferentes por isso, a menos que algo realmente diga ao dbt o que mudou.
O que a seleção baseada em estado realmente compara
O dbt grava um manifest.json após cada execução bem-sucedida, que descreve totalmente o SQL compilado de cada modelo e seu lugar no DAG. --select state:modified+ compara o manifest atual com um salvo que você aponta, e constrói só os modelos cujo SQL compilado realmente mudou, mais tudo que depende deles adiante.
Por que isso silenciosamente nunca entra em ação
A razão mais comum pela qual a seleção por estado não faz nada: o CI nunca salvou nem baixou o manifest da execução anterior, então --state não tem com o que comparar. O dbt não dá erro nisso - simplesmente não consegue achar modelos modificados em relação a nada, e a build silenciosamente faz tudo. Consertar isso significa tratar o manifest.json como um artefato de CI que é enviado após cada execução de produção bem-sucedida e baixado no início da próxima.
O outro assassino silencioso: o hábito do full-refresh
Uma flag --full-refresh deixada no comando de CI "por segurança" reconstrói cada modelo incremental do zero, não importa o que a seleção por estado tenha encontrado - ela ignora o diff completamente para esses modelos. Esse padrão geralmente é resto de ter depurado um modelo incremental quebrado uma vez, nunca removido. Reserve o --full-refresh para uma execução explícita e deliberada em um modelo, não como flag fixa do CI.
O sinal: se o tempo de build do CI escala com o tamanho total do projeto em vez do tamanho do diff do PR, a seleção por estado não está realmente funcionando - verifique primeiro um manifest faltando em --state, depois um --full-refresh perdido por aí.
Veja como isso fica no seu próprio pipeline.
Envie um event log real do Spark, um run_results.json do dbt ou uma exportação de métricas do Flink e receba recomendações concretas, para aprovar antes de aplicar - não mais uma regra geral.