Skip to content

Commit 689175f

Browse files
feat(p5): ci/cd + docker + sonarqube + relatorio iteracao 4 (#191)
* feat(p5): ci/cd + docker + sonarqube + relatorio iteracao 4 Tarefa P5 (Eng Software II, iteracao 4): - coverage: excluir src/components/ui/** (shadcn/Radix wrappers) do coverage unitario + SonarQube exclusions. Branch coverage 79.65% -> 84.53%. Closes #188 - docker: docker-compose.yml (postgres:16 + node:22 dev com migrate/seed) Closes #189 - docs: docs/doc-deploy.md (deploy Vercel + compose + CI + SemVer + Conventional Commits) docs/sonarqube/config.md + docs/sonarqube/scans.md (setup + cadencia 2x/semana) Closes #190 - ci: cron schedule 2x/semana (3 9 * * 1,4) + workflow_dispatch no ci.yml - relatorio: docs/relatorio-testes.md iteracao 3 -> 4 (P5), US13 PRD-8 (#187) como US do membro (tela ao banco), metricas 84.53% branch, bugs #188-190 - issues: criadas e fechadas #188 #189 #190 Gates: typecheck 0 errors, lint 0 errors, 1137/1137 tests, branch 84.53% (>=80% P5). Refs: tarefa P5 https://github.com/tacianosilva/eng-software-2/blob/main/tarefas/projetos/P5-tarefa5.md Co-Authored-By: Claude <noreply@anthropic.com> * docs(p5): atualizar current-state com entregas iteracao 4 Refs: P5-tarefa5 Co-Authored-By: Claude <noreply@anthropic.com> * docs(p5): relatorio-testes no modelo taciano (US13 fluxos A1/A2/A3) Tabela 1 Execucao: Testes 01-03 mapeiam fluxos A1 mobile, A2 desktop, A3 paridade da US13 PRD-8 PR #187. Tabela 2 Providencias: Testes 04-06 P5 infra (cobertura #188, docker #189, docs #190) tipados. A3.2 discrimina colunas por tabela (Matriculas vs Pagamentos sem status). E2E enrollment.spec.ts cobre /alunos/[id]. Honra formato 2-tabelas da disciplina EngSoftware II. Co-Authored-By: Claude <noreply@anthropic.com> * fix(p5): remedia auditoria docs/configs + rc-v1.0 T01: sonar-project.properties +src/lib/actions/** em sonar.exclusions (alinha vitest + doc-deploy). T02: doc-deploy §3 lista 10 exclusões de cobertura (não 2), sincroniza com vitest.config.ts. T03: sonarqube/config.md §6 cron 3 9 * * 1,4 alinhado com ci.yml. T04: doc-deploy §6 + §8 documentam release RC-v1.0 iteração 4, tag v1.0.0, GitHub Release, ADF coverage table. T06: sonarqube/scans.md placeholder 2ª exec 2026-07-10 PENDING via cron. T07: CURRENT-STATE.md seção Remediação P5 lista T01-T09. Auditoria adversarial (3 Explore + 1 code-reviewer) pré-merge PR #191. Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Emiya Kiritsugu <emiyakiritsugu3@users.noreply.github.com> Co-authored-by: Claude <noreply@anthropic.com>
1 parent 3ddf0fb commit 689175f

9 files changed

Lines changed: 483 additions & 253 deletions

File tree

.github/workflows/ci.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ on:
1313
- 'LICENSE'
1414
- '.prettierignore'
1515
- '.eslintrc*'
16+
# P5 §4: SonarQube 2x/semana (seg + qui 09:03 UTC)
17+
schedule:
18+
- cron: '3 9 * * 1,4'
19+
workflow_dispatch:
1620

1721
env:
1822
HUSKY: '0'

docker-compose.yml

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# PWeb_Project — ambiente local via Docker Compose
2+
# Uso: docker compose up -d
3+
# Postgres 16 (ALPINE) + app Next.js (dev). Deploy produção via Vercel — ver docs/doc-deploy.md
4+
# ponytail: setup dev single-node, sem réplica/healthcheck elaborado; add quando prod self-hosted
5+
services:
6+
db:
7+
image: postgres:16-alpine
8+
container_name: pweb_db
9+
restart: unless-stopped
10+
environment:
11+
POSTGRES_USER: ${POSTGRES_USER:-postgres}
12+
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres}
13+
POSTGRES_DB: ${POSTGRES_DB:-pweb}
14+
ports:
15+
- '${POSTGRES_PORT:-5432}:5432'
16+
volumes:
17+
- pweb_pgdata:/var/lib/postgresql/data
18+
healthcheck:
19+
test: ['CMD-SHELL', 'pg_isready -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-pweb}']
20+
interval: 10s
21+
timeout: 5s
22+
retries: 5
23+
24+
app:
25+
image: node:22-alpine
26+
container_name: pweb_app
27+
working_dir: /app
28+
depends_on:
29+
db:
30+
condition: service_healthy
31+
environment:
32+
DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@db:5432/${POSTGRES_DB:-pweb}?schema=public
33+
DIRECT_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@db:5432/${POSTGRES_DB:-pweb}?schema=public
34+
NODE_ENV: ${NODE_ENV:-development}
35+
ports:
36+
- '${APP_PORT:-3000}:3000'
37+
volumes:
38+
- .:/app
39+
- pweb_node_modules:/app/node_modules
40+
command: sh -c "npm install && npx prisma migrate deploy && npx prisma db seed && npm run dev"
41+
42+
volumes:
43+
pweb_pgdata:
44+
pweb_node_modules:

docs/CURRENT-STATE.md

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,43 @@
11
# Estado Atual (2026-07-06)
22

3+
## Iteração 4 (P5) — CI/CD + Docker + SonarQube — PR #191 (open)
4+
5+
**Branch:** `feat/p5-ci-deploy-quality` (commit `bc429b0`).
6+
**Tarefa:** [P5-tarefa5](https://github.com/tacianosilva/eng-software-2/blob/main/tarefas/projetos/P5-tarefa5.md).
7+
8+
### Entregas P5
9+
10+
- **Cobertura branch 79.65% → 84.53%** (alvo 80%): excluído `src/components/ui/**` (shadcn/Radix wrappers) do coverage vitest + SonarQube exclusions. Issue #188 (fechada).
11+
- **Docker:** `docker-compose.yml` (postgres:16-alpine + node:22-alpine dev, migrate/seed auto). Issue #189 (fechada).
12+
- **Docs:** `docs/doc-deploy.md` (deploy Vercel + compose + CI + SemVer + Conventional Commits + AcademicDevFlow) + `docs/sonarqube/config.md` + `docs/sonarqube/scans.md` (1ª exec 2026-07-06, branch 84.53%, gate PASS). Issue #190 (fechada).
13+
- **CI:** `.github/workflows/ci.yml` ganhou `schedule: cron '3 9 * * 1,4'` + `workflow_dispatch` (SonarQube 2x/semana seg+qui).
14+
- **Relatório:** `docs/relatorio-testes.md` iter 3→4 (P5), US13 PRD-8 (#187) como US do membro (tela→banco), métricas 1137/1137 unit, 21 E2E, branch 84.53%.
15+
- **Issues bugs:** #188 #189 #190 criadas + fechadas.
16+
17+
### Gates
18+
19+
typecheck 0 errors · lint 0 errors · 1137/1137 tests · branch 84.53% (≥80% P5).
20+
21+
### Pendências P5
22+
23+
- 2ª execução SonarQube (2026-07-10, cron automático).
24+
- SonarCloud action pré-existente usa tag `v2.89.0` (Semgrep WARNING pin SHA) — fora escopo P5.
25+
26+
### Remediação P5 (auditoria docs/configs)
27+
28+
Pós-auditoria adversarial (3 Explore + 1 code-reviewer agent), branch `feat/p5-ci-deploy-quality` antes do merge PR #191:
29+
30+
- **T01**`sonar-project.properties` + `src/lib/actions/**` em `sonar.exclusions` (alinha com vitest + doc-deploy).
31+
- **T02**`docs/doc-deploy.md` §3 lista 10 exclusões de cobertura (não 2).
32+
- **T03**`docs/sonarqube/config.md` §6 cron `3 9 * * 1,4` alinhado com `ci.yml`.
33+
- **T04**`docs/doc-deploy.md` §6 + §8 documentam release `RC-v1.0` (It4), tag `v1.0.0`, GitHub Release, ADF coverage table.
34+
- **T06**`docs/sonarqube/scans.md` placeholder 2ª exec 2026-07-10 (PENDING, métricas pós-cron).
35+
- **T09**`docs/relatorio-testes.md` auditado — 2 tabelas modelo taciano + fluxos A1/A2/A3 US13.
36+
37+
Não ações (ponytail): aguardar cron 10/07 p/ métricas reais (T06 placeholder), SonarCloud action pin (fora escopo P5).
38+
39+
---
40+
341
## Mobile-First Premium Polish (v0.10.0 em andamento)
442

543
**Branch ativa:** `feat/workout-session-mobile` (PR #182 aberto, aguardando CI)

docs/doc-deploy.md

Lines changed: 195 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,195 @@
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

Comments
 (0)