Saltar a contenido

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 deployment solo cuando haya que publicar DEV.

3. Controles ADO (UI, una vez)

En cada pipeline → Settings:

  1. Build completion / concurrency: limitar a 1 run en curso; cancelar runs previos de la misma rama (Cancel previous builds / “newer builds cancel older”).
  2. Triggers con batching (YAML batch: true ya en CI).
  3. Environments con exclusive lock (solo un deploy a la vez).

4. Qué NO hacer

  • Disparar az acr build en main/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):

  • securityFailOnFindingstrue falla el job ante HIGH/CRITICAL (default true en CI; DAST usa continueOnError para no tumbar el deploy por findings de baseline).
  • sonarFailOnQualityGatefailOnQualityGate: "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).