Deployment Checklist
Checklist completo para deploy para production.
Pre-Deployment
1 Dia Antes
- PR de
devparamainaberto - Code review completo
- Release notes preparadas
- Stakeholders notificados (se necessário)
- Janela de deploy agendada
- On-call schedule verificado
Dia do Deploy
Verificações Técnicas
- Todos os testes passando em
dev - QA manual aprovado em staging
- Smoke tests executados em staging
- Performance acceptable em staging
- No alarmes ativos em staging
- Migrations testadas em staging
- Rollback plan documentado
Verificações de Código
- No TODOs ou FIXMEs críticos
- No console.log ou debuggers
- Secrets não hardcoded
- Dependencies atualizadas
- Lint passou
- Coverage >= threshold
Verificações de Infraestrutura
- Database backup agendado
- Capacity adequada (Lambda concurrency, RDS connections)
- Rate limits configurados
- CDN cache invalidation preparado (se necessário)
- Monitoring dashboard aberto
Comunicação
- Time avisado (Slack #deploys)
- Statuspage atualizado (se mudanças externas)
- Customer support avisado (se impacto visível)
During Deployment
Passo a Passo
- Aprovação Final (5 min)
- Tech Lead aprovou PR
- Último check de staging
-
Confirmar horário é adequado
-
Merge PR (1 min)
- Merge PR de
devparamain -
GitHub Actions CI inicia
-
Database Backup (2-5 min)
- Verificar snapshot sendo criado
-
Aguardar conclusão
-
Run Migrations (2-10 min)
- Migrations executadas
- Schema verification passou
-
No erros nos logs
-
Deploy Application (5-10 min)
- SAM build completou
- SAM deploy iniciou
- CloudFormation stack atualizando
-
Aguardar stack UPDATE_COMPLETE
-
Verificação Inicial (5 min)
- Health check passou
- Smoke tests passaram
- Sem alarmes disparados
- Logs sem erros críticos
Monitoramento Ativo (30 min)
Primeiros 5 minutos: - [ ] Testar endpoints críticos manualmente - [ ] Verificar logs em tempo real - [ ] Checar métricas no dashboard - [ ] Error rate < 1%
Primeiros 15 minutos: - [ ] Latency normal (p99 < threshold) - [ ] No alarmes disparados - [ ] Queue processing normal - [ ] Database performance OK
Primeiros 30 minutos: - [ ] Métricas estáveis - [ ] No user reports de problemas - [ ] Feedback positivo (se esperado) - [ ] Tudo operando normalmente
Post-Deployment
Validação Final
- Smoke tests completos passaram
- User acceptance testing (se aplicável)
- Performance metrics OK
- No regressions detectadas
- Rollback plan não necessário
Comunicação
- Anunciar conclusão no Slack
- Atualizar Statuspage (se alterado)
- Responder perguntas do time
- Documentar qualquer issue encontrado
Documentação
- Release notes publicadas
- Documentação atualizada (se necessário)
- Known issues documentadas
- Runbooks atualizados (se necessário)
Se Algo Der Errado
Durante Deploy
Se deploy falhar:
- GitHub Actions tentará rollback automático
- Verificar logs do workflow
- Identificar causa
- Decidir: fix forward ou rollback manual
- Comunicar ao time
Após Deploy
Se bug descoberto após deploy:
- Avaliar severidade (P0/P1/P2/P3)
- Decidir: rollback imediato ou hotfix
- Ver Incident Response
- Ver Rollback Procedure
Horários de Deploy
✅ Recomendados
- Segunda a Quinta: 10h-16h
- Tráfego baixo/médio
- Time disponível para monitorar
⚠️ Cuidado
- Sextas-feiras (apenas se urgente)
- Final do dia (dificulta rollback)
- Vésperas de feriado
❌ Evitar
- Finais de semana
- Feriados
- Horários de pico (12h-14h se e-commerce)
- Fora do horário comercial (a menos que planejado)
Checklist Simplificado
Quick checklist (imprima!):
PRÉ-DEPLOY:
☐ Tests passing
☐ QA approved
☐ Backup scheduled
☐ Rollback plan ready
☐ Team notified
DEPLOY:
☐ Merge PR
☐ Monitor CI/CD
☐ Verify health checks
☐ Run smoke tests
☐ Monitor 30 min
PÓS-DEPLOY:
☐ Validate metrics
☐ Announce completion
☐ Update docs
☐ Celebrate! 🎉
Automation
Idealmente, este checklist deve ser automatizado no CI/CD.
Script scripts/pre_deploy_check.py:
def run_pre_deploy_checks():
checks = [
("Tests passing", check_tests_passed),
("Staging healthy", check_staging_health),
("No active incidents", check_no_incidents),
("Backups recent", check_backup_age),
]
failed = []
for name, check_func in checks:
if not check_func():
failed.append(name)
print(f"❌ {name}")
else:
print(f"✅ {name}")
if failed:
print(f"\n🛑 Pre-deploy checks failed: {', '.join(failed)}")
sys.exit(1)
print("\n✅ All pre-deploy checks passed! Ready to deploy.")