(DEPRECATO) Pipeline CI/CD completa per distribuire un'applicazione multi-contenitore nel servizio Azure Container con Docker Swarm usando Azure DevOps Services

Avviso

Il servizio Azure Container (ACS) è deprecato. Non saranno aggiunte nuove funzionalità al servizio Azure Container. Tutte le API, l'esperienza del portale, i comandi dell'interfaccia della riga di comando e la documentazione sono contrassegnate come deprecate.

Per altre informazioni, vedere l'annuncio di deprecazione del servizio Azure Container su Azure.com.

È consigliabile distribuire una delle soluzioni di Azure Marketplace seguenti:

Se si vuole usare Kubernetes, vedere Servizio Azure Kubernetes.

Una delle sfide principali quando si sviluppano applicazioni moderne per il cloud è quella di riuscire a distribuire le applicazioni in modo continuativo. In questo articolo viene descritto come implementare una pipeline completa di distribuzione e di integrazione continua (CI/CD) tramite il servizio Azure Container con Docker Swarm, Registro Azure Container e la gestione Azure Pipelines.

Applicazione MyShop di esempio

L'obiettivo è distribuire l'applicazione in modo continuativo in un cluster Docker Swarm, tramite Azure DevOps Services. Nell'immagine seguente sono illustrati i dettagli della pipeline di distribuzione continuativa:

Applicazione MyShop di esempio

Una breve spiegazione dei passaggi:

  1. Viene eseguito il commit delle modifiche al codice nel repository del codice sorgente (in questo caso GitHub)
  2. GitHub attiva una compilazione in Azure DevOps Services
  3. Ottenere la versione più recente delle origini e compilare tutte le immagini che compongono l'applicazione di servizi di Azure DevOps
  4. Servizi di Azure DevOps effettua il push di ogni immagine in un registro Docker creato con il servizio Registro Azure Container
  5. Azure DevOps Services attiva un nuovo rilascio
  6. Il rilascio esegue alcuni comandi tramite SSH nel nodo principale del cluster del servizio Azure Container
  7. Docker Swarm nel cluster effettua il pull della versione più recente delle immagini
  8. La nuova versione dell'applicazione viene distribuita mediante Docker Compose

Prerequisiti

Prima di iniziare questa esercitazione, è necessario soddisfare i requisiti seguenti:

Nota

L'agente di orchestrazione Docker Swarm nel servizio Azure Container usa Swarm autonomo legacy. La modalità Swarm integrata (in Docker 1.12 e versioni successive) attualmente non è un agente di orchestrazione supportato nel servizio Azure Container. Per distribuire un cluster in modalità Swarm in Azure, usare il motore ACS open source, un modello di avvio rapido creato dalla community, o una soluzione Docker in Azure Marketplace.

È inoltre necessario disporre di un computer Ubuntu (14.04 o 16.04) con Docker. Il computer viene usato da servizi Azure DevOps Services durante i processi Azure Pipelines. Un modo per creare questo computer consiste nell'usare l'immagine disponibile in Azure Marketplace.

Passaggio 1: Configurare l'organizzazione di Azure DevOps Services

In questa sezione si configura l'organizzazione di Azure DevOps Services.

Configurare un agente di compilazione Linux di Azure DevOps Services

Per creare immagini Docker ed effettuare il push in Registro Azure Container da una compilazione di Azure DevOps Services, è necessario registrare un agente Linux. Sono disponibili queste opzioni di installazione:

Installare l'estensione Integrazione di Docker in Azure DevOps Services

Microsoft fornisce un'estensione di Azure DevOps Services per lavorare con Docker nei processi di Azure Pipelines. Questa estensione è disponibile nel Marketplace di Azure DevOps Services. Fare clic su Installa per aggiungere questa estensione per l'organizzazione di Azure DevOps Services:

Installare Docker Integration

Viene chiesto di connettersi all'organizzazione di Azure DevOps Services con le credenziali.

Connettere Azure DevOps Services e GitHub

Configurare una connessione tra il progetto di Azure DevOps Services e l'account GitHub.

  1. Nel progetto di Azure DevOps Services, fare clic sull'icona Impostazioni nella barra degli strumenti e selezionare Servizi.

    Azure DevOps Services - Connessione esterna

  2. A sinistra fare clic su Nuovo endpoint> di servizioGitHub.

    Azure DevOps Services - GitHub

  3. Per autorizzare Azure DevOps Services a lavorare con il proprio account GitHub, fare clic su Autorizza e seguire la procedura nella finestra visualizzata.

    Azure DevOps Services - Autorizzare GitHub

