Saltar al contenido principal

Tutorial de Azure Pipelines: Una guía completa de CI/CD para principiantes

Este tutorial te guía a través de la configuración, ejecución y optimización de flujos de trabajo CI/CD utilizando Azure Pipelines.
Actualizado 30 may 2025  · 15 min de lectura

Si tu proceso CI/CD se rompe constantemente o parece lento y torpe, no eres el único. He tenido que lidiar con compilaciones fallidas, entornos desajustados y compañeros de equipo que accidentalmente sobrescribían mi trabajo. Azure Pipelines elimina estas frustraciones con un servicio alojado en la nube que puede crear, probar y desplegar casi cualquier proyecto en cualquier plataforma.

Por eso, en este tutorial, te mostraré cómo hacerlo:

  1. Crea tu primer Azure Pipeline
  2. Construye tu proyecto en la nube
  3. Añade pruebas automatizadas para detectar errores a tiempo
  4. Despliega en la fase de preparación o de producción con una sola pulsación
  5. Supervisa y optimiza tu canalización para que sea más rápida y fiable
  6. Sigue las mejores prácticas probadas en proyectos del mundo real

¡Empecemos!

¿Qué es Azure Pipelines?

Azure Pipelines es una solución basada en la nube que simplifica el desarrollo, las pruebas y el despliegue de aplicaciones. 

Es un componente del conjunto de herramientas Azure DevOps, que da soporte a todo el ciclo de vida del desarrollo de software. También es una opción flexible para equipos de todos los tamaños, porque admite varias plataformas y lenguajes de programación. GitHub, Azure Repos y otros conocidos sistemas de control de versiones están integrados con él. 

Las características principales de Azure Pipelines incluyen: 

Servicio

Propósito

Soporte multiplataforma

Azure Pipelines automatiza la creación y despliegue de aplicaciones para varios sistemas operativos, como Linux, macOS y Windows.

Integración con el control de versiones

Azure Pipelines se conecta a tus repositorios de código, como Azure Repos, GitHub y otros conocidos sistemas de control de versiones.

Configuración de canalizaciones basada en YAML

Azure Pipelines nos permite definir nuestros procesos de compilación y despliegue como código, permitiendo el control de versiones.

Integración continua y Despliegue continuo (CI/CD)

Azure Pipelines facilita el proceso integral de integración de cambios de código y despliegue de aplicaciones.

En mi experiencia, Azure Pipelines es útil para cualquiera que desee tener proper CI/CD dentro de su equipo. Es flexible, escalable y se integra bien con otros servicios de Azure.

Azure Pipelines Architecture es una configuración que automatiza el proceso de creación, prueba y despliegue de código. Comienza cuando los programadores envían sus cambios de código a un repositorio. A continuación, el sistema ejecuta una serie de tareas automatizadas, como la depuración del código, la construcción y las pruebas. Una vez completadas estas tareas, el código se despliega en distintos entornos, como el de preparación y el de producción. Esta arquitectura garantiza que los cambios en el código se entreguen de forma coherente y fiable, ayudando a los equipos a mantener un software de alta calidad.

Arquitectura de Azure Pipelines (Fuente: Microsoft).

Si buscas una comprensión más amplia de Azure DevOps más allá de los pipelines, este tutorial Azure DevOps warecorre todo el ciclo de vida de CI/CD de principio a fin.

Configurar tu primera canalización en Azure

Para trabajar con el entorno Azure Pipelines, primero debemos configurarlo todo para fomentar un proceso de creación, prueba y despliegue de extremo a extremo.

Requisitos previos

Antes de lanzarte a crear tu primera canalización, asegúrate de que tienes lo siguiente:

  1. Configuración de la cuenta y la organización de Azure DevOps: Regístrate eno en una cuenta Azure DevOpsnt si aún no la tienes. Crea una organización para gestionar tus proyectos. 
  2. Repositorio: Necesitarás un repositorio de código con un proyecto de ejemplo. Puede alojarse en Azure Repos o en GitHub. Para este tutorial, utilizaremos un proyecto Node.js sencillo.
  3. Acceso al portal Azure: También necesitarás acceder a tl portal de Azure cuando quieras desplegar en servicios de Azure como Azure Kubernetes Service (AKS) y muchos más.

Si necesitas ponerte al día sobre el ecosistema Azure en general, te recomiendo que consultes el curso Comprender Microsoft Azure

Crear un nuevo proyecto y repositorio

Ahora que tu cuenta Azure DevOps y tu organización están configuradas, vamos a crear nuestro primer proyecto y repositorio.

  • Crea un nuevo proyecto:
    • Accede a tu cuenta Azure DevOps.
    • Haz clic en Nuevo proyecto, dale un nombre (por ejemplo, "AzureDevOps-DataCamp-Tutorial") y elige la visibilidad (pública o privada).
    • Haz clic en Crear proyecto.

Configurar un nuevo proyecto en Azure DevOps es sencillo:

Introduce los detalles del proyecto, incluyendo el nombre del proyecto, una breve descripción y establece la visibilidad (pública o privada).

Por último, haz clic en "Crear el proyecto" para empezar.

  • Crea un repositorio:
    • Si utilizas Azure Repos, navega hasta la secciónRepos e inicializa un nuevo repositorio.
    • Alternativamente, puedes vincular un repositorio GitHub existente seleccionando Importar repositorio.
    • Ponle un nombre a tu repositorio, elige el tipo de repositorio (Git o TFVC), pega la URL de tu repositorio clonado y haz clic en Importar.

Elegir un sistema de control de versiones es esencial en Azure Pipelines a la hora de gestionar tu código. Aquí tienes dos opciones:

Git: Un sistema de control de versiones distribuido que es moderno y ampliamente utilizado en la comunidad de programadores. Es la mejor opción para la mayoría de los proyectos.

