DevSecOps + estrategia de concurrencia (ADO sin parallel jobs)¶
Problema de cola (hoy)¶
Un solo push “promovido” a main + develop + deployment dispara a la vez:
| Pipeline | Ramas que lo disparaban | Coste |
|---|---|---|
| eai-mvp-ci | main, develop | tests |
| eai-finance-api-deploy | main, develop, deployment | ACR build (caro) |
| eai-terraform-dev | main, develop, deployment | plan Azure |
Con 1 Microsoft-hosted parallel job, todo se encola (reloj azul). No es falta de YAML: es multiplicador rama × pipeline.
Estrategia de concurrencia (obligatoria)¶
1. Un job a la vez por diseño de triggers¶
| Pipeline | Trigger CI | Deploy / apply |
|---|---|---|
| eai-mvp-ci | PR → main/develop + push main (batch: true) |
— |
| eai-finance-api-deploy | solo rama deployment (path filter app) |
environment dev-app-deploy |
| eai-terraform-dev | PR + push main (path infra/**) |
apply solo deployment |
| eai-terraform-bootstrap | none (manual) | once |
2. Flujo de ramas (dejar de FF-mergear las 3)¶
feature/* ──PR──► develop ──PR──► main ──promote──► deployment
│
└── solo eai-mvp-ci
deployment ──► ACR build + deploy (+ DAST)
infra on deployment ──► terraform apply (gate)
- No empujar el mismo commit a las 3 ramas en el mismo minuto.
- Promover a
deploymentsolo cuando haya que publicar DEV.
3. Controles ADO (UI, una vez)¶
En cada pipeline → Settings:
- Build completion / concurrency: limitar a 1 run en curso; cancelar runs previos de la misma rama (
Cancel previous builds/ “newer builds cancel older”). - Triggers con batching (YAML
batch: trueya en CI). - Environments con exclusive lock (solo un deploy a la vez).
4. Qué NO hacer¶
- Disparar
az acr buildenmain/develop“por si acaso”. - Correr CI + deploy + terraform plan en paralelo por el mismo commit en 3 ramas.
- Añadir más stages secuenciales innecesarios sin estrechar triggers primero.
Capas DevSecOps (implementadas en YAML)¶
| Capa | Herramienta | Dónde | Artefacto en ADO |
|---|---|---|---|
| Secret heuristics | grep patterns | eai-mvp-ci | log + fail |
| SAST | Bandit (Python) | eai-mvp-ci, finance-api | bandit-report.json + summary |
| SAST | SonarQube (Python / TS) | finance-api, finance-web PreSecurity | UI Sonar + Quality Gate (blocking) |
| Coverage | pytest-cov / vitest | finance-api, finance-web PreSecurity → Sonar y pestaña Code Coverage en ADO (PublishCodeCoverageResults@2) |
coverage-finance-api.xml / Cobertura + lcov web |
| SCA (OWASP) | OWASP Dependency-Check | eai-mvp-ci | HTML/JSON + JUnit → Tests tab |
| IaC | Checkov | eai-terraform-dev | JSON/CLI + artifact |
| Container | Trivy image | eai-finance-api-deploy (post ACR) | SARIF/JSON artifact |
| DAST (OWASP) | ZAP baseline | post-deploy finance-api | HTML + XML → Tests/Artifacts |
Reportes: Pipeline run → Related / Artifacts → security-reports, y pestaña Tests cuando hay JUnit/NUnit XML.
Variables de control (pipeline):
securityFailOnFindings—truefalla el job ante HIGH/CRITICAL (defaulttrueen CI; DAST usacontinueOnErrorpara no tumbar el deploy por findings de baseline).sonarFailOnQualityGate—failOnQualityGate: "true"en finance-api/web deploy pipelines (QG Sonar way: new_violations).
US relacionada¶
Boards US 133 (CI/CD DevSecOps hardening) + task 135 (Trivy/Checkov).