1. Obiettivi
In questo tutorial creerai tre cluster GKE denominati preview, canary e prod. Poi, crea un target Cloud Deploy corrispondente a ogni cluster e una pipeline Cloud Deploy che definirà la sequenza di passaggi da eseguire per il deployment in questi target.
Il flusso di deployment verrà attivato da una pipeline cloudbuild che creerà la release di Cloud Deploy ed eseguirà il deployment nel cluster di anteprima. Dopo aver verificato che il deployment nell'anteprima sia andato a buon fine e funzioni come previsto, promuoverai manualmente la release nel cluster canary. La promozione della release nel cluster prod richiederà l'approvazione. Approverai la pipeline prod nell'interfaccia utente di Cloud Deploy e infine la promuoverai.
Gli obiettivi di questo tutorial possono essere suddivisi nei seguenti passaggi:
- Prepara il tuo workspace
- Definisci i target Cloud Deploy
- Definisci la pipeline Cloud Deploy
- Crea una release
- Promuovi un deployment
- Approva una release di produzione
Configurazione dell'ambiente autonomo
- Accedi alla console Google Cloud e crea un nuovo progetto o riutilizzane uno esistente. Se non hai ancora un account Gmail o Google Workspace, devi crearne uno.



- Il nome del progetto è il nome visualizzato per i partecipanti a questo progetto. È una stringa di caratteri non utilizzata dalle API di Google e puoi aggiornarla in qualsiasi momento.
- L'ID progetto deve essere univoco in tutti i progetti Google Cloud ed è immutabile (non può essere modificato dopo l'impostazione). La console Cloud genera automaticamente una stringa univoca; in genere non ti interessa quale sia. Nella maggior parte dei codelab, dovrai fare riferimento all'ID progetto (in genere identificato come
PROJECT_ID), quindi, se non ti piace, generane un altro casuale oppure puoi provare il tuo e verificare se è disponibile. Dopo la creazione del progetto, l'ID progetto viene "bloccato". - Esiste un terzo valore, un numero di progetto , utilizzato da alcune API. Scopri di più su tutti e tre i valori nella documentazione.
- Dopodiché, devi abilitare la fatturazione nella console Cloud per utilizzare le risorse/API Cloud. Completare questo codelab non dovrebbe costare molto, se non nulla. Per arrestare le risorse in modo da non incorrere in addebiti di fatturazione oltre questo tutorial, segui le istruzioni di "pulizia" riportate alla fine del codelab. I nuovi utenti di Google Cloud hanno diritto al programma di prova senza costi di 300$.
2. Configurazione della piattaforma
Preparazione del workspace
Qui configureremo l'ambiente necessario per eseguire questo tutorial. Al termine di questo passaggio, avremo creato un cluster GKE in cui potremo eseguire i deployment.
- Imposta i valori predefiniti di gcloud config
gcloud config set project <your project>
gcloud config set deploy/region us-central1
- Clona un repository
git clone https://github.com/gushob21/software-delivery-workshop
cd software-delivery-workshop/labs/cloud-deploy/
cloudshell workspace .
rm -rf deploy && mkdir deploy
- Imposta le variabili di ambiente
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects list --filter="$PROJECT_ID" --format="value(PROJECT_NUMBER)")
- Abilita le API
gcloud services enable \
cloudresourcemanager.googleapis.com \
`container.googleapis.com \`
`cloudbuild.googleapis.com \`
`containerregistry.googleapis.com \`
`secretmanager.googleapis.com \`
`clouddeploy.googleapis.com`
- Crea cluster GKE
`gcloud container clusters create preview \`
--zone=us-central1-a --async
`gcloud container clusters create canary \`
--zone=us-central1-b --async
`gcloud container clusters create prod \`
--zone=us-central1-c
Definizione dei target Cloud Deploy
- Crea un file nella directory deploy denominato preview.yaml con il seguente comando in Cloud Shell:
cat <<EOF >deploy/preview.yaml
apiVersion: deploy.cloud.google.com/v1beta1
kind: Target
metadata:
name: preview
annotations: {}
labels: {}
description: Target for preview environment
gke:
cluster: projects/$PROJECT_ID/locations/us-central1-a/clusters/preview
EOF
As you noticed, the "kind" tag is "Target". It allows us to add some metadata to the target, a description and finally the GKE cluster where the deployment is supposed to happen for this target.
- Crea un file nella directory deploy denominato canary.yaml con il seguente comando in Cloud Shell:
cat <<EOF >deploy/canary.yaml
apiVersion: deploy.cloud.google.com/v1beta1
kind: Target
metadata:
name: canary
annotations: {}
labels: {}
description: Target for canary environment
gke:
cluster: projects/$PROJECT_ID/locations/us-central1-b/clusters/canary
EOF
- Crea un file nella directory deploy denominato prod.yaml con il seguente comando in Cloud Shell:
cat <<EOF >deploy/prod.yaml
apiVersion: deploy.cloud.google.com/v1beta1
kind: Target
metadata:
name: prod
annotations: {}
labels: {}
description: Target for prod environment
requireApproval: true
gke:
cluster: projects/$PROJECT_ID/locations/us-central1-c/clusters/prod
EOF
Nota il tag requireApproval impostato su true. In questo modo, la promozione al target prod non sarà consentita finché non verrà concessa l'approvazione. Per approvare una release, devi disporre del ruolo roles/clouddeploy.approver.
- Crea i target di deployment
`gcloud config set deploy/region us-central1`
gcloud beta deploy apply --file deploy/preview.yaml
gcloud beta deploy apply --file deploy/canary.yaml
gcloud beta deploy apply --file deploy/prod.yaml
3. Creazione di app
Nell'ambito della creazione di una nuova applicazione, la pipeline CICD viene in genere configurata per eseguire build, test di integrazione e deployment automatici. I seguenti passaggi sono considerati parte della procedura di configurazione di una nuova app. Ogni nuova applicazione avrà una pipeline di deployment configurata.
Definizione della pipeline Cloud Deploy
- Crea un file nella directory deploy denominato pipeline.yaml con il seguente comando in Cloud Shell:
cat <<EOF >>deploy/pipeline.yaml
apiVersion: deploy.cloud.google.com/v1beta1
kind: DeliveryPipeline
metadata:
name: sample-app
labels:
`app: sample-app`
description: delivery pipeline
serialPipeline:
stages:
- targetId: preview
`profiles:`
`- preview`
- targetId: canary
`profiles:`
`- canary`
- targetId: prod
`profiles:`
`- prod`
EOF
As you noticed, the "kind" tag is "DeliveryPipeline". It lets you define the metadata for the pipeline, a description and an order of deployment into various targets via serialPipeline tag.
Il tag serialPipeline contiene un tag denominato stages, che è un elenco di tutti i target in cui è configurata la pipeline di distribuzione per il deployment.
targetId identifica il target specifico da utilizzare per questa fase della pipeline di distribuzione. Il valore è la proprietà metadata.name della definizione del target.
profiles è un elenco di zero o più nomi di profili Skaffold da skaffold.yaml. Cloud Deploy utilizza il profilo con skaffold render durante la creazione della release.
- Applica la pipeline
gcloud beta deploy apply --file deploy/pipeline.yaml
4. Fase di sviluppo
Man mano che le applicazioni vengono sviluppate, le toolchain CICD automatizzate creano e archiviano gli asset. I seguenti comandi vengono eseguiti per creare l'applicazione utilizzando Skaffold e archiviare gli asset per il deployment con Cloud Deploy. Questo passaggio viene eseguito dal processo CICD per ogni build dell'applicazione.
- Crea e archivia l'applicazione con Skaffold
skaffold build \
--file-output=artifacts.json \
--default-repo gcr.io/$PROJECT_ID \
--push=true
5. Fase di rilascio
Al termine del processo CICD, in genere quando il codice viene taggato per la produzione, avvii la procedura di rilascio chiamando il comando cloud deploy release. In un secondo momento, una volta convalidato e approvato il deployment, sposterai la release nei vari ambienti di destinazione promuovendo e approvando l'azione tramite processi automatizzati o approvazioni manuali.
Creazione di una release
In precedenza in questo tutorial abbiamo creato i file Cloud Deploy per comprendere il funzionamento di Cloud Deploy. Ai fini della demo, abbiamo creato gli stessi file Cloud Deploy e li abbiamo inviati a un repository GitHub con un'applicazione Go di esempio. Utilizzeremo Cloud Deploy per rilasciare l'applicazione.
export REL_TIMESTAMP=$(date '+%Y%m%d-%H%M%S')
gcloud beta deploy releases create \
sample-app-release-${REL_TIMESTAMP} \
--delivery-pipeline=sample-app \
--description="Release demo" \
--build-artifacts=artifacts.json \
--annotations="release-id=rel-${REL_TIMESTAMP}"
Esamina la release
Quando viene creata una release di Cloud Deploy, viene implementata automaticamente nel primo target, ovvero l'anteprima.
- Vai a <Cloud Deploy> nella console Google Cloud
- Fai clic su "sample-app"
In questa schermata vedrai una rappresentazione grafica della pipeline.
- Verifica che sia presente un contorno verde sul lato sinistro della casella di anteprima, il che significa che la release è stata eseguita in quell'ambiente.
- (Facoltativo) Esamina ulteriori dettagli sulla release facendo clic sul nome della release nella sezione Dettagli release nella parte inferiore della schermata.
- Verifica che la release abbia eseguito correttamente il deployment dell'applicazione eseguendo il seguente comando in Cloud Shell
gcloud container clusters get-credentials preview --zone us-central1-a && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080
- Fai clic sull'icona di anteprima web in alto a destra nella schermata.
- Seleziona Anteprima sulla porta 8080
Viene visualizzata una nuova pagina con il messaggio "Hello World!".
- Utilizza
ctrl+cnel terminale per terminare l'inoltro della porta.
Promozione di una release
Ora che la release è stata eseguita nel primo target (anteprima) della pipeline, puoi promuoverla al target successivo (canary). Esegui il comando seguente per iniziare la procedura.
gcloud beta deploy releases promote \
--release=sample-app-release-${REL_TIMESTAMP} \
--delivery-pipeline=sample-app \
--quiet
Esamina la promozione della release
- Vai alla pipeline sample-app nella console Google Cloud
- Verifica che sia presente un contorno verde sul lato sinistro della casella Canary, il che significa che la release è stata eseguita in quell'ambiente.
- Verifica che l'applicazione sia stata eseguita correttamente creando un tunnel
gcloud container clusters get-credentials canary --zone us-central1-b && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080
- Fai clic sull'icona di anteprima web in alto a destra nella schermata.
- Seleziona Anteprima sulla porta 8080
Viene visualizzata una nuova pagina con il messaggio "Hello World!".
- Utilizza
ctrl+cnel terminale per terminare l'inoltro della porta.
Approvazione di una release di produzione
Ricorda che quando abbiamo creato il target prod tramite prod.yaml, abbiamo specificato il tag requireApproval come true. In questo modo, la promozione in prod richiederà l'approvazione.
- Promuovi la versione canary in produzione con il seguente comando
gcloud beta deploy releases promote \
--release=sample-app-release-${REL_TIMESTAMP} \
--delivery-pipeline=sample-app \
--quiet
- Vai alla pipeline sample-app nella console Google Cloud
- Nota l'indicatore giallo che indica "1 in attesa".
Questo messaggio indica che è presente una release in coda per il deployment in produzione, ma richiede revisione e approvazione.
- Fai clic sul pulsante "Esamina" appena sotto l'avviso giallo.
- Nella schermata successiva, fai di nuovo clic su "Esamina" per accedere alla schermata di approvazione per la produzione.
- (Facoltativo) Esamina la differenza del manifest per esaminare le modifiche. In questo caso, un file completamente nuovo.
- Fai clic sul pulsante "Approva"
- Torna alla pagina della pipeline sample-app, dove vedrai la release in produzione in corso.
Esamina la release di produzione
Come per gli altri ambienti, puoi esaminare il deployment al termine utilizzando i passaggi riportati di seguito.
- Esegui il seguente comando in Cloud Shell per creare l'inoltro della porta
gcloud container clusters get-credentials prod --zone us-central1-c && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080
- Fai clic sull'icona di anteprima web in alto a destra nella schermata.
- Seleziona Anteprima sulla porta 8080
Viene visualizzata una nuova pagina con il messaggio "Hello World!".
- Utilizza
ctrl+cnel terminale per terminare l'inoltro della porta.