TFVC (Team Foundation Version Control): Un sistema de control de versiones centralizado, menos común y a menudo utilizado en proyectos heredados.

Este esquema intuitivo te ayuda a decidir qué sistema se adapta mejor a las necesidades de tu proyecto.

  • Si utilizas GitHubpuedes vincular tu cuenta de GitHub a Azure DevOps yendo a la parte inferior izquierda de la interfaz de tu proyecto y seleccionando Configuración del proyecto > Conexiones GitHub > Conectar tu cuenta de GitHub.

Ilustración que muestra cómo vincular una cuenta de GitHub a Azure DevOps navegando a Configuración del proyecto en la esquina inferior izquierda de la interfaz.

Después, selecciona Conexiones GitHub.

Por último, haz clic en Conecta tu cuenta de GitHub.

Para este tutorial, utilizaremos Azure Repos como nuestro repositorio de código. Si estás empezando o no tienes una razón específica para elegir TFVC, te aconsejo que elijas Git.

Crear tu primera canalización

Es hora de crear nuestra primera tubería. Sigue los pasos que se indican a continuación:

  • En tus Tuberías haz clic en Crear pipeline.

Navega a la sección Pipelines dentro de tu proyecto Azure DevOps:

Abre tu proyecto Azure DevOps.

En el menú de la izquierda, haz clic en Pipelines.

Esta sección te permite gestionar eficientemente tus pipelines de compilación y lanzamiento.

Haz clic en Crear canalización para empezar a configurar una nueva canalización.

Este sencillo paso te ayuda a iniciar el proceso de automatización de tus flujos de trabajo en Azure DevOps.

  • Selecciona Azure Repos Git como fuente y elige tu repositorio.

Elige una fuente para tu tubería:

Selecciona Azure Repos Git como fuente.

A continuación, elige el repositorio con el que quieres trabajar.

Este sencillo proceso garantiza que conectes el repositorio de código correcto a tu canalización para una gestión eficaz.

  • Puedes configurar tu canalización utilizando el editor YAML o Clásico. Vamos con YAML, una forma de definir la canalización basada en código.
  • Guarda la tubería y ejecútala para ver si todo funciona correctamente.

Elegir YAML vs Editor Clásico

Azure Pipelines proporciona dos formas de definir tus pipelines:

  • Canalizaciones YAML: Una forma codificada de describir tu canalización. Se definen en un archivo .yaml o .yml en tu repositorio de fuentes, lo que permite el versionado y una mejor colaboración.
  • Editor clásico: El Editor clásico es una interfaz visual de arrastrar y soltar fácil de usar que es menos flexible para escenarios complejos.

Aspecto

Tuberías YAML

Editor clásico

Control de versiones

Las canalizaciones YAML admiten el control de versiones y se almacenan en el repositorio de código fuente.

El Editor clásico no admite el control de versiones. Está basado en una interfaz gráfica de usuario (GUI).

Flexibilidad

Las tuberías YAML tienen una flexibilidad de alto nivel.

El Editor Clásico tiene una flexibilidad limitada.

Lo mejor para

Los YAML Pipelines son mejores para flujos de trabajo complejos a largo plazo y para la automatización.

El Editor Clásico es el más adecuado para configuraciones rápidas.

En mi experiencia, las canalizaciones YAML proporcionan más flexibilidad y son mejores para los equipos quepermiten prácticas de Infraestructura como Código (IaC). Pero este Editor Clásico es perfecto para los más frescos, con una forma más visual de hacer las cosas. 

Sin embargo, para una escalabilidad a largo plazo, se recomiendan las canalizaciones YAML en lugar del Editor Clásico.

Construir con Azure Pipelines

Ahora, veamos cómo podemos construir con Azure Pipelines. 

En esta sección, especificaremos los pasos que Azure Pipelines realiza para construir tu código, como la instalación de dependencias, la compilación y la ejecución de pruebas. Vamos a expresar estos pasos en un archivo de configuración en nuestro repositorio de código fuente utilizando YAML, una forma sencilla y legible por humanos de describir los pasos de una receta.

Sintaxis de la canalización YAML

Aquí tienes un ejemplo sencillo de una canalización YAML:

# This section defines the trigger(s) for the pipeline.
# 'main' specifies that the pipeline will run whenever changes are pushed to the 'main' branch.
trigger:
- main  # automatically triggers this pipeline when changes are made to the 'main' branch.

# This defines the pool where the pipeline will run.
# 'ubuntu-latest' specifies the virtual machine image for executing tasks.
pool:
  vmImage: 'ubuntu-latest'  # This uses the latest Ubuntu image provided by Azure DevOps.

# Steps contain the individual tasks or actions that the pipeline will execute.
steps:
- script: echo Hello, world!  # A script task to run shell commands. This one prints "Hello, world!".
  displayName: 'Run my first pipeline script'  # A friendly name for this step, making it easier to identify in the pipeline logs.

Vamos a desglosar el código paso a paso:

  • trigger: Especifica la rama que activa la canalización (por ejemplo, main).
  • pool: Define el agente de construcción (por ejemplo, ubuntu-latest).
  • steps: Enumera las tareas a ejecutar, como instalar dependencias y ejecutar un script de compilación.

Configurar los pasos de construcción

Para añadir pasos de compilación a tu canalización YAML, debes definir el "script" en la sección "pasos".

Para una aplicación sencilla de Node.js, por ejemplo, nuestro archivo azure-pipelines.yml de abajo contiene código que Azure DevOps creó automáticamente.

# Node.js
# Build a general Node.js project with npm.
# Add steps that analyze code, save build artifacts, deploy, and more:
# https://docs.microsoft.com/azure/devops/pipelines/languages/javascript

trigger:
- main

pool:
  vmImage: 'ubuntu-latest'

steps:
- task: NodeTool@0
  inputs:
    versionSpec: '20.x'
  displayName: 'Install Node.js'

