Experts in Angular

The Twelve-Factor AppV. Build, Release, Run – Separar estritamente as etapas de build, release e execução
Separar estritamente as etapas de build, release e execução

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

  1. 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).
    Exemplo de comando de build:
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:

  1. 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).
  2. 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.
  3. 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

  1. Build: Um desenvolvedor executa ng build --prod para gerar o build da aplicação.
  2. 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.
  3. 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.