Skip to content

Commit 3fb94db

Browse files
ci: add quality and security gate
1 parent c350181 commit 3fb94db

4 files changed

Lines changed: 150 additions & 5 deletions

File tree

.github/workflows/ci.yml

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
name: CI
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
pull_request:
8+
9+
permissions:
10+
contents: read
11+
12+
concurrency:
13+
group: ci-${{ github.workflow }}-${{ github.ref }}
14+
cancel-in-progress: true
15+
16+
jobs:
17+
quality:
18+
name: Quality and security
19+
runs-on: ubuntu-latest
20+
timeout-minutes: 20
21+
22+
env:
23+
CI: true
24+
APOLLO_API_ENVIRONMENT: production
25+
APOLLO_V2_PERSISTENCE: postgres
26+
V2_DATABASE_URL: postgresql://apollo:apollo-ci@127.0.0.1:5432/apollo_v2?schema=public
27+
28+
services:
29+
postgres:
30+
image: postgres:16-alpine
31+
env:
32+
POSTGRES_DB: apollo_v2
33+
POSTGRES_USER: apollo
34+
POSTGRES_PASSWORD: apollo-ci
35+
ports:
36+
- 5432:5432
37+
options: >-
38+
--health-cmd "pg_isready -U apollo -d apollo_v2"
39+
--health-interval 10s
40+
--health-timeout 5s
41+
--health-retries 10
42+
43+
steps:
44+
- name: Check out repository
45+
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
46+
47+
- name: Set up Node.js
48+
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
49+
with:
50+
node-version: 22
51+
cache: npm
52+
cache-dependency-path: package-lock.json
53+
54+
- name: Prepare integration environment
55+
run: touch .env
56+
57+
- name: Install locked dependencies
58+
run: npm ci
59+
60+
- name: Audit dependencies
61+
run: npm run security:audit
62+
63+
- name: Typecheck
64+
run: npm run typecheck
65+
66+
- name: Run unit and contract tests
67+
run: npm test
68+
69+
- name: Validate public API contracts
70+
run: npm run api:v1:validate
71+
72+
- name: Validate database schema and migrations
73+
run: npm run db:v2:validate
74+
75+
- name: Apply database migrations
76+
run: npm run db:v2:migrate:deploy
77+
78+
- name: Build production application
79+
run: npm run build
80+
81+
- name: Run Prisma integration tests
82+
run: npm run test:integration:prisma
83+
84+
- name: Run public API integration tests
85+
run: npm run test:integration:api

README.md

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ Editor de vídeo local que automatiza a edição usando IA. Recebe vídeo bruto,
44

55
## Stack
66

7-
- **Next.js 14** — Interface e API
7+
- **Next.js 16 + React 19** — Interface e API
88
- **Remotion 4.0.434** — Renderização programática de vídeo
99
- **Whisper API** (OpenAI) — Transcrição com timestamps
1010
- **Claude API** (Anthropic) — Análise de conteúdo e cenas
@@ -21,7 +21,7 @@ Upload → Normalização → Transcrição → Análise IA → Revisão → Ren
2121

2222
### Pré-requisitos
2323

24-
- Node.js v20+
24+
- Node.js 22 recomendado (mínimo 20.9)
2525
- FFmpeg instalado globalmente
2626
- Chaves API: OpenAI + Anthropic
2727

@@ -52,6 +52,22 @@ npm run remotion:dev # Remotion na porta 3001
5252

5353
Acesse: http://localhost:3333
5454

55+
## Validação contínua
56+
57+
O workflow de CI roda em pushes para `main` e em pull requests. Ele usa instalação
58+
determinística pelo `package-lock.json` e bloqueia a integração quando falham:
59+
60+
- auditoria de dependências a partir de severidade baixa;
61+
- typecheck, testes unitários e contratos públicos;
62+
- validação e aplicação das migrations em Postgres 16;
63+
- build de produção e testes de integração Prisma/API.
64+
65+
Para executar a auditoria localmente:
66+
67+
```bash
68+
npm run security:audit
69+
```
70+
5571
## Formatos
5672

5773
- **Vertical (9:16)** — Shorts, Reels, TikTok

