Publier avec Cloud Deploy

1. Objectifs

Dans cet atelier, vous allez créer trois clusters GKE nommés "preview", "canary" et "prod". Vous allez ensuite créer une cible Cloud Deploy correspondant à chaque cluster et un pipeline Cloud Deploy qui définira la séquence d'étapes à suivre pour effectuer le déploiement dans ces cibles.

Le flux de déploiement sera déclenché par un pipeline cloudbuild qui créera une version Cloud Deploy et effectuera le déploiement dans le cluster de prévisualisation. Une fois que vous aurez vérifié que le déploiement dans la prévisualisation a réussi et qu'il fonctionne comme prévu, vous allez promouvoir manuellement la version dans le cluster Canary. La promotion de la version dans le cluster de production nécessitera une approbation. Vous approuverez le pipeline de production dans l'interface utilisateur de Cloud Deploy, puis vous le promouvrez.

Les objectifs de cet atelier peuvent être divisés en plusieurs étapes :

  • Préparer votre espace de travail
  • Définir des cibles Cloud Deploy
  • Définir un pipeline Cloud Deploy
  • Créer une version
  • Promouvoir un déploiement
  • Approuver une version de production

Configuration de l'environnement au rythme de chacun

  1. Connectez-vous à la console Google Cloud, puis créez un projet ou réutilisez un projet existant. (Si vous ne possédez pas encore de compte Gmail ou Google Workspace, vous devez en créer un.)

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Le nom du projet est le nom à afficher pour les participants au projet. Il s'agit d'une chaîne de caractères qui n'est pas utilisée par les API Google, et que vous pouvez modifier à tout moment.
  • L'ID du projet doit être unique sur l'ensemble des projets Google Cloud et doit être immuable (vous ne pouvez pas le modifier une fois que vous l'avez défini). Cloud Console génère automatiquement une chaîne unique dont la composition importe peu, en général. Dans la plupart des ateliers de programmation, vous devrez référencer l'ID du projet (généralement identifié comme PROJECT_ID), donc s'il ne vous convient pas, générez-en un autre au hasard ou définissez le vôtre, puis vérifiez s'il est disponible. Il est ensuite "gelé" une fois le projet créé.
  • La troisième valeur est le numéro de projet, utilisé par certaines API. Pour en savoir plus sur ces trois valeurs, consultez la documentation.
  1. Vous devez ensuite activer la facturation dans Cloud Console afin d'utiliser les ressources/API Cloud. L'exécution de cet atelier de programmation est très peu coûteuse, voire sans frais. Pour arrêter les ressources afin d'éviter qu'elles ne vous soient facturées après ce tutoriel, suivez les instructions de nettoyage indiquées à la fin de l'atelier. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier du programme d'essai sans frais de 300$.

2. Configuration de la plate-forme

Préparer votre espace de travail

Nous allons configurer l'environnement requis pour exécuter cet atelier. Une fois cette étape terminée, nous aurons créé un cluster GKE dans lequel nous pourrons exécuter les déploiements.

  1. Définir les valeurs par défaut de la configuration gcloud

gcloud config set project <your project>

gcloud config set deploy/region us-central1

  1. Cloner le dépôt

git clone https://github.com/gushob21/software-delivery-workshop

cd software-delivery-workshop/labs/cloud-deploy/

cloudshell workspace .

rm -rf deploy && mkdir deploy

  1. Définir des variables d'environnement

export PROJECT_ID=$(gcloud config get-value project)

export PROJECT_NUMBER=$(gcloud projects list --filter="$PROJECT_ID" --format="value(PROJECT_NUMBER)")

  1. Activer les API

gcloud services enable \

cloudresourcemanager.googleapis.com \

    `container.googleapis.com \`

    `cloudbuild.googleapis.com \`

    `containerregistry.googleapis.com \`

    `secretmanager.googleapis.com \`

    `clouddeploy.googleapis.com` 
  1. Créer des clusters 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

Définir des cibles Cloud Deploy

  1. Créez un fichier nommé preview.yaml dans le répertoire de déploiement à l'aide de la commande suivante dans 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. Créez un fichier nommé canary.yaml dans le répertoire de déploiement à l'aide de la commande suivante dans 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. Créez un fichier nommé prod.yaml dans le répertoire de déploiement à l'aide de la commande suivante dans 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

Notez le tag requireApproval défini sur "true". Cela n'autorisera pas la promotion dans la cible de production tant que l'approbation n'aura pas été accordée. Vous avez besoin du rôle roles/clouddeploy.approver pour approuver une version.

  1. Créer les cibles de déploiement
         `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. Création d'applications

Lors de la création d'une application, le pipeline CICD est généralement configuré pour effectuer des builds, des tests d'intégration et des déploiements automatiques. Les étapes suivantes sont considérées comme faisant partie du processus de configuration d'une nouvelle application. Chaque nouvelle application aura un pipeline de déploiement configuré.

Définir un pipeline Cloud Deploy

  1. Créez un fichier nommé pipeline.yaml dans le répertoire de déploiement à l'aide de la commande suivante dans 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.

Le tag serialPipeline contient un tag nommé "stages", qui est une liste de toutes les cibles vers lesquelles ce pipeline de livraison est configuré pour être déployé.

targetId identifie la cible spécifique à utiliser pour cette étape du pipeline de livraison. La valeur est la propriété metadata.name de la définition de la cible.

profiles est une liste de zéro ou plusieurs noms de profils Skaffold, à partir de skaffold.yaml. Cloud Deploy utilise le profil avec le rendu Skaffold lors de la création de la version.

  1. Appliquer le pipeline

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

4. Phase de développement

Au fur et à mesure du développement des applications, les chaînes d'outils CICD automatisées créent et stockent des composants. Les commandes suivantes sont exécutées pour créer l'application à l'aide de Skaffold et stocker les composants pour le déploiement avec Cloud Deploy. Cette étape est effectuée par votre processus CICD pour chaque build d'application.

  1. Créer et stocker l'application avec Skaffold

skaffold build \

--file-output=artifacts.json \

--default-repo gcr.io/$PROJECT_ID \

--push=true

5. Phase de version

À la fin de votre processus CICD, généralement lorsque le code est balisé pour la production, vous lancez le processus de version en appelant la commande cloud deploy release. Une fois le déploiement validé et approuvé, vous déplacez la version dans les différents environnements cibles en promouvant et en approuvant l'action via des processus automatisés ou des approbations manuelles.

Créer une version

Nous avons créé des fichiers Cloud Deploy plus tôt dans cet atelier pour comprendre comment fonctionne Cloud Deploy. À des fins de démonstration, nous avons créé les mêmes fichiers Cloud Deploy et les avons transférés vers un dépôt GitHub avec un exemple d'application Go. Nous allons utiliser Cloud Deploy pour publier cette application.

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}"

