Vai al contenuto principale

Tutorial su Azure Pipelines: una guida CI/CD completa per principianti

Questo tutorial ti guida nella configurazione, esecuzione e ottimizzazione dei workflow CI/CD usando Azure Pipelines.
Aggiornato 29 set 2026  · 15 min leggi

Scopri con l'IA

ChatGPTClaudePerplexity

Se la tua pipeline CI/CD continua a rompersi o sembra lenta e macchinosa, non sei solo. Mi sono scontrato con build fallite, ambienti non allineati e colleghi che sovrascrivevano per sbaglio il mio lavoro. Azure Pipelines elimina queste frustrazioni con un servizio cloud-hosted che può creare, testare e distribuire quasi qualsiasi progetto su qualsiasi piattaforma.

Ecco perché in questo tutorial ti mostrerò come:

  1. Creare la tua prima Azure Pipeline
  2. Effettuare la build del tuo progetto nel cloud
  3. Aggiungere test automatici per intercettare gli errori in anticipo
  4. Distribuire in staging o produzione con un solo push
  5. Monitorare e ottimizzare la pipeline per velocità e affidabilità
  6. Seguire le best practice collaudate su progetti reali

Iniziamo!

Che cos’è Azure Pipelines?

Azure Pipelines è una soluzione cloud che semplifica lo sviluppo, il test e la distribuzione delle applicazioni. 

È un componente della toolkit di Azure DevOps, che supporta l’intero ciclo di vita dello sviluppo software. È anche un’opzione flessibile per team di tutte le dimensioni perché supporta varie piattaforme e linguaggi di programmazione. Si integra con GitHub, Azure Repos e altri noti sistemi di controllo versione. 

Le funzionalità principali di Azure Pipelines includono: 

Servizio

Scopo

Supporto multipiattaforma

Azure Pipelines automatizza la build e la distribuzione di applicazioni per vari sistemi operativi, come Linux, macOS e Windows.

Integrazione con il controllo versione

Azure Pipelines si connette ai tuoi repository di codice come Azure Repos, GitHub e altri noti sistemi di controllo versione.

Configurazione della pipeline basata su YAML

Azure Pipelines consente di definire i processi di build e deployment come codice, abilitando il controllo versione.

Integrazione continua e distribuzione continua (CI/CD)

Azure Pipelines facilita l’intero processo di integrazione delle modifiche al codice e distribuzione delle applicazioni.

Per la mia esperienza, Azure Pipelines è utile per chiunque voglia avere una propria CI/CD all’interno del team. È flessibile, scalabile e si integra bene con altri servizi Azure.

L’architettura di Azure Pipelines è una configurazione che automatizza i processi di build, test e distribuzione del codice. Si parte dagli sviluppatori che inviano le modifiche a un repository. Il sistema esegue poi una serie di attività automatiche, come linting del codice, build e test. Una volta completati questi passaggi, il codice viene distribuito in diversi ambienti come staging e produzione. Questa architettura garantisce che le modifiche al codice vengano consegnate in modo coerente e affidabile, aiutando i team a mantenere software di alta qualità.

Architettura di Azure Pipelines (Fonte: Microsoft).

Se cerchi una visione più ampia di Azure DevOps oltre le pipeline, questo tutorial su Azure DevOps illustra l’intero ciclo di vita CI/CD dall’inizio alla fine.

Configurare la tua prima Azure Pipeline

Per lavorare con l’ambiente Azure Pipelines, dobbiamo prima configurare tutto per favorire un processo end-to-end di build, test e distribuzione.

Prerequisiti

Prima di creare la tua prima pipeline, assicurati di avere quanto segue:

  1. Account Azure DevOps e organizzazione configurati: Iscriviti a un account Azure DevOps se non ne hai già uno. Crea un’organizzazione per gestire i tuoi progetti. 
  2. Repository: Ti serve un repository di codice con un progetto di esempio. Può essere ospitato su Azure Repos o GitHub. Per questo tutorial useremo un semplice progetto Node.js.
  3. Accesso al portale Azure: Ti servirà anche l’accesso al portale di Azure quando vorrai distribuire su servizi Azure come Azure Kubernetes Service (AKS) e molti altri.

Se vuoi ripassare l’ecosistema Azure nel suo complesso, ti consiglio di dare un’occhiata al corso Understanding Microsoft Azure. 

Creare un nuovo progetto e repository

Ora che il tuo account Azure DevOps e l’organizzazione sono pronti, creiamo il nostro primo progetto e repository.

  • Crea un nuovo progetto:
    • Accedi al tuo account Azure DevOps.
    • Clicca su New Project, assegnagli un nome (ad es. "AzureDevOps-DataCamp-Tutorial"), e scegli la visibilità (pubblica o privata).
    • Clicca su Create Project.

