Tutorial de integración de Azure DevOps para CI/CD en aplicaciones .NET y Node.js

·

·

Introducción a la integración de Azure DevOps para CI/CD

En la actualidad, la automatización de procesos de Integración Continua (CI) y Entrega Continua (CD) es clave para ofrecer software de calidad, con despliegues rápidos y estables.
Azure DevOps proporciona un conjunto completo de servicios para gestionar repositorios de código, pipelines de compilación y despliegue, pruebas automatizadas y control de versiones.
En este artículo detallado exploraremos cómo configurar un flujo CI/CD para aplicaciones .NET y Node.js de forma profesional.

1. Preparación del entorno en Azure DevOps

1.1 Crear Organización y Proyecto

  • Acceder al portal de Azure DevOps:
    https://dev.azure.com/.
  • Crear una Organización si no existe.
  • Dentro de la organización, seleccionar New Project, asignar nombre, visibilidad (privada/pública) y el tipo de control (Git).

1.2 Configurar Repositorios y Branch Policies

  • En Repos, clonar localmente el proyecto .NET o Node.js.
  • Definir políticas de ramas (Branch policies) para exigir revisiones de código, compilación exitosa y escaneos de seguridad.
  • Crear ramas principales (main, develop) y ramas de características (feature/).

2. Pipeline de CI: compilación y pruebas

Azure DevOps permite usar pipelines basados en YAML o la UI clásica. Aquí nos centraremos en YAML para versionarlos junto al código.

2.1 Agentes y Pools

  • Usar Microsoft-hosted agents (windows-latest, ubuntu-latest) o agentes privados.
  • Seleccionar la imagen adecuada para .NET o Node.js según el runtime requerido.

2.2 Ejemplo de YAML para .NET

trigger:
  branches:
    include:
      - main
      - develop

pool:
  vmImage: windows-latest

variables:
  buildConfiguration: Release

steps:
  - task: UseDotNet@2
    inputs:
      packageType: sdk
      version: 6.x

  - script: dotnet restore
    displayName: Restaurar paquetes NuGet

  - script: dotnet build --configuration (buildConfiguration)
    displayName: Compilar solución

  - script: dotnet test --configuration (buildConfiguration) --no-build --verbosity normal
    displayName: Ejecutar pruebas
  
  - task: PublishBuildArtifacts@1
    inputs:
      pathtoPublish: (Build.SourcesDirectory)/bin/(buildConfiguration)
      artifactName: drop
  

2.3 Ejemplo de YAML para Node.js

trigger:
  branches:
    include:
      - main
      - develop

pool:
  vmImage: ubuntu-latest

steps:
  - task: NodeTool@0
    inputs:
      versionSpec: 16.x

  - script: npm install
    displayName: Instalar dependencias

  - script: npm run build
    displayName: Construir proyecto

  - script: npm test
    displayName: Ejecutar pruebas

  - task: PublishBuildArtifacts@1
    inputs:
      pathtoPublish: dist
      artifactName: node-drop
  

3. Pipeline de CD: despliegue automatizado

Una vez generados los artefactos, configuraremos un pipeline de liberación o YAML de Releases para llevar la aplicación a distintos entornos.

3.1 Definición de Entornos y Aprobaciones

  • Crear Environments: Desarrollo, QA, Producción.
  • Para producción, configurar approvals y gates (p. ej., validación manual, comprobaciones de calidad).

3.2 Despliegue a Azure App Service

Para aplicaciones .NET o Node.js en App Service:

stages:
- stage: Deploy
  displayName: Desplegar a Producción
  dependsOn: Build
  jobs:
  - deployment: DeployWeb
    environment: Production
    pool:
      vmImage: ubuntu-latest
    strategy:
      runOnce:
        deploy:
          steps:
          - download: current
            artifact: drop
          
          - task: AzureWebApp@1
            inputs:
              azureSubscription: MiServiceConnection
              appType: webApp
              appName: mi-app-service
              package: (Pipeline.Workspace)/drop/.zip
  

3.3 Despliegue a Azure Kubernetes Service (AKS)

  • Construir y etiquetar imágenes Docker, subirlas a Azure Container Registry.
  • Usar tareas Docker@2 y KubernetesManifest@0.
- task: Docker@2
  displayName: Build and Push image
  inputs:
    containerRegistry: MiACR
    repository: miaplicacion
    command: buildAndPush
    Dockerfile: /Dockerfile
    tags: 
      (Build.BuildId)

- task: KubernetesManifest@0
  displayName: Deploy to AKS
  inputs:
    action: deploy
    kubernetesServiceConnection: MiAKSConnection
    namespace: production
    manifests: 
      k8s/deployment.yaml
      k8s/service.yaml
  

4. Variables, Seguridad y Conexiones de Servicio

  • Service connections: Autenticación con Azure, Docker, GitHub.
  • Uso de Variable Groups y Secret variables para credenciales.
  • Integración con Azure Key Vault para gestionar secretos.

5. Estrategias Avanzadas y Buenas Prácticas

5.1 Reutilización con Plantillas YAML

Crear templates para pasos comunes (steps), trabajos (jobs) o etapas (stages), parametrizarlos y almacenarlos en un repositorio central.

5.2 Matrices de Construcción y Paralelismo

Definir strategy.matrix para compilar en múltiples configuraciones (.NET 5, 6, 7) o versiones de Node.js.

5.3 Caché de Paquetes

Reducir tiempos de CI con Caching de NuGet o npm:

- task: Cache@2
  inputs:
    key: npm  (Agent.OS)  package-lock.json
    path: (Pipeline.Workspace)/.npm
  

6. Monitoreo y Métricas

  • Configurar Dashboards en Azure DevOps para ver estado de pipelines.
  • Integrar con Azure Monitor y Application Insights para telemetría en ejecución.
  • Gates de calidad: pruebas unitarias mínimas, análisis de vulnerabilidades con SonarCloud.

7. Comparativa de Tareas para .NET vs Node.js

Fase .NET Node.js
Instalar Runtime UseDotNet@2 NodeTool@0
Restaurar Dependencias dotnet restore npm install
Compilar/Construir dotnet build npm run build
Pruebas dotnet test npm test

8. Recursos y Enlaces de Interés

Conclusión

Implementar flujos de CI/CD con Azure DevOps aporta control, calidad y velocidad al ciclo de vida de desarrollo.
Siguiendo los ejemplos para .NET y Node.js, podemos establecer pipelines robustos, seguros y escalables.
Adoptar buenas prácticas, plantillas YAML y monitorización continua garantiza la entrega de software confiable y eficiente.



Leave a Reply

Your email address will not be published. Required fields are marked *