Mettre en œuvre des déploiements Canary Cloud Run à l'aide de branches Git et Cloud Build

Last reviewed 2023-05-26 UTC

Ce document explique comment mettre en œuvre un pipeline de déploiement pour Cloud Run, qui met en œuvre une progression de code depuis les branches de développement jusqu'à la production à l'aide de tests Canary automatisés et d'une gestion du trafic basée sur des pourcentages. Il est destiné aux administrateurs de plate-forme chargés de créer et de gérer les pipelines CI/CD. Ce document part du principe que vous maîtrisez les concepts de base de Git, de Cloud Run et des pipelines CI/CD.

Cloud Run vous permet de déployer et d'exécuter vos applications avec un minimum d'efforts. De nombreuses organisations utilisent des pipelines de versions robustes pour transférer du code en production. Cloud Run fournit des fonctionnalités de gestion du trafic uniques qui vous permettent de mettre en œuvre des techniques avancées de gestion des versions en toute simplicité.

Objectifs

  • Créer votre service Cloud Run
  • Activer une branche de développeur
  • Mettre en œuvre des tests Canary
  • Déployer en production en toute sécurité

Coûts

Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Avant de commencer

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  3. Dans la console Google Cloud, activez Cloud Shell.

    Activer Cloud Shell

    En bas de la fenêtre de la console Google Cloud, une session Cloud Shell démarre et affiche une invite de ligne de commande. Cloud Shell est un environnement shell dans lequel Google Cloud CLI est déjà installé, et dans lequel des valeurs sont déjà définies pour votre projet actuel. L'initialisation de la session peut prendre quelques secondes.

Préparer l'environnement

  1. Dans Cloud Shell, créez des variables d'environnement à utiliser tout au long de ce tutoriel :

    export PROJECT_ID=$(gcloud config get-value project)
    export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
    
  2. Activez les API suivantes :

    • Resource Manager
    • GKE
    • Cloud Build
    • Container Registry
    • Cloud Run
    gcloud services enable \
        cloudresourcemanager.googleapis.com \
        container.googleapis.com \
        secretmanager.googleapis.com \
        cloudbuild.googleapis.com \
        containerregistry.googleapis.com \
        run.googleapis.com
    
  3. Accordez le rôle Administrateur Cloud Run (roles/run.admin) au compte de service Cloud Build.

    gcloud projects add-iam-policy-binding $PROJECT_ID \
      --member=serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
      --role=roles/run.admin
    
  4. Attribuez le rôle Utilisateur du compte de service IAM (roles/iam.serviceAccountUser) au compte de service Cloud Build sur le compte de service d'exécution Cloud Run.

    gcloud iam service-accounts add-iam-policy-binding \
    $PROJECT_NUMBER-compute@developer.gserviceaccount.com \
      --member=serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
      --role=roles/iam.serviceAccountUser
    

Définir les valeurs Git

Si vous n'avez pas encore utilisé Git dans Cloud Shell, définissez les valeurs user.name et user.email que vous souhaitez utiliser :

    git config --global user.email YOUR_EMAIL_ADDRESS
    git config --global user.name YOUR_USERNAME
    git config --global credential.helper store
  • YOUR_EMAIL_ADDRESS : adresse e-mail utilisée avec votre compte GitHub
  • YOUR_USERNAME : votre ID utilisateur GitHub

Si vous utilisez MFA avec GitHub, créez un jeton d'accès personnel et utilisez-le comme mot de passe pour interagir avec GitHub via la ligne de commande.

Stockez votre ID utilisateur GitHub dans une variable d'environnement pour en faciliter l'accès :

export GH_USER=YOUR_GITHUB_ID

Dupliquer le dépôt de projet

Pour créer votre propre version en écriture du dépôt de l'atelier, dupliquez l'exemple de dépôt dans votre compte GitHub via l'interface utilisateur GitHub.

Cloner l'exemple de dépôt

Clonez et préparez l'exemple de dépôt :

git clone https://github.com/$GH_USER/software-delivery-workshop.git cloudrun-progression