Configurare un nuovo progetto in Azure DevOps è semplice:

Inserisci i dettagli del progetto, incluso il nome, una breve descrizione e imposta la visibilità (pubblica o privata).

Infine, clicca su "Create the Project" per iniziare.

  • Configura un repository:
    • Se usi Azure Repos, vai alla sezione Repos e inizializza un nuovo repository.
    • In alternativa, puoi collegare un repository GitHub esistente selezionando Import Repository.
    • Assegna un nome al repository, scegli il Repository type (Git o TFVC), incolla l’URL del repository clonato e clicca su Import.

Scegliere un sistema di controllo versione è essenziale in Azure Pipelines quando gestisci il tuo codice. Ecco due opzioni:

Git: un sistema di controllo versione distribuito, moderno e ampiamente utilizzato nella community degli sviluppatori. È la scelta migliore per la maggior parte dei progetti.

TFVC (Team Foundation Version Control): un sistema di controllo versione centralizzato, meno comune e spesso usato in progetti legacy.

Questo layout intuitivo ti aiuta a decidere quale sistema si adatta meglio alle esigenze del tuo progetto.

  • Se usi GitHub, puoi collegare il tuo account GitHub ad Azure DevOps andando in basso a sinistra nell’interfaccia del progetto e selezionando Project Settings > GitHub Connections > Connect your GitHub account.

Illustrazione che mostra come collegare un account GitHub ad Azure DevOps navigando in Project Settings nell’angolo in basso a sinistra dell’interfaccia.

Dopodiché, seleziona GitHub Connections.

Infine, clicca su Connect your GitHub account.

Per questo tutorial, useremo Azure Repos come repository del codice. Se stai iniziando o non hai un motivo specifico per scegliere TFVC, ti consiglio di optare per Git.

Creare la tua prima pipeline

È il momento di creare la nostra prima pipeline. Segui i passaggi seguenti:

  • Nella sezione Pipelines, clicca su Create Pipeline.

Naviga nella sezione Pipelines all’interno del tuo progetto Azure DevOps:

Apri il tuo progetto Azure DevOps.

Nel menu a sinistra, clicca su Pipelines.

Questa sezione ti permette di gestire in modo efficiente le pipeline di build e rilascio.

Clicca su Create Pipeline per iniziare a impostare una nuova pipeline.

Questo passaggio semplice ti aiuta ad avviare l’automazione dei tuoi workflow in Azure DevOps.

  • Seleziona Azure Repos Git come sorgente e scegli il tuo repository.

Scegli una sorgente per la tua pipeline:

Seleziona Azure Repos Git come sorgente.

Poi scegli il repository con cui vuoi lavorare.

Questo processo semplice garantisce di collegare il repository corretto alla tua pipeline per una gestione efficiente.

  • Puoi configurare la pipeline usando l’editor YAML o Classic. Scegliamo YAML, un modo basato su codice per definire la pipeline.
  • Salva la pipeline ed eseguila per verificare che tutto funzioni correttamente.

Scegliere YAML vs Classic Editor

Azure Pipelines offre due modi per definire le pipeline:

  • Pipeline YAML: Un modo basato su codice per descrivere la tua pipeline. Sono definite in un file .yaml o .yml nel tuo repository sorgente, abilitando versionamento e migliore collaborazione.
  • Classic Editor: Classic Editor è un’interfaccia visiva drag-and-drop facile da usare, ma meno flessibile negli scenari complessi.

Aspetto

Pipeline YAML

Classic Editor

Controllo versione

Le pipeline YAML supportano il controllo versione e sono archiviate nel repository del codice sorgente.

Classic Editor non supporta il controllo versione. È basato su interfaccia grafica (GUI).

Flessibilità

Le pipeline YAML hanno un’elevata flessibilità.

Classic Editor ha una flessibilità limitata.

Ideale per

Le pipeline YAML sono ideali per workflow complessi e di lungo periodo e per l’automazione.

Classic Editor è più adatto a configurazioni rapide.

Per la mia esperienza, le pipeline YAML offrono maggiore flessibilità e sono migliori per i team che seguono pratiche di Infrastructure as Code (IaC). Ma il Classic Editor è perfetto per i neofiti che preferiscono un approccio più visivo. 

Tuttavia, per la scalabilità a lungo termine, le pipeline YAML sono raccomandate rispetto al Classic Editor.

Build con Azure Pipelines

Ora vediamo come effettuare la build con Azure Pipelines. 

