Experts in Angular

The Twelve-Factor AppX. Dev/Prod Parity – Manter desenvolvimento e produção o mais semelhantes possível

X. Dev/Prod Parity – Manter desenvolvimento e produção o mais semelhantes possível

Reduzir as lacunas entre os ambientes para garantir consistência e evitar surpresas.

10º Fator: Paridade entre Desenvolvimento e Produção (Dev/Prod Parity)

O décimo fator da metodologia de doze fatores trata da paridade entre os ambientes de desenvolvimento, homologação e produção, ou seja, manter esses ambientes o mais semelhantes possível. A ideia é reduzir as diferenças que costumam existir entre o que é desenvolvido localmente, o que é testado em homologação, e o que é implantado em produção, garantindo que o código funcione da mesma forma em todos os ambientes. Essa prática é fundamental para a implantação contínua, permitindo que as alterações sejam lançadas rapidamente e com menos riscos de falhas.

Gaps Comuns entre Desenvolvimento e Produção

Historicamente, há três tipos principais de lacunas entre os ambientes de desenvolvimento e produção:

  1. Lacuna de Tempo:
    • Em ambientes tradicionais, o tempo entre o desenvolvimento de um código e sua implantação em produção pode ser de semanas ou meses. Isso cria uma desconexão entre o que foi desenvolvido e como ele funciona no ambiente real.
  2. Lacuna de Pessoas:
    • Muitas vezes, os desenvolvedores escrevem o código, mas não estão envolvidos no processo de implantação ou no monitoramento da aplicação em produção. Equipes de operações fazem o deploy e cuidam da produção, criando uma barreira entre quem desenvolve e quem implanta.
  3. Lacuna de Ferramentas:
    • O ambiente de desenvolvimento frequentemente usa um conjunto diferente de ferramentas e tecnologias em comparação ao ambiente de produção. Por exemplo, um desenvolvedor pode usar SQLite no desenvolvimento local, enquanto a produção usa PostgreSQL. Essa diferença entre ferramentas pode levar a comportamentos inesperados no código ao ser promovido para produção.

Angular e Paridade entre Ambientes

No contexto de Angular, um framework frontend que roda no navegador, a aplicação geralmente não sofre tanto com lacunas diretas entre desenvolvimento e produção em termos de código e execução, porque o Angular é compilado em arquivos estáticos (HTML, CSS, JS), que são iguais em todos os ambientes após o processo de build. Contudo, existem fatores externos que afetam a aplicação Angular, principalmente o backend e os serviços de apoio (APIs, bancos de dados, caches, etc.) que ela consome.

Os seguintes elementos podem causar diferenças entre ambientes:

  • APIs e Serviços de Backend: Durante o desenvolvimento, a aplicação Angular pode consumir APIs locais ou mockadas, enquanto em produção ela consome APIs reais, com bancos de dados e serviços de produção. Se os ambientes de API não forem consistentes, pode haver incompatibilidades.
  • Configurações de Ambiente: O Angular usa arquivos de configuração (environment.ts, environment.prod.ts) para definir variáveis de ambiente, como URLs de APIs ou modos de execução. Se essas configurações não estiverem bem gerenciadas, a aplicação pode funcionar corretamente em desenvolvimento, mas falhar em produção.

Reduzindo as Lacunas: Dev/Prod Parity no Angular

