Rilascio con Cloud Deploy

1. Obiettivi

In questo tutorial creerai tre cluster GKE denominati Preview, Canary e prod. Quindi, crea una destinazione Cloud Deploy corrispondente a ogni cluster e una pipeline Cloud Deploy che definirà la sequenza di passaggi per eseguire il deployment in quelle destinazioni.

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 è riuscito e funziona come previsto, promuoverai manualmente la release nel cluster canary. La promozione della release nel cluster di produzione richiederà l'approvazione. Dovrai approvare la pipeline di produzione nella UI di Cloud Deploy e infine promuoverla.

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

  • Prepara l'area di lavoro
  • Definisci le destinazioni di Cloud Deploy
  • Definisci la pipeline di Cloud Deploy
  • Crea una release
  • Promuovi un deployment
  • Approvare una release di produzione

Configurazione dell'ambiente autogestito

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

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Il Nome progetto è il nome visualizzato dei partecipanti del progetto. Si tratta di una stringa di caratteri non utilizzata dalle API di Google e può essere aggiornata 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). La console Cloud genera automaticamente una stringa univoca; di solito non ti importa cosa sia. Nella maggior parte dei codelab, devi fare riferimento all'ID progetto (che solitamente è identificato come PROJECT_ID), quindi, se non ti piace, generane un altro a caso oppure puoi fare un tentativo personalizzato e controllare se è disponibile. Poi c'è "congelato" dopo la creazione del progetto.
  • C'è un terzo valore, il numero di progetto, utilizzato da alcune API. Scopri di più su tutti e tre questi valori nella documentazione.
  1. Successivamente, dovrai abilitare la fatturazione nella console Cloud per utilizzare le risorse/le API Cloud. Eseguire questo codelab non dovrebbe costare molto. Per arrestare le risorse in modo da non incorrere in fatturazione oltre questo tutorial, segui eventuali "pulizie" istruzioni riportate alla fine del codelab. I nuovi utenti di Google Cloud sono idonei al programma prova senza costi di 300$.

2. Configurazione della piattaforma

Preparazione dell'area di lavoro

Configureremo il nostro ambiente qui richiesto per eseguire questo tutorial. Al termine di questo passaggio, creeremo un cluster GKE in cui eseguire i deployment.

  1. Imposta i valori predefiniti 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. Impostare 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 delle destinazioni di Cloud Deploy

  1. Crea un file nella directory di deployment denominato anteprima.yaml con il seguente comando in cloudshell:

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

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 il seguente comando in cloudshell:

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 che il tag requestApproval è impostato su true. Ciò non consentirà la promozione nel target di produzione fino a quando non verrà concessa l'approvazione. È necessario il ruolo roles/clouddeploy.approver per approvare una release.

  1. 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 in genere è configurata per eseguire build automatiche, test di integrazione e deployment. I passaggi che seguono sono considerati parte della procedura di configurazione di una nuova app. Per ogni nuova applicazione verrà configurata una pipeline di deployment.

Definizione della pipeline di Cloud Deploy

  1. Crea un file nella directory di deployment denominata pipeline.yaml con il seguente comando in cloudshell:

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 fasi che elenca tutti i target in cui è configurata il deployment di 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 della destinazione.

profiles è un elenco di zero o più nomi di profili Skaffold, provenienti da skaffold.yaml. Cloud Deploy utilizza il profilo con rendering skaffold 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 catene di strumenti CICD automatizzate creano e archiviano gli asset. I comandi seguenti vengono eseguiti per creare l'applicazione utilizzando skaffold e gli asset di archiviazione 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 del processo CICD, in genere quando il codice viene codificato per la produzione, avvierai il processo di rilascio chiamando il comando cloud deploy release. In seguito, dopo che il deployment è stato convalidato e approvato, sposterai la release attraverso i vari ambienti di destinazione promuovendo e approvando l'azione attraverso processi automatizzati o approvazioni manuali.

Creazione di una release

In questo tutorial abbiamo già creato i file di Cloud Deploy per capire come funziona Cloud Deploy. A scopo dimostrativo, 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 il rilascio dell'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, la implementa automaticamente nel primo target, ovvero in 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. Conferma il contorno verde sul lato sinistro della finestra di anteprima che indica che è stato eseguito il deployment della release nell'ambiente.
  2. Se vuoi, puoi esaminare ulteriori dettagli sulla release facendo clic sul nome della release sotto Dettagli sulla release nella sezione inferiore dello schermo.
  3. Verifica che la release abbia eseguito il deployment dell'applicazione ed esegui il comando seguente cloushell

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 dell'anteprima web nella parte superiore destra dello schermo.
  2. Seleziona Anteprima sulla porta 8080

Verrà visualizzata una nuova pagina in cui viene visualizzato il messaggio "Hello World!".

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

Promozione di una nuova uscita

Ora che è stato eseguito il deployment della release nel primo target (anteprima) della pipeline, puoi promuoverla alla destinazione successiva (canary). Esegui questo comando per avviare il processo.

gcloud beta deploy releases promote \

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

--delivery-pipeline=sample-app \

--quiet

Controllo della promozione dell'uscita

  1. Vai alla pipeline dell'app di esempio nella console Google Cloud
  2. Conferma il contorno verde sul lato sinistro della casella Canary che indica che è stato eseguito il deployment della release nell'ambiente in questione.
  3. Verifica che il deployment dell'applicazione sia corretto 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 dell'anteprima web nella parte superiore destra dello schermo.
  2. Seleziona Anteprima sulla porta 8080

Verrà visualizzata una nuova pagina in cui viene visualizzato il messaggio "Hello World!".

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

Approvazione di una release di produzione

Ricorda che, quando abbiamo creato il target di produzione tramite prod.yaml, abbiamo specificato il tag requestApproval su true. In questo modo, verrà forzata un'esigenza 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 dell'app di esempio nella console Google Cloud
  2. Nota che l'indicatore giallo indica "1 pending".

Questo messaggio indica che c'è una release in coda per il deployment in produzione, ma che deve essere esaminata e approvata.

  1. Fai clic sul pulsante "Rivedi" appena sotto la notifica gialla.
  2. Nella schermata successiva, fai clic su "Rivedi" di nuovo per accedere alla schermata di approvazione per la produzione
  3. Se vuoi, puoi esaminare la differenza manifest per esaminare le modifiche. In questo caso, un file completamente nuovo.
  4. Fai clic sul pulsante "Approva" pulsante
  5. Torna alla pagina della pipeline dell'app di esempio, dove vedrai la release di produzione in corso.

Esamina la release di produzione

Come per gli altri ambienti, puoi rivedere il deployment una volta completato seguendo i passaggi riportati di seguito.

  1. Esegui questo comando in Cloudshell per creare il port-forward

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 dell'anteprima web nella parte superiore destra dello schermo.
  2. Seleziona Anteprima sulla porta 8080

Verrà visualizzata una nuova pagina in cui viene visualizzato il messaggio "Hello World!".

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