In questa sezione specificheremo i passaggi che Azure Pipelines esegue per creare il tuo codice, come installare le dipendenze, compilare ed eseguire i test. Esprimeremo questi passaggi in un file di configurazione nel nostro repository del codice sorgente usando YAML, un modo semplice e leggibile per descrivere passaggi in una “ricetta”.

Sintassi delle pipeline YAML

Ecco un semplice esempio di pipeline 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.

Analizziamo il codice passo per passo:

  • trigger: specifica il branch che attiva la pipeline (ad es., main).
  • pool: definisce l’agente di build (ad es., ubuntu-latest).
  • steps: elenca le attività da eseguire, come l’installazione delle dipendenze e l’esecuzione di uno script di build.

Configurare i passaggi di build

Per aggiungere passaggi di build alla tua pipeline YAML, devi definire lo ‘script’ nella sezione ‘steps’.

Per una semplice applicazione Node.js, ad esempio, il nostro file azure-pipelines.yml qui sotto contiene codice creato automaticamente da Azure DevOps.

# 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'

Vediamo i steps di build nella pipeline YAML sopra: 

  1. Installa Node.js: usa il task NodeTool@0 per specificare la versione di Node.js. 
  2. Installa le dipendenze: esegui npm install per installare le dipendenze del progetto. 
  3. Compila il codice (build del progetto): esegui npm run build per compilare il codice. 

Esecuzione della pipeline

La nostra pipeline può essere attivata manualmente o impostata per l’esecuzione automatica quando si verificano eventi come i push sul branch.

  • Trigger manuale: clicca su Run Pipeline nell’interfaccia di Azure DevOps per avviare manualmente la pipeline.

Pulsante Run Pipeline nell’interfaccia di Azure DevOps, usato per avviare manualmente l’esecuzione della pipeline.

  • Trigger automatico: imposta i trigger basati sugli eventi del repository in modo che i push sul branch main attivino automaticamente la pipeline. Ecco un esempio:
trigger:
- main

Dopo aver eseguito la pipeline, puoi visualizzare i log e risolvere eventuali problemi.

Per accedere ai log, vai al riepilogo dell’esecuzione della pipeline e seleziona il job o il task specifico. Verranno mostrati i log per quel passaggio; come nell’immagine seguente, puoi scegliere qualsiasi job (Build, Push o Update) per visualizzare i log grezzi.

Riepilogo dell’esecuzione della pipeline che mostra le opzioni dei job (Build, Push, Update) per accedere ai log grezzi di ogni passaggio.

Riepilogo dell’esecuzione della pipeline che mostra le opzioni dei job (Build, Push, Update) per accedere ai log grezzi di ogni passaggio.

Per risolvere i problemi comuni, puoi verificare la pipeline per problemi frequenti come timeout, vincoli di risorse o errori di configurazione.

Aggiungere test alla tua pipeline

Aggiungi i test alla pipeline per garantire la qualità del codice e intercettare i problemi nelle prime fasi di sviluppo. In Azure Pipelines puoi integrare unit test, test di integrazione o altri test aggiungendo passaggi nella configurazione della pipeline.

Configurare i passaggi di test

Includi passaggi di test nella pipeline per garantire la qualità del codice. Puoi usare framework popolari come Jest, Mocha o NUnit. Ad esempio, ecco come aggiungere unit test con Jest:

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

Visualizzare i risultati dei test

Azure Pipelines include reportistica test integrata. Puoi configurare la pubblicazione dei risultati dei test per un tracciamento più semplice e visualizzare i risultati nei log della pipeline. Ecco come fare:

  • Innanzitutto, vai su Builds > Test Results.
  • Per pubblicare i risultati dei test, usa il task PublishTestResults@2 per mostrarli. Questo rende più semplice il tracciamento complessivo. Ad esempio:
- task: PublishTestResults@2
  inputs:
    testResultsFiles: '**/test-results.xml'
    testRunTitle: 'Unit Tests'

Distribuire con Azure Pipelines

Nei passaggi di deployment del tuo file YAML di Azure Pipeline, puoi distribuire automaticamente la tua applicazione in diversi ambienti, come test, staging e produzione. In questa sezione esamineremo alcuni modi per distribuire con Azure Pipelines.

Distribuire su Azure Web Apps

Azure Web Apps è un servizio nel portale Azure che consente di sviluppare, distribuire e gestire applicazioni web su larga scala. 

Per distribuire su Azure Web Apps, devi collegare i due servizi. Ecco come fare:

  • In basso a sinistra del tuo progetto, vai su Project Settings e clicca su Service Connections nella sezione Pipelines. 

