Um app não está pronto quando funciona na sua máquina
Ao longo da trilha você construiu as peças separadamente: o frontend que consome a API, o backend que a serve, a autenticação, os testes, a CI e o deploy. O capstone as conecta em um único pipeline: o caminho que o seu código percorre desde o momento em que você escreve a primeira linha até que um usuário real o utilize.
IDEIA
│
├─▶ CONSTRUIR frontend (React + fetch) + backend (API REST + dados)
│
├─▶ TESTAR testes unitários e de integração (verde antes de avançar)
│
├─▶ EMPACOTAR contêiner (Docker): o app + seu ambiente, idêntico em todo lugar
│
├─▶ AUTOMATIZAR CI: a cada push, instalar → testar → construir a imagem
│
├─▶ FAZER DEPLOY CD: se a CI estiver verde, publicar a nova versão
│
├─▶ OBSERVAR logs, métricas, health check e alertas (ainda está viva?)
│
└─▶ PROTEGER HTTPS, segredos fora do repo, validação de entrada, auth
Cada etapa é um portão
O que importa não é que as etapas existam, mas que cada uma é um portão: você não avança até que a anterior esteja verde. Se os testes falham, a CI corta e nada é implantado. Se o contêiner não sobe, ele nunca chega à produção. Essa cadeia de portões é o que transforma "funciona na minha máquina" em "funciona em produção, e eu sei disso".
Construir: frontend e backend que respeitam um contrato
O frontend pede dados com fetch e os renderiza; o backend valida a entrada,
autentica e responde com o código de status correto (201 ao criar,
400 se a entrada é inválida, 401 se falta a autenticação). Ambos respeitam
o mesmo contrato: as mesmas rotas e o mesmo formato dos dados.
Empacotar: o contêiner
Um contêiner (Docker) empacota o seu app junto com o seu ambiente (versão do Node, dependências, variáveis). Assim, a imagem que passa nos testes na CI é exatamente a que roda em produção: acabou o "na minha máquina funciona".
Automatizar: a CI como rede de segurança
A CI executa, a cada mudança, a mesma sequência: instalar dependências →
rodar os testes → construir a imagem. É um pipeline de passos onde, se um
falha, os seguintes não são executados. No capstone, você modelará esse pipeline com
uma função executarPipeline(passos).
Observar: saber que ainda está viva
Uma vez em produção, você precisa de olhos: um health check (/health) que
responde "estou viva", logs do que acontece, métricas e alertas que te
avisam antes que o usuário note o problema. Fazer deploy sem observar é
voar às cegas.