Connettere Azure DevOps Services al Registro Azure Container e a un cluster del servizio Azure Container

Gli ultimi passaggi prima di approfondire la pipeline CI/CD consistono nel configurare le connessioni esterne nel registro contenitori e nel cluster Docker Swarm in Azure.

  1. Nelle impostazioni Servizi del progetto di Azure DevOps Services, aggiungere un endpoint di servizio di tipo registro Docker.

  2. Nel popup che viene visualizzato immettere l'URL e le credenziali del Registro Azure Container.

    Azure DevOps Services - Registro Docker

  3. Per il cluster Docker Swarm, aggiungere un endpoint di tipo SSH. Successivamente, immettere le informazioni di connessione SSH del cluster Swarm.

    Azure DevOps Services - SSH

Tutti i passaggi di configurazione vengono eseguiti ora. Nei passaggi successivi viene creata la pipeline CI/CD che compila e distribuisce l'applicazione al cluster Docker Swarm.

Passaggio 2: creare la pipeline di compilazione

In questo passaggio, viene impostata una pipeline di compilazione per il progetto di Azure DevOps Services e viene definito il flusso di lavoro di compilazione per le immagini contenitore

Configurazione iniziale della pipeline

  1. Per creare una pipeline di compilazione, connettersi al progetto di Azure DevOps Services e fare clic su Compila e rilascia.

  2. Nella sezione Definizione di compilazione fare clic su + New (+Nuova). Selezionare il modello Vuoto.

    Azure DevOps - Nuova pipeline di compilazione

  3. Configurare la nuova compilazione con un'origine di repository GitHub, selezionare Integrazione continua, quindi scegliere la coda dell'agente in cui è registrato l'agente Linux. Fare clic su Crea per creare la pipeline di compilazione.

    Azure DevOps Services - Creazione della pipeline di compilazione

  4. Nella pagina Definizioni di compilazione innanzitutto aprire la scheda Repository e configurare la compilazione in modo che usi la fork del progetto MyShop creata nei prerequisiti. Assicurarsi di selezionare acs-docs come ramo predefinito.

    Azure DevOps Services - Configurazione del Repository di compilazione

  5. Nella scheda Trigger configurare la compilazione in modo che venga attivata dopo ciascun commit. Selezionare Integrazione continua e Modifiche bacth.

    Azure DevOps Services - Configurazione del trigger di compilazione

Definire il flusso di lavoro di compilazione

Nei passaggi successivi viene definito il flusso di lavoro di compilazione. Esistono cinque immagini contenitore per la compilazione dell'applicazione MyShop. Ogni immagine viene compilata attraverso il file Docker che si trova nelle cartelle del progetto:

  • ProductsApi
  • Proxy
  • RatingsApi
  • RecommendationsApi
  • ShopFront

È necessario aggiungere due passaggi di Docker per ogni immagine, uno per compilare l'immagine, l'altro per effettuare il push dell'immagine nel Registro Azure Container.

  1. Per aggiungere un passaggio nel flusso di lavoro di compilazione fare clic su + Aggiungi istruzione di compilazione e selezionare Docker.

    Azure DevOps Services - Aggiunta di passaggi di compilazione

  2. Per ogni immagine, configurare un passaggio che usi il comando docker build.

    Azure DevOps Services - Registro Docker

    Per l'operazione di compilazione, selezionare il Registro Azure Container, l'azione Compila un'immagine e il Dockerfile che definisce ogni immagine. Impostare Build context (Contesto compilazione) come directory radice del file Docker e definire Nome immagine.

    Come mostrato nella schermata precedente, il nome dell'immagine deve iniziare con l'URI del Registro Azure Container. È anche possibile usare una variabile di compilazione per assegnare parametri al tag dell'immagine, in questo esempio l'identificatore di compilazione.

  3. Per ogni immagine, configurare un secondo passaggio che usi il comando docker push.

    Azure DevOps Services - Effettuazione del push di Docker

    Per l'operazione di push, selezionare il Registro Azure Container, l'azione Push an image (Push immagine) e immettere il nome dell'immagine compilato nel passaggio precedente.

  4. Dopo aver configurato i passaggi di compilazione e push per ognuna delle cinque immagini, aggiungere altri due passaggi nel flusso di lavoro di compilazione.

    a. Attività della riga di comando che usa uno script bash per sostituire l'occorrenza buildNumber nel file docker-compose.yml con l'ID di compilazione corrente. Per informazioni dettagliate, vedere la schermata seguente.

    Azure DevOps Services- Aggiornamento del file Compose

    b. Un'attività che rimuove il file Compose aggiornato come elemento di compilazione per poterlo usare nel rilascio. Vedere i dettagli nella schermata di seguito.

    Azure DevOps Services - Pubblicazione del file Compose

  5. Fare clic su Salva e assegnare un nome alla pipeline di compilazione.