- script: |
    npm install
    npm run build
  displayName: 'npm install and build'

Echemos un vistazo a la construcción steps en el canal YAML anterior: 

  1. Instala Node.js: Utiliza la tarea NodeTool@0 para especificar la versión de Node.js. 
  2. Instala las dependencias: Ejecuta npm install para instalar las dependencias del proyecto. 
  3. Compila el código (construye el proyecto): Ejecuta npm run build para compilar el código. 

Ejecutar el oleoducto

Nuestro pipeline puede activarse manualmente o configurarse para que se ejecute automáticamente cuando se produzcan eventos como el empuje de ramas.

  • Disparo manual: Haz clic en Ejecutar canalización en la interfaz Azure DevOps para activar la canalización manualmente.

Botón Ejecutar canalización en la interfaz Azure DevOps utilizado para iniciar manualmente la ejecución de la canalización.

  • Disparo automático: Establece desencadenantes basados en eventos del repositorio para enviar cambios a la rama main y desencadenar la canalización automáticamente. He aquí un ejemplo:
trigger:
- main

Después de ejecutar tu canalización, puedes ver los registros y solucionar cualquier problema.

Para acceder a los registros, ve al resumen de ejecución de tu pipeline y selecciona el trabajo o tarea específicos. Esto mostrará los registros de ese paso; como en la imagen de abajo, puedes elegir cualquier trabajo (Construir, Empujar o Actualizar) para ver los registros sin procesar.

Resumen de la ejecución de la tubería mostrando las opciones del trabajo (Construir, Empujar, Actualizar) para acceder a los registros sin procesar de cada paso.

Resumen de la ejecución de la tubería mostrando las opciones del trabajo (Construir, Empujar, Actualizar) para acceder a los registros sin procesar de cada paso.

Para solucionar problemas comunes, puedes comprobar tu canalización en busca de problemas comunes como tiempos de espera, limitaciones de recursos o configuraciones erróneas.

Añadir pruebas a tu pipeline

Añade pruebas a tu proceso para garantizar la calidad del código y detectar problemas en las primeras fases del desarrollo. En Azure Pipelines, puedes integrar pruebas unitarias, de integración o de otro tipo añadiendo pasos en la configuración de tu pipeline.

Configurar los pasos de la prueba

Incluye pasos de prueba en tu pipeline para garantizar la calidad del código. Puedes utilizar frameworks populares como Jest, Mocha o NUnit. Por ejemplo, aquí tienes cómo añadir pruebas unitarias con Jest:

- script: |
    npm test
  displayName: 'Run unit tests with Jest'

Ver los resultados de las pruebas

Hay informes de pruebas integrados en Azure Pipelines. Puedes configurar la publicación de los resultados de las pruebas para un seguimiento más sencillo y ver los resultados de las pruebas en los registros de la canalización. Así se hace:

  • Primero, navega hasta Construye > Resultados de las pruebas.
  • Para publicar los resultados de las pruebas, utiliza la tarea PublishTestResults@2 para mostrar los resultados. Esto facilita el seguimiento general. Por ejemplo:
- task: PublishTestResults@2
  inputs:
    testResultsFiles: '**/test-results.xml'
    testRunTitle: 'Unit Tests'

Despliegue con Azure Pipelines

En los pasos de despliegue de tu archivo YAML de canalización de Azure, puedes desplegar automáticamente tu aplicación en varios entornos, como pruebas, staging y producción. En esta sección, revisaremos algunas formas de desplegar con Azure Pipelines.

Despliegue en Azure Web Apps

Azure Web Apps es un servicio del Portal Azure que te permite desarrollar, desplegar y gestionar aplicaciones web a escala. 

Para desplegar en Azure Web Apps, debes vincular los dos servicios. He aquí cómo hacerlo:

  • En la parte inferior izquierda de tu proyecto, ve a Configuración del proyecto y haz clic en Conexiones de servicio debajo de Tuberías sección.

Interfaz de Azure DevOps que muestra la opción Configuración del proyecto en la esquina inferior izquierda para vincular los servicios de Azure.

Navega hasta la sección Pipelines:

Haz clic en Conexiones de Servicio, dentro de la sección Pipelines.

Este paso te ayuda a enlazar con los Servicios de Azure, mejorando las capacidades e integraciones de tu proyecto.

  • Haz clic en Nueva conexión de servicio y selecciona Gestor de Recursos Azure.

Establece una nueva conexión de servicio:

Haz clic en Nueva conexión de servicio.

Este sencillo proceso te ayuda a conectarte a los recursos de Azure, mejorando las capacidades de tu proyecto.

Establece una nueva conexión de servicio:

Elige Azure Resource Manager.

Este sencillo proceso te ayuda a conectarte a los recursos de Azure, mejorando las capacidades de tu proyecto.

  • Autentícate con tu cuenta Azure.
  • Despliega en Azure App Service:
    • Vuelve a tus Pipelines y configura tu pipeline.
    • En tu pipeline, añade una tarea para desplegar en Azure.
    • Especifica el grupo de recursos y los detalles del servicio. 

He aquí un ejemplo de canalización de despliegue YAML para una sencilla aplicación Node.js en Azure App Service:

# Define the task for deploying to an Azure Web App
- task: AzureWebApp@1
  inputs:
    # This specifies your Azure subscription service connection
    azureSubscription: 'your-azure-subscription'
    # This specifies the name of your web app
    appName: 'your-app-name'
    # This specifies the location of the app package or files to be deployed
    package: '$(Build.ArtifactStagingDirectory)'

Vamos a desglosar el código anterior, para que puedas adaptarlo a tu caso de uso:

  • Sustituye your-azure-subscription por el nombre de la conexión de servicio que da acceso a tu suscripción de Azure.
  • Sustituye your-app-name por el nombre real de tu aplicación web en Azure. 
  • Sustituye $(Build.ArtifactStagingDirectory) por el directorio donde colocar el paquete o los archivos de la aplicación web para su despliegue. $(Build.ArtifactStagingDirectory) - Esta variable apunta a la carpeta en la que se encuentran tus artefactos de compilación (los archivos de tu aplicación) una vez compilados.