A fim de manter a paridade entre desenvolvimento e produção, algumas práticas são recomendadas:

  1. Reduzir o Tempo entre Deploys:
    • Usar práticas de CI/CD (Continuous Integration/Continuous Deployment) para reduzir o tempo entre a escrita do código e sua implantação em produção. Isso pode ser feito com pipelines automatizados que testam e implantam o código rapidamente, em questão de horas ou minutos.
    • No Angular, ferramentas como Jenkins, GitLab CI, ou GitHub Actions podem ser configuradas para automatizar o build e o deploy da aplicação Angular em ambientes de teste e produção.
  2. Unificar o Processo de Deploy:
    • Em vez de delegar a responsabilidade do deploy exclusivamente para equipes de operações, os desenvolvedores devem estar envolvidos no processo de implantação e monitoramento em produção. Isso pode ser facilitado por ferramentas como Docker, que permitem criar ambientes semelhantes ao de produção localmente.
    • Com Docker, os desenvolvedores podem rodar containers localmente que imitam o ambiente de produção, com a mesma versão de banco de dados, servidores de cache, e outros serviços que a aplicação Angular consome.
  3. Usar as Mesmas Ferramentas nos Diferentes Ambientes:
    • Evitar diferenças entre os serviços de apoio: Durante o desenvolvimento, o ideal é que a aplicação Angular consuma os mesmos tipos de serviços que a produção. Por exemplo, se a produção usa PostgreSQL, o ambiente de desenvolvimento também deveria usar PostgreSQL, em vez de uma versão simplificada como SQLite. Isso minimiza o risco de diferenças no comportamento do código entre ambientes.
    • Ferramentas de Mocking e Simulação: Em situações onde o uso dos mesmos serviços de produção não é prático (por exemplo, integração com APIs de terceiros), é possível usar ferramentas de mocking e simulação para garantir que o comportamento seja o mais próximo possível do ambiente de produção.
  4. Usar Ferramentas de Provisionamento e Containers:
    • Ferramentas como Docker e Kubernetes podem ser usadas para garantir que o ambiente de desenvolvimento seja o mais próximo possível da produção. Os desenvolvedores podem criar containers que simulam os mesmos bancos de dados, serviços de cache, e filas que estarão em produção, garantindo que o código seja testado em condições similares.
    • Docker Compose pode ser usado para rodar localmente uma instância do backend, banco de dados, e até mesmo simular o ambiente de produção de forma local, garantindo consistência.

Exemplo de Paridade com Docker e Angular

Vamos ver um exemplo prático de como garantir a paridade entre desenvolvimento e produção com Docker:

  1. Dockerfile para o Angular: O código Angular pode ser empacotado em um container Docker, garantindo que o ambiente de build seja o mesmo em todos os lugares:
FROM node:16-alpine as build
WORKDIR /app
COPY package.json ./
RUN npm install
COPY . .
RUN npm run build --prod

2. Docker Compose para Ambientes de Produção e Desenvolvimento: Um docker-compose.yml pode ser usado para orquestrar o ambiente de desenvolvimento localmente com um banco de dados PostgreSQL e uma API simulada:

version: '3'
services:
  angular-app:
    build: .
    ports:
      - "4200:80"
  api:
    image: my-api:latest
    environment:
      - DATABASE_URL=postgres://db_user:db_pass@db:5432/mydb
  db:
    image: postgres:12
    environment:
      POSTGRES_USER: db_user
      POSTGRES_PASSWORD: db_pass

Aqui, a mesma configuração de banco de dados e API pode ser usada localmente, simulando o ambiente de produção para garantir que a aplicação Angular se comporte da mesma forma em ambos os ambientes.

Benefícios da Paridade Dev/Prod

  1. Menos Surpresas em Produção: Quanto mais semelhantes forem os ambientes de desenvolvimento e produção, menores as chances de comportamentos inesperados ao migrar o código para produção.
  2. Deploy Contínuo: A paridade entre os ambientes permite que novas versões do código sejam lançadas de forma contínua, com menos fricção, incentivando um ciclo de desenvolvimento mais ágil e responsivo.
  3. Menos Retrabalho: A unificação das ferramentas e serviços entre os ambientes elimina a necessidade de ajustes adicionais ou correções que muitas vezes surgem quando os ambientes são significativamente diferentes.

Conclusão

Manter a paridade entre desenvolvimento e produção é um princípio fundamental para garantir que o código seja testado e implantado de forma rápida, confiável e sem surpresas. Para aplicações Angular, isso significa garantir que as APIs, serviços de backend, e ferramentas utilizadas no desenvolvimento local ou em homologação sejam o mais próximo possível do ambiente de produção, utilizando ferramentas como Docker para garantir consistência e simplificar o ciclo de deploy.