Passaggio 3: Creare la pipeline di versione

Servizi di Azure DevOps consente di gestire le versioni in vari ambienti. È possibile abilitare la distribuzione continua per assicurarsi che l'applicazione venga distribuita in ambienti diversi (ad esempio sviluppo, test, preproduzione e produzione) in modo uniforme. È possibile creare un nuovo ambiente che rappresenti il cluster Docker Swarm del servizio Azure Container.

Azure DevOps Services - Rilascio su ACS

Configurazione iniziale del rilascio

  1. Per creare una pipeline di versione, fare clic su Release>+ Release

  2. Per configurare l'origine dell'artefatto, fare clic su Artefatti>Collegare un'origine artefatto. In questo caso, è possibile collegare questa nuova pipeline di versione alla compilazione definita nel passaggio precedente. In questo modo, il file docker-compose.yml è disponibile nel processo di rilascio.

    Azure DevOps Services - Rilascio di artefatti

  3. Per configurare il trigger di rilascio, fare clic su Trigger e selezionare Distribuzione continua. Impostare il trigger sulla stessa origine dell'elemento. Questa impostazione garantisce che un nuovo rilascio venga avviato non appena la compilazione viene completata correttamente.

    Azure DevOps Services - Rilascio dei trigger

Definire il flusso di lavoro di rilascio

Il flusso di lavoro di rilascio è composto da due attività che vengono aggiunte.

  1. Configurare un'attività per copiare in modo sicuro il file Compose in una cartella di distribuzione nel nodo master Docker Swarm, tramite la connessione SSH configurata in precedenza. Vedere i dettagli nella schermata di seguito.

    Servizi di Azure DevOps - Rilascio SCP

  2. Configurare una seconda attività in modo che esegua un comando bash per i comandi docker e docker-compose nel nodo principale. Vedere i dettagli nella schermata di seguito.

    Azure DevOps Services- Rilascio di Bash

    Il comando eseguito nel nodo principale usa l'interfaccia della riga di comando di Docker e Docker-Compose per eseguire le attività seguenti:

    • Accedere al Registro Azure Container (usa tre variabili di compilazione definite nella scheda Variabili )

    • Definire la variabile DOCKER_HOST in modo che sia compatibile con l'endpoint Swarm (:2375)

    • Accedere alla cartella di distribuzione che è stata creata dall'attività di copia sicura precedente e che contiene il file docker-compose.yml

    • Eseguire i comandi docker-compose che effettuano il pull di nuove immagini, interrompono e rimuovono i servizi e creano i contenitori.

      Importante

      Come illustrato nella schermata precedente, lasciare deselezionata la casella Interrompi in caso di STDERR. Questa è un'impostazione importante, perché docker-compose stampa diversi messaggi di diagnostica, ad esempio in caso di contenitori arrestati o in fase di eliminazione, nell'output di errore standard. Se si seleziona la casella di controllo, Azure DevOps Services segnala che si sono verificati errori durante il rilascio, anche se tutto va bene.

  3. Salvare la nuova pipeline di versione.

Nota

Questa distribuzione include tempi di inattività perché vengono interrotti i servizi precedenti per eseguire quello nuovo. È possibile evitare il problema effettuando una distribuzione di tipo blu-verde.

Passaggio 4. Testare la pipeline CI/CD

Dopo aver completato la configurazione, è il momento di testare la nuova pipeline CI/CD. Il modo più semplice per eseguire il test consiste nell'aggiornare il codice sorgente ed eseguire il commit delle modifiche nel repository GitHub. Pochi secondi dopo aver effettuato il push del codice, verrà visualizzata una nuova compilazione in esecuzione in Azure DevOps Services. Dopo il suo completamento, verrà attivato un nuovo rilascio, che distribuirà la nuova versione dell'applicazione nel cluster del servizio Azure Container.

Passaggi successivi