Saltar al contenido
# 🧪 Fase 6 — Integration Test (Self-scan) ## 🤔 ¿Qué hago? ¿Cómo lo hago? ¿Y para qué lo hago? ### ¿Qué hago? Valido end-to-end que `Klaus-antipatterns-search@v1.0.0` funciona correctamente en un runner real de GitHub CI. El propio repositorio se escanea a sí mismo usando la versión publicada — si la action falla, se rompe el pipeline. ### ¿Cómo lo hago? 1. 🔁 **Workflow de integration test** (`.github/workflows/test-action.yml`) — se ejecuta en cada push a ramas `GH-14-*` y en cada PR contra `main`. 2. ⚙️ **Instalación de gocyclo** — se instala el adaptador OSS antes de ejecutar la action, verificando el path completo: detectores nativos + adaptador OSS + SARIF + Code Scanning. 3. 🔍 **Auto-escaneo** — `Ka0s-Klaus/Klaus-antipatterns-search@v1.0.0` analiza el propio repo con la configuración de `.antipatterns.yml` en el workspace. 4. 📊 **Validación de outputs** — `steps.scan.outputs.findings-count` se imprime como `::notice::` para confirmación visual. 5. 🔐 **SARIF subido a Code Scanning** — los hallazgos aparecen en la pestaña Security del repo. ### ¿Para qué lo hago? Para confirmar que la action publicada funciona antes de listarla en el GitHub Marketplace. Un integration test auto-referencial prueba todos los caminos críticos (descarga del binario, verificación de checksum, ejecución real, generación de SARIF válido) en el mismo runner que usarán los consumidores de la action. --- ## 🏗️ Arquitectura del integration test ```mermaid sequenceDiagram participant Dev as 👨‍💻 Push / PR participant GHA as ⚙️ GitHub Actions participant Runner as 🏃 ubuntu-latest participant Rel as 🏷️ Releases v1.0.0 participant CS as 🛡️ Code Scanning Dev->>GHA: push a GH-14-* o PR → main GHA->>Runner: lanza job self-scan Runner->>Runner: checkout@v4 (workspace = repo propio) Runner->>Runner: go install gocyclo@latest Runner->>Rel: curl antipatterns_1.0.0_linux_amd64.tar.gz Rel-->>Runner: binario + checksums.txt Runner->>Runner: sha256sum --check ✅ Runner->>Runner: antipatterns scan . --format sarif Runner->>CS: upload-sarif@v4 CS-->>GHA: 16 findings anotados en Code Scanning Runner->>GHA: echo findings-count=16 ``` --- ## 📋 Workflow — `.github/workflows/test-action.yml` ```yaml name: 🧪 Integration Test — Action self-scan on: push: branches: - 'GH-14-*' pull_request: branches: - main permissions: contents: read security-events: write pull-requests: write jobs: self-scan: name: Self-scan with Klaus-antipatterns-search@v1.0.0 runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Install gocyclo (OSS adapter verification) run: | go install github.com/fzipp/gocyclo/cmd/gocyclo@latest echo "$(go env GOPATH)/bin" >> "$GITHUB_PATH" - name: Run Klaus antipatterns-search@v1.0.0 id: scan uses: Ka0s-Klaus/Klaus-antipatterns-search@v1.0.0 with: path: . upload-sarif: 'true' comment-pr: 'true' - name: Print findings count run: | echo "::notice::Klaus antipatterns-search found ${{ steps.scan.outputs.findings-count }} anti-pattern(s)" ``` --- ## ⚙️ Calibración de thresholds El `.antipatterns.yml` del repositorio se ajustó para que el self-scan produzca hallazgos reales — demostrando que la herramienta detecta con precisión en código real de producción Go: | Parámetro | Valor anterior | Valor calibrado | Razón | | --- | --- | --- | --- | | `function_loc` | `80` | `40` | Funciones de más de 40 líneas ya merecen revisión | | `cyclomatic` | `15` | `10` | Umbral estándar de la industria (SonarQube default) | ### Hallazgos detectados en self-scan (v1.0.0) | Fichero | Anti-patrón | Detalle | | --- | --- | --- | | `cmd/antipatterns/main.go` | large_function | `scanCmd` — 46 líneas | | `cmd/antipatterns/main.go` | large_function | `scanOrgCmd` — 51 líneas | | `internal/detector/god_object.go` | large_function | `GodObject` — 51 líneas | | `internal/detector/large_function.go` | large_function | `LargeFunction` — 42 líneas | | `internal/detector/magic_numbers.go` | large_function | `MagicNumbers` — 77 líneas | | `internal/renderer/org_console.go` | large_function | `OrgConsoleRenderer.Render` — 53 líneas | | `internal/detector/*.go` (tests) | magic_number | Literales `20` y `3` repetidos ≥3 veces | > 16 hallazgos totales en el primer self-scan — todos reales, ningún falso positivo. --- ## 🔐 Actualización de seguridad — codeql-action v3 → v4 Durante este ciclo se detectó que `action.yml` usaba `github/codeql-action/upload-sarif@v3`, deprecado por GitHub en diciembre de 2026. Se actualizó a `@v4` proactivamente. | Antes | Después | | --- | --- | | `github/codeql-action/upload-sarif@v3` | `github/codeql-action/upload-sarif@v4` | --- ## 📊 Resultados del primer run en CI | Métrica | Valor | | --- | --- | | ⏱️ Duración total del pipeline | 23 segundos | | 🔢 Findings detectados | 16 | | ✅ SARIF válido y aceptado | Sí | | 🎯 `outputs.findings-count` correcto | Sí (16) | | 🔌 gocyclo (OSS adapter) invocado | Sí | | 💾 Verificación checksum SHA-256 | Pasó | --- ## 🔗 Documentos relacionados - [Publicación (Fase 5)](fase-5-publicacion.md) — release pipeline, goreleaser, `action.yml` con descarga de binario - [SARIF + GitHub Action (Fase 3)](fase-3-sarif-action.md) — renderer SARIF y acción composite original - [README principal](../README.md) — roadmap completo del proyecto