sonarqube-quality-gate-playbook
Node.jsやTypeScriptで開発されたプロジェクトを、ビルドやパイプラインを壊さずにSonarQubeの品質基準を満たすように改善し、新規コードの品質向上、バグや脆弱性の修正、セキュリティリスクの確認などを効率的に行うための手順を提供するSkill。
📜 元の英語説明(参考)
Playbook iterativo para llevar proyectos Node y TypeScript (NestJS + React en monorepo) a cumplir Quality Gates de SonarQube sin romper build ni pipelines. Usar cuando se necesite subir cobertura priorizando New Code, eliminar issues nuevos (Bugs, Vulnerabilities, Code Smells), revisar Security Hotspots y controlar duplicacion y deuda tecnica.
🇯🇵 日本人クリエイター向け解説
Node.jsやTypeScriptで開発されたプロジェクトを、ビルドやパイプラインを壊さずにSonarQubeの品質基準を満たすように改善し、新規コードの品質向上、バグや脆弱性の修正、セキュリティリスクの確認などを効率的に行うための手順を提供するSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o sonarqube-quality-gate-playbook.zip https://jpskill.com/download/10605.zip && unzip -o sonarqube-quality-gate-playbook.zip && rm sonarqube-quality-gate-playbook.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/10605.zip -OutFile "$d\sonarqube-quality-gate-playbook.zip"; Expand-Archive "$d\sonarqube-quality-gate-playbook.zip" -DestinationPath $d -Force; ri "$d\sonarqube-quality-gate-playbook.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
sonarqube-quality-gate-playbook.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
sonarqube-quality-gate-playbookフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
SonarQube Quality Gate Playbook
このフローを小さく検証可能なイテレーションで適用します。実際の影響と低いリスクを優先します。
必要なインプット
最初のサイクル前にこれらのインプットを定義します。
SONAR_HOST_URL(例:http://127.0.0.1:9000)- 分析権限を持つ
SONAR_TOKEN SONAR_PROJECT_KEYおよびオプションのSONAR_PROJECT_NAMESONAR_NEW_CODE_REFERENCE_BRANCH(デフォルト:main)- モノレポのパス:
apps/backend,apps/frontend,packages/* - coverage を伴うアプリ (backend/frontend) ごとのテストコマンド
- アプリごとのレポート
lcov.infoのパス - Sonar ファイル (
sonar-project.properties) または CI の同等のパラメータ - coverage と分析の除外パターン
- Quality Gate の閾値 (coverage, bugs, vulns, smells, duplicacion)
- 壊してはならないビルド/パイプラインコマンド
優先順位付け戦略
次の作業順序に従います。
- New Code を最初に
- 新しい Bugs と Vulnerabilities
TO_REVIEW状態の Security Hotspots- PR によって触れられたクリティカルなモジュールの Coverage
- 新しい Code Smells (重大度が高いものを優先)
- アクティブな領域の Duplicacion と技術的負債
- 過去の負債 (スプリントの目標に影響を与えない場合に限る)
インパクトのヒューリスティック
各 issue またはファイルについて、優先度を簡単に計算します。
priorityScore = (isNewCode*100) + (isBugOrVuln*80) + (isHotspotToReview*70) + severityWeight + (criticalPath*20) + (coverageGap*10) - (estimatedEffort*5)
ここで、severityWeight は次のようになります: blocker 40, critical 30, major 20, minor 10.
coverage のインフレ防止ルール
動作を検証せずにパーセンテージだけを上げるテストは受け入れません。
- すべての新しいテストは、正常系、異常系、および境界条件をカバーする必要があります
- スナップショットのみを唯一のアサーションとして禁止
- ロジックのないコードのトリビアルなテストは避ける
- 実際のバグでテストが失敗しない場合、価値のある coverage とは見なされません
スキルのパイプライン (ステップバイステップ)
coverage の不一致の Runbook (再利用可能なケース)
SonarQube がローカルよりもはるかに低い coverage を示す場合は、この runbook を使用します。
典型的な症状
- ローカル (Jest/Vitest): 高い coverage (例: >90%)
- SonarQube: 著しく低い coverage (例: 40-60%)
頻繁な根本原因
- Windows で生成された
lcov.infoのバックスラッシュ (\\) を含むSF:パス。 \\を使用してパスをマッピングできない Linux/コンテナで実行されている SonarQube。- coverage が低い共有パッケージ (例:
packages/utils) がグローバルを引き下げている。
迅速な診断
- 各アプリ/パッケージの
lcov.infoの最初のSF:エントリを確認します。 sonar-scannerのログで、マッピングされていない、または無視されている coverage ファイルがあるかどうかを確認します。- モジュール (backend/frontend/packages) ごとの coverage を比較して、外れ値を検出します。
推奨されるコマンド:
Get-Content "apps\\backend\\coverage\\lcov.info" | Select-String "^SF:" | Select-Object -First 10
Get-Content "apps\\frontend\\coverage\\lcov.info" | Select-String "^SF:" | Select-Object -First 10
SF:src\\app.ts のようなパスが表示される場合は、スキャン前に正規化します。
推奨される修正
sonar-scannerの前に、すべてのlcov.infoでパスをフォワードスラッシュ (/) に正規化します。- coverage テストとスキャンを再実行します。
- グローバルを歪めないように、パーセンテージが最も低いパッケージ/モジュールの coverage を上げます。
移植可能な例 (scripts/fix-lcov-paths.js):
const fs = require('node:fs');
const reports = [
'apps/backend/coverage/lcov.info',
'apps/frontend/coverage/lcov.info',
'packages/utils/coverage/lcov.info'
];
for (const reportPath of reports) {
if (!fs.existsSync(reportPath)) continue;
const content = fs.readFileSync(reportPath, 'utf8');
const normalized = content.replace(/\\\\/g, '/');
fs.writeFileSync(reportPath, normalized);
}
Guardrail CI (バックスラッシュが残っている場合は失敗):
if grep -q 'SF:.*\\\\' apps/backend/coverage/lcov.info; then
echo "ERROR: Backslashes encontrados en lcov.info"
exit 1
fi
ステップ 1: 現在のギャップを検出する
- 関連する backend/frontend/packages で coverage を使用してテストを実行します
- SonarQube 分析を実行します
- 優先順位を付けるために、新しいメトリクスと issue を収集します
一般的なコマンド:
bun run --cwd apps/backend test -- --coverage
bun run --cwd apps/frontend test -- --coverage
sonar-scanner `
-Dsonar.host.url=$env:SONAR_HOST_URL `
-Dsonar.token=$env:SONAR_TOKEN `
-Dsonar.projectKey=$env:SONAR_PROJECT_KEY `
-Dsonar.qualitygate.wait=true
curl -4 -s "$env:SONAR_HOST_URL/api/measures/component?component=$env:SONAR_PROJECT_KEY&metricKeys=coverage,new_coverage,bugs,new_bugs,vulnerabilities,new_vulnerabilities,code_smells,new_code_smells,duplicated_lines_density,new_duplicated_lines_density" -u "$env:SONAR_TOKEN:"
curl -4 -s "$env:SONAR_HOST_URL/api/issues/search?componentKeys=$env:SONAR_PROJECT_KEY&resolved=false&inNewCodePeriod=true&types=BUG,VULNERABILITY,CODE_SMELL&ps=500" -u "$env:SONAR_TOKEN:"
curl -4 -s "$env:SONAR_HOST_URL/api/hotspots/search?projectKey=$env:SONAR_PROJECT_KEY&status=TO_REVIEW&ps=500" -u "$env:SONAR_TOKEN:"
ステップ 2: Sonar 構成を生成または更新する
モノレポの実際のパスを使用して、ルートに sonar-project.properties を作成または更新します。
ステップ 3: 実際の coverage の読み取りを保証する
lcov.infoの存在を確認します- すべてのパスで
sonar.javascript.lcov.reportPathsを構成します - スキャナのログに coverage が不足しているという警告がないことを確認します
SF:行が/を使用し、\\を使用していないことを確認します- Windows/Linux の混合環境がある場合は、スキャン前にパスの正規化を実行します
- 関連する共有パッケージも coverage を報告していることを確認します (アプリだけでなく)
ステップ 4: 一貫した方法でテストを実行する
- ローカルと CI で同じコマンドとフラグを使用します
- coverage のアーティファクトを公開します
- 環境間でランナー/フラグを混在させないでください
ステップ 5: 小さなバッチで反復処理する
- バッチ A: 新しい Bugs/Vulns/Hotspots
- バッチ B: New Code の Coverage
- バッチ C: 新しい Code Smells
- バッチ D: 触れられた領域の Duplicacion/負債
ガイド付きテスト生成 (
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
SonarQube Quality Gate Playbook
Aplicar este flujo en iteraciones pequenas y verificables. Priorizar impacto real y bajo riesgo.
Inputs requeridos
Definir estos inputs antes del primer ciclo:
SONAR_HOST_URL(ejemplo:http://127.0.0.1:9000)SONAR_TOKENcon permisos de analisisSONAR_PROJECT_KEYy opcionalSONAR_PROJECT_NAMESONAR_NEW_CODE_REFERENCE_BRANCH(default:main)- Rutas del monorepo:
apps/backend,apps/frontend,packages/* - Comandos de test por app (backend/frontend) con coverage
- Rutas de reportes
lcov.infopor app - Archivo Sonar (
sonar-project.properties) o parametros equivalentes en CI - Patron de exclusiones de coverage y de analisis
- Umbrales del Quality Gate (coverage, bugs, vulns, smells, duplicacion)
- Comando de build/pipeline que no se puede romper
Estrategia de priorizacion
Seguir este orden de trabajo:
- New Code primero
- Nuevos Bugs y Vulnerabilities
- Security Hotspots en estado
TO_REVIEW - Coverage en modulos criticos y tocados por el PR
- Nuevos Code Smells (priorizar severidad alta)
- Duplicacion y deuda tecnica en zonas activas
- Deuda historica (solo si no afecta el objetivo del sprint)
Heuristica de impacto
Para cada issue o archivo, calcular prioridad de manera simple:
priorityScore = (isNewCode*100) + (isBugOrVuln*80) + (isHotspotToReview*70) + severityWeight + (criticalPath*20) + (coverageGap*10) - (estimatedEffort*5)
Donde severityWeight puede ser: blocker 40, critical 30, major 20, minor 10.
Regla anti inflado de coverage
No aceptar tests que solo suben porcentaje sin validar comportamiento:
- Todo test nuevo debe cubrir caso feliz, caso negativo y borde
- Prohibido snapshot-only como unica asercion
- Evitar tests triviales de codigo sin logica
- Si el test no falla ante un bug real, no cuenta como cobertura de valor
Pipeline del skill (paso a paso)
Runbook de discrepancia de cobertura (caso reutilizable)
Usar este runbook cuando SonarQube muestre cobertura mucho menor a la local.
Sintoma tipico
- Local (Jest/Vitest): cobertura alta (por ejemplo >90%)
- SonarQube: cobertura sensiblemente menor (por ejemplo 40-60%)
Causas raiz frecuentes
- Rutas
SF:con backslashes (\\) enlcov.infogeneradas en Windows. - SonarQube ejecutando en Linux/containers sin poder mapear rutas con
\\. - Packages compartidos con cobertura baja (ejemplo
packages/utils) tirando abajo el global.
Diagnostico rapido
- Revisar primeras entradas
SF:dellcov.infode cada app/package. - Verificar en logs de
sonar-scannersi hay archivos de coverage no mapeados o ignorados. - Comparar cobertura por modulo (backend/frontend/packages) para detectar outliers.
Comandos sugeridos:
Get-Content "apps\\backend\\coverage\\lcov.info" | Select-String "^SF:" | Select-Object -First 10
Get-Content "apps\\frontend\\coverage\\lcov.info" | Select-String "^SF:" | Select-Object -First 10
Si aparecen rutas como SF:src\\app.ts, normalizar antes del scan.
Remediacion recomendada
- Normalizar rutas a forward slash (
/) en todos loslcov.infoantes desonar-scanner. - Re-ejecutar tests de coverage y scan.
- Subir cobertura del paquete/modulo de menor porcentaje para no sesgar el global.
Ejemplo portable (scripts/fix-lcov-paths.js):
const fs = require('node:fs');
const reports = [
'apps/backend/coverage/lcov.info',
'apps/frontend/coverage/lcov.info',
'packages/utils/coverage/lcov.info'
];
for (const reportPath of reports) {
if (!fs.existsSync(reportPath)) continue;
const content = fs.readFileSync(reportPath, 'utf8');
const normalized = content.replace(/\\\\/g, '/');
fs.writeFileSync(reportPath, normalized);
}
Guardrail CI (fallar si quedan backslashes):
if grep -q 'SF:.*\\\\' apps/backend/coverage/lcov.info; then
echo "ERROR: Backslashes encontrados en lcov.info"
exit 1
fi
Paso 1: Detectar gap actual
- Ejecutar tests con coverage en backend/frontend/packages relevantes
- Ejecutar analisis SonarQube
- Levantar metricas e issues nuevos para priorizar
Comandos genericos:
bun run --cwd apps/backend test -- --coverage
bun run --cwd apps/frontend test -- --coverage
sonar-scanner `
-Dsonar.host.url=$env:SONAR_HOST_URL `
-Dsonar.token=$env:SONAR_TOKEN `
-Dsonar.projectKey=$env:SONAR_PROJECT_KEY `
-Dsonar.qualitygate.wait=true
curl -4 -s "$env:SONAR_HOST_URL/api/measures/component?component=$env:SONAR_PROJECT_KEY&metricKeys=coverage,new_coverage,bugs,new_bugs,vulnerabilities,new_vulnerabilities,code_smells,new_code_smells,duplicated_lines_density,new_duplicated_lines_density" -u "$env:SONAR_TOKEN:"
curl -4 -s "$env:SONAR_HOST_URL/api/issues/search?componentKeys=$env:SONAR_PROJECT_KEY&resolved=false&inNewCodePeriod=true&types=BUG,VULNERABILITY,CODE_SMELL&ps=500" -u "$env:SONAR_TOKEN:"
curl -4 -s "$env:SONAR_HOST_URL/api/hotspots/search?projectKey=$env:SONAR_PROJECT_KEY&status=TO_REVIEW&ps=500" -u "$env:SONAR_TOKEN:"
Paso 2: Generar o actualizar config Sonar
Crear o actualizar sonar-project.properties en raiz con rutas reales del monorepo.
Paso 3: Asegurar lectura de coverage real
- Verificar existencia de
lcov.info - Configurar
sonar.javascript.lcov.reportPathscon todas las rutas - Validar en logs del scanner que no haya warnings de coverage faltante
- Verificar que lineas
SF:usen/y no\\ - Si hay entorno mixto Windows/Linux, correr normalizacion de paths antes del scan
- Confirmar que packages compartidos relevantes tambien reporten coverage (no solo apps)
Paso 4: Ejecutar tests de forma consistente
- Usar los mismos comandos y flags en local y CI
- Publicar artefactos de coverage
- No mezclar runners/flags entre entornos
Paso 5: Iterar por lotes pequenos
- Lote A: Bugs/Vulns/Hotspots nuevos
- Lote B: Coverage en New Code
- Lote C: Code Smells nuevos
- Lote D: Duplicacion/deuda en areas tocadas
Generacion de tests guiada (backend y frontend)
1) Identificar archivos sin cobertura
- Fuente principal: SonarQube (archivos con uncovered lines en New Code)
- Fuente secundaria:
lcov.info+ archivos modificados del PR
git diff --name-only origin/main...HEAD | Where-Object { $_ -match '\.(ts|tsx)$' }
2) Elegir tipo de test correcto
- Unit: logica pura y funciones con pocas dependencias
- Integration (backend): controladores + servicios + repositorios mockeados
- Component (frontend): interacciones, estados y accesibilidad
- E2E: solo flujos criticos, no como reemplazo de unit/component
3) Mocking strategy
- DB: fake repo o base de test aislada
- HTTP externo: mocks deterministas (sin pegar a servicios reales)
- Tiempo/random: controlar reloj y valores aleatorios
- Evitar mocks excesivos que oculten defectos reales
4) Criterios minimos de calidad del test
- Estructura Arrange/Act/Assert clara
- Aserciones semanticas del comportamiento esperado
- Caso feliz + negativo + borde obligatorios
- Test estable y sin flakiness
- Nombre orientado a comportamiento
5) Naming y estructura
- Backend:
*.spec.ts - Frontend:
*.test.tsx - Patron recomendado:
should <resultado> when <condicion>returns <error> when <input invalido>
Remediacion de Code Smells, Bugs y Security
Aplicar fixes quirurgicos, sin cambios de estilo masivos.
Checklist por categoria:
- Complejidad: extraer funciones, usar early return, bajar anidacion
- Duplicacion: consolidar utilidades y evitar copy-paste
- Nullability: guards explicitos y defaults seguros
- Manejo de errores: evitar
catchvacio, propagar con contexto - Leaks/resources: cerrar timers, subscripciones, conexiones
- Regex/DoS: evitar patrones catastróficos y limitar input
- Dependencias inseguras: actualizar librerias vulnerables
- Sanitizacion: validar y sanitizar input, evitar XSS/inyeccion
- Security Hotspots: revisar y documentar resolucion por cada item
Reglas de exclusion y trade-offs
Exclusiones aceptables (con justificativo):
**/index.tssin logica- DTOs o types simples sin ramas
- codigo generado (
**/generated/**) - bootstrap minimo sin logica de negocio
Exclusiones no aceptables:
- servicios/casos de uso/controladores con logica
- hooks y validadores con ramas
- codigo de autenticacion/autorizacion
- excluir para pasar el porcentaje sin mejorar calidad
Regla: cada exclusion debe registrar el motivo tecnico.
Definicion de Done y metricas
Declarar ciclo completado solo con evidencia:
- Quality Gate en estado
PASSED new_coverage >= 80new_bugs = 0new_vulnerabilities = 0new_code_smells = 0new_security_hotspots_reviewed = 100%- Duplicacion y deuda dentro de umbral del gate
- Build y pipelines verdes
Evidencia minima a adjuntar:
- salida de
sonar-scannerconsonar.qualitygate.wait=true - salida de APIs de metricas/issues/hotspots
- cobertura por carpeta (backend/frontend/packages)
- resumen de issues resueltos (antes/despues)
Snippets de configuracion
sonar-project.properties
sonar.projectKey=my-org_my-monorepo
sonar.projectName=my-monorepo
sonar.sourceEncoding=UTF-8
sonar.sources=apps/backend/src,apps/frontend/src,packages
sonar.tests=apps/backend,apps/frontend,packages
sonar.test.inclusions=**/*.spec.ts,**/*.test.ts,**/*.test.tsx,**/*.spec.tsx
sonar.javascript.lcov.reportPaths=apps/backend/coverage/lcov.info,apps/frontend/coverage/lcov.info
sonar.newCode.referenceBranch=main
sonar.exclusions=**/dist/**,**/build/**,**/node_modules/**,**/*.d.ts
sonar.coverage.exclusions=**/index.ts,**/*.dto.ts,**/generated/**,**/*.stories.tsx
Jest backend (ejemplo)
import type { Config } from 'jest';
const config: Config = {
preset: 'ts-jest',
testEnvironment: 'node',
collectCoverage: true,
coverageDirectory: 'coverage',
coverageReporters: ['text', 'lcov', 'html'],
collectCoverageFrom: [
'src/**/*.{ts,tsx}',
'!src/**/*.dto.ts',
'!src/**/index.ts',
'!src/**/generated/**'
]
};
export default config;
Vitest frontend (ejemplo)
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
environment: 'jsdom',
coverage: {
provider: 'v8',
reporter: ['text', 'lcov', 'html'],
reportsDirectory: './coverage',
include: ['src/**/*.{ts,tsx}'],
exclude: ['src/**/*.stories.tsx', 'src/**/index.ts']
}
}
});
GitHub Actions (ejemplo)
name: quality-gate
on:
pull_request:
push:
branches: [main]
jobs:
quality:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: oven-sh/setup-bun@v2
- run: bun install --frozen-lockfile
- name: Backend tests with coverage
run: bun run --cwd apps/backend test -- --coverage
- name: Frontend tests with coverage
run: bun run --cwd apps/frontend test -- --coverage
- name: Normalize lcov paths (Windows/Linux safe)
run: node scripts/fix-lcov-paths.js
- name: Validate lcov path format
run: |
if grep -q 'SF:.*\\\\' apps/backend/coverage/lcov.info; then
echo "ERROR: Backslashes encontrados en backend lcov.info"
exit 1
fi
- name: Build
run: bun run build
- name: SonarQube Scan
env:
SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
run: |
sonar-scanner \
-Dsonar.host.url=$SONAR_HOST_URL \
-Dsonar.token=$SONAR_TOKEN \
-Dsonar.qualitygate.wait=true
GitLab CI (ejemplo)
stages:
- test
- quality
variables:
GIT_DEPTH: "0"
test_and_build:
stage: test
image: oven/bun:1
script:
- bun install --frozen-lockfile
- bun run --cwd apps/backend test -- --coverage
- bun run --cwd apps/frontend test -- --coverage
- node scripts/fix-lcov-paths.js
- bun run build
artifacts:
when: always
paths:
- apps/backend/coverage/
- apps/frontend/coverage/
sonarqube:
stage: quality
image: sonarsource/sonar-scanner-cli:latest
dependencies:
- test_and_build
script:
- sonar-scanner -Dsonar.host.url=$SONAR_HOST_URL -Dsonar.token=$SONAR_TOKEN -Dsonar.qualitygate.wait=true
allow_failure: false
README del skill
Usar este resumen rapido en ejecucion:
- correr tests con coverage
- correr sonar-scanner con wait del gate
- priorizar New Code -> Bugs/Vulns -> Hotspots -> Coverage -> Smells
- iterar en lotes pequenos y adjuntar evidencia
Comandos base:
bun run --cwd apps/backend test -- --coveragebun run --cwd apps/frontend test -- --coveragesonar-scanner -Dsonar.host.url=$SONAR_HOST_URL -Dsonar.token=$SONAR_TOKEN -Dsonar.qualitygate.wait=true
Checklist de PR
- [ ] No hay nuevos Bugs ni Vulnerabilities
- [ ] No hay nuevos Code Smells
- [ ] New Coverage >= 80%
- [ ] Hotspots nuevos revisados
- [ ] Sin exclusiones injustificadas
- [ ] Tests con caso feliz, negativo y borde
- [ ] Build y CI en verde
- [ ] Evidencia de Sonar adjunta
- [ ]
lcov.infosin backslashes en lineasSF: - [ ] Packages compartidos sin brecha fuerte de coverage
Plantillas de comandos listas para pegar
$env:SONAR_HOST_URL="http://127.0.0.1:9000"
$env:SONAR_TOKEN="<token>"
$env:SONAR_PROJECT_KEY="<project-key>"
bun run --cwd apps/backend test -- --coverage
bun run --cwd apps/frontend test -- --coverage
bun run build
sonar-scanner `
-Dsonar.host.url=$env:SONAR_HOST_URL `
-Dsonar.token=$env:SONAR_TOKEN `
-Dsonar.projectKey=$env:SONAR_PROJECT_KEY `
-Dsonar.qualitygate.wait=true
curl -4 -s "$env:SONAR_HOST_URL/api/measures/component?component=$env:SONAR_PROJECT_KEY&metricKeys=new_coverage,new_bugs,new_vulnerabilities,new_code_smells,new_duplicated_lines_density" -u "$env:SONAR_TOKEN:"
Defaults a ajustar si hay incertidumbre
- branch de New Code:
main - umbral New Coverage:
80 - duplicacion maxima new code:
3% - coverage exclusions: solo archivos sin logica
- estrategia de lotes: 1 PR por categoria critica