Configurar el despliegue continuo (DC)

Una vez que todo nuestro código supera todas las pruebas y comprobaciones, el siguiente paso es configurar nuestro despliegue continuo. Sigue los pasos que se describen a continuación.

Modelo Azure Release Pipeline que muestra las fuentes de artefactos que alimentan el Release Pipeline para su despliegue.

Modelo de despliegue de la canalización de versiones de Azure (Fuente: Microsoft)

  • Crea una cadena de liberación:
    • Ir a Tuberías > Lanzamientos y haz clic en Nueva pipeline.

La interfaz Azure DevOps muestra la ruta para crear una canalización de lanzamientos navegando a Canalizaciones > Lanzamientos y seleccionando Nueva canalización.

Crear una cadena de lanzamiento en Azure DevOps es sencillo:

Navega hasta la sección Pipelines del menú de la izquierda.

Haz clic en Lanzamientos.

A continuación, selecciona Nuevo pipeline para empezar a configurar tu proceso de publicación.

Esta interfaz fácil de usar te ayuda a gestionar y automatizar eficazmente tus flujos de trabajo de publicación.

  • Selecciona la opción Despliegue de Azure App Service plantilla.

La interfaz Azure DevOps muestra la opción de seleccionar la plantilla Azure App Service Deployment para la configuración de la canalización de versiones.

  • Configura los entornos:
    • Añadir y configurar Desarrollo, Puesta en escena, QAy Producción en los que quieres que se despliegue tu aplicación.

La interfaz Azure DevOps muestra entornos configurados como Dev, Staging, QA y Production para el despliegue de aplicaciones.

  • Vincula el artefacto de tu proceso de creación como fuente del proceso de publicación seleccionando Añadir un artefacto.

La interfaz Azure DevOps muestra la opción de añadir un artefacto del canal de creación como fuente para la configuración del canal de publicación.

  • Configura aprobaciones y puertas:
    • Es necesario establecer aprobaciones previas a la implantación para entornos sensibles, como los de producción. Por ejemplo, puede ser necesario que un jefe de equipo apruebe la liberación. También puedes añadir puertas como pruebas automatizadas o comprobaciones de seguimiento para garantizar que la implantación cumple las normas de calidad.

Según mi experiencia, esta fase es necesaria para mantener la estabilidad en entornos de desarrollo exigentes. Las aprobaciones y las puertas proporcionan control y garantizan que sólo el código de alta calidad llegue a la producción.

Despliegue en Kubernetes

Kubernetes facilita la ejecución de aplicaciones en contenedores fiables y escalables. Al utilizar Azure Kubernetes Service (AKS), obtienes un entorno gestionado que simplifica el despliegue y las operaciones. En esta sección, te explicaré cómo desplegar tu aplicación en AKS utilizando Azure Pipelines.

Prepara tu Cluster AKS

Puedes crear un clúster AKS utilizando el portal de Azure o la CLI. Aquí tienes un comando CLI Bash básico para aprovisionar el clúster:

az aks create \
  --resource-group <ResourceGroupName> \
  --name <AKSClusterName> \
  --node-count 3 \
  --enable-addons monitoring \
  --generate-ssh-keys

Vamos a desglosar el comando anterior:

  • --resource-group: Indica el grupo de recursos de Azure en el que se creará el clúster AKS.
  • --name: Se refiere al nombre de tu cluster AKS.
  • --node-count: Establece el número de nodos del clúster (por ejemplo, 3 en este ejemplo).
  • --enable-addons monitoring: Esto hace posible la supervisión y el análisis con Azure Monitor for Containers.
  • --generate-ssh-keys: Esto genera automáticamente claves SSH para el acceso seguro al nodo si no se proporcionan.

No olvides sustituir y por los nombres reales de tu grupo de recursos y clúster.

Kubectl debe configurarse después de que tu clúster AKS esté configurado. Esto garantiza que tu agente de canalización u ordenador local pueda utilizar kubectl para comunicarse con el clúster.

Puedes acelerar tus tareas en Azure utilizando la línea de comandos aols: esta hoja de trucos de la CLI de Azure es una referencia práctica.

Crear un archivo YAML de despliegue 

Tomemos como ejemplo un archivo YAML de despliegue básico para desplegar una imagen Docker en Kubernetes:

# This defines the API version and the kind of Kubernetes resource we are creating.
# 'apps/v1' is the API version, and 'Deployment' is the resource type.
apiVersion: apps/v1
kind: Deployment

# Metadata contains information to identify the resource uniquely.
# 'name' specifies the name of the Deployment.
metadata:
  name: my-app  # Name of the Deployment, used for identification.

# "spec" specifies the intended deployment state.
spec:
  # Number of replicas/pods we want for this Deployment.
  replicas: 3  # Ensures high availability by running three app replicas.

  # Selector is used to define the labels that this Deployment will manage.
  selector:
    matchLabels:
      app: my-app  # This ensures that only Pods with the label 'app: my-app' are managed by this Deployment.

  # Template specifies the blueprint for the pods created by the Deployment.
  template:
    metadata:
      labels:
        app: my-app  # Labels for the Pods, matching the selector above.

    # A specification for the containers of the Pods.
    spec:
      containers:
      - name: my-app  # Name of the container. This is useful for linking to the container in logs, etc.
        image: mycontainerregistry.azurecr.io/my-app:latest  # Pull the container image you will call from your container registry.
        ports:
        - containerPort: 80  # The container listens on port 80.

Despliega utilizando Azure Pipelines

En tu canalización YAML, incluye una tarea para desplegar en AKS.