Interfaccia di Azure DevOps che mostra l’opzione Project Settings nell’angolo in basso a sinistra per collegare i servizi Azure.

Naviga nella sezione Pipelines:

Clicca su Service Connections nella sezione Pipelines.

Questo passaggio ti aiuta a collegarti ai servizi Azure, migliorando le funzionalità e le integrazioni del tuo progetto.

  • Clicca su New Service Connection e scegli Azure Resource Manager. 

Configura una nuova service connection:

Clicca su New Service Connection.

Questo processo semplice ti aiuta a connetterti alle risorse Azure, migliorando le funzionalità del tuo progetto.

Configura una nuova service connection:

Scegli Azure Resource Manager.

Questo processo semplice ti aiuta a connetterti alle risorse Azure, migliorando le funzionalità del tuo progetto.

  • Autenticati con il tuo account Azure.
  • Distribuisci su Azure App Service:
    • Torna alle tue Pipelines e configura la pipeline.
    • Nella pipeline, aggiungi un task per distribuire su Azure.
    • Specifica il resource group e i dettagli del servizio. 

Ecco un esempio di pipeline YAML di deployment per una semplice app Node.js su 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)'

Analizziamo il codice sopra, così potrai adattarlo al tuo caso d’uso:

  • Sostituisci your-azure-subscription con il nome della service connection che fornisce l’accesso alla tua sottoscrizione Azure.
  • Sostituisci your-app-name con il nome effettivo della tua web app in Azure. 
  • Sostituisci $(Build.ArtifactStagingDirectory) con la directory in cui inserire il pacchetto o i file della web app per la distribuzione. $(Build.ArtifactStagingDirectory) — Questa variabile punta alla cartella in cui si trovano gli artifact di build (i file della tua app) dopo la compilazione.

Impostare la distribuzione continua (CD)

Una volta che tutto il nostro codice supera test e verifiche, il passo successivo è impostare la distribuzione continua. Segui i passaggi descritti di seguito.

Modello di Azure Release Pipeline che mostra le origini degli artifact che alimentano la release pipeline per la distribuzione.

Modello di distribuzione della release pipeline di Azure (Fonte: Microsoft)

  • Crea una release pipeline:
    • Vai su Pipelines > Releases e clicca su New Pipeline.

Interfaccia di Azure DevOps che mostra il percorso per creare una release pipeline navigando su Pipelines > Releases e selezionando New Pipeline.

Creare una release pipeline in Azure DevOps è semplice:

Nel menu a sinistra, vai su Pipelines.

Clicca su Releases.

Poi seleziona New Pipeline per iniziare a impostare il processo di rilascio.

Questa interfaccia intuitiva ti aiuta a gestire e automatizzare in modo efficiente i workflow di rilascio.

  • Seleziona il template Azure App Service Deployment.

Interfaccia di Azure DevOps che mostra l’opzione per selezionare il template Azure App Service Deployment per l’impostazione della release pipeline.

  • Configura gli ambienti:
    • Aggiungi e configura gli ambienti Dev, Staging, QA e Production in cui vuoi distribuire la tua applicazione.

Interfaccia di Azure DevOps che mostra ambienti configurati come Dev, Staging, QA e Production per la distribuzione delle applicazioni.

  • Collega l’artifact dalla tua build pipeline come sorgente per la release pipeline selezionando Add an artifact.

Interfaccia di Azure DevOps che mostra l’opzione per aggiungere un artifact dalla build pipeline come sorgente per l’impostazione della release pipeline.

  • Configura approvazioni e gate:
    • È necessario impostare approvazioni pre-distribuzione per gli ambienti sensibili, come la produzione. Ad esempio, potrebbe essere richiesta l’approvazione di un team lead. Puoi anche aggiungere gate come test automatici o controlli di monitoraggio per assicurarti che la distribuzione soddisfi gli standard di qualità.

Per la mia esperienza, questa fase è necessaria per mantenere la stabilità in ambienti di sviluppo impegnativi. Approvazioni e gate forniscono controllo e garantiscono che solo codice di alta qualità arrivi in produzione.

Distribuire su Kubernetes

Kubernetes semplifica l’esecuzione di applicazioni containerizzate affidabili e scalabili. Usando Azure Kubernetes Service (AKS), ottieni un ambiente gestito che semplifica distribuzione e operazioni. In questa sezione ti mostrerò come distribuire la tua applicazione su AKS usando Azure Pipelines.

Prepara il tuo cluster AKS

Puoi creare un cluster AKS usando il portale Azure o la CLI. Ecco un semplice comando Bash CLI per effettuare il provisioning del cluster:

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

