Corso
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:
- Creare la tua prima Azure Pipeline
- Effettuare la build del tuo progetto nel cloud
- Aggiungere test automatici per intercettare gli errori in anticipo
- Distribuire in staging o produzione con un solo push
- Monitorare e ottimizzare la pipeline per velocità e affidabilità
- 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.

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

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

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



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.


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

- 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
.yamlo.ymlnel 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:
- Installa Node.js: usa il task
NodeTool@0per specificare la versione di Node.js. - Installa le dipendenze: esegui
npm installper installare le dipendenze del progetto. - Compila il codice (build del progetto): esegui
npm run buildper 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.

- Trigger automatico: imposta i trigger basati sugli eventi del repository in modo che i push sul branch
mainattivino 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.


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@2per 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.


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


- 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-subscriptioncon il nome della service connection che fornisce l’accesso alla tua sottoscrizione Azure. - Sostituisci
your-app-namecon 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 distribuzione della release pipeline di Azure (Fonte: Microsoft)
- Crea una release pipeline:
- Vai su Pipelines > Releases e clicca su New Pipeline.


- Seleziona il template Azure App Service Deployment.

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

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

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

- Poi clicca su New Dashboard o usa uno esistente.

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

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.

- Clicca su Notifications.

- Poi clicca su New Subscription.

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:

- Infine, clicca su Finish.
- Nella sezione Notifications puoi controllare la descrizione Build per la notifica “A build fails” che abbiamo creato 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.

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 |
|
Feature branch (Esegue su ogni commit) |
|
Staging |
|
Pull request → Staging (Trigger manuale) |
|
Produzione |
|
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.

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

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

Passo 2: Aggiungere secret al variable group
- Aggiungi variabili:
- Nel variable group, clicca su Add per creare una nuova variabile.

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

- Clicca su Save per salvare la variabile.

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 usareDB_CONNECTION_STRINGin 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:
- Azure DevOps Tutorial - Questo tutorial ti guida attraverso Azure DevOps, rendendo la CI/CD più semplice che mai.
- Understanding Microsoft Azure – Costruisci solide basi su Microsoft Azure e libera la potenza del cloud computing.
- Microsoft Azure Fundamentals (AZ-900) – Preparati all’esame con questo percorso per principianti che copre tutti i fondamenti di Azure.
- Understanding Microsoft Azure Architecture and Services – Scopri come l’architettura e i servizi di Azure lavorano insieme per alimentare soluzioni cloud.
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 è 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.


