|
| 1 | +# Documento de Implantação (Deploy) |
| 2 | + |
| 3 | +> PWeb_Project — Engenharia de Software II / Iteração 4 (P5) |
| 4 | +> Cobertura: ambiente local (Docker Compose), pipeline de CI, deploy de produção (Vercel), versionamento. |
| 5 | +
|
| 6 | +--- |
| 7 | + |
| 8 | +## 1. Visão geral |
| 9 | + |
| 10 | +| Camada | Tecnologia | Ambiente | |
| 11 | +|---|---|---| |
| 12 | +| App | Next.js 15 (App Router) + TypeScript 5 | dev / preview / produção | |
| 13 | +| DB | PostgreSQL via Prisma 7 | local (Docker) / Supabase / Vercel Postgres | |
| 14 | +| Auth | Supabase Auth SSR (`@supabase/ssr`) | dev / produção | |
| 15 | +| AI | Google Genkit 1.31 (Gemini) | produção (Vercel) | |
| 16 | +| CI | GitHub Actions (lint·typecheck·test·format) | push/PR | |
| 17 | +| Quality | SonarQube (`sonar-project.properties`) | 2x/semana | |
| 18 | +| E2E | Playwright 1.59 (staging) | agendado / manual | |
| 19 | +| Deploy | Vercel (preview/production) | merge em `main` | |
| 20 | + |
| 21 | +--- |
| 22 | + |
| 23 | +## 2. Ambiente local — Docker Compose |
| 24 | + |
| 25 | +`docker-compose.yml` sobe Postgres 16 + Next.js dev com migrate/seed automáticos. |
| 26 | + |
| 27 | +### Pré-requisitos |
| 28 | +- Docker Engine ≥ 24 |
| 29 | +- Docker Compose v2 |
| 30 | +- Variáveis em `.env` (copiar de `.env.example`): |
| 31 | + - `NEXT_PUBLIC_SUPABASE_URL`, `NEXT_PUBLIC_SUPABASE_PUBLISHABLE_DEFAULT_KEY` |
| 32 | + - `SUPABASE_SERVICE_ROLE_KEY` |
| 33 | + - `GEMINI_API_KEY` (ou `GOOGLE_GENAI_API_KEY`) para AI workout gen |
| 34 | + - `NEXT_PUBLIC_APP_URL=http://localhost:3000` |
| 35 | + |
| 36 | +### Subir |
| 37 | + |
| 38 | +```bash |
| 39 | +cp .env.example .env # preencher chaves Supabase/AI |
| 40 | +docker compose up -d # db + app |
| 41 | +docker compose logs -f app # acompanhar boot |
| 42 | +# app em http://localhost:3000 |
| 43 | +``` |
| 44 | + |
| 45 | +Comando do serviço `app`: |
| 46 | +```sh |
| 47 | +npm install && npx prisma migrate deploy && npx prisma db seed && npm run dev |
| 48 | +``` |
| 49 | + |
| 50 | +### Parâmetros (`.env`, opcionais) |
| 51 | + |
| 52 | +| Var | Default | Descrição | |
| 53 | +|---|---|---| |
| 54 | +| `POSTGRES_USER` | `postgres` | usuário do DB | |
| 55 | +| `POSTGRES_PASSWORD` | `postgres` | senha do DB | |
| 56 | +| `POSTGRES_DB` | `pweb` | nome do DB | |
| 57 | +| `POSTGRES_PORT` | `5432` | porta exposta | |
| 58 | +| `APP_PORT` | `3000` | porta da app | |
| 59 | +| `NODE_ENV` | `development` | env Next | |
| 60 | + |
| 61 | +### Reset |
| 62 | + |
| 63 | +```bash |
| 64 | +docker compose down -v # derruba + apaga volume do DB |
| 65 | +``` |
| 66 | + |
| 67 | +> **Nota:** Auth Supabase é externa ao compose. Para Auth + PostgREST local, use o Supabase CLI local (`supabase start`, ports 54321/54322) — ver `docs/CURRENT-STATE.md` seção E2E. |
| 68 | +
|
| 69 | +--- |
| 70 | + |
| 71 | +## 3. Pipeline de CI (`.github/workflows/ci.yml`) |
| 72 | + |
| 73 | +4 gates obrigatórios antes do merge (`main`): |
| 74 | + |
| 75 | +| Gate | Comando | |
| 76 | +|---|---| |
| 77 | +| typecheck | `npm run typecheck` (TS strict) | |
| 78 | +| lint | `npm run lint` (ESLint) | |
| 79 | +| test | `npm test` (Vitest, coverage 80%+ branch) | |
| 80 | +| format | `npm run format:check` (Prettier) | |
| 81 | + |
| 82 | +E2E (`npm run e2e`) roda em branch de staging contra Supabase local. |
| 83 | + |
| 84 | +### Cobertura |
| 85 | +- Reporter: Vitest v8 (`coverage/lcov.info`) |
| 86 | +- Threshold: branch ≥ 80% (atual: **84.53%**) |
| 87 | +- Exclusões (10 patterns, alinhadas com `vitest.config.ts`): |
| 88 | + - `src/lib/actions/**` (server actions, E2E Prisma/Supabase) |
| 89 | + - `src/components/ui/**` (shadcn/Radix wrappers, E2E) |
| 90 | + - `src/test/**` (infra de teste) |
| 91 | + - `src/**/*.d.ts` (declarações de tipo) |
| 92 | + - `src/**/*.config.*` (configs) |
| 93 | + - `src/app/**/loading.*`, `error.*`, `not-found.*`, `layout.*` (Next.js special files) |
| 94 | + |
| 95 | +--- |
| 96 | + |
| 97 | +## 4. SonarQube |
| 98 | + |
| 99 | +Config: `sonar-project.properties` na raiz. |
| 100 | +Frequência: **2x por semana** (segunda + quinta). |
| 101 | + |
| 102 | +```bash |
| 103 | +sonar-scanner \ |
| 104 | + -Dsonar.projectKey=PWeb_Project \ |
| 105 | + -Dsonar.login=$SONAR_TOKEN |
| 106 | +``` |
| 107 | + |
| 108 | +Cobertura importada de `coverage/lcov.info` (`sonar.javascript.lcov.reportPaths`). |
| 109 | + |
| 110 | +Ver detalhes em `docs/sonarqube/config.md`. |
| 111 | + |
| 112 | +--- |
| 113 | + |
| 114 | +## 5. Deploy — Vercel (produção) |
| 115 | + |
| 116 | +1. Conectar repo `PWeb_Project` ao Vercel (Project Settings). |
| 117 | +2. Framework preset: **Next.js**. |
| 118 | +3. Build: `npm run build`. |
| 119 | +4. Variáveis de ambiente (Vercel → Settings → Environment Variables): |
| 120 | + - `DATABASE_URL`, `DIRECT_URL` (Vercel Postgres) |
| 121 | + - `NEXT_PUBLIC_SUPABASE_URL`, `NEXT_PUBLIC_SUPABASE_PUBLISHABLE_DEFAULT_KEY`, `SUPABASE_SERVICE_ROLE_KEY` |
| 122 | + - `GEMINI_API_KEY` / `GOOGLE_GENAI_API_KEY` |
| 123 | + - `NEXT_PUBLIC_APP_URL`, `SENTRY_DSN`, `SENTRY_AUTH_TOKEN` |
| 124 | +5. Domínios: produção `app.dominio.com`, preview automático por branch. |
| 125 | +6. Cada PR abre **Preview Deployment**; merge em `main` → produção. |
| 126 | + |
| 127 | +### Manual (CLI) |
| 128 | + |
| 129 | +```bash |
| 130 | +npm i -g vercel |
| 131 | +vercel # preview |
| 132 | +vercel --prod # produção |
| 133 | +``` |
| 134 | + |
| 135 | +--- |
| 136 | + |
| 137 | +## 6. Versionamento (SemVer) |
| 138 | + |
| 139 | +- Formato: `MAJOR.MINOR.PATCH` (ex: `v1.0.0`) |
| 140 | +- Bump: feature → MINOR, fix → PATCH, breaking → MAJOR |
| 141 | +- Tag no commit de release: `git tag v1.0.0 && git push --tags` |
| 142 | +- `CHANGELOG.md` mantém histórico por versão (reverse-chrono). |
| 143 | + |
| 144 | +### Release RC-v1.0 (Iteração 4 — P5) |
| 145 | + |
| 146 | +Release candidato do MVP da Iteração 4 (Docker + Implantação + Qualidade Final): |
| 147 | + |
| 148 | +- **Tag:** `v1.0.0` (semântica SemVer release final; `package.json` já em `1.0.0`) |
| 149 | +- **GitHub Release:** título `RC-v1.0 (Iteração 4)`, tag `v1.0.0` |
| 150 | +- **Referência:** [plano-iterações 2026.1](https://github.com/tacianosilva/eng-software-2/blob/main/projetos/20261/plano-iteracoes.md) — It4 `RC-v1.0` |
| 151 | +- **Aplicada:** pós-merge PR #191, no SHA squash em `main` |
| 152 | + |
| 153 | +--- |
| 154 | + |
| 155 | +## 7. Conventional Commits |
| 156 | + |
| 157 | +Padrão: `type(scope): mensagem` |
| 158 | + |
| 159 | +| Type | Uso | |
| 160 | +|---|---| |
| 161 | +| `feat` | nova funcionalidade | |
| 162 | +| `fix` | correção de bug | |
| 163 | +| `docs` | documentação | |
| 164 | +| `test` | testes | |
| 165 | +| `chore` | build/config/dev | |
| 166 | +| `refactor` | refactor sem mudança de comportamento | |
| 167 | +| `ci` | pipeline CI | |
| 168 | + |
| 169 | +Scope: área do código (`aluno`, `auth`, `dashboard`, `e2e`, `mobile`). |
| 170 | +Rodapé: `Refs #<task-id>` quando associado a tracker. |
| 171 | + |
| 172 | +Ex: `feat(aluno): PRD-8 mobile card variant for detail tables Refs #187` |
| 173 | + |
| 174 | +--- |
| 175 | + |
| 176 | +## 8. AcademicDevFlow |
| 177 | + |
| 178 | +Fluxo acadêmico (LabEnS — `labens.dct.ufrn.br/academicflow`): |
| 179 | +1. Planejar iteração (`docs/plano-iteracao.md`) |
| 180 | +2. Implementar US da tela ao banco |
| 181 | +3. Testes unidade (dev) + aceitação (relatório) |
| 182 | +4. SonarQube 2x/semana |
| 183 | +5. Documentar + versionar + tag |
| 184 | + |
| 185 | +### Iteração 4 (P5) — cobertura ADF + release RC-v1.0 |
| 186 | + |
| 187 | +| Step ADF | Evidência | |
| 188 | +| --- | --- | |
| 189 | +| 1. Planejar | `docs/plano-iteracao.md` + plano de remediação | |
| 190 | +| 2. Implementar US tela-banco | US13 PRD-8 PR #187 (merge squash `3ddf0fb`) | |
| 191 | +| 3. Testes unidade + aceitação | 1137/1137 unit, 21 E2E, `docs/relatorio-testes.md` (modelo taciano) | |
| 192 | +| 4. SonarQube 2x/semana | cron `3 9 * * 1,4` em `ci.yml`, registry `docs/sonarqube/scans.md` | |
| 193 | +| 5. Documentar + versionar + tag | `docs/doc-deploy.md` + tag `v1.0.0` + CHANGELOG + GitHub Release `RC-v1.0` | |
| 194 | + |
| 195 | +Release RC-v1.0 aplicada na It4, tag `v1.0.0` no SHA pós-merge PR #191 em `main`. |
0 commit comments