Analizziamo il comando sopra:

  • --resource-group: indica il resource group di Azure in cui verrà creato il cluster AKS.
  • --name: si riferisce al nome del tuo cluster AKS.
  • --node-count: imposta il numero di nodi nel cluster (ad es., 3 in questo esempio).
  • --enable-addons monitoring: abilita monitoraggio e analisi con Azure Monitor for Containers.
  • --generate-ssh-keys: genera automaticamente le chiavi SSH per un accesso sicuro ai nodi, se non fornite.

Non dimenticare di sostituire <ResourceGroupName> e <AKSClusterName> con i nomi effettivi del tuo resource group e cluster.

Dopo aver configurato il cluster AKS, è necessario configurare kubectl. Questo assicura che l’agente della pipeline o il tuo computer locale possano usare kubectl per comunicare con il cluster.

Puoi velocizzare le attività su Azure usando strumenti da riga di comando—questo cheat sheet di Azure CLI è un pratico riferimento.

Crea un file YAML di deployment 

Prendiamo un file YAML di deployment di base per distribuire un’immagine Docker su Kubernetes come esempio:

# 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.

Distribuire usando Azure Pipelines

Nella tua pipeline YAML, includi un task per distribuire su 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

Fai commit e push del file YAML per attivare il deployment.

AKS semplifica l’orchestrazione dei container, facilitando la gestione di scaling, aggiornamenti e rollback. Per la mia esperienza, è imprescindibile per le moderne applicazioni cloud-native.

Ottimizzare e monitorare le tue pipeline

All’inizio della mia carriera, costruire pipeline non era la sfida più grande—avere una pipeline veloce e affidabile lo era. Una pipeline ben ottimizzata non solo rende le build più rapide; riduce anche la frustrazione del team, abbassa i rischi di distribuzione e accelera la consegna. 

Condividerò alcuni suggerimenti e strategie che puoi usare per mantenere le tue Azure DevOps Pipelines veloci, ordinate e affidabili.

Caching della pipeline

L’installazione delle dipendenze è un altro collo di bottiglia comune. Che tu stia lavorando con npm, .NET o altri package manager, scaricare ripetutamente le stesse dipendenze può far perdere molto tempo. Mettere in cache dipendenze e artifact tra un’esecuzione e l’altra riduce drasticamente i tempi. 

Ecco come mettere in cache le dipendenze in Azure Pipelines.

Per prima cosa, devi identificare i package manager, come:

  • Node.js (node_modules)
  • Pacchetti NuGet
  • Python (pacchetti pip)
  • Dipendenze Maven/Gradle

Azure Pipelines supporta meccanismi di caching, come il task Cache@2, che ti consente di memorizzare in cache le dipendenze tra le esecuzioni della pipeline. 

Vediamo un semplice caching per Node.js come esempio:

# 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'

Puoi quindi saltare l’installazione se la cache è presente. È un controllo intelligente prima di completare l’installazione di npm. È una logica efficiente basata su condizioni.

Vediamo un semplice esempio qui sotto:

# 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.

Questo esempio di caching semplice per un’applicazione Node.js salva la directory della cache npm usando package-lock.json come chiave. Quando le tue dipendenze non cambiano, le ripristina, risparmiando minuti a ogni build. 

Ho visto il caching ridurre drasticamente i tempi di build, soprattutto in progetti grandi, ma solo se le chiavi della cache sono scelte con attenzione. In uno dei miei progetti passati, questo ha ridotto del 55% il tempo di build di un’applicazione Node.js.

Monitorare lo stato di salute della pipeline

Una pipeline di successo non riguarda solo i segni verdi, ma anche visibilità e feedback rapido. Quando qualcosa si rompe, vuoi che il tuo team lo sappia subito. Ecco come anticipare i problemi.

Come configurare i dashboard di Azure DevOps

Azure DevOps fornisce widget integrati per mostrare lo stato della pipeline, le esecuzioni recenti, i tassi di fallimento e le durate medie. 

  • Per prima cosa, vai su Dashboards nel tuo progetto.

Interfaccia di Azure DevOps che mostra la sezione Dashboards con widget integrati per stato della pipeline, esecuzioni recenti, tassi di fallimento e durate medie.

  • Poi clicca su New Dashboard o usa uno esistente.

Interfaccia di Azure DevOps che mostra l’opzione per creare un nuovo dashboard o selezionarne uno esistente nella sezione Dashboards.

  • Puoi aggiungere widget come: Build History, Release Pipeline Overview, Test Results Trend e altro.