cd cloudrun-progression/labs/cloudrun-progression

Connecter le dépôt Git

Cloud Build vous permet de créer et de gérer des connexions à des dépôts de code source à l'aide de la console Google Cloud. Vous pouvez créer et gérer des connexions à l'aide des dépôts Cloud Build de première ou de deuxième génération. Ce tutoriel utilise des dépôts Cloud Build de deuxième génération.

Accorder les autorisations requises

Pour connecter votre hôte GitHub, attribuez le rôle Administrateur de connexion Cloud Build (roles/cloudbuild.connectionAdmin) à votre compte utilisateur :

PN=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)")
CLOUD_BUILD_SERVICE_AGENT="service-${PN}@gcp-sa-cloudbuild.iam.gserviceaccount.com"
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
 --member="serviceAccount:${CLOUD_BUILD_SERVICE_AGENT}" \
 --role="roles/secretmanager.admin"

Créer la connexion hôte

  1. Configurez la connexion au dépôt Cloud Build :

    gcloud alpha builds connections create github $GH_USER --region=us-central1
    
  2. Cliquez sur le lien fourni dans la sortie et suivez les instructions à l'écran pour finaliser la connexion.

  3. Vérifiez l'installation de votre connexion GitHub :

    gcloud alpha builds connections describe $GH_USER --region=us-central1
    

À l'aide de la connexion hôte que vous venez de configurer, associez l'exemple de dépôt que vous avez dupliqué :

 gcloud alpha builds repositories create cloudrun-progression \
     --remote-uri=https://github.com/$GH_USER/software-delivery-workshop.git \
     --connection=$GH_USER \
     --region=us-central1

Définir une variable de nom de dépôt

Stockez le nom du dépôt pour une utilisation ultérieure :

export REPO_NAME=projects/$PROJECT_ID/locations/us-central1/connections/$GH_USER/repositories/cloudrun-progression

Déployer le service Cloud Run

Dans cette section, vous allez créer et déployer l'application de production initiale que vous utiliserez tout au long de ce tutoriel.

Déployer le service

  • Dans Cloud Shell, créez et déployez l'application, y compris un service nécessitant une authentification. Pour rendre un service public, utilisez l'option --allow-unauthenticated.

        gcloud builds submit --tag gcr.io/$PROJECT_ID/hello-cloudrun
    
        gcloud run deploy hello-cloudrun \
          --image gcr.io/$PROJECT_ID/hello-cloudrun \
          --platform managed \
          --region us-central1 \
          --tag=prod -q
    

    La sortie ressemble à ceci :

    Deploying container to Cloud Run service [hello-cloudrun] in project [sdw-mvp6] region [us-central1]
    ✓ Deploying new service... Done.
      ✓ Creating Revision...
      ✓ Routing traffic...
    Done.
    Service [hello-cloudrun] revision [hello-cloudrun-00001-tar] has been deployed and is serving 100 percent of traffic.
    Service URL: https://hello-cloudrun-apwaaxltma-uc.a.run.app
    The revision can be reached directly at https://prod---hello-cloudrun-apwaaxltma-uc.a.run.app
    

Le résultat inclut l'URL du service et une URL unique pour la révision. Vos valeurs seront légèrement différentes de celles indiquées ici.

Validez le déploiement.

  1. Une fois le déploiement terminé, affichez le service nouvellement déployé sur la page Révisions de la console Cloud.

  2. Dans Cloud Shell, affichez la réponse du service authentifié :

    PROD_URL=$(gcloud run services describe hello-cloudrun --platform managed --region us-central1 --format=json | jq --raw-output ".status.url")
    
    echo $PROD_URL
    
    curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" $PROD_URL
    

Activer les déploiements de branches

Dans cette section, vous activez une URL unique pour les branches de développement dans Git.

Configurer un déclencheur de branche