# This defines a task for deploying Kubernetes manifests within an Azure DevOps pipeline.
- task: KubernetesManifest@0  # Task type for working with Kubernetes manifest files.
  inputs:
    # This configures what to do with the Kubernetes manifest files.
    action: 'deploy'  # 'deploy' action ensures the Kubernetes manifests are applied to the cluster.

    # This defines the namespace where the Kubernetes resources will be deployed.
    namespace: 'default'  # 'default' is the namespace for deploying resources. Change if needed.

    # All this does is point to the manifest files that define the desired state of your Kubernetes resources.
    manifests: '$(Build.ArtifactStagingDirectory)/manifests/*.yaml'
    # The 'manifests' variable points to the location of all the YAML files (e.g., Deployment, Service, etc.) that will be applied during the deployment.

    # To access private container registry images, use the image pull secret.
    imagePullSecrets: 'my-registry-secret'
    # This instructs Kubernetes on which secret to use when pulling images from a private container registry.
    # Ensure that 'my-registry-secret' exists in the namespace before the deploy

Confirma y envía el archivo YAML para activar el despliegue.

AKS simplifica la orquestación de contenedores, facilitando la gestión del escalado, las actualizaciones y las reversiones. En mi experiencia, es imprescindible para las aplicaciones modernas nativas de la nube.

Obtén la certificación AZ-900 de Azure

Prepárate para el PL-300 de Azure y consigue un 50% de descuento en el precio del examen.
Certifica tus conocimientos de Azure

Optimizar y supervisar tus tuberías

Al principio de mi carrera, construir oleoductos no era el mayor reto, sino tener un oleoducto rápido y fiable. Un pipeline bien optimizado no sólo agiliza las compilaciones, sino que también reduce la frustración del equipo, disminuye los riesgos de despliegue y acelera la entrega. 

Compartiré algunos consejos y estrategias que puedes utilizar para mantener tus canalizaciones Azure DevOps rápidas, organizadas y fiables.

Almacenamiento en caché

La instalación de dependencias es otro cuello de botella común en las canalizaciones. Tanto si trabajas con npm, .NET u otros gestores de paquetes, descargar repetidamente las mismas dependencias puede hacerte perder mucho tiempo. El almacenamiento en caché de dependencias y artefactos entre ejecuciones reduce drásticamente el tiempo de ejecución. 

A continuación te explicamos cómo almacenar en caché las dependencias en Azure Pipelines.

Primero, tienes que identificar los gestores de paquetes, como:

  • Node.js (node_modules)
  • Paquetes NuGet
  • Python (pip paquetes)
  • Dependencias de Maven/Gradle

Azure Pipelines admite mecanismos de almacenamiento en caché, como la tarea Cache@2, que te permite almacenar en caché dependencias entre ejecuciones de pipelines. 

Tomemos como ejemplo un simple almacenamiento en caché para Node.js:

# This task is used to cache files to speed up your pipeline.
- task: Cache@2  # This is the task name for caching files in Azure Pipelines.
  inputs:
    # Key is used to identify the cache. It combines npm (package manager), operating system (OS), and package-lock.json files.
    key: 'npm | "$(Agent.OS)" | package-lock.json'



    # RestoreKeys is an optional value used when the specific cache key is not found. It helps to find a fallback cache.
    restoreKeys: |
      npm | "$(Agent.OS)"



    # Path defines the location of files or folders to be cached.
    # Here, we are caching the 'node_modules' directory to avoid reinstalling dependencies.
    path: '$(Build.SourcesDirectory)/node_modules'



    # CacheHitVar is a variable that stores whether the cache was successfully used (restored).
    # This can be checked later in the pipeline to decide if tasks need to run.
    cacheHitVar: 'NPM_CACHE_RESTORED'

Entonces puedes omitir condicionalmente la instalación si se almacena en caché. Se trata de una comprobación inteligente antes de completar la instalación de npm. Es una lógica eficiente basada en condiciones.

Pongamos un ejemplo sencillo:

# This step runs the command to install Node.js dependencies using npm.

- script: npm install  # Installs packages listed in the package.json file.
  
# The condition checks whether the cache was restored successfully.
# This step will run if the cache is not restored ('NPM_CACHE_RESTORED' is not true).
  condition: ne(variables.NPM_CACHE_RESTORED, 'true')  # Run only if the cache is not restored.

Este ejemplo de caché simple para una aplicación Node.js guarda el directorio de caché npm utilizando package-lock.json como clave. Cuando tus dependencias no cambian, las restaura, ahorrando minutos en cada compilación. 

He visto que el almacenamiento en caché reduce drásticamente el tiempo de construcción, especialmente en proyectos grandes, pero sólo si las claves de caché se eligen cuidadosamente. En uno de mis proyectos anteriores, esto redujo el tiempo de compilación de una aplicación Node.js en un 55%.

Control de la salud de las tuberías

Un pipeline de éxito no es sólo cuestión de ticks verdes, visibilidad y retroalimentación rápida. Cuando algo se rompe, quieres que tu equipo lo sepa al instante. He aquí cómo adelantarte a los problemas.

Cómo configurar los cuadros de mando de Azure DevOps

Azure DevOps proporciona widgets integrados para mostrar el estado de las canalizaciones, las ejecuciones recientes, las tasas de fallos y las duraciones medias. 

  • Primero, navega a Cuadros de mando en tu proyecto.

La interfaz Azure DevOps muestra la sección Cuadros de mando con widgets incorporados para el estado de las canalizaciones, ejecuciones recientes, tasas de fallos y duraciones medias.

  • A continuación, haz clic en Nuevo Cuadro de Mando o utiliza uno existente.

La interfaz Azure DevOps muestra la opción de crear un nuevo cuadro de mando o seleccionar uno existente en la sección Cuadros de mando.

  • Puedes añadir widgets como Historia de la construcción, Resumen del proceso de publicación, Tendencia de los resultados de las pruebasy mucho más.