Interfaccia di Azure DevOps che mostra le opzioni per aggiungere widget come Build History, Release Pipeline Overview e Test Results Trend.

Sono fondamentali per tracciare i trend pass/fail, vedere quali ambienti sono problematici e altro ancora.

Configurare avvisi per pipeline fallite

  • In basso a sinistra del tuo progetto, vai su Project Settings.

Interfaccia di Azure DevOps che mostra l’opzione Project Settings nell’angolo in basso a sinistra per configurare avvisi per pipeline fallite.

  • Clicca su Notifications.

Interfaccia di Azure DevOps che mostra l’opzione Notifications per configurare gli avvisi della pipeline.

  • Poi clicca su New Subscription.

Interfaccia di Azure DevOps che mostra l’opzione per creare una nuova sottoscrizione per le notifiche nella sezione Notifications.

Facciamo uno scenario: nella sezione Category seleziona Build; nella sezione Template seleziona  “A build fails”, e clicca su Next.

Avrai un’interfaccia come quella qui sotto:

Interfaccia di Azure DevOps che mostra la sezione Category con 'Build' selezionato e la sezione Template con 'A build fails' scelta per creare una sottoscrizione di notifica.

  • Infine, clicca su Finish.
  • Nella sezione Notifications puoi controllare la descrizione Build per la notifica “A build fails” che abbiamo creato in precedenza. 

Interfaccia di Azure DevOps che mostra la sezione Notifications con la descrizione Build per la notifica 'A build fails' creata in precedenza.

Una volta ho mancato un errore critico di distribuzione perché gli avvisi non erano configurati. Da allora, imposto e configuro sempre gli avvisi di team per ogni distribuzione in produzione. Così non mi perdo mai una build rotta o un ritardo nel ciclo di rilascio.

Analizzare le prestazioni della pipeline

Sappiamo che anche se la tua pipeline funziona, potrebbe essere lenta, e le pipeline lente uccidono la produttività. Identificare i colli di bottiglia per tempo evita problemi più avanti.

Le metriche della pipeline fanno luce sulle prestazioni di build e deployment. Ecco come raggiungerle. 

Per prima cosa, devi abilitare le Analytics Views nelle impostazioni del progetto e collegarti a Power BI o esplorare tramite grafici integrati.

Monitorare lo stato di salute della pipeline

  • Nella sezione Pipelines, vai su Analytics. 
  • Visualizza metriche come tasso di successo della pipeline, tasso di successo dei test e durata della pipeline.

Monitora lo stato della pipeline:

Vai su Pipelines, poi seleziona Analytics.

Visualizza metriche importanti come tasso di successo della pipeline, tasso di successo dei test e durata della pipeline.

Questa funzione ti aiuta a tenere traccia delle prestazioni della pipeline e a garantire che tutto funzioni senza intoppi.

Esploriamo ulteriormente quali metriche chiave possiamo monitorare in analytics e perché sono importanti:

Metrica

Perché è importante

Trend della durata delle build

Aiuta a individuare facilmente i rallentamenti nel tempo.

Tasso di fallimento per branch

Aiuta a identificare le feature instabili.

Tempo in coda

Aiuta a rilevare carenze di agent.

Qualche mese fa ho lavorato sulla pipeline di un cliente e ciò che mi ha colpito di più è stato il Tempo in coda. Ho scoperto che il mio team e io avevamo sovraccaricato un pool di agent self-hosted, e il 40% del tempo della pipeline veniva speso in attesa di un runner disponibile. Nessuno se lo aspettava finché le analytics non lo hanno reso evidente.

Abbiamo risolto aggiungendo due agent self-hosted e distribuendo il carico per tipo di job. I risultati sono stati immediati; il tempo medio di build della pipeline è sceso di circa il 35%.

Monitorare usando i log

Oltre alle metriche, i timeline log sono oro, soprattutto per i task di lunga durata. Nel corso degli anni ho preso l’abitudine di aggiungere marker di log personalizzati all’interno dei passaggi critici degli script per individuare esattamente i ritardi.

Ecco un semplice esempio:

# 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.

Best practice per Azure Pipelines

Ora che abbiamo visto i servizi core di Azure Pipelines e molto altro, vediamo come ottenere il massimo seguendo queste best practice. 

Passiamo dalle prestazioni alla struttura, perché una pipeline veloce ma difficile da mantenere finirà comunque per danneggiare qualsiasi team.

Organizzare le pipeline per i team

Quando più team o ambienti condividono pipeline, spesso si crea confusione. Serve struttura. Un’unica grande pipeline per ambienti di sviluppo, staging e produzione porta al caos. 

