Quality Gates
Bloqueie merges e deploys até que lint, testes, typecheck e auditoria de segurança passem em código Node.js 24 TypeScript.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
steps:
- run: npm ci
- run: npm run lint
- run: npm run typecheck
- run: npm run test
- run: npm audit --audit-level=high
- run: npm run buildQuando usar isso: Antes de qualquer deploy para staging ou produção. Quality gates são inegociáveis para APIs Node de produção.
Exemplo de Trabalho
{
"scripts": {
"lint": "eslint src --max-warnings 0",
"typecheck": "tsc -p tsconfig.json --noEmit",
"test": "vitest run --coverage",
"test:unit": "vitest run --project unit",
"test:integration": "vitest run --project integration",
"build": "tsc -p tsconfig.json",
"audit:ci": "npm audit --audit-level=high",
"gates": "npm run lint && npm run typecheck && npm run test && npm run audit:ci && npm run build"
}
}# .github/workflows/ci.yml (excerto)
jobs:
gates:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: "24"
cache: npm
- run: npm ci
- run: npm run gates
docker-scan:
needs: gates
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: docker build -t api:ci .
- uses: aquasecurity/trivy-action@master
with:
image-ref: api:ci
severity: CRITICAL,HIGH
exit-code: 1O que isso demonstra:
- Script
gatesúnico que desenvolvedores locais executam antes do push --max-warnings 0trata avisos de lint como falhas- Escaneamento Trivy na imagem Docker após os gates da aplicação passarem
Mergulho Profundo
Ordem e Custo dos Gates
| Gate | Duração Típica | Falha Rápida? |
|---|---|---|
| lint | 5-30s | Sim |
| typecheck | 10-60s | Sim |
| teste unitário | 1-5 min | Sim |
| teste de integração | 2-15 min | Após unitário |
| npm audit | 5-20s | Sim (dependente da política) |
| build + scan Docker | 2-10 min | Apenas no release |
Gate ESLint
// excerto de eslint.config.js
export default [
{
rules: {
"no-console": "error",
"@typescript-eslint/no-floating-promises": "error",
},
},
];Proíbe console.log em src/; use logging estruturado.
Gate Typecheck
{
"scripts": {
"typecheck": "tsc -p tsconfig.json --noEmit"
}
}Execute em CI mesmo se build emitir tipos. --noEmit é mais rápido para feedback de PR.
Limite de Cobertura (Opcional)
// vitest.config.ts
export default {
test: {
coverage: {
thresholds: {
lines: 80,
functions: 80,
branches: 70,
},
},
},
};Comece com cobertura diferente nos arquivos alterados se os limites do repositório completo forem muito rigorosos inicialmente.
Proteção de Branch
Configure no GitHub:
- Exigir status check
gates(edocker-scanpara branches de release) - Exigir revisão de PR
- Descartar aprovações desatualizadas em novos commits
Armadilhas
- Ruído do
npm auditem dependências transitivas - bloqueia todo PR. Correção:audit-level=high, Renovate para atualizações, ou playbooknpm audit fix. - Pular typecheck quando
buildexecutatsc- build pode pular arquivos estritos. Correção: jobtypecheckexplícito. - Lintar apenas arquivos alterados em CI - branch principal diverge. Correção: lintar todo
src/em cada execução (rápido o suficiente). - Testes de integração sem contêineres de serviço - CI instável. Correção: contêineres de serviço postgres/redis no workflow.
- Escaneamento Docker apenas no main - Dockerfile vulnerável em merges de PR. Correção: escanear no PR quando
Dockerfilemuda. - Sem lockfile -
npm cifalha ou audit é sem sentido. Correção: imporpackage-lock.jsonno repositório.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Gates estritos em todo PR | APIs de Produção | Repositórios de protótipo inicial (temporário) |
| Integração completa noturna | Suítes E2E lentas | Você pula toda a integração no PR |
| SonarQube / CodeClimate | Métricas de qualidade em toda a organização | Equipe pequena com ESLint + Vitest suficiente |
| Snyk / Dependabot | Automação de triagem de CVE | Substituir npm audit inteiramente sem política |
FAQs
Os gates devem ser executados em PRs apenas de documentação?
Use filtros de caminho para pular CI quando apenas *.md mudam, mas mantenha os filtros estreitos. A maioria dos PRs Node toca em código.
Qual nível de auditoria para ambientes regulamentados?
Falhar em moderate ou superior e manter exportação de SBOM (npm sbom) no pipeline de release.
Os quality gates substituem a revisão de código?
Não. Eles pegam problemas mecânicos; humanos pegam falhas de design e lógica de segurança.
Como os gates se aplicam ao Lambda?
Mesmo script gates antes do zip esbuild. Escaneie o zip com trivy fs se não estiver usando Docker.
Monorepo: um job de gate ou muitos?
Detecção de pacote afetado (Nx/Turbo) por serviço, mas nunca pule gates em um serviço cujo código mudou.
Podemos fazer deploy se o smoke test de staging falhar?
Não. O smoke test é um gate entre staging e produção - Princípios Básicos de CI/CD.
Relacionados
- Princípios Básicos de CI/CD - estrutura do pipeline
- GitHub Actions para Node - configuração do workflow
- Typecheck em CI - gates TypeScript
- Princípios Básicos de Linting - configuração ESLint
- Melhores Práticas de CI/CD - checklist da seção
Versões da Stack: Esta página foi escrita para Node.js 24.18.0 (Active LTS), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 e NestJS 11.