Pubblicazione con Cloud Deploy

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 per eseguire il deployment in questi target.

Il flusso di deployment verrà attivato da una pipeline cloudbuild che creerà la release Cloud Deploy ed eseguirà il deployment nel cluster di anteprima. Dopo aver verificato che il deployment in anteprima è andato a buon fine e funziona come previsto, promuoverai manualmente la release nel cluster canary. La promozione della release nel cluster di produzione richiederà l'approvazione. Approverai la pipeline di produzione nella UI di Cloud Deploy e infine la promuoverai.

Gli obiettivi di questo tutorial possono essere suddivisi nei seguenti passaggi:

  • Preparare il workspace
  • Definisci le destinazioni Cloud Deploy
  • Definisci la pipeline Cloud Deploy
  • Crea una release
  • Promuovere un deployment
  • Approvare una release di produzione

Configurazione dell'ambiente autonomo

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

b35bf95b8bf3d5d8.pnga99b7ace416376c4.pngbd84a6d3004737c5.png

  • 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 essere stato impostato). Cloud Console genera automaticamente una stringa univoca, di solito non ti interessa di cosa si tratta. Nella maggior parte dei codelab, devi fare riferimento all'ID progetto (che in genere è identificato come PROJECT_ID), quindi, se non ti piace, generane un altro casuale oppure puoi provare a crearne uno tuo e vedere se è disponibile. Viene "congelato" dopo la creazione del progetto.
  • Esiste un terzo valore, un numero di progetto, utilizzato da alcune API. Scopri di più su tutti e tre questi valori nella documentazione.
  1. Successivamente, devi abilitare la fatturazione in Cloud Console per utilizzare le risorse/API Cloud. L'esecuzione di questo codelab non dovrebbe costare molto, se non nulla. Per arrestare le risorse in modo da non incorrere in costi di fatturazione al termine di questo tutorial, segui le istruzioni di "pulizia" riportate alla fine del codelab. I nuovi utenti di Google Cloud possono beneficiare del programma 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.

  1. Imposta le impostazioni predefinite di gcloud config

gcloud config set project <your project>

gcloud config set deploy/region us-central1

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

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

  1. Abilita le API

gcloud services enable \

cloudresourcemanager.googleapis.com \

    `container.googleapis.com \`

    `cloudbuild.googleapis.com \`

    `containerregistry.googleapis.com \`

    `secretmanager.googleapis.com \`

    `clouddeploy.googleapis.com` 
  1. 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

  1. Crea un file nella directory di deployment denominato preview.yaml con questo 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.
  1. Crea un file nella directory di deployment 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

  1. Crea un file nella directory di deployment denominato prod.yaml con questo 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. Ciò non consentirà la promozione nella destinazione di produzione finché non sarà stata concessa l'approvazione. Per approvare una release, devi disporre del ruolo roles/clouddeploy.approver.

  1. Crea le destinazioni 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 CI/CD viene in genere configurata per eseguire build, test di integrazione e deployment automatici. I passaggi seguenti sono considerati parte della procedura di configurazione di una nuova app. Ogni nuova applicazione avrà una pipeline di deployment configurata.

Definizione della pipeline di Cloud Deploy

  1. Crea un file nella directory di deployment denominato pipeline.yaml con questo 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 per cui è configurata questa pipeline di distribuzione.

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 dal file skaffold.yaml. Cloud Deploy utilizza il profilo con skaffold render durante la creazione della release.

  1. Applica pipeline

gcloud beta deploy apply --file deploy/pipeline.yaml

4. Fase di sviluppo

Man mano che le applicazioni vengono sviluppate, le toolchain CICD automatizzate creeranno e archivieranno 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.

  1. 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 della procedura 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 convalidata e approvata l'implementazione, sposterai la release nei vari ambienti di destinazione promuovendo e approvando l'azione tramite processi automatizzati o approvazioni manuali.

Creare una release

In precedenza in questo tutorial abbiamo creato file Cloud Deploy per capire come funziona 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 e utilizzeremo Cloud Deploy per eseguire il rilascio di questa 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}"

Rivedi la release

Quando viene creata una release di Cloud Deploy, questa viene implementata automaticamente nel primo target, ovvero l'anteprima.

  1. Vai a <Cloud Deploy> nella console Google Cloud
  2. Fai clic su "sample-app".

In questa schermata vedrai una rappresentazione grafica della pipeline.

  1. Verifica che sul lato sinistro della casella di anteprima sia presente un contorno verde, il che significa che la release è stata implementata in quell'ambiente.
  2. Se vuoi, puoi esaminare ulteriori dettagli sulla release facendo clic sul nome della release nella sezione Dettagli release nella parte inferiore dello schermo.
  3. Verifica che la release abbia eseguito il deployment dell'applicazione correttamente, esegui questo 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

  1. Fai clic sull'icona di anteprima web in alto a destra dello schermo.
  2. Seleziona Anteprima sulla porta 8080

Si aprirà una nuova pagina con il messaggio "Hello World!".

  1. Utilizza ctrl+c nel terminale per terminare il port forwarding.

Promozione di una release

Ora che la release è stata implementata nel primo target (anteprima) della pipeline, puoi promuoverla al target successivo (canary). Esegui questo comando per iniziare la procedura.

gcloud beta deploy releases promote \

--release=sample-app-release-${REL_TIMESTAMP} \

--delivery-pipeline=sample-app \

--quiet

Controllare la promozione della release

  1. Vai alla pipeline sample-app nella console Google Cloud
  2. Verifica che sul lato sinistro della casella Canary sia presente un contorno verde, il che significa che la release è stata implementata in quell'ambiente.
  3. Verifica che l'applicazione sia stata implementata 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

  1. Fai clic sull'icona di anteprima web in alto a destra dello schermo.
  2. Seleziona Anteprima sulla porta 8080

Si aprirà una nuova pagina con il messaggio "Hello World!".

  1. Utilizza ctrl+c nel terminale per terminare il port forwarding.

Approvazione di una release di produzione

Ricordi che quando abbiamo creato la destinazione di produzione tramite prod.yaml, abbiamo specificato il tag requireApproval come true. In questo modo, verrà imposta la richiesta di approvazione per la promozione in produzione.

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

  1. Vai alla pipeline sample-app nella console Google Cloud
  2. Nota l'indicatore giallo che indica "1 in attesa".

Questo messaggio indica che è presente una release in coda per l'implementazione in produzione, ma richiede revisione e approvazione.

  1. Fai clic sul pulsante "Rivedi" appena sotto l'avviso giallo.
  2. Nella schermata successiva, fai di nuovo clic su "Rivedi" per accedere alla schermata di approvazione per la produzione.
  3. (Facoltativo) Esamina la differenza del manifest per rivedere le modifiche. In questo caso, un file completamente nuovo.
  4. Fai clic sul pulsante "Approva".
  5. Torna alla pagina della pipeline sample-app, dove vedrai la release in produzione in corso.

Rivedi la release di produzione

Come per gli altri ambienti, puoi esaminare il deployment al termine utilizzando i passaggi riportati di seguito.

  1. Esegui questo comando in Cloud Shell per creare l'inoltro delle porte

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

  1. Fai clic sull'icona di anteprima web in alto a destra dello schermo.
  2. Seleziona Anteprima sulla porta 8080

Si aprirà una nuova pagina con il messaggio "Hello World!".

  1. Utilizza ctrl+c nel terminale per terminare il port forwarding.