Per organizzare la tua pipeline, devi separarla per ambienti. Vediamo una semplice struttura qui sotto. 

Ambiente

Nome pipeline

Trigger

Sviluppo

dev.yml

Feature branch (Esegue su ogni commit)

Staging

staging.yml

Pull request → Staging (Trigger manuale)

Produzione

prod.yml

Manuale o release pipeline (Richiede approvazione)

Cose chiave da capire da questa semplice struttura:

  • Ogni file richiama template condivisi.
  • Ogni file usa variabili specifiche per l’ambiente.
  • Ogni file controlla l’accesso tramite permessi della pipeline.

Per esperienza, questa separazione rende il debug più semplice e consente agli sviluppatori junior di distribuire in Dev senza rischiare l’ambiente di Produzione.

Usare template e codice riutilizzabile

DevOps significa ridurre il lavoro manuale e migliorare l’automazione lungo tutto il processo di sviluppo software. 

Il codice YAML è soggetto a errori quando viene copiato e incollato tra progetti. Azure DevOps dispone di template di pipeline per una configurazione DRY (Don’t Repeat Yourself) tramite pipeline YAML. Puoi riutilizzare i template YAML della pipeline in più progetti, progettare le pipeline in modo coerente e persino ridurre i tempi di elaborazione della pipeline.

Vediamo un semplice template di build riutilizzabile come esempio.

Per prima cosa, definisci il tuo template di build, 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.

Usa il template di build nella tua pipeline principale:

# 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.

Gestire secret e variabili

Quando lavori su progetti, soprattutto in ambienti collaborativi, è comune usare informazioni sensibili come stringhe di connessione ai database, API key, password o token. Se questi secret sono hardcoded nel codice o esposti nei log, possono essere facilmente compromessi.

Vediamo come gestire in modo sicuro i nostri secret e variabili usando i secret di Azure Pipelines e i variable group.

Passo 1: Creare un variable group

  • Clicca sulla scheda Pipelines nella sidebar a sinistra.
  • Nella sezione Pipelines, clicca su Library.

Interfaccia di Azure DevOps che mostra la scheda Pipelines nella barra laterale sinistra e l’opzione Library all’interno della sezione Pipelines.

  • Crea un variable group:
    • Clicca sulla scheda Variable groups.

Crea facilmente un nuovo variable group:

In Azure DevOps, vai su Pipelines, poi seleziona Library.

Crea un nuovo variable group.

Questo passaggio ti aiuta a gestire e organizzare le tue variabili per configurazioni di pipeline efficienti.

  • Clicca sul pulsante Add variable group.
  • Inserisci un nome per il variable group (ad es., MyAppSecrets).

Interfaccia di Azure DevOps che mostra il pulsante Add variable group e un campo per inserire il nome del variable group, ad esempio MyAppSecrets.

Passo 2: Aggiungere secret al variable group

  • Aggiungi variabili: 
    • Nel variable group, clicca su Add per creare una nuova variabile. 

Interfaccia di Azure DevOps che mostra l’opzione per aggiungere variabili all’interno di un variable group cliccando sul pulsante Add.

  • Inserisci il nome della variabile (ad es., DB_CONNECTION_STRING).
  • Seleziona la casella Keep this value secret per assicurarti che venga trattata come un secret. 
  • Inserisci il valore della variabile (ad es., la stringa di connessione del mio database).

Interfaccia di Azure DevOps che mostra i campi per inserire un nome di variabile (ad es., DB_CONNECTION_STRING), segnarla come secret e impostarne il valore (ad es., stringa di connessione del database).

  • Clicca su Save per salvare la variabile.

Interfaccia di Azure DevOps che mostra il pulsante Save usato per archiviare la variabile appena aggiunta nel variable group.

Passo 3: Usare i secret nella tua pipeline

Ora che hai creato un variable group con i secret, puoi usare queste variabili nel file YAML della tua pipeline.

  • Riferisci il variable group: aggiungi il variable group al file YAML della pipeline: 
variables:
- group: MyAppSecrets
  • Usa i secret nei tuoi passaggi: puoi referenziare i secret nei passaggi della pipeline usando la sintassi $(VariableName). Ecco un esempio di come usare DB_CONNECTION_STRING in uno step script:
# 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.

Passo 4: Eseguire la pipeline

  • Dopo aver salvato il file YAML, vai alla sezione Pipelines e clicca su Run Pipeline.
  • Dopo l’esecuzione della pipeline, puoi controllare i log. Noterai che il valore del secret è nascosto, mantenendo al sicuro le tue informazioni sensibili.

Conclusione