La interfaz Azure DevOps muestra opciones para añadir widgets como Historial de construcción, Visión general de la canalización de lanzamientos y Tendencia de los resultados de las pruebas.

Son esenciales para seguir las tendencias de aprobados y suspensos, ver qué entornos son problemáticos, etc.

Configurar alertas para canalizaciones fallidas

  • En la parte inferior izquierda de tu proyecto, ve a Configuración del proyecto.

Interfaz de Azure DevOps que muestra la opción Configuración del proyecto en la esquina inferior izquierda para configurar alertas de canalizaciones fallidas.

  • Haz clic en Notificaciones.

Interfaz Azure DevOps mostrando la opción Notificaciones para configurar las alertas del pipeline.

  • A continuación, haz clic en Nueva suscripción.

La interfaz de Azure DevOps muestra la opción de crear una nueva suscripción para notificaciones en la sección Notificaciones.

Pongámonos en situación: En la sección Category, selecciona Build; en la sección Template, selecciona "A build fails", y haz clic en Next.

Tienes una interfaz como la siguiente

"La interfaz Azure DevOps muestra la sección Categoría con la opción "Compilación" seleccionada, y la sección Plantilla con la opción "Una compilación falla" elegida para crear una suscripción de notificación.

  • Por último, haz clic en Finalizar.
  • En la sección Notificaciones puedes consultar la sección Construir la descripción de "Falla una compilación"que hemos creado antes.

Interfaz Azure DevOps mostrando la sección Notificaciones con la descripción de la compilación para la notificación "Falla una compilación" creada anteriormente.

Una vez me perdí un fallo crítico de despliegue porque no se habían configurado las alertas. Desde entonces, siempre he establecido y configurado alertas de equipo para cada despliegue de producción. De este modo, nunca me pierdo una compilación rota o un retraso en mi ciclo de publicación.

Analizar el rendimiento de la tubería

Sabemos que aunque tu canalización funcione, puede ser lenta, y las canalizaciones lentas matan la productividad. Así que identificar los cuellos de botella a tiempo ahorra problemas más adelante.

Las métricas de canalización arrojan luz sobre el rendimiento de las compilaciones y los despliegues. Así es como se llega a ellos. 

En primer lugar, debes activar Vistas analíticas en los configuración del proyecto y conectarte a Power BI o explorar a través de los gráficos integrados.

Vigila la salud de las tuberías

  • Bajo Tuberías ve a Análisis.
  • Visualiza métricas como la tasa de aprobación del pipeline, la tasa de aprobación de las pruebas y la duración del pipeline.

Controla la salud de la tubería:

Ve a Pipelines, luego selecciona Análisis.

Visualiza métricas importantes como el índice de aprobación de la canalización, el índice de aprobación de las pruebas y la duración de la canalización.

Esta función te ayuda a controlar el rendimiento de tu pipeline y a asegurarte de que todo funciona correctamente.

Exploremos más a fondo qué métricas clave podemos controlar en la analítica y por qué son importantes:

Métrica

Por qué es importante

Tendencias de la duración de la construcción

Esto ayuda a detectar fácilmente las ralentizaciones a lo largo del tiempo.

Tasa de fracaso por rama

Esto ayuda a identificar los rasgos inestables.

Tiempo en cola

Esto ayuda a detectar la escasez de agentes.

Hace unos meses, trabajé en el pipeline de un cliente, ylo que más me llamó la atención fue el Tiempo en Cola. Una vez descubrí que mi equipo y yo habíamos sobrecargado un grupo de agentes autoalojados, y el 40% de nuestro tiempo de canalización se dedicaba a esperar a un corredor disponible. Nadie lo vio venir hasta que la analítica lo hizo evidente.

Podríamos solucionarlo añadiendo dos agentes autoalojados más y distribuyendo la carga por tipo de trabajo. Los resultados fueron inmediatos: el tiempo medio de construcción del pipeline se redujo aproximadamente un 35%.

Supervisar mediante registros

Así que, más allá de las métricas, los registros de la línea de tiempo son oro, especialmente para las tareas de larga duración. A lo largo de los años, he añadido habitualmente marcadores de registro personalizados dentro de los pasos críticos de las secuencias de comandos para señalar los retrasos exactos.

Pongamos un ejemplo sencillo:

# This step prints a message to the console in the pipeline logs.
# It helps to mark the start of the dependency installation process.

echo "=== START: Dependency Install ==="  # Display a message indicating the beginning of dependency installation.

Obtén la certificación AZ-900 de Azure

Prepárate para el PL-300 de Azure y consigue un 50% de descuento en el precio del examen.

Buenas prácticas para Azure Pipelines

Ahora que hemos cubierto los servicios principales de Azure Pipelines y muchos más, veamos cómo sacarles el máximo partido siguiendo estas prácticas recomendadas. 

Pasemos del rendimiento a la estructura, porque un pipeline rápido y difícil de mantener seguirá perjudicando a cualquier equipo.

Organizar canalizaciones para equipos

Cuando varios equipos o entornos comparten canalizaciones, a menudo las cosas se complican. Necesitarás estructura. Una tubería gigante para los entornos de desarrollo, preparación y producción conduce al caos. 

Para organizar tu pipeline, debes separarlo en entornos. Veamos una estructura sencillaa continuación. 

Medio ambiente

Nombre de la tubería

Disparador

Desarrollo

dev.yml

Ramas de características (Se ejecuta en cada confirmación)

Puesta en escena

staging.yml

Pull requests → Puesta en escena (Activación manual)

Producción

prod.yml

Tuberías manuales o de liberación (se requiere autorización)

Cosas clave que hay que entender de esta sencillaestructura:

  • Cada archivo tira de plantillas compartidas.
  • Cada archivo utiliza variables específicas del entorno.
  • Cada archivo controla el acceso mediante permisos de canalización.

