Este documento explica a estrutura otimizada e resiliente dos workflows de CI/CD do projeto.
react-lgpd-consent sempre reflete a versão dos pacotes internos.github/workflows/ci.yml)Trigger: Todo push em main e PRs
Objetivo: Validar código antes do merge
Steps:
Artefatos Gerados:
coverage-reports-{sha}: Relatórios completos de coverage em múltiplos formatos
lcov.info) - Para Codecov, Coveralls, SonarQubecobertura-coverage.xml) - Para Azure DevOps, GitLabclover.xml) - Para Jenkins, Atlassiancoverage-final.json) - Para análise programáticacoverage-summary.json) - Para badges e dashboardslcov-report/) - Para visualização localbuild-artifacts-{sha}: Pacotes compilados (apenas em main)
dist/ de cada pacoteComentários em PRs:
Em cada Pull Request, o CI adiciona automaticamente um comentário com:
Otimizações:
.github/workflows/version.yml)Trigger: Push em main após merge de PR
Objetivo: Criar PR de versão ou tag de release
Steps:
changeset version (gera novos package.json)scripts/sync-versions.mjs (sincroniza versões)vX.Y.Z se PR de version foi mergeadoLógica de Sincronização:
// scripts/sync-versions.mjs
// Detecta bumps nos pacotes internos e aplica o mesmo tipo ao agregador
// Cenários:
// 1. core: 0.6.2 → 0.6.3 (patch)
// main: 0.6.1 → 0.6.2 (patch também)
// 2. mui: 0.6.1 → 0.7.0 (minor)
// main: 0.6.8 → 0.7.0 (minor também)
// 3. core: 0.6.8 (sem mudança), mui: 0.6.2 → 0.6.3 (patch)
// main: 0.6.7 → 0.6.8 (patch)
// 4. core: 0.6.8 → 0.7.0 (minor), mui: 0.6.2 → 0.6.3 (patch)
// main: 0.6.7 → 0.7.0 (minor - usa o maior tipo de bump)
// IMPORTANTE: Compara com git HEAD para detectar mudanças
function detectBumps() {
const coreOldVersion = getGitVersion('packages/core/package.json')
const muiOldVersion = getGitVersion('packages/mui/package.json')
const coreBump = getBumpType(coreOldVersion, coreVersion)
const muiBump = getBumpType(muiOldVersion, muiVersion)
// Aplicar o maior tipo de bump ao agregador
if (coreBump === 'major' || muiBump === 'major') return 'major'
if (coreBump === 'minor' || muiBump === 'minor') return 'minor'
if (coreBump === 'patch' || muiBump === 'patch') return 'patch'
return null
}
Output:
vX.Y.Z (após merge do PR de version).github/workflows/publish.yml)Trigger: Push de tag v* (criada pelo workflow de version)
Objetivo: Publicar pacotes no NPM
Steps:
changeset publish)Segurança:
NODE_AUTH_TOKEN para autenticaçãoid-token: write.github/workflows/docs.yml)Trigger: Push de tag v* (mesma que publish)
Objetivo: Publicar documentação no GitHub Pages
Steps:
pnpm run docs:generate)pnpm run build-storybook)/ → index.html com versões corretas/modules.html → TypeDoc/storybook/ → StorybookVersões Corretas:
# Extrai versões dos package.json da tag
VERSION_CORE=$(node -p "require('./packages/core/package.json').version")
VERSION_MUI=$(node -p "require('./packages/mui/package.json').version")
VERSION_MAIN=$(node -p "require('./packages/react-lgpd-consent/package.json').version")
# Injeta no HTML
cat > integrated-docs/index.html <<EOF
<li><span class="badge">react-lgpd-consent</span> v${VERSION_MAIN}</li>
<li><span class="badge">@react-lgpd-consent/mui</span> v${VERSION_MUI}</li>
<li><span class="badge">@react-lgpd-consent/core</span> v${VERSION_CORE}</li>
EOF
git checkout -b feature/nova-feature
# ... desenvolver ...
git add .
git commit -m "feat: nova feature incrível"
pnpm changeset
# Selecionar pacotes afetados: core, mui, react-lgpd-consent
# Escolher tipo: patch, minor ou major
# Descrever mudanças
git push origin feature/nova-feature
# Abrir PR no GitHub
# Após aprovação e merge:
# Workflow "Version Bump & Tag" é acionado automaticamente
sync-versions.mjs sincroniza versõeschore(release): version packages# Ao mergear PR de version:
# - Tag vX.Y.Z é criada automaticamente
# - Workflow "Publish to NPM" é acionado
# - Workflow "Deploy Docs" é acionado
scripts/sync-versions.mjsPropósito: Sincronizar versões dos pacotes para que o agregador sempre reflita mudanças internas.
Execução: Automática após changeset version via hook em package.json
Lógica:
1. Ler versões de core, mui e main
2. Pegar maior versão entre core e mui
3. Se main < maior_interna: main = maior_interna
4. Se main > maior_interna: core = mui = main
5. Atualizar dependências internas (mui depende de core)
Garantias:
Exemplos Práticos:
# Cenário 1: Apenas core muda
# Estado atual: core=0.6.7, mui=0.6.1, main=0.6.6
# Changeset: core patch (0.6.7 → 0.6.8)
# Resultado: core=0.6.8, mui=0.6.1, main=0.6.7
# Cenário 2: Apenas mui muda
# Estado atual: core=0.6.8, mui=0.6.1, main=0.6.7
# Changeset: mui patch (0.6.1 → 0.6.2)
# Resultado: core=0.6.8, mui=0.6.2, main=0.6.8
# Cenário 3: Ambos mudam com tipos diferentes
# Estado atual: core=0.6.8, mui=0.6.2, main=0.6.8
# Changeset: core minor (0.6.8 → 0.7.0) + mui patch (0.6.2 → 0.6.3)
# Resultado: core=0.7.0, mui=0.6.3, main=0.7.0 (usa minor, o maior)
# Verifica se versão do package.json == tag
EXPECTED="0.6.2"
MAIN_VERSION=$(node -p "require('./packages/react-lgpd-consent/package.json').version")
if [ "${MAIN_VERSION}" != "${EXPECTED}" ]; then
echo "❌ Version mismatch!"
exit 1
fi
# Extrai versões reais dos package.json da tag
# Injeta no HTML (não usa variáveis hardcoded)
VERSION_CORE=$(node -p "require('./packages/core/package.json').version")
# 1. Turbo cache (builds incrementais)
- path: .turbo
key: ${{ runner.os }}-turbo-${{ github.sha }}
# 2. TypeScript + ESLint cache
- path: |
.tsbuildinfo
node_modules/.cache
**/.eslintcache
key: ${{ runner.os }}-build-cache-${{ hashFiles('**/tsconfig.json', '**/*.ts') }}
# CI: cancela builds antigos de PRs
concurrency:
group: ci-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
# Publish/Docs: nunca cancela
concurrency:
group: publish-${{ github.ref }}
cancel-in-progress: false
coverage-reports-{sha} - Relatórios de coverage completosbuild-artifacts-{sha} - Pacotes compilados (apenas main)# Listar runs recentes
gh run list --workflow=ci.yml
# Ver detalhes de um run específico
gh run view <run-id>
# Baixar artefato de coverage
gh run download <run-id> -n coverage-reports-<sha>
# Baixar todos os artefatos de um run
gh run download <run-id>
# Listar artefatos de um workflow run
curl -H "Authorization: token $GITHUB_TOKEN" \
https://api.github.com/repos/lucianoedipo/react-lgpd-consent/actions/runs/<run-id>/artifacts
# Download direto de um artefato
curl -L -H "Authorization: token $GITHUB_TOKEN" \
https://api.github.com/repos/lucianoedipo/react-lgpd-consent/actions/artifacts/<artifact-id>/zip \
-o coverage.zip
Para detalhes completos sobre os formatos exportados, consulte COVERAGE.md.
Resumo:
lcov.info - Codecov, Coveralls, SonarQube, IDE extensionscobertura-coverage.xml - Azure DevOps, GitLab CIclover.xml - Jenkins, Atlassian Bamboocoverage-final.json - Análise programáticacoverage-summary.json - Badges e dashboardslcov-report/index.html - Visualização interativa# Execute manualmente:
node scripts/sync-versions.mjs
pnpm install --lockfile-only
# Verifique se PR de version foi criado primeiro
# Se não, execute manualmente:
pnpm run changeset:version
git add .
git commit -m "chore(release): version packages"
git push
# Workflow criará tag automaticamente
# Certifique-se de que está fazendo deploy da TAG, não de main
# Workflow extrai versões do package.json da tag
# Verifique se NPM_TOKEN está configurado nos secrets
# Verifique se versão não foi publicada antes
npm view react-lgpd-consent versions
feat: nova feature
fix: correção de bug
docs: atualização de documentação
chore: tarefas de manutenção
test: adição/correção de testes
refactor: refatoração de código
vX.Y.Z (ex: v0.6.2)react-lgpd-consent (agregador)main: branch principal (protegida)feature/*: featuresfix/*: correçõesdocs/*: documentaçãochore/*: manutençãoÚltima atualização: 01/12/2025