TODO.md

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,10 @@
411411
- [ ] Provisionar object storage em desenvolvimento isolado.
412412
- [ ] Provisionar workflow durável em desenvolvimento isolado.
413413
- [ ] Criar seeds mínimos para workspace, projeto, source e OutputSpec.
414-
- [ ] Configurar lint, typecheck, unit, integration, golden e E2E no CI.
414+
- [x] Configurar audit, typecheck, unit, migration check, contract gate, build e integrações Postgres/API no CI. Evidência: `.github/workflows/ci.yml`.
415+
- [ ] Configurar lint no CI após selecionar regras e corrigir o baseline da v1.
416+
- [ ] Configurar golden tests no CI após existir fixture/render determinístico.
417+
- [ ] Configurar E2E no CI após existir jornada vertical F0 executável.
415418
- [ ] Criar telemetria comum com trace, job, workspace e project IDs.
416419
- [ ] Fazer upload de fixture, normalizar, criar plano estático e renderizar proxy.
417420
- [ ] Reconstruir o proxy usando apenas banco, object storage e manifest.
@@ -2296,7 +2299,7 @@ Pendências deliberadas:
22962299

22972300
### Slice F0-007 — Upgrade seguro de Next.js e React
22982301

2299-
**Status:** concluído em 12 de julho de 2026; ainda não commitado.
2302+
**Status:** concluído e publicado em 12 de julho de 2026 no commit `c350181`.
23002303

23012304
Entregas:
23022305

@@ -2325,5 +2328,45 @@ Evidências:
23252328
Pendências deliberadas:
23262329

23272330
- migrar aliases/externals de Remotion/FFmpeg para Turbopack antes de remover `--webpack`;
2328-
- adicionar `npm audit` como gate formal de CI;
23292331
- atualizar TypeScript/Prisma e demais libs somente em slices próprios, com seus testes de migração.
2332+
2333+
### Slice F0-008 — Gate de qualidade e segurança no CI
2334+
2335+
**Status:** concluído em 12 de julho de 2026; ainda não commitado.
2336+
2337+
Entregas:
2338+
2339+
- workflow GitHub Actions para pushes em `main` e pull requests;
2340+
- permissões mínimas `contents: read` e cancelamento de execuções obsoletas da mesma referência;
2341+
- actions oficiais fixadas por commit SHA, com indicação da major usada;
2342+
- Node.js 22 e instalação determinística via `npm ci`/`package-lock.json`;
2343+
- `npm audit --audit-level=low` como gate bloqueante e comando local `security:audit`;
2344+
- typecheck, testes unitários, contratos públicos e migration/schema check;
2345+
- Postgres 16 efêmero com health check e migration deploy real;
2346+
- build de produção seguido pelas integrações Prisma e API pública;
2347+
- documentação do gate e runtime recomendado no README.
2348+
2349+
Critério de falha:
2350+
2351+
- qualquer comando retorna status diferente de zero e bloqueia o job;
2352+
- nenhuma credencial externa é necessária: banco e credenciais de integração são efêmeros;
2353+
- o job possui timeout de 20 minutos e não publica artifacts nem recebe permissão de escrita.
2354+
2355+
Evidências locais:
2356+
2357+
- reinstalação limpa com `npm ci` aprovada;
2358+
- YAML válido e workflow aprovado pelo `actionlint` 1.7.12;
2359+
- `npm audit --audit-level=low`: zero vulnerabilidades;
2360+
- 32 testes, typecheck, contratos e migration check aprovados;
2361+
- migration deploy real, build Next 16 e integrações Prisma/API aprovados.
2362+
2363+
Risco identificado:
2364+
2365+
- `npm ci` alerta que `fluent-ffmpeg@2.1.3` não possui mais suporte; a substituição por um adapter mantido ou por chamadas diretas ao FFmpeg deve ocorrer antes de promover o media worker a produção.
2366+
2367+
Pendências deliberadas:
2368+
2369+
- lint depende da seleção de regras e correção do baseline legado;
2370+
- golden depende de fixture e render determinísticos;
2371+
- E2E depende da primeira jornada vertical completa;
2372+
- configurar a proteção da branch no GitHub para exigir o check `quality` é uma ação administrativa após a publicação do workflow.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
"start": "next start -p 3333",
1313
"typecheck": "tsc --noEmit",
1414
"test": "node --disable-warning=MODULE_TYPELESS_PACKAGE_JSON --test",
15+
"security:audit": "npm audit --audit-level=low",
1516
"test:integration:prisma": "node --disable-warning=MODULE_TYPELESS_PACKAGE_JSON --env-file=.env --test tests/v2/prisma-project-repository.integration.mjs",
1617
"test:integration:api": "node --disable-warning=MODULE_TYPELESS_PACKAGE_JSON --env-file=.env --test tests/v2/public-project-api.integration.mjs",
1718
"api:v1:validate": "node --disable-warning=MODULE_TYPELESS_PACKAGE_JSON scripts/verify-public-contracts.mjs",

0 commit comments

Comments
 (0)