Chaque branche est représentée par une URL identifiée par le nom de la branche. Les commits permettent de déclencher un déploiement dans la branche, et les mises à jour sont accessibles via cette même URL.

  1. Dans Cloud Shell, configurez le déclencheur :

    gcloud alpha builds triggers create github \
    --name=branchtrigger \
    --repository=$REPO_NAME \
    --branch-pattern='[^(?!.*main)].*' \
    --build-config=labs/cloudrun-progression/branch-cloudbuild.yaml \
    --region=us-central1
    
  2. Pour examiner le déclencheur, accédez à la page Déclencheurs Cloud Build dans la console Cloud.

Créer des modifications sur une branche

  1. Dans Cloud Shell, créez une branche :

    git checkout -b new-feature-1
    
  2. Ouvrez l'exemple d'application à l'aide de votre éditeur favori ou de Cloud Shell IDE :

    edit app.py
    
  3. Dans l'exemple d'application, modifiez la ligne 24 pour indiquer la version 1.1 au lieu de la version 1.0 :

    @app.route('/')
    
    def hello_world():
        return 'Hello World v1.1'
    
    
  4. Pour revenir à votre terminal, cliquez sur "Ouvrir le terminal".

Exécuter le déclencheur de branche

  1. Dans Cloud Shell, validez la modification et transférez-la vers le dépôt distant :

    git add . && git commit -m "updated" && git push origin new-feature-1
    
  2. Pour examiner la compilation en cours, accédez à l'écran d'historique de compilation de Cloud Build.

  3. Pour examiner la nouvelle révision, une fois la compilation terminée, accédez à la page Révisions de Cloud Run dans la console Cloud :

  4. Dans Cloud Shell, obtenez l'URL unique de cette branche :

    BRANCH_URL=$(gcloud run services describe hello-cloudrun --platform managed --region us-central1 --format=json | jq --raw-output ".status.traffic[] | select (.tag==\"new-feature-1\")|.url")
    
    echo $BRANCH_URL
    
  5. Accédez à l'URL authentifiée :

    curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" $BRANCH_URL
    

    Le résultat de la mise à jour ressemble à ceci :

    Hello World v1.1
    

Automatiser les tests Canary

Lorsque le code est publié en production, il est courant de libérer le code dans un petit sous-ensemble de trafic actif avant de migrer tout le trafic vers le nouveau code base.

Dans cette section, vous mettez en œuvre un déclencheur qui est activé lorsque le code est validé dans la branche principale. Le déclencheur déploie le code vers une URL Canary unique et achemine 10 % de tout le trafic actif vers la nouvelle révision.

  1. Dans Cloud Shell, configurez le déclencheur de branche :

    gcloud alpha builds triggers create github \
      --name=maintrigger \
      --repository=$REPO_NAME \
      --branch-pattern=main \
      --build-config=labs/cloudrun-progression/main-cloudbuild.yaml \
      --region=us-central1
    
  2. Pour examiner le nouveau déclencheur, accédez à la page Déclencheurs Cloud Build dans la console Cloud.

  3. Dans Cloud Shell, fusionnez la branche avec la ligne principale et transférez-la vers le dépôt distant :

    git checkout main
    git merge new-feature-1
    git push origin main
    
  4. Pour examiner la compilation en cours, accédez à la page Compilations Cloud Build.

  5. Une fois la compilation terminée, pour examiner la nouvelle révision, accédez à la page Révisions de Cloud Run dans la console Cloud. Notez que 90 % du trafic est acheminé vers la production, 10 % vers la version Canary et 0 % vers les révisions de branche.

Examinez les lignes clés de main-cloudbuild.yaml qui mettent en œuvre la logique du déploiement Canary.

Les lignes 39 à 45 déploient la nouvelle révision et utilisent l'option "tag" pour acheminer le trafic à partir de l'URL Canary unique :

gcloud run deploy ${_SERVICE_NAME} \
--platform managed \
--region ${_REGION} \
--image gcr.io/${PROJECT_ID}/${_SERVICE_NAME} \
--tag=canary \
--no-traffic

La ligne 61 ajoute un tag statique à la révision qui note le SHA court Git du déploiement :

