Pular para o conteúdo principal

Pipeline de CI/CD

Este documento descreve os fluxos de integração contínua, execução de testes e o processo de deploy manual do projeto.


1. Visão Geral

O repositório conta com dois workflows do GitHub Actions e um script de deploy manual via SSH. Não há Continuous Deployment automático — o deploy em produção é sempre iniciado manualmente.

ArquivoTriggerJobsDuração Estimada
.github/workflows/ci.ymlPush em develop ou maintype-check, lint, build~3–5 min
.github/workflows/tests.ymlPush em develop/main (unit); PRs para main (unit + e2e)unit, e2e~5–8 min (unit) / ~12–18 min (e2e)
scripts/deploy.batManual (desenvolvedor)SSH + pm2 restart~5–10 min

2. Workflow ci.yml — Integração Contínua

Executado a cada push nas branches develop e main. É a barreira de qualidade de código: se qualquer step falhar, o push é bloqueado de avançar no pipeline.

2.1 Steps Detalhados

Job: ci
Runs-on: ubuntu-latest
Node.js: 20 (cache: npm)

1. actions/checkout@v4
└── Faz checkout do código do branch que disparou o push.

2. actions/setup-node@v4 (node-version: 20, cache: npm)
└── Instala Node 20 e restaura o cache do node_modules
baseado no package-lock.json (acelera execuções subsequentes).

3. npm ci
└── Instalação limpa das dependências (usa package-lock.json).
Falha se houver inconsistência entre package.json e lock file.

4. npx prisma generate
└── Gera o Prisma Client a partir do schema.prisma.
OBRIGATÓRIO antes de qualquer import de @/lib/db ou @prisma/client.
Não requer DATABASE_URL (apenas lê o schema).

5. tsc --noEmit
└── Type check completo do projeto sem gerar arquivos.
Falha em qualquer erro de tipo, mesmo em arquivos não alterados.

6. eslint --max-warnings=200
└── Linting com tolerância de até 200 warnings.
Warnings acima de 200 ou qualquer erro → falha do job.
O threshold 200 é temporário — reduzir progressivamente.

7. next build
└── Build de produção completo.
Falha se houver import inválido, variável de ambiente ausente
marcada como obrigatória, ou erro de runtime em Server Components.

2.2 Variáveis de Ambiente Necessárias no CI

O step next build exige algumas variáveis para não falhar. Defina-as como secrets no repositório GitHub:

VariávelObrigatória no Build?Observação
DATABASE_URLNão (Prisma generate não conecta)Necessária apenas nos testes
JWT_SECRETSim (referenciada em código)Qualquer valor de 32+ chars serve para build
NEXTAUTH_URLRecomendadoEvita warnings no build
NEXT_PUBLIC_GA4_IDNãoBuild continua sem ela (feature fica desabilitada)
NEXT_PUBLIC_CLARITY_IDNãoIdem

2.3 Como Interpretar Falhas

FalhaCausa Mais ComumAção
tsc --noEmit com errosTipo incorreto, import errado, any implícitoCorrigir os erros de tipo localmente antes do push
eslint com Found X warnings, max allowed: 200Warnings acumuladosCorrigir warnings até ficar abaixo do threshold
next buildModule not foundPrisma Client não gerado ou path alias erradoVerificar se npx prisma generate roda antes
next buildEnvironment variable not foundSecret ausente no GitHubAdicionar o secret em Settings → Secrets → Actions

3. Workflow tests.yml — Testes Automatizados

3.1 Job unit — Testes Unitários com Jest

Executado em todo push para develop e main, e também como pré-requisito do job e2e.

Job: unit
Runs-on: ubuntu-latest
Node.js: 20 (cache: npm)

