V. Build, Release, Run – Separar estritamente as etapas de build, release e execução
Como organizar o ciclo de vida da aplicação para facilitar deploys contínuos
5º Fator: Separação Estrita entre as Etapas de Build, Release e Execução
O quinto fator da metodologia de doze fatores destaca a importância de separar claramente as três etapas principais no ciclo de vida de uma aplicação: build, release e execução. No contexto do Angular, que envolve a construção de aplicações modernas baseadas em componentes e frequentemente implantadas na nuvem, essa separação é crucial para garantir a robustez e confiabilidade do processo de deploy.
As Três Etapas: Build, Release e Execução
- Build (Construção): A primeira etapa no processo de deploy é a construção da aplicação. Durante essa fase, o código base é transformado em uma versão executável, chamada de build. No caso do Angular, isso normalmente envolve o uso do comando
ng build
, que compila os arquivos TypeScript, HTML e SCSS da aplicação e gera o código JavaScript otimizado para ser servido em um navegador.O build inclui:- Compilação do código TypeScript para JavaScript.
- Minificação de arquivos de estilo e scripts.
- Otimização de ativos estáticos (imagens, fontes, etc.).
- Integração de dependências externas (bibliotecas instaladas via
npm
).
ng build --prod
2. Release (Lançamento): A segunda etapa combina o build criado na etapa anterior com as configurações atuais do ambiente de deploy, como as variáveis de ambiente (vistas no terceiro fator). O release é o pacote final que contém o build e as configurações específicas para aquele deploy, e está pronto para ser executado no ambiente de produção ou qualquer outro ambiente de execução.
A separação entre build e release é fundamental para garantir que o mesmo build possa ser reutilizado em diferentes ambientes de deploy, apenas trocando as configurações (por exemplo, para staging ou produção) sem necessidade de recompilar o código.
Exemplo de prática no Angular: Se você faz um build da aplicação para produção, pode ter um release com a configuração de um API_URL para produção. Já no ambiente de staging, você usa o mesmo build, mas com a configuração da URL da API apontando para um servidor de homologação.
3. Run (Execução): A terceira e última etapa é a execução, ou o momento em que o release é lançado no ambiente de execução, seja ele um servidor de produção ou um contêiner em nuvem. Durante essa etapa, a aplicação é executada a partir de uma combinação específica de build e configurações, sem que seja possível modificar o código diretamente.
No Angular, a etapa de execução geralmente acontece quando o servidor começa a servir os arquivos estáticos gerados pelo build (normalmente em diretórios como dist/
), e o aplicativo Angular é carregado no navegador do usuário.
Importância da Separação
Separar essas três etapas traz uma série de benefícios para o desenvolvimento e manutenção de uma aplicação Angular:
- Previsibilidade: O código construído na etapa de build é imutável durante a execução. Isso garante que o comportamento da aplicação seja consistente entre o build e a execução, evitando surpresas.
- Facilidade de Rollback: Como cada release tem uma identidade única (como um timestamp ou versão), é fácil reverter a aplicação para um release anterior em caso de problemas em produção. Isso é muito útil em sistemas de deploy contínuo, onde mudanças são frequentes e rápidas.
- Menor Risco em Produção: Como a etapa de execução deve ter o menor número possível de partes móveis, isso reduz o risco de falhas inesperadas durante o runtime. O build pode ser complexo, mas a execução deve ser simples e direta, o que minimiza a chance de erros inesperados durante a operação.
Ferramentas para Gerenciamento de Build e Release no Angular
No ecossistema Angular, algumas ferramentas e práticas ajudam a implementar essa separação:
- Angular CLI: O Angular CLI oferece comandos diretos para a construção da aplicação (
ng build
) e facilita a integração de diferentes configurações de ambiente (ng build --prod
). - CI/CD (Integração e Deploy Contínuos): Ferramentas de integração contínua como Jenkins, GitHub Actions, CircleCI e plataformas de deploy contínuo como Heroku, Netlify, e Vercel permitem automatizar as etapas de build, release e execução. O processo de CI/CD ajuda a manter essa separação estrita e automatizada.
- Versionamento de Releases: Para garantir a rastreabilidade dos releases, ferramentas de deploy como o Capistrano ou o próprio pipeline do GitLab podem ser configuradas para gerar IDs únicos de release, como números incrementais ou timestamps, garantindo que cada versão seja facilmente identificável e rastreável.
Exemplo de Fluxo de Deploy
- Build: Um desenvolvedor executa
ng build --prod
para gerar o build da aplicação. - Release: A equipe de operações ou uma ferramenta de CI/CD toma esse build e combina com as variáveis de ambiente apropriadas (como
API_URL
) para o ambiente de produção. - Run: O release é enviado para o servidor ou plataforma de nuvem (como AWS, GCP, Azure) e a aplicação começa a rodar a partir desse release.
Se houver um problema, o sistema de CI/CD ou a equipe de operações pode simplesmente reverter para um release anterior sem precisar reconstruir a aplicação, aumentando a segurança e agilidade do processo.
Conclusão
A separação clara entre as fases de build, release e execução garante que uma aplicação Angular seja previsível, fácil de manter e resiliente. Seguindo o quinto fator da metodologia de doze fatores, você garante que sua aplicação possa ser gerenciada de maneira eficiente em produção, minimizando riscos e facilitando rollbacks rápidos quando necessário.