Examiner la version

Lorsqu'une version Cloud Deploy est créée, elle est automatiquement déployée dans la première cible, qui est la prévisualisation.

  1. Accédez à <Cloud Deploy> dans la console Google Cloud.
  2. Cliquez sur "sample-app".

Sur cet écran, vous verrez une représentation graphique de votre pipeline.

  1. Vérifiez qu'un contour vert s'affiche sur le côté gauche de la zone de prévisualisation, ce qui signifie que la version a été déployée dans cet environnement.
  2. Si vous le souhaitez, examinez d'autres détails sur la version en cliquant sur son nom sous "Détails de la version" dans la partie inférieure de l'écran.
  3. Vérifiez que la version a bien déployé l'application en exécutant la commande suivante dans 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. Cliquez sur l'icône d'aperçu Web en haut à droite de l'écran.
  2. Sélectionnez "Prévisualiser sur le port 8080".

Vous serez redirigé vers une nouvelle page affichant le message "Hello World!".

  1. Utilisez ctrl+c dans le terminal pour mettre fin au transfert de port.

Promouvoir une version

Maintenant que votre version est déployée dans la première cible (prévisualisation) du pipeline, vous pouvez la promouvoir vers la cible suivante (Canary). Exécutez la commande suivante pour commencer le processus.

gcloud beta deploy releases promote \

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

--delivery-pipeline=sample-app \

--quiet

Examiner la promotion de la version

  1. Accédez au pipeline sample-app dans la console Google Cloud.
  2. Vérifiez qu'un contour vert s'affiche sur le côté gauche de la zone Canary, ce qui signifie que la version a été déployée dans cet environnement.
  3. Vérifiez que l'application est correctement déployée en créant un tunnel vers celle-ci.

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. Cliquez sur l'icône d'aperçu Web en haut à droite de l'écran.
  2. Sélectionnez "Prévisualiser sur le port 8080".

Vous serez redirigé vers une nouvelle page affichant le message "Hello World!".

  1. Utilisez ctrl+c dans le terminal pour mettre fin au transfert de port.

Approuver une version de production

Rappelez-vous que lorsque nous avons créé la cible de production via prod.yaml, nous avons spécifié le tag requireApproval comme "true". Cela forcera une exigence d'approbation pour la promotion en production.

  1. Promouvez la version Canary en production à l'aide de la commande suivante :

gcloud beta deploy releases promote \

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

--delivery-pipeline=sample-app \

--quiet

  1. Accédez au pipeline sample-app dans la console Google Cloud.
  2. Notez l'indicateur jaune indiquant "1 en attente".

Ce message indique qu'une version est mise en file d'attente pour être déployée en production, mais qu'elle nécessite un examen et une approbation.

  1. Cliquez sur le bouton "Examiner" juste en dessous de l'avis jaune.
  2. Sur l'écran suivant, cliquez à nouveau sur "Examiner" pour accéder à l'écran d'approbation de la production.
  3. Si vous le souhaitez, examinez la différence entre les fichiers manifestes pour consulter les modifications. Dans ce cas, il s'agit d'un tout nouveau fichier.
  4. Cliquez sur le bouton "Approuver".
  5. Revenez à la page du pipeline sample-app, où vous verrez la version en cours de production.

Examiner la version de production

Comme pour les autres environnements, vous pouvez examiner le déploiement une fois qu'il est terminé en suivant les étapes ci-dessous.

  1. Exécutez la commande suivante dans Cloud Shell pour créer le transfert de port :

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. Cliquez sur l'icône d'aperçu Web en haut à droite de l'écran.
  2. Sélectionnez "Prévisualiser sur le port 8080".

Vous serez redirigé vers une nouvelle page affichant le message "Hello World!".

  1. Utilisez ctrl+c dans le terminal pour mettre fin au transfert de port.