A Guerra das Ferramentas de Build
A Procura pela Ferramenta de Build Perfeita
Já lá vai o tempo em que tínhamos de memorizar cada passo necessário para executar uma tarefa, fosse ela grande ou pequena. Procuro sempre formas de automatizar tarefas e libertar a minha memória para coisas mais importantes, em vez de ter de recordar como executar certas operações. Aprender, automatizar e seguir em frente—essa é a minha filosofia!
Tenho utilizado Makefiles e Dockerfiles tradicionais há bastante tempo. Afinal, são ferramentas comprovadas e funcionam bem. Mas… há sempre um “mas”! Quando se começa a escalar e a padronizar processos, estas duas ferramentas deixam de ser suficientes. Se existirem múltiplos projetos que são construídos da mesma forma, com apenas pequenas diferenças, mais cedo ou mais tarde será necessário atualizar algo num deles e desejar que essa mudança se propague automaticamente para todos os outros.
Além disso, chega um ponto em que é essencial garantir que os builds, testes e tarefas sejam executados exatamente da mesma forma, tanto na máquina local como num ambiente de CI. Não é um problema crítico quando se trabalha com dois ou três projetos, mas quando se escala para algo mais complexo, torna-se um verdadeiro pesadelo.
É aqui que entram o Taskfile, Earthfile (Earthly) e Dagger. Cada um destes adiciona um reforço significativo aos Makefiles, Dockerfiles ou mesmo ambos! Mas qual deles devo usar? E como?
Os Meus Requisitos
Para avaliar estas ferramentas de forma justa, defini alguns requisitos essenciais para mim:
- Reutilização de Tarefas: Deve ser possível definir tarefas e reutilizá-las em múltiplos repositórios ou em diferentes projetos dentro de um monorepo.
- Reutilização de Construção de Containers: A ferramenta deve permitir definir builds de containers e reutilizá-los noutros projetos.
- Consistência de Ambiente: Os builds devem funcionar da mesma forma tanto na máquina local como em qualquer ambiente de CI.
Para testar estas ferramentas, utilizei o meu projeto mais recente (na data em que escrevo este artigo): aeye. É um projeto em Python que desenvolvi para automatizar um dos meus canais do YouTube/Twitch, The Arctic Skies. O projeto treina e executa um modelo de IA que deteta auroras boreais a partir do feed de vídeo da câmara.
As tarefas que preciso de realizar são:
- Construir um container.
- Executar o container com algumas variáveis definidas para testes.
- Executar o container, mas com um shell interativo, para investigar problemas.
Taskfile: Simples, mas Insuficiente
Começo pela opção mais simples e também a única que não testei de todo: Taskfile.
Há uma razão muito simples pela qual não testei Taskfiles—apenas substituem Makefiles. Embora tenham uma sintaxe YAML mais limpa para definir tarefas e encorajem reutilização, queria eliminar a duplicação tanto nos Makefiles como nos Dockerfiles.
Se o objetivo for apenas ter um Makefile mais organizado com YAML, Taskfile vale a pena. Mas como não atende totalmente às minhas necessidades, continuei a explorar outras opções.
Dagger: Promissor, mas Estranho
Dagger parece muito promissor. Pode substituir Dockerfiles e afirma que também pode substituir Makefiles. No entanto, após uma análise inicial, fiquei com algumas dúvidas sobre esta última afirmação. Para esclarecer, decidi testar.
Não vou abordar todas as funcionalidades—para isso, basta visitar dagger.io. Em vez disso, foco-me no que torna Dagger único: a definição de builds com código real! É possível utilizar Go, Python, TypeScript e outros para definir o pipeline de build.
Embora funcione muito bem, seja rápido e bastante interessante, Dagger obriga a escrever código num estilo que achei difícil de ler e interpretar mentalmente. Além disso, todo o código Go é executado dentro de um container pelo motor do Dagger. Não há uma opção de execução local/nativa, e depois de falar com alguns dos seus programadores, não parece que estejam interessados em adicionar essa funcionalidade.
No geral, gostei do Dagger, mas o estilo de código imposto e a falta de execução local fizeram-me hesitar.
Considerações Finais
Adoro Go e considerei seriamente combinar Dagger com Taskfile ou Earthly. No entanto, isso significaria continuar a depender de duas ferramentas para realizar o mesmo trabalho, e não gostei da forma como o Dagger impõe assinaturas de função longas e notações específicas.
Apesar da incerteza quanto ao futuro do Earthly, por agora, é a minha escolha, pois resolve e abstrai todos os meus problemas numa única ferramenta.
Resumo
Ferramenta | Vantagens | Desvantagens |
---|---|---|
Taskfile | Simples, baseado em YAML | Não substitui Dockerfile, escopo limitado |
Dagger | Define builds com código real, rápido | Código difícil de ler, sem execução local |
Earthly | Sintaxe familiar, combina Makefile & Dockerfile, boa reutilização | Futuro dos Earthfiles é incerto |
Neste momento, o Earthly vence, mas vou acompanhar a evolução das ferramentas! 🚀