Problema
Cada repositório copia o mesmo pipeline de lint/test/build com pequenas variações. Secrets espalhados, jobs sem limite de concorrência e deploy para produção sem gate humano quando necessário.
Solução
Centralizar em reusable workflow (workflow_call) com inputs (environment, run_e2e). Usar environments do GitHub para secrets por stage e required reviewers em produção. Cache de dependências por lockfile.
Arquitetura
ci.yml (on push) → chama org/reusable-ci@v1
release.yml (on tag) → build artifact → deploy workflow com environment production
- Matriz só onde há ganho real (Node 20/22 ou multi-package).
- Artefatos imutáveis (digest da imagem) passados entre jobs.
Código
# .github/workflows/ci.yml
jobs:
quality:
uses: my-org/actions/.github/workflows/node-ci.yml@main
with:
node-version: "22"
secrets: inherit# reusable: node-ci.yml
on:
workflow_call:
inputs:
node-version: { required: true, type: string }
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ inputs.node-version }}
cache: npm
- run: npm ci
- run: npm run lint && npm testPerformance
Cache npm/pnpm; paths filter para não rodar monólito inteiro; sharding de testes em monorepos grandes.
Melhorias futuras
Assinatura de artefatos; SBOM; deploy canário integrado ao provedor cloud.
Conclusão
CI/CD maduro é contrato de qualidade do time. Mostrar reusable workflows indica que você já sofreu com escala de engenharia.