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@2yKubernetesManifest@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
- Documentación oficial de Azure Pipelines
- Guía de .NET Core
- Documentación de Node.js
- Azure Kubernetes Service (AKS)
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