gcloud beta run services update-traffic ${_SERVICE_NAME} --update-tags=sha-$SHORT_SHA=$${CANARY} --platform managed --region ${_REGION}

La ligne 62 met à jour le trafic pour qu'il achemine 90 % vers la production et 10 % vers la version Canary :

gcloud run services update-traffic ${_SERVICE_NAME} --to-revisions=$${PROD}=90,$${CANARY}=10 --platform managed --region ${_REGION}
  1. Dans Cloud Shell, obtenez l'URL unique de la révision Canary :

    CANARY_URL=$(gcloud run services describe hello-cloudrun --platform managed --region us-central1 --format=json | jq --raw-output ".status.traffic[] | select (.tag==\"canary\")|.url")
    
    echo $CANARY_URL
    
  2. Examinez directement le point de terminaison Canary :

    curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" $CANARY_URL
    
  3. Pour afficher les réponses en pourcentage, envoyez une série de requêtes :

    LIVE_URL=$(gcloud run services describe hello-cloudrun --platform managed --region us-central1 --format=json | jq --raw-output ".status.url")
    for i in {0..20};do
      curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" $LIVE_URL; echo \n
    done
    

Mise en production

Une fois le déploiement Canary validé avec un petit sous-ensemble de trafic, vous déployez le déploiement sur le reste du trafic actif.

Dans cette section, vous allez configurer un déclencheur qui est activé lorsque vous créez un tag dans le dépôt. Le déclencheur migre 100 % du trafic vers la révision déjà déployée en fonction du SHA de commit du tag. L'utilisation du SHA de commit garantit que la révision validée avec le trafic Canary correspond à la révision utilisée pour le reste du trafic en production.

  1. Dans Cloud Shell, configurez le déclencheur de tag :

    gcloud alpha builds triggers create github \
      --name=tagtrigger \
      --repository=$REPO_NAME \
      --tag-pattern=. \
      --build-config=labs/cloudrun-progression/tag-cloudbuild.yaml \
      --region=us-central1
    
  2. Pour examiner le nouveau déclencheur, accédez à la page Déclencheurs Cloud Build dans la console Cloud.

  3. Dans Cloud Shell, créez un tag et transférez-le vers le dépôt distant :

    git tag 1.1
    git push origin 1.1
    
  4. Pour examiner la compilation en cours, accédez à l'écran d'historique de compilation de Cloud Build dans la console Cloud.

  5. Une fois la compilation terminée, pour examiner la nouvelle révision, accédez à la page Révisions de Cloud Run dans la console Cloud. Notez que la révision est mise à jour pour indiquer le tag "prod" et qu'elle diffuse 100 % du trafic actif.

  6. Dans Cloud Shell, pour afficher les réponses basées sur des pourcentages, envoyez une série de requêtes :

    LIVE_URL=$(gCloud Run services describe hello-cloudrun --platform managed --region us-central1 --format=json | jq --raw-output ".status.url")
    
    for i in {0..20};do
      curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" $LIVE_URL; echo \n
    done
    
  7. Examinez les lignes clés de tag-cloudbuild.yaml qui mettent en œuvre la logique de déploiement de production.

    La ligne 37 met à jour la révision Canary en ajoutant le tag "prod". La révision déployée est maintenant taguée pour "prod" et pour "Canary" :

    gcloud beta run services update-traffic ${_SERVICE_NAME} --update-tags=prod=$${CANARY} --platform managed --region ${_REGION}
    

    La ligne 39 met à jour le trafic de l'URL du service de base pour acheminer 100 % du trafic vers la révision taguée "prod" :

    gcloud run services update-traffic ${_SERVICE_NAME} --to-revisions=$${NEW_PROD}=100 --platform managed --region ${_REGION}
    

Effectuer un nettoyage

Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte Google Cloud, supprimez le projet contenant les ressources, ou conservez le projet et supprimez les ressources individuelles.

  1. Dans la console Google Cloud, accédez à la page Gérer les ressources.

    Accéder à la page Gérer les ressources

  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.

Étape suivante