In questo tutorial abbiamo percorso l’intero viaggio di utilizzo di Azure Pipelines—dalla configurazione della prima pipeline alla build, al test, alla distribuzione, al monitoraggio e all’ottimizzazione.

La fase di deployment richiede pratica. Inizia in modo semplice, continua a migliorare e con il tempo acquisirai sicurezza e dimestichezza nella gestione dei workflow CI/CD. Azure Pipelines ti fornisce gli strumenti; tu ci metti iterazione e apprendimento.

Con costanza, puoi rendere più snello il tuo processo di sviluppo e diventare sicuro nel distribuire software di alta qualità su larga scala.

Per approfondire Azure DevOps e Microsoft Azure, dai un’occhiata alle seguenti risorse: 

FAQ

Posso usare Azure Pipelines per progetti non Azure?

Sì. Azure Pipelines supporta distribuzioni on-premise e in vari ambienti cloud come AWS, GCP e molti altri.

Quali linguaggi di programmazione supporta Azure Pipelines?

Azure Pipelines supporta molti linguaggi di programmazione, tra cui Node.js, Python, Java, .NET e molti altri.

Qual è la differenza tra Azure Pipelines e GitHub Actions?

Azure Pipelines offre un’integrazione più profonda con l’ecosistema Azure e strumenti di distribuzione solidi, mentre GitHub Actions fornisce un’esperienza CI/CD più semplice e nativa di GitHub. Entrambi supportano workflow YAML e distribuzioni containerizzate.

Posso usare Azure Pipelines con tecnologie non Microsoft come Python o Java?

Sì, Azure Pipelines supporta tutte le principali piattaforme e linguaggi, tra cui Python, Java, Node.js e altro. Puoi configurare build e distribuzioni per qualsiasi stack tecnologico usando YAML.

Azure Pipelines è gratuito?

Azure Pipelines offre un livello gratuito con 1.800 minuti/mese per progetti pubblici e tempo di build limitato per quelli privati. Per uso aggiuntivo serve un piano a pagamento o agent self-hosted.

Cosa sono le Service Connections di Azure DevOps e perché sono importanti?

Le Service Connections collegano in modo sicuro Azure Pipelines a servizi esterni come Azure Web Apps o cluster Kubernetes. Sono essenziali per distribuzioni automatiche e gestione dell’infrastruttura.

Come si confronta Azure Pipelines con Jenkins o CircleCI?

Azure Pipelines offre un’esperienza più integrata per gli utenti Azure e un supporto migliore per i servizi Microsoft. Jenkins è più personalizzabile ma richiede più configurazione; CircleCI eccelle in velocità e parallelismo.


Emmanuel Akor's photo
Author
Emmanuel Akor
LinkedIn
Twitter

Emmanuel Akor è un Cloud & DevOps Engineer con esperienza nell’utilizzo di tecnologie cloud e strumenti DevOps per realizzare progetti di impatto. Laureato con il massimo dei voti in Informatica alla Babcock University ed ex Cloud Co-Lead per GDSC, Emmanuel unisce l’eccellenza accademica all’esperienza pratica. Come Technical Content Writer, eccelle nella condivisione della conoscenza e nella collaborazione con i team.

Argomenti
Azure
Cloud

Scopri di più su Azure con questi corsi!

Corso

Capire Microsoft Azure

3 ore
50.7K
Scopri quanto sono potenti Microsoft Azure e il software di cloud computing per aiutarti a migliorare le tue abilità nell'ingegneria dei dati.
Vedi i dettagliRight Arrow
Inizia Il Corso
Mostra altroRight Arrow
Correlato

blog

Che cos'è Snowflake? Guida per principianti alla piattaforma dati cloud

Esplora le basi di Snowflake, la piattaforma dati cloud. Scopri la sua architettura, le sue funzionalità e come integrarla nelle tue pipeline di dati.
Tim Lu's photo

Tim Lu

12 min

blog

I 15 migliori server MCP remoti che ogni AI builder dovrebbe conoscere nel 2026

Scopri i 15 migliori server MCP remoti che stanno trasformando lo sviluppo AI nel 2026. Scopri come migliorano automazione, ragionamento, sicurezza e velocità dei workflow.
Abid Ali Awan's photo

Abid Ali Awan

15 min

blog

Tokenizzazione nel NLP: come funziona, sfide e casi d'uso

Guida al preprocessing NLP nel machine learning. Copriamo spaCy, i transformer di Hugging Face e come funziona la tokenizzazione in casi d'uso reali.
Abid Ali Awan's photo

Abid Ali Awan

10 min

Mostra AltroMostra Altro