Por experiencia, esta separación facilita la depuración y permite a los programadores junior desplegarse en el entorno de desarrollo sin arriesgar el entorno de producción.

Utilizar plantillas y código reutilizable

DevOps consiste en reducir el flujo de trabajo manual y mejorar la automatización en todo el proceso de desarrollo de software. 

El código YAML es propenso a errores cuando se copia y pega entre proyectos. Azure DevOps dispone de plantillas de canalización para la configuración DRY (Don't Repeat Yourself) mediante canalizaciones YAML. Puedes reutilizar las plantillas de canalización YAML en varios proyectos, diseñar tus canalizaciones de forma coherente e incluso reducir el tiempo de procesamiento de las canalizaciones.

Tomemos como ejemplo una sencilla plantilla de construcción reutilizable.

En primer lugar, define tu plantilla de construcción, build-template.yml:

# Here we configure the platform and the build configuration.
parameters:
  buildPlatform: 'Any CPU'  # This specifies the build platform (e.g., Any CPU, x86, x64).
  buildConfiguration: 'Release'  # This specifies the build configuration (Release) to avoid warning.

# A pipeline is composed of steps (a series of tasks that will be executed)
steps:
- task: DotNetCoreCLI@2  # Task for running .NET Core commands in the pipeline.
  inputs:
    command: 'build'  # This runs the 'build' command to compile the project(s).
    projects: '**/*.csproj'  # This specifies to build all .csproj files in the repository.
    arguments: '--configuration ${{ parameters.buildConfiguration }}'
    # This passes the build configuration parameter (e.g., Release or Debug) to the command.

Utiliza tu plantilla de construcción en tu canal principal:

# A pipeline job is a group of tasks. Here, the job is named 'Build'.
jobs:
- job: Build  # The job name where the build process occurs.

  # Steps define the tasks or actions the pipeline will perform.
  steps:
  - template: templates/build-template.yml  # Reference an external YAML template for reusable steps.

Gestión de secretos y variables

Cuando se trabaja en proyectos, especialmente en entornos colaborativos, es habitual utilizar información sensible como cadenas de conexión a bases de datos, claves API, contraseñas o tokens. Si estos secretos están codificados en tu código base o expuestos en los registros, pueden verse fácilmente comprometidos.

Veamos cómo gestionar de forma segura nuestros secretos y variables utilizando los secretos y grupos de variables de Azure Pipelines.

Paso 1: Crear un grupo de variables

  • Haz clic en el botón Tuberías en la barra lateral izquierda.
  • En la sección Pipelines, haz clic en Biblioteca.

Interfaz de Azure DevOps mostrando la pestaña Pipelines en la barra lateral izquierda y la opción Biblioteca dentro de la sección Pipelines.

  • Crea un grupo de variables:
    • Haz clic en los Grupos de variables .

Crea fácilmente un nuevo grupo de variables:

En Azure DevOps, navega hasta Pipelines y, a continuación, selecciona Biblioteca.

Crea un nuevo grupo de variables.

Este paso te ayuda a gestionar y organizar tus variables para una configuración eficiente de las canalizaciones.

  • Haz clic en el botón Añadir grupo de variables .
  • Introduce un nombre para tu grupo de variables (por ejemplo, MyAppSecrets).

Interfaz Azure DevOps que muestra el botón Añadir grupo de variables y un campo para introducir el nombre del grupo de variables, como MyAppSecrets.

Paso 2: Añadir secretos al grupo de variables

  • Añade variables: 
    • En el grupo de variables, haz clic en Añadir para crear una nueva variable.

La interfaz Azure DevOps muestra la opción de añadir variables dentro de un grupo de variables haciendo clic en el botón Añadir.

  • Introduce el nombre de la variable (por ejemplo, DB_CONNECTION_STRING).
  • Marca la casilla Mantener este valor en secreto para que se trate como secreto.
  • Introduce el valor de la variable (por ejemplo, mi cadena de conexión a la base de datos).

Interfaz Azure DevOps que muestra campos para introducir un nombre de variable (por ejemplo, DB_CONNECTION_STRING), marcarla como secreta y establecer su valor (por ejemplo, cadena de conexión a la base de datos).

  • Haz clic en Guardar para guardar la variable.

Interfaz Azure DevOps que muestra el botón Guardar utilizado para almacenar la variable recién añadida en el grupo de variables.

Paso 3: Utilizar secretos en tu pipeline

Ahora que has creado un grupo de variables con secretos, puedes utilizar estas variables en el archivo YAML de tu canalización.

  • Haz referencia al grupo de variables: Añade el grupo de variables al archivo YAML de tu canalización: 
variables:
- group: MyAppSecrets
  • Utiliza los secretos en tus pasos: Puedes hacer referencia a los secretos en los pasos de tu pipeline utilizando la sintaxis $(VariableName). Aquí tienes un ejemplo de cómo utilizar DB_CONNECTION_STRING en un paso de guión:
# This defines the trigger for the pipeline.
# The pipeline runs automatically whenever changes are pushed to the 'main' branch.
trigger:
- main  # Trigger the pipeline on changes to the 'main' branch.

# The pool specifies the environment where the pipeline will run.
# 'ubuntu-latest' means the pipeline will use the latest Ubuntu operating system image.
pool:
  vmImage: 'ubuntu-latest'  # Use the latest Ubuntu image provided by Azure Pipelines.

# Variables section defines reusable values for the pipeline.
# 'group: MyAppSecrets' links to a variable group that stores sensitive information like secrets.
variables:
- group: MyAppSecrets  # Load secrets, such as database credentials, from a variable group.

# Steps define the tasks that the pipeline will execute one by one.
steps:
- script: |
    echo "Connecting to the database..." # Print a message indicating the start of database connection.
    echo "Connection String: $(DB_CONNECTION_STRING)" # Display the database connection string from the variable group.
  displayName: 'Connect to Database'  # A simple name for this step that appears in the pipeline logs.

Paso 4: Ejecutar el oleoducto

  • Una vez que hayas guardado tu archivo YAML, ve a la sección Tuberías y haz clic en Ejecutar canalización.
  • Después de que se ejecute la tubería, puedes comprobar tus registros. Te darás cuenta de que el valor secreto está oculto, manteniendo a salvo tu información sensible.

Conclusión

En este tutorial, recorremos todo el proceso de uso de Azure Pipelines, desde la configuración de tu primera canalización hasta su creación, prueba, despliegue, supervisión y optimización.

La fase de despliegue requiere práctica. Empieza con algo sencillo, sigue mejorando y, con el tiempo, ganarás confianza y soltura en la gestión de los flujos de trabajo CI/CD. Azure Pipelines te da las herramientas, tú aportas la iteración y el aprendizaje.

Con un esfuerzo constante, puedes agilizar tu proceso de desarrollo y confiar en el envío de software de alta calidad a escala.

Para profundizar en Azure DevOps y Microsoft Azure, consultalos siguientes recursos: 

Preguntas frecuentes

¿Puedo utilizar Azure Pipelines para proyectos que no sean de Azure?

Sí, puedes hacerlo. Azure Pipelines admite despliegues en las instalaciones y en varios entornos de nube como AWS, GCP y muchos más.

¿Qué lenguajes de programación admite Azure Pipelines?

Azure Pipelines admite muchos lenguajes de programación, como Node.js, Python, Java, .NET y muchos más.

¿Cuál es la diferencia entre Azure Pipelines y GitHub Actions?

Azure Pipelines ofrece una integración más profunda con el ecosistema Azure y sólidas herramientas de despliegue, mientras que GitHub Actions proporciona una experiencia de CI/CD más sencilla y nativa de GitHub. Ambos admiten flujos de trabajo YAML y despliegues en contenedores.

¿Puedo utilizar Azure Pipelines con tecnologías que no sean de Microsoft, como Python o Java?

Sí, Azure Pipelines es compatible con las principales plataformas y lenguajes, incluidos Python, Java, Node.js, etc. Puedes configurar compilaciones y despliegues para cualquier pila tecnológica utilizando YAML.

¿El uso de Azure Pipelines es gratuito?

Azure Pipelines ofrece un nivel gratuito con 1.800 minutos/mes para proyectos públicos y un tiempo limitado de construcción privada. El uso adicional requiere un plan de pago o agentes autoalojados.

¿Qué son las Conexiones de Servicio DevOps de Azure y por qué son importantes?

Las Conexiones de Servicio enlazan de forma segura Azure Pipelines con servicios externos como Azure Web Apps o clústeres Kubernetes. Son esenciales para las implantaciones automatizadas y la gestión de infraestructuras.

¿Cómo se compara Azure Pipelines con Jenkins o CircleCI?

Azure Pipelines ofrece una experiencia más integrada a los usuarios de Azure y una mejor compatibilidad con los servicios de Microsoft. Jenkins es más personalizable pero requiere más configuración; CircleCI destaca en velocidad y paralelismo.


Emmanuel Akor's photo
Author
Emmanuel Akor
LinkedIn
Twitter

Emmanuel Akor es un Ingeniero de Nube y DevOps experto en aprovechar las tecnologías de nube y las herramientas DevOps para impulsar proyectos impactantes. Licenciado en Informática de primera clase por la Universidad de Babcock y antiguo co-líder de la nube para GDSC, Emmanuel combina la excelencia académica con la experiencia práctica. Como Redactor de Contenidos Técnicos, destaca a la hora de compartir conocimientos y colaborar con los equipos.

Temas

Aprende más sobre Azure con estos cursos

Curso

Understanding Microsoft Azure

3 h
34.3K
Learn about the power of Microsoft Azure and cloud computing software to help you improve your data engineering skills.
Ver detallesRight Arrow
Comienza el curso
Ver másRight Arrow
Relacionado

blog

AWS Certified Cloud Practitioner: guía completa

Comprende la certificación y el examen AWS Certified Cloud Practitioner con nuestra guía completa. Descubre consejos, recursos y estrategias para garantizar tu éxito.
Srujana Maddula's photo

Srujana Maddula

13 min

Tutorial

Sinapsis Azure: Guía paso a paso para principiantes

Una guía fácil de seguir para que los principiantes aprendan Azure Synapse, que abarca desde la configuración de tu espacio de trabajo hasta la integración de datos y la ejecución de análisis.
Moez Ali's photo

Moez Ali

13 min

Tutorial

Cuentas de almacenamiento Azure: Tutorial paso a paso para principiantes

Esta guía te enseña a configurar y gestionar las Cuentas de Almacenamiento de Azure, paso a paso. También explora opciones avanzadas de configuración para un rendimiento óptimo y una optimización de costes.
Anneleen Rummens's photo

Anneleen Rummens

11 min

Tutorial

Base de datos Azure SQL: Configuración y gestión paso a paso

Aprende a crear, conectar, gestionar, consultar y proteger tu base de datos Azure SQL. Esta guía paso a paso cubre todo lo esencial para una configuración óptima de la base de datos.
Anneleen Rummens's photo

Anneleen Rummens

12 min

Tutorial

Tutorial de GitHub y Git para principiantes

Un tutorial para principiantes que muestra cómo funciona el control de versiones Git y por qué es crucial para los proyectos de ciencia de datos.
Abid Ali Awan's photo

Abid Ali Awan

9 min

Tutorial

Tutorial de Power BI para principiantes

Aprende los fundamentos de Power BI y a crear un informe básico con este tutorial paso a paso.
DataCamp Team's photo

DataCamp Team

13 min

Ver másVer más