1. Obiettivi
In questo tutorial creerai tre cluster GKE denominati preview, canary e prod. Poi, crea un target Cloud Deploy corrispondente a ciascun 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 sia andato a buon fine e funzioni come previsto, dovrai promuovere manualmente la release nel cluster canary. La promozione della release nel cluster di produzione richiede l'approvazione. Dovrai approvare la pipeline di produzione nell'interfaccia utente di Cloud Deploy e infine promuoverla.
Gli obiettivi di questo tutorial possono essere suddivisi nei seguenti passaggi:
- Preparare lo spazio di lavoro
- Definire i target Cloud Deploy
- Definisci la pipeline di Cloud Deploy
- Crea una release
- Eseguire la promozione di un deployment
- Approvare una release di produzione
Configurazione dell'ambiente a tuo ritmo
- 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 al progetto. Si tratta di 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 è importante 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 vedere se è disponibile. Dopo la creazione del progetto, viene "congelato". - Esiste un terzo valore, un Numero progetto, utilizzato da alcune API. Scopri di più su tutti e tre questi valori nella documentazione.
- Successivamente, dovrai abilitare la fatturazione nella console Cloud per utilizzare le API/risorse Cloud. L'esecuzione di questo codelab non dovrebbe costare molto, se non del tutto. Per arrestare le risorse in modo da non incorrere in addebiti dopo questo tutorial, segui le istruzioni di "pulizia" riportate alla fine del codelab. I nuovi utenti di Google Cloud possono partecipare al programma Prova senza costi di 300$.
2. Configurazione della piattaforma
Preparazione dell'area di lavoro
Qui configureremo l'ambiente necessario per eseguire questo tutorial. Al termine di questo passaggio, avremo creato un cluster GKE in cui eseguire i deployment.
- Impostare 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`
- Creare 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
Definire i target Cloud Deploy
- Crea un file nella directory di deployment 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 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
- Crea un file nella directory di deployment 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
Tieni presente il tag requireApproval impostato su true. La promozione non verrà consentita nel target di produzione finché non verrà concessa l'approvazione. Per approvare una release, devi disporre del ruolo roles/clouddeploy.approver.
- 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
Durante la creazione di una nuova applicazione, la pipeline CICD viene in genere configurata per eseguire build, test di integrazione e deployment automatici. I passaggi che seguono fanno 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
- Crea un file nella directory di deployment 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 fasi, che è un elenco di tutti i target a cui è configurato il deployment di questa pipeline di importazione.
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 il rendering di skaffold durante la creazione della release.
- Applica pipeline
gcloud beta deploy apply --file deploy/pipeline.yaml
4. Fase di sviluppo
Man mano che le applicazioni vengono sviluppate, le toolchain CICD automatiche creano e archiviano gli asset. I comandi seguenti vengono eseguiti per compilare l'applicazione utilizzando skaffold e archiviare le risorse per il deployment con Cloud Deploy. Questo passaggio verrà 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 della procedura CICD, in genere quando il codice è contrassegnato per la produzione, avvii la procedura di rilascio chiamando il comando cloud deploy release
. In seguito, una volta convalidato e approvato il deployment, sposterai la release nei vari ambienti di destinazione promuovendo e approvando l'azione tramite procedure automatiche o approvazioni manuali.
Creazione di una release
Abbiamo creato i file Cloud Deploy in questo tutorial in precedenza 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 e 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}"
Rivedi la release
Quando viene creata una release 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 viene visualizzata una rappresentazione grafica della pipeline.
- Verifica che sul lato sinistro della casella di anteprima sia presente un contorno verde, che indica che la release è stata dispiattata in quell'ambiente.
- Se vuoi, puoi esaminare ulteriori dettagli sulla release facendo clic sul nome della release in Dettagli della release nella sezione inferiore dello schermo.
- Verifica che la release abbia eseguito correttamente il deployment dell'applicazione, esegui il seguente comando in CloudShell
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
Si aprirà una nuova pagina con il messaggio "Hello World!".
- Usa
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 il seguente comando per avviare la procedura.
gcloud beta deploy releases promote \
--release=sample-app-release-${REL_TIMESTAMP} \
--delivery-pipeline=sample-app \
--quiet
Rivedi la promozione della release
- Vai alla pipeline sample-app nella console Google Cloud
- Verifica che sul lato sinistro della casella Canary sia presente un contorno verde, il che significa che la release è stata implementata in quell'ambiente.
- 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
- Fai clic sull'icona di anteprima web in alto a destra nella schermata.
- Seleziona Anteprima sulla porta 8080
Si aprirà una nuova pagina con il messaggio "Hello World!".
- 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 requireApproval come true. In questo modo verrà imposto un requisito di approvazione per la promozione in produzione.
- Promuovi la release 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
- Notare l'indicatore giallo con la dicitura "1 in attesa".
Questo messaggio indica che è presente una release in coda per il deployment in produzione, ma che richiede revisione e approvazione.
- Fai clic sul pulsante "Rivedi" appena sotto la notifica gialla.
- 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 dell'app di esempio, dove vedrai la release in produzione in corso.
Rivedi la release di produzione
Come per gli altri ambienti, puoi esaminare l'implementazione al termine seguendo i passaggi riportati di seguito.
- Esegui il seguente comando in Cloud Shell per creare il port forwarding
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
Si aprirà una nuova pagina con il messaggio "Hello World!".
- Usa
ctrl+c
nel terminale per terminare il port forwarding.