1. checkout + setup-node + npm ci + prisma generate
2. jest --ci --coverage --coverageThreshold='{"global":{"lines":60}}'
└── Executa todos os testes (__tests__/**).
Falha se coverage de linhas cair abaixo de 60%.
--ci desativa watch mode e trata warnings como erros.
3. actions/upload-artifact@v4
└── Faz upload do relatório coverage/lcov-report/ como artifact.
Disponível por 7 dias na aba Actions do repositório.

Variáveis de ambiente necessárias para os testes unitários:

DATABASE_URL=mysql://root:root@localhost:3306/ljvemas_test
JWT_SECRET=test-secret-for-ci-at-least-32-characters

3.2 Job e2e — Testes End-to-End com Playwright

Executado apenas em Pull Requests para main, e somente após o job unit ser concluído com sucesso.

Job: e2e
Needs: unit
If: github.event_name == 'pull_request' && github.base_ref == 'main'
Runs-on: ubuntu-latest

1. checkout + setup-node + npm ci + prisma generate
2. npx playwright install chromium
└── Instala apenas o browser Chromium (economia de ~400MB vs instalar todos).
3. Sobe banco de dados MySQL via Docker
└── docker run -d -p 3306:3306 mysql:8
Aguarda healthcheck antes de continuar.
4. npx prisma migrate deploy
└── Aplica todas as migrations no banco de testes.
5. npm run db:seed
└── OBRIGATÓRIO antes dos testes E2E.
O login helper dos testes depende do usuário admin seedado.
6. npm run test:e2e
└── Playwright com retries: 2 e workers: 1 (para evitar race conditions).

3.3 Diagrama de Dependência dos Jobs

3.4 Configuração do Playwright

O arquivo playwright.config.ts define:

  • Browser: Chromium apenas
  • Retries: 2 (falhas intermitentes não bloqueiam o PR)
  • Workers: 1 em CI (evita conflitos no banco de dados)
  • Base URL: http://localhost:3000
  • Timeout: 30s por teste

4. Deploy Manual

O deploy em produção não é automatizado. O processo atual utiliza o script scripts/deploy.bat que realiza a implantação via SSH no servidor Hostinger.

4.1 Pré-requisitos

  • Acesso SSH configurado ao servidor Hostinger (chave SSH no agente ou arquivo ~/.ssh/config)
  • Variáveis de ambiente de produção configuradas no servidor
  • PM2 instalado globalmente no servidor: npm install -g pm2

4.2 Processo de Deploy

scripts/deploy.bat

1. Conecta ao servidor via SSH
2. git pull origin main (atualiza o código no servidor)
3. npm ci --omit=dev (instala dependências de produção)
4. npx prisma generate (regenera o Prisma Client)
5. npx prisma migrate deploy (aplica migrations pendentes)
6. next build (gera o build de produção)
7. pm2 restart ljvemasearomas (reinicia a aplicação)

4.3 Verificação Pós-Deploy

Após o deploy, verificar manualmente:

  • pm2 status — processo ljvemasearomas está online
  • pm2 logs ljvemasearomas --lines 50 — sem erros de inicialização
  • Acessar a URL de produção e verificar que a loja carrega
  • Testar login no admin panel
  • Verificar que o último pedido/produto está presente (sem regressão de dados)

5. Secrets Necessários no GitHub

Os secrets abaixo precisam ser configurados em Settings → Secrets and variables → Actions do repositório. Atualmente nenhum está configurado — isso precisa ser feito antes de os workflows poderem rodar em ambiente limpo.

SecretUsoComo ObterOnde Configurar
JWT_SECRETBuild e testesopenssl rand -hex 32GitHub → Settings → Secrets → Actions
DATABASE_URLTestes unitários e E2EConnection string do MySQL de CIGitHub → Settings → Secrets → Actions
NEXTAUTH_URLBuild sem warningsURL do ambiente (ex.: http://localhost:3000)GitHub → Settings → Secrets → Actions
SSH_PRIVATE_KEYDeploy via deploy.bat (futuro)Chave privada do servidor HostingerGitHub → Settings → Secrets → Actions
SSH_HOSTDeploy via deploy.bat (futuro)IP ou hostname do servidorGitHub → Settings → Secrets → Actions
HYPERDX_API_KEYTelemetria em produçãoDashboard HyperDXServidor (não no CI)

Atenção: para o deploy manual atual via scripts/deploy.bat, os secrets do GitHub não são necessários — o script usa as credenciais SSH do desenvolvedor. Os secrets SSH_PRIVATE_KEY e SSH_HOST seriam necessários apenas se o deploy fosse automatizado via GitHub Actions no futuro.


6. Como Adicionar um Novo Workflow

6.1 Template Mínimo

# .github/workflows/meu-workflow.yml
name: Meu Workflow

on:
push:
branches: [develop, main]

jobs:
meu-job:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20
cache: npm

- name: Instalar dependências
run: npm ci

- name: Gerar Prisma Client
run: npx prisma generate

- name: Executar tarefa
run: npm run minha-tarefa
env:
JWT_SECRET: ${{ secrets.JWT_SECRET }}
DATABASE_URL: ${{ secrets.DATABASE_URL }}

6.2 Checklist para Novo Workflow

  • Usa actions/checkout@v4 (não versões antigas)
  • Usa node-version: 20 com cache: npm
  • Roda npm ci (não npm install)
  • Roda npx prisma generate antes de qualquer import de Prisma
  • Variáveis de ambiente sensíveis são lidas de secrets, não hardcoded
  • Nome do workflow e dos jobs é descritivo em inglês
  • Trigger é restrito às branches necessárias (não usar on: push sem filtro)

7. Solução de Problemas de CI

7.1 Erros de Type Check

Sintoma: tsc --noEmit falha com erros de tipo.

Causa: Tipos incompatíveis, imports incorretos ou any implícito introduzido em um PR.

Solução: Executar localmente antes do push:

npx tsc --noEmit

Corrigir todos os erros antes de fazer push.


7.2 Lint com Excesso de Warnings

Sintoma: Found 215 warnings (max: 200).

Causa: Warnings de lint acumulados ultrapassaram o threshold de 200.

Solução:

npx eslint . --max-warnings=200 2>&1 | grep "warning" | head -30

Corrigir pelo menos 15 warnings (os mais fáceis primeiro: variáveis não usadas, imports desnecessários).


7.3 Testes E2E sem Banco de Dados

Sintoma: Testes E2E falham com P1001: Can't reach database server.

Causa: O step de subir o MySQL via Docker não foi aguardado ou a DATABASE_URL está incorreta.

Solução: Verificar no workflow se o healthcheck do container MySQL está configurado e se DATABASE_URL aponta para localhost:3306 com as credenciais corretas do container.


7.4 Playwright sem Browsers Instalados

Sintoma: Error: browserType.launch: Executable doesn't exist at .../chromium.

Causa: O step npx playwright install chromium não foi executado no job.

Solução: Garantir que o workflow inclui o step de instalação antes de rodar os testes:

npx playwright install chromium

7.5 Seed Falha com Timeout no CI

Sintoma: npm run db:seed falha com P1001 ou timeout.

Causa: O Prisma não consegue conectar ao banco porque o container MySQL ainda não está pronto, ou a DATABASE_URL está incorreta no step.

Solução: Adicionar um sleep ou healthcheck antes do seed:

- name: Aguardar MySQL
run: |
for i in $(seq 1 30); do
mysqladmin ping -h 127.0.0.1 -u root -proot && break
sleep 2
done

- name: Seed do banco
run: npm run db:seed
env:
DATABASE_URL: mysql://root:root@localhost:3306/ljvemas_test