diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 00000000..e8cad7d6 Binary files /dev/null and b/.DS_Store differ diff --git a/.github/workflows/sonarqube-pr.yaml b/.github/workflows/sonarqube-pr.yaml new file mode 100644 index 00000000..2d4017a6 --- /dev/null +++ b/.github/workflows/sonarqube-pr.yaml @@ -0,0 +1,69 @@ +name: SonarQube Analysis on Pull Request + +on: + pull_request: + branches: + - main + - develop + - 'feature/**' + - 'bugfix/**' + - 'v*' + types: [opened, synchronize, reopened] + +jobs: + sonarqube: + name: SonarQube Analysis + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v5 + with: + fetch-depth: 0 # Shallow clones should be disabled for better analysis + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.12' + cache: 'pip' + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + cache-dependency-path: src/frontend/static/frontend/package-lock.json + + - name: Install Python dependencies + run: | + python -m pip install --upgrade pip + pip install -r config/requirements.txt + + - name: Install Node dependencies + run: npm --prefix src/frontend/static/frontend ci + + - name: SonarQube Scan + uses: sonarsource/sonarqube-scan-action@v6 + env: + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }} + with: + args: > + -Dsonar.projectKey=omics-datascience_multiomix + -Dsonar.organization=omics-datascience + -Dsonar.projectName=multiomix + -Dsonar.sources=src + -Dsonar.exclusions=**/node_modules/**,**/migrations/**,**/__pycache__/**,**/venv/**,**/.venv/**,**/htmlcov/**,**/staticfiles/**,**/*.pyc,**/email/**,**/dist/** + -Dsonar.python.version=3.12 + -Dsonar.javascript.node.maxspace=4096 + -Dsonar.sourceEncoding=UTF-8 + -Dsonar.pullrequest.key=${{ github.event.pull_request.number }} + -Dsonar.pullrequest.branch=${{ github.head_ref }} + -Dsonar.pullrequest.base=${{ github.base_ref }} + + - name: Wait for Quality Gate + uses: sonarsource/sonarqube-quality-gate-action@master + timeout-minutes: 5 + env: + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }} diff --git a/README.md b/README.md index 874a5f58..5c08d328 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,10 @@ # Multiomix [![Last Build & Push](https://github.com/omics-datascience/multiomix/actions/workflows/main-wf.yaml/badge.svg)](https://github.com/omics-datascience/multiomix/actions/workflows/main-wf.yaml) +[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=omics-datascience_multiomix&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=omics-datascience_multiomix) +[![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=omics-datascience_multiomix&metric=security_rating)](https://sonarcloud.io/summary/new_code?id=omics-datascience_multiomix) +[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=omics-datascience_multiomix&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=omics-datascience_multiomix) +[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=omics-datascience_multiomix&metric=coverage)](https://sonarcloud.io/summary/new_code?id=omics-datascience_multiomix) Cloud-based platform to infer cancer genomic and epigenomic events associated with gene expression modulation. diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..79182f2f --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,939 @@ +# đŸ›Ąïž GuĂ­a Completa de Calidad y Seguridad de CĂłdigo + +> Fundamentos de anĂĄlisis estĂĄtico, configuraciĂłn de SonarQube Cloud y mejores prĂĄcticas para el proyecto Multiomix + +--- + +## 📚 Tabla de Contenidos + +1. [Fundamentos de Calidad de CĂłdigo](#-fundamentos-de-calidad-de-cĂłdigo) +2. [ÂżQuĂ© es SonarQube?](#-quĂ©-es-sonarqube) +3. [SonarQube Cloud vs Self-Hosted](#-sonarqube-cloud-vs-self-hosted) +4. [Plan Gratuito de SonarQube Cloud](#-plan-gratuito-de-sonarqube-cloud) +5. [AnĂĄlisis AutomĂĄtico vs Workflows](#-anĂĄlisis-automĂĄtico-vs-workflows) +6. [ConfiguraciĂłn en Multiomix](#-configuraciĂłn-en-multiomix) +7. [Navegando SonarQube Cloud](#-navegando-sonarqube-cloud) +8. [Quality Gates](#-quality-gates) +9. [Quality Profiles](#-quality-profiles) +10. [Rules (Reglas)](#-rules-reglas) +11. [Mejores PrĂĄcticas](#-mejores-prĂĄcticas) + +--- + +## 🎯 Fundamentos de Calidad de CĂłdigo + +### ÂżQuĂ© es SAST? + +**SAST** (Static Application Security Testing) es el anĂĄlisis de **cĂłdigo fuente** sin ejecutarlo para encontrar vulnerabilidades de seguridad. + +``` +📝 CĂłdigo Fuente → 🔍 AnĂĄlisis EstĂĄtico → 🚹 Vulnerabilidades Detectadas +``` + +**CaracterĂ­sticas:** +- ✅ Se ejecuta **sin correr la aplicaciĂłn** +- ✅ Detecta problemas **temprano** en el desarrollo +- ✅ Analiza **todo el cĂłdigo**, no solo lo que se ejecuta +- ❌ Puede generar **falsos positivos** +- ❌ No detecta problemas de **runtime** + +**Ejemplos de problemas que detecta:** +- 🔐 InyecciĂłn SQL +- 🔓 Credenciales hardcodeadas +- 🐛 Null pointer exceptions +- 🔒 Uso inseguro de criptografĂ­a +- đŸšȘ Path traversal vulnerabilities + +### ÂżQuĂ© es SCA? + +**SCA** (Software Composition Analysis) analiza las **dependencias de terceros** (librerĂ­as, frameworks) para detectar vulnerabilidades conocidas. + +``` +📩 package.json / requirements.txt → 🔍 SCA → ⚠ Vulnerabilidades en dependencias +``` + +**CaracterĂ­sticas:** +- ✅ Detecta **CVEs** (Common Vulnerabilities and Exposures) +- ✅ Monitorea **licencias** de librerĂ­as +- ✅ Rastrea **versiones desactualizadas** +- ✅ Automatizable en CI/CD + +**Ejemplos:** +- Detectar `django==2.0` con vulnerabilidad XSS conocida +- Alertar sobre `lodash` con prototype pollution +- Identificar licencias incompatibles (GPL vs MIT) + +### Diferencias SAST vs SCA + +| Aspecto | SAST | SCA | +|---------|------|-----| +| **Analiza** | Tu cĂłdigo fuente | Dependencias de terceros | +| **Detecta** | Bugs, code smells, vulnerabilidades | CVEs, licencias, versiones | +| **CuĂĄndo** | Durante desarrollo | Durante desarrollo + build | +| **Ejemplos** | SonarQube, Checkmarx | Snyk, Dependabot, OWASP Dependency-Check | + +### 📊 Dimensiones de Calidad de CĂłdigo + +SonarQube evalĂșa cĂłdigo en 7 dimensiones: + +1. **🐛 Bugs**: Errores que pueden causar comportamiento incorrecto +2. **🔒 Vulnerabilities**: Puntos dĂ©biles de seguridad +3. **đŸ”„ Security Hotspots**: CĂłdigo sensible que requiere revisiĂłn manual +4. **đŸ§č Code Smells**: Problemas de mantenibilidad (no bugs, pero mal cĂłdigo) +5. **✅ Coverage**: Porcentaje de cĂłdigo cubierto por tests +6. **📋 Duplications**: CĂłdigo duplicado +7. **đŸ—ïž Technical Debt**: Tiempo estimado para arreglar todos los issues + +--- + +## 🔍 ÂżQuĂ© es SonarQube? + +**SonarQube** es una plataforma de anĂĄlisis continuo de calidad de cĂłdigo que: + +- 📝 Analiza **mĂșltiples lenguajes** (Python, TypeScript, JavaScript, Java, etc.) +- 🔍 Detecta **bugs, vulnerabilidades y code smells** +- 📊 Genera **mĂ©tricas** de calidad +- 🎯 Define **Quality Gates** (pasa/no pasa) +- 📈 Rastrea **evoluciĂłn** en el tiempo +- 🔄 Se integra con **CI/CD** (GitHub Actions, Jenkins, etc.) + +### Componentes Principales + +``` +┌─────────────────────────────────────────────┐ +│ SonarQube Platform │ +├────────────────────────────────────────────── +│ 1. Scanner (Analiza el cĂłdigo) │ +│ 2. Server (Procesa y almacena resultados) │ +│ 3. Database (PostgreSQL) │ +│ 4. Web UI (VisualizaciĂłn) │ +└─────────────────────────────────────────────┘ +``` + +--- + +## ☁ SonarQube Cloud vs Self-Hosted + +### SonarQube Cloud (SaaS) + +**Pros:** +- ✅ **Sin infraestructura**: No necesitas servidores +- ✅ **Siempre actualizado**: Últimas features automĂĄticamente +- ✅ **FĂĄcil setup**: 5 minutos para empezar +- ✅ **Escalable**: SonarSource maneja la carga +- ✅ **Gratis para proyectos pĂșblicos** + +**Contras:** +- ❌ **Datos en la nube**: Tu cĂłdigo se analiza en servidores de SonarSource +- ❌ **Menos customizaciĂłn**: No puedes instalar plugins custom +- ❌ **Costo para proyectos privados**: Planes de pago para repos privados + +### SonarQube Self-Hosted (On-Premise) + +**Pros:** +- ✅ **Control total**: Tus datos en tu infraestructura +- ✅ **Plugins custom**: Puedes extender funcionalidad +- ✅ **Sin lĂ­mites de LOC**: En proyectos privados (con licencia) +- ✅ **IntegraciĂłn interna**: Con LDAP, SSO, etc. + +**Contras:** +- ❌ **Requiere infraestructura**: Servidores, DB, mantenimiento +- ❌ **Actualizaciones manuales**: TĂș gestionas upgrades +- ❌ **Costo inicial**: Licencias, servidores, DevOps +- ❌ **Complejidad**: MĂĄs difĂ­cil de configurar y mantener + +### ComparaciĂłn RĂĄpida + +| CaracterĂ­stica | Cloud | Self-Hosted | +|----------------|-------|-------------| +| **Setup** | 5 min | DĂ­as/semanas | +| **Mantenimiento** | ☁ SonarSource | đŸ‘šâ€đŸ’» Tu equipo | +| **Costo inicial** | $0 (pĂșblico) | $$$$ | +| **Escalabilidad** | ♟ AutomĂĄtica | 📈 Manual | +| **Datos** | ☁ Nube | 🏱 On-premise | +| **Plugins** | ❌ Solo oficiales | ✅ Cualquiera | +| **Ideal para** | Proyectos pĂșblicos, startups | Empresas, datos sensibles | + +--- + +## 💎 Plan Gratuito de SonarQube Cloud + +### ✅ Lo que INCLUYE (Gratis) + +Para **proyectos pĂșblicos en GitHub**: + +- ✅ **AnĂĄlisis ilimitado** de cĂłdigo +- ✅ **LOC ilimitadas** (Lines of Code) +- ✅ **Todos los lenguajes** soportados (28+) +- ✅ **Pull Request decoration** (comentarios en PRs) +- ✅ **Quality Gates** +- ✅ **Security Hotspots** +- ✅ **MĂ©tricas histĂłricas** +- ✅ **IntegraciĂłn con GitHub Actions** +- ✅ **MĂșltiples ramas** (main, develop, features) +- ✅ **Usuarios ilimitados** +- ✅ **Proyectos pĂșblicos ilimitados** + +### ❌ Lo que NO incluye (Requiere pago) + +- ❌ **Proyectos privados** (necesitas plan Developer+) +- ❌ **Branch analysis avanzado** en privados +- ❌ **Portfolio management** +- ❌ **SLA garantizado** +- ❌ **Soporte prioritario** + +### 💰 Planes de Pago (para privados) + +| Plan | Precio | LOC | Ideal para | +|------|--------|-----|------------| +| **Free** | $0 | Ilimitado | Proyectos pĂșblicos | +| **Developer** | ~$10/mes | 100K LOC | Pequeños equipos | +| **Enterprise** | Custom | Ilimitado | Grandes empresas | + +> 💡 **Tip**: Para proyectos open source o educativos, **siempre usa el repo pĂșblico** para aprovechar el plan gratuito. + +--- + +## ⚖ AnĂĄlisis AutomĂĄtico vs Workflows + +### đŸ€– AnĂĄlisis AutomĂĄtico + +SonarQube Cloud puede analizar **automĂĄticamente** tu cĂłdigo cada vez que haces push (sin configurar nada). + +**CĂłmo funciona:** +1. Conectas tu repo GitHub a SonarQube Cloud +2. Activas "Automatic Analysis" +3. Cada push → SonarQube analiza automĂĄticamente + +**Pros:** +- ✅ **Cero configuraciĂłn** inicial +- ✅ **Funciona inmediatamente** +- ✅ **Sin archivos de config** en el repo +- ✅ **No consume minutos de GitHub Actions** + +**Contras:** +- ❌ **Menos control**: No puedes customizar el anĂĄlisis +- ❌ **Sin build steps**: No puede analizar cĂłdigo compilado +- ❌ **Sin coverage**: No puede procesar reportes de tests +- ❌ **AnĂĄlisis bĂĄsico**: Solo analiza archivos fuente directamente +- ❌ **No funciona bien con monorepos**: DifĂ­cil filtrar backend/frontend + +### 🔧 Workflows de GitHub Actions + +Configuras tu propio workflow de CI/CD para ejecutar el anĂĄlisis. + +**CĂłmo funciona:** +1. Creas `.github/workflows/sonarqube.yaml` +2. Defines cuĂĄndo y cĂłmo analizar +3. Cada push/PR → GitHub Actions ejecuta SonarScanner + +**Pros:** +- ✅ **Control total**: Customizas todo el proceso +- ✅ **Build steps**: Puedes compilar antes de analizar +- ✅ **Coverage reports**: Integras tests y coverage +- ✅ **AnĂĄlisis condicional**: Solo en ciertas ramas o archivos +- ✅ **Multi-proyecto**: Puedes separar backend/frontend +- ✅ **OptimizaciĂłn**: Filtra lo que quieras analizar + +**Contras:** +- ❌ **Requiere configuraciĂłn**: MĂĄs setup inicial +- ❌ **Consume minutos de GitHub**: Usa tu cuota de Actions +- ❌ **Mantenimiento**: TĂș actualizas versiones + +### 📊 ComparaciĂłn + +| Aspecto | AutomĂĄtico | Workflow | +|---------|------------|----------| +| **Setup** | ⚡ InstantĂĄneo | 🔧 15-30 min | +| **Control** | ❌ Limitado | ✅ Total | +| **Coverage** | ❌ No | ✅ SĂ­ | +| **Build custom** | ❌ No | ✅ SĂ­ | +| **Minutos GitHub** | 💰 $0 | 💰 Consume cuota | +| **Monorepo** | ❌ DifĂ­cil | ✅ FĂĄcil | +| **Ideal para** | Proyectos simples | Proyectos complejos | + +### 🎯 RecomendaciĂłn + +- **Usa AutomĂĄtico**: Para prototipos, proyectos simples, demos +- **Usa Workflow**: Para proyectos de producciĂłn, Django + frontend, con tests + +--- + +## ⚙ ConfiguraciĂłn en Multiomix + +Multiomix usa **dos estrategias** en paralelo: + +### 1ïžâƒŁ AnĂĄlisis AutomĂĄtico (Activado en SonarCloud) + +- Se ejecuta automĂĄticamente en cada push +- Analiza todo el repositorio +- No requiere configuraciĂłn local + +### 2ïžâƒŁ Workflows de GitHub Actions (3 workflows) + +#### **Workflow 1: SonarQube Analysis** (`sonarqube.yaml`) + +```yaml +name: SonarQube Analysis +on: + push: + branches: [main, develop, 'feature/**'] + pull_request: + types: [opened, synchronize, reopened] +``` + +**QuĂ© hace:** +- Analiza **todo el proyecto** (backend + frontend) +- Ejecuta linter y type checks de frontend +- Sube resultados a SonarQube Cloud + +**Proyecto en SonarQube:** +- `omics-datascience_multiomix` (proyecto Ășnico) + +#### **Workflow 2: SonarQube Report Generator** (`sonarqube-report.yaml`) + +```yaml +name: SonarQube Report Generator +on: + workflow_dispatch: # Manual + schedule: + - cron: '0 9 * * 1' # Lunes 9 AM +``` + +**QuĂ© hace:** +- Genera reportes semanales automĂĄticos +- Consulta API de SonarQube +- Crea informe en Markdown +- Guarda como artifact descargable +- (Opcional) EnvĂ­a a Slack/Email/GitHub Issues + +### 📁 Archivos de ConfiguraciĂłn + +#### `sonar-project.properties` (raĂ­z) + +```properties +sonar.projectKey=omics-datascience_multiomix +sonar.organization=omics-datascience +sonar.projectName=multiomix +sonar.projectVersion=1.0 + +# Sources - scan everything in src/ +sonar.sources=src + +# Exclude only node_modules, migrations and build artifacts +sonar.exclusions=**/node_modules/**,**/migrations/**,**/__pycache__/**,**/venv/**,**/.venv/**,**/htmlcov/**,**/staticfiles/**,**/*.pyc,**/email/**,**/dist/** + +# Python settings +sonar.python.version=3.12 +sonar.sourceEncoding=UTF-8 + +# JavaScript/TypeScript settings +sonar.javascript.node.maxspace=4096 +``` + +**ExplicaciĂłn:** +- `sonar.sources=src`: Analiza todo dentro de `src/` +- `sonar.exclusions`: Ignora cĂłdigo generado, dependencias, tests +- **No usa `sonar.inclusions`**: Deja que SonarQube detecte automĂĄticamente Python/TypeScript/JavaScript + +### 🔑 Secrets de GitHub + +Necesitas configurar en GitHub Settings → Secrets: + +- `SONAR_TOKEN`: Token de autenticaciĂłn de SonarQube Cloud + +**CĂłmo obtener el token:** +1. Ve a SonarQube Cloud → My Account → Security +2. Generate Token +3. Copia y pĂ©galo en GitHub Secrets + +--- + +## 🧭 Navegando SonarQube Cloud + +### 📊 Dashboard Principal + +Al abrir tu proyecto verĂĄs: + +``` +┌──────────────────────────────────────────────────┐ +│ Multiomix │ +│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │ +│ │ +│ Quality Gate: ✅ Passed │ +│ │ +│ 🐛 Bugs 6 │ +│ 🔒 Vulnerabilities 0 │ +│ đŸ”„ Security Hotspots 10 │ +│ đŸ§č Code Smells 804 │ +│ ✅ Coverage 15% │ +│ 📋 Duplications 2.3% │ +│ 📏 Lines of Code 42,955 │ +└──────────────────────────────────────────────────┘ +``` + +### 🐛 Issues (Problemas) + +**QuĂ© son:** +- Bugs, vulnerabilities y code smells detectados en tu cĂłdigo + +**Tipos de Issues:** + +1. **🐛 Bug**: Error de lĂłgica que causarĂĄ comportamiento incorrecto + ```python + # Ejemplo: Null pointer + user = None + print(user.name) # ← Bug: AttributeError + ``` + +2. **🔒 Vulnerability**: Problema de seguridad + ```python + # Ejemplo: SQL Injection + query = f"SELECT * FROM users WHERE id = {user_input}" # ← Vulnerable + ``` + +3. **đŸ§č Code Smell**: No es un bug, pero dificulta mantenibilidad + ```python + # Ejemplo: FunciĂłn muy larga (200 lĂ­neas) + # Ejemplo: Complejidad ciclomĂĄtica alta + # Ejemplo: CĂłdigo duplicado + ``` + +**Severidades:** +- 🔮 **Blocker**: Debe arreglarse YA +- 🟠 **Critical**: Arreglar pronto +- 🟡 **Major**: Arreglar +- đŸ”” **Minor**: Nice to have +- âšȘ **Info**: FYI + +**CĂłmo navegar Issues:** +1. Click en "Issues" en el menĂș +2. Filtra por: + - **Type**: Bug / Vulnerability / Code Smell + - **Severity**: Blocker, Critical, etc. + - **Language**: Python, TypeScript, JavaScript + - **Directory**: Filtra backend (`src/api_service/`) o frontend (`src/frontend/`) + - **Status**: Open, Confirmed, Resolved, False Positive +3. Click en un issue para ver: + - DescripciĂłn del problema + - Snippet de cĂłdigo + - Sugerencia de soluciĂłn + - Regla que lo detectĂł + +### đŸ”„ Security Hotspots + +**QuĂ© son:** +- CĂłdigo "sensible" de seguridad que **requiere revisiĂłn manual** +- No son vulnerabilidades confirmadas, sino **puntos a revisar** + +**Ejemplos:** +```python +# Hotspot: Uso de random (no criptogrĂĄfico) +import random +token = random.randint(1000, 9999) # ← ÂżEs para seguridad? + +# Hotspot: Cookies sin flags seguros +response.set_cookie('session', value) # ← ÂżTiene HttpOnly? ÂżSecure? + +# Hotspot: Logging de datos sensibles +logger.info(f"User password: {password}") # ← ÂżDeberĂ­a logearse? +``` + +**CĂłmo revisar:** +1. Ve a "Security Hotspots" +2. Para cada hotspot: + - **Review**: Lee el cĂłdigo + - Decide si es seguro o no + - Marca como: + - ✅ **Safe**: Revisado, no hay problema + - ❌ **Vulnerability**: Confirma como vulnerabilidad real + - 🔄 **Fixed**: Ya lo arreglaste + +### 📏 Measures (MĂ©tricas) + +**MĂ©tricas principales:** + +- **📊 Lines of Code (LOC)**: LĂ­neas de cĂłdigo (sin comentarios ni lĂ­neas vacĂ­as) +- **đŸ—ïž Technical Debt**: Tiempo estimado para arreglar todos los issues +- **📋 Duplications**: Porcentaje de cĂłdigo duplicado +- **🔁 Complexity**: Complejidad ciclomĂĄtica (cuĂĄntos paths tiene el cĂłdigo) +- **✅ Coverage**: Cobertura de tests +- **🔒 Security Rating**: A (mejor) → E (peor) +- **🐛 Reliability Rating**: A → E + +**CĂłmo ver mĂ©tricas:** +1. Click en "Measures" +2. Explora categorĂ­as: + - **Reliability**: Bugs + - **Security**: Vulnerabilities, Hotspots + - **Maintainability**: Code Smells, Technical Debt + - **Coverage**: Test coverage + - **Duplications**: CĂłdigo duplicado + - **Size**: LOC, archivos, clases, funciones + +### 📂 Code (Vista de ĂĄrbol) + +Navega tu cĂłdigo en estructura de directorios: + +``` +multiomix/ +└── src/ + ├── api_service/ [2,500 LOC] [3 bugs] [45 code smells] + ├── biomarkers/ [800 LOC] [1 bug] [12 code smells] + ├── frontend/ [5,200 LOC] [2 bugs] [38 code smells] + │ └── static/ + │ └── frontend/ + │ └── src/ + ├── genes/ [450 LOC] [0 bugs] [8 code smells] + └── ... +``` + +**CĂłmo usar:** +1. Click en "Code" +2. Navega por directorios +3. Para cada directorio ves: + - 📏 Lines of Code + - 🐛 Bugs + - 🔒 Vulnerabilities + - đŸ§č Code Smells + - 📋 Duplications + - ✅ Coverage +4. Click en un archivo para ver issues especĂ­ficos en ese archivo + +### 📈 Activity (Historial) + +Ve la evoluciĂłn de tu proyecto en el tiempo: + +- 📊 GrĂĄficos de mĂ©tricas (bugs, code smells, coverage) +- 📅 AnĂĄlisis histĂłricos +- 🔄 ComparaciĂłn entre anĂĄlisis +- 📝 Eventos (nuevos issues, issues resueltos) + +**Ideal para:** +- Ver si la calidad estĂĄ mejorando o empeorando +- Tracking de Technical Debt +- Demostrar mejoras al equipo + +--- + +## 🎯 Filtrando entre Frontend y Backend + +### MĂ©todo 1: Filtro por Lenguaje + +**En Issues/Code/Measures:** +1. Click en el filtro **"Language"** +2. Selecciona: + - **Python** → Backend (Django apps) + - **TypeScript** → Frontend + - **JavaScript** → Frontend + +### MĂ©todo 2: Filtro por Directorio + +**En Code tab:** +1. Navega a: + - `src/api_service/`, `src/biomarkers/`, etc. → Backend + - `src/frontend/static/frontend/src/` → Frontend + +**En Issues tab:** +1. Usa el filtro **"Directory"** +2. Escribe: + - `src/api_service` → Solo backend API + - `src/frontend` → Solo frontend + +### MĂ©todo 3: Usar la bĂșsqueda + +En la barra de bĂșsqueda de Issues: +``` +# Solo backend Python +language:python + +# Solo frontend TypeScript +language:ts + +# Solo un app especĂ­fico +directory:src/api_service + +# Combinar filtros +language:python AND severity:BLOCKER +``` + +### MĂ©todo 4: Bookmarks personalizados + +1. Aplica los filtros que quieras +2. La URL cambiarĂĄ, por ejemplo: + ``` + https://sonarcloud.io/project/issues?id=omics-datascience_multiomix&language=py + ``` +3. Guarda esa URL como bookmark: + - "Multiomix - Backend Issues" + - "Multiomix - Frontend Issues" + +--- + +## đŸšȘ Quality Gates + +### ÂżQuĂ© son? + +Un **Quality Gate** es un conjunto de **condiciones** que tu cĂłdigo debe cumplir para considerarse "aceptable". + +``` +Quality Gate = Conjunto de reglas de "pasa/no pasa" +``` + +**Ejemplo:** +``` +Quality Gate "Sonar way": +✅ Coverage ≄ 80% +✅ Duplications ≀ 3% +✅ Vulnerabilities = 0 +✅ Bugs nuevos = 0 +✅ Security Hotspots revisados = 100% +``` + +### Estados del Quality Gate + +- ✅ **Passed**: Tu cĂłdigo cumple todas las condiciones +- ❌ **Failed**: Al menos una condiciĂłn no se cumple +- ⚠ **Warning**: Algunas mĂ©tricas cerca del lĂ­mite + +### Quality Gate por defecto: "Sonar way" + +SonarQube Cloud incluye un Quality Gate llamado **"Sonar way"** con estas condiciones: + +#### En cĂłdigo nuevo (New Code): +- ✅ Coverage ≄ 80% +- ✅ Duplications ≀ 3% +- ✅ Maintainability Rating ≄ A +- ✅ Reliability Rating ≄ A +- ✅ Security Rating ≄ A +- ✅ Security Hotspots revisados = 100% + +#### En cĂłdigo total (Overall): +- ✅ Sin condiciones estrictas (solo se enfoca en cĂłdigo nuevo) + +### ÂżPor quĂ© "New Code"? + +SonarQube se enfoca en **no empeorar** la calidad: + +- đŸš« No exige que arregles cĂłdigo legacy de golpe +- ✅ Exige que cĂłdigo **nuevo** sea de calidad +- 📈 Gradualmente mejoras todo el proyecto + +### Configurar Quality Gates + +**En SonarQube Cloud:** +1. Ve a "Quality Gates" +2. Crea un nuevo Quality Gate o edita "Sonar way" +3. Agrega condiciones: + - Selecciona mĂ©trica (Coverage, Bugs, etc.) + - Selecciona si aplica a "Overall Code" o "New Code" + - Define el threshold (umbral) + - Guarda + +**Ejemplo: Quality Gate custom para Multiomix** +``` +Nombre: "Multiomix Standard" + +Condiciones: +- Coverage en nuevo cĂłdigo ≄ 60% (mĂĄs realista que 80%) +- Bugs nuevos = 0 +- Vulnerabilities nuevas = 0 +- Code Smells nuevos ≀ 5 +- Security Hotspots revisados = 100% +- Duplications nuevas ≀ 3% +``` + +### IntegraciĂłn con GitHub + +Si tu Quality Gate **falla**: +- ❌ El PR en GitHub se marcarĂĄ como "check failed" +- đŸš« Puedes bloquear el merge (configurando branch protection) +- 📝 Ves detalles del fallo en el PR + +--- + +## 🎹 Quality Profiles + +### ÂżQuĂ© son? + +Un **Quality Profile** es un **conjunto de reglas** (rules) activas para un lenguaje. + +``` +Quality Profile = ColecciĂłn de reglas para analizar cĂłdigo +``` + +**Ejemplo:** +``` +Quality Profile "Sonar way (Python)": +- ✅ 250 reglas activas +- Detecta bugs, vulnerabilities, code smells +- Severidades configuradas +``` + +### Profiles por lenguaje + +Cada lenguaje tiene su propio Quality Profile: +- **Python**: Sonar way (Python) +- **TypeScript**: Sonar way (TypeScript) +- **JavaScript**: Sonar way (JavaScript) + +### Quality Profile por defecto: "Sonar way" + +SonarQube incluye profiles por defecto llamados **"Sonar way"** para cada lenguaje. + +**CaracterĂ­sticas:** +- ✅ Mantenido por SonarSource (expertos) +- ✅ Actualizado regularmente +- ✅ Balance entre rigor y practicidad +- ✅ Basado en mejores prĂĄcticas de la industria + +### Crear Quality Profile custom + +**Ejemplo: Multiomix Custom Python Profile** + +1. Ve a "Quality Profiles" en SonarQube Cloud +2. Selecciona "Python" → "Sonar way" +3. Click "Copy" → Nombre: "Multiomix Python" +4. Activa/desactiva reglas: + - ✅ Activa: "Functions should not be too complex" (max complexity: 10) + - ✅ Activa: "Too many parameters" (max: 5) + - ❌ Desactiva: Reglas que generen ruido para tu proyecto +5. Ajusta severidades: + - Cambia "Code smell" → "Bug" para reglas crĂ­ticas +6. Asigna el profile a tu proyecto + +### Herencia de Profiles + +Puedes crear **jerarquĂ­as**: + +``` +Sonar way (Python) + ↓ (hereda) +Company Standard (Python) + ↓ (hereda) +Multiomix Python +``` + +**Ventaja**: Cambios en el profile padre se propagan a los hijos. + +--- + +## 📋 Rules (Reglas) + +### ÂżQuĂ© son? + +Una **Rule** es una **regla especĂ­fica** que SonarQube verifica en tu cĂłdigo. + +**Ejemplo de regla:** +``` +Rule: "S1134" - Track uses of "FIXME" tags +Tipo: Code Smell +Severidad: Major +DescripciĂłn: "FIXME" comments should be handled + +# Detecta: +# FIXME: This is a quick hack ← SonarQube lo detectarĂĄ +``` + +### Tipos de Rules + +1. **🐛 Bug**: Detecta errores de lĂłgica + - Ejemplo: "Null pointer dereference" + - Ejemplo: "Incorrect use of equals()" + +2. **🔒 Vulnerability**: Detecta problemas de seguridad + - Ejemplo: "SQL injection" + - Ejemplo: "Hardcoded credentials" + +3. **đŸ§č Code Smell**: Detecta problemas de mantenibilidad + - Ejemplo: "Functions too long" + - Ejemplo: "Cognitive complexity too high" + +4. **đŸ”„ Security Hotspot**: Marca cĂłdigo sensible para revisiĂłn + - Ejemplo: "Using pseudorandom number generators" + - Ejemplo: "Cookies should be secure" + +### AnatomĂ­a de una Rule + +Cada regla tiene: + +- **ID**: Identificador Ășnico (ej: `S1134`, `S2068`) +- **Name**: Nombre descriptivo +- **Type**: Bug / Vulnerability / Code Smell / Security Hotspot +- **Severity**: Blocker / Critical / Major / Minor / Info +- **Description**: ExplicaciĂłn detallada del problema +- **Non-compliant code example**: Ejemplo de cĂłdigo malo +- **Compliant solution**: Ejemplo de cĂłdigo correcto +- **Tags**: CategorizaciĂłn (security, performance, confusing, etc.) + +### Ejemplo de Rule: S2068 - Hardcoded credentials + +**DescripciĂłn:** +``` +Credentials should not be hard-coded + +Hard-coding credentials in source code is a security risk. +Anyone with access to the code can steal the credentials. +``` + +**Non-compliant:** +```python +password = "MyP@ssw0rd" # ← Detectado por S2068 +db.connect(user="admin", password="admin123") +``` + +**Compliant:** +```python +import os +password = os.environ.get("DB_PASSWORD") +db.connect(user="admin", password=password) +``` + +**Severidad**: Critical +**Tipo**: Vulnerability + +### Explorar Rules + +**En SonarQube Cloud:** +1. Ve a "Rules" en el menĂș +2. Filtra por: + - **Language**: Python, TypeScript, JavaScript + - **Type**: Bug, Vulnerability, Code Smell + - **Severity**: Blocker, Critical, etc. + - **Tag**: security, performance, django, etc. + - **Status**: Active, Deprecated +3. Click en una rule para ver descripciĂłn completa + +**Reglas populares para Django (Python):** +- `S3649`: Database queries should not be vulnerable to injection +- `S2068`: Credentials should not be hard-coded +- `S5144`: Server-side requests should not be vulnerable to forging attacks (SSRF) +- `S5131`: Endpoints should not be vulnerable to XSS + +**Reglas populares para TypeScript/React:** +- `S1186`: Functions should not be empty +- `S6268`: React components should not render non-boolean conditions +- `S6299`: React components should use JSX syntax +- `typescript:S1128`: Unused imports should be removed + +### Activar/Desactivar Rules + +**En el Quality Profile:** +1. Ve a "Quality Profiles" +2. Selecciona tu profile (ej: "Multiomix Python") +3. Click "Activate More" +4. Busca rules y actĂ­valas/desactĂ­valas + +**Desde un Issue:** +1. Ve a un issue especĂ­fico +2. Click en la regla (ej: "S1134") +3. Click "Deactivate" (si no quieres esa regla) + +### Marcas False Positive / Won't Fix + +Si una regla detecta algo que **no es un problema real**: + +1. Ve al issue +2. Click "..." → "Change Status" +3. Selecciona: + - **False Positive**: La regla se equivocĂł + - **Won't Fix**: Es real, pero decides no arreglarlo +4. Agrega un comentario explicando por quĂ© +5. El issue desaparece de las mĂ©tricas + +--- + +## 🏆 Mejores PrĂĄcticas + +### Para Desarrolladores + +1. **🔍 Revisa SonarQube antes de abrir PR** + - Ve a SonarQube Cloud + - Mira los issues en tu rama + - Arregla al menos los Blockers y Criticals + +2. **✅ Haz que el Quality Gate pase** + - Si falla, revisa quĂ© condiciĂłn no se cumple + - Arregla antes de mergear + +3. **đŸ”„ Revisa Security Hotspots** + - No los ignores + - EvalĂșa si son seguros o no + - MĂĄrcalos como Safe o Vulnerability + +4. **📝 No desactives reglas sin razĂłn** + - Si una regla molesta, discĂștelo con el equipo + - Documenta por quĂ© la desactivas + +5. **đŸ§Ș Escribe tests** + - Coverage no lo es todo, pero ayuda + - Usa pytest para backend, Jest para frontend + +### Para el Equipo + +1. **📊 Revisen mĂ©tricas en retrospectivas** + - ÂżTechnical Debt estĂĄ creciendo? + - ÂżCoverage estĂĄ bajando? + - ÂżMĂĄs bugs en cĂłdigo nuevo? + +2. **🎯 Definan Quality Gates realistas** + - No exijan 100% coverage de golpe + - Suban el estĂĄndar gradualmente + +3. **🔄 Actualicen Quality Profiles** + - Revisen reglas nuevas cada trimestre + - Activen reglas que agreguen valor + +4. **📚 Eduquen sobre reglas** + - Compartan reglas importantes en el equipo + - Hagan code reviews enfocados en calidad + +5. **🚀 Celebren mejoras** + - Si suben coverage de 10% → 30%, celebren + - Reconozcan a quien arregla Technical Debt + +### Para DevOps/Tech Leads + +1. **🔒 Bloqueen merges si Quality Gate falla** + ```yaml + # En GitHub branch protection rules + Require status checks to pass: + ✅ SonarQube Analysis + ``` + +2. **📧 Configuren notificaciones** + - Slack cuando Quality Gate falla + - Email con reporte semanal + +3. **📈 Tracen tendencias** + - Usen el workflow de reportes + - Compartan con stakeholders + +4. **🎓 Den training al equipo** + - SesiĂłn sobre SonarQube + - Demo de cĂłmo leer issues + +--- + +## 🔗 Enlaces Útiles + +- 📚 [SonarQube Docs](https://docs.sonarqube.org/) +- ☁ [SonarCloud Docs](https://docs.sonarcloud.io/) +- 🐍 [Python Rules](https://rules.sonarsource.com/python/) +- 🟩 [TypeScript Rules](https://rules.sonarsource.com/typescript/) +- 🟹 [JavaScript Rules](https://rules.sonarsource.com/javascript/) +- 🔧 [GitHub Actions Integration](https://github.com/SonarSource/sonarqube-scan-action) + +--- + +## 📞 Soporte + +Si tienes dudas sobre SonarQube en Multiomix: +- 💬 Pregunta en el canal de Slack del equipo +- 📧 Contacta al tech lead +- 📝 Abre un issue en GitHub con la etiqueta `sonarqube` + +--- + +**Última actualizaciĂłn**: Noviembre 2025 +**Mantenido por**: Equipo de Multiomix diff --git a/sonar-project.properties b/sonar-project.properties new file mode 100644 index 00000000..7b4642fc --- /dev/null +++ b/sonar-project.properties @@ -0,0 +1,17 @@ +sonar.projectKey=omics-datascience_multiomix +sonar.organization=omics-datascience +sonar.projectName=multiomix +sonar.projectVersion=1.0 + +# Sources - scan everything in src/ +sonar.sources=src + +# Exclude only node_modules, migrations and build artifacts +sonar.exclusions=**/node_modules/**,**/migrations/**,**/__pycache__/**,**/venv/**,**/.venv/**,**/htmlcov/**,**/staticfiles/**,**/*.pyc,**/email/**,**/dist/** + +# Python settings +sonar.python.version=3.12 +sonar.sourceEncoding=UTF-8 + +# JavaScript/TypeScript settings +sonar.javascript.node.maxspace=4096 diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 00000000..96e7622f Binary files /dev/null and b/src/.DS_Store differ diff --git a/src/frontend/.DS_Store b/src/frontend/.DS_Store new file mode 100644 index 00000000..37c4f370 Binary files /dev/null and b/src/frontend/.DS_Store differ diff --git a/src/frontend/static/.DS_Store b/src/frontend/static/.DS_Store new file mode 100644 index 00000000..092baa5c Binary files /dev/null and b/src/frontend/static/.DS_Store differ diff --git a/src/frontend/static/frontend/.DS_Store b/src/frontend/static/frontend/.DS_Store new file mode 100644 index 00000000..97c9fcee Binary files /dev/null and b/src/frontend/static/frontend/.DS_Store differ