Cette page explique comment créer un pipeline d'intégration et de livraison continues (CI/CD) sur Google Cloud en n'utilisant que des produits hébergés et la méthodologie bien connue GitOps.
Les ingénieurs Google stockent les fichiers de configuration et de déploiement dans notre dépôt de code source principal depuis très longtemps. Cette méthodologie est décrite dans le chapitre 8 du livre Site Reliability Engineering (Beyer et. al., 2016). Kelsey Hightower en a fait la démonstration lors du discours d'ouverture de Google Cloud Next '17.
L'un des éléments clés de GitOps est le concept des "Environnements en tant que code" : cette approche permet de décrire les déploiements de manière déclarative à l'aide de fichiers (par exemple, des manifestes Kubernetes) stockés dans un dépôt Git.
Dans ce tutoriel, vous allez créer un pipeline CI/CD qui compile automatiquement une image de conteneur à partir d'un code validé, stocke l'image dans Artifact Registry, met à jour un manifeste Kubernetes dans un dépôt Git, puis déploie l'application sur Google Kubernetes Engine (GKE) à l'aide de ce manifeste.
Ce tutoriel utilise deux dépôts Git :
- dépôt de l'application (app) : contient le code source de l'application
- dépôt de l'environnement (env) : contient les manifestes pour le déploiement Kubernetes
Lorsque vous déployez une modification dans le dépôt app, le pipeline Cloud Build exécute des tests, compile une image de conteneur, puis déploie cette image sur Artifact Registry. Après avoir déployé l'image, Cloud Build met à jour le manifeste de déploiement et le transfère vers le dépôt env. Cette opération déclenche un autre pipeline Cloud Build, qui applique le manifeste au cluster GKE et, en cas de succès, le stocke dans une autre branche du dépôt env.
Nous gardons les dépôts app et env séparés, car leur utilisation et leur cycle de vie diffèrent. Les principaux utilisateurs du dépôt app sont des humains et ce dépôt est dédié à une application spécifique. Les principaux utilisateurs du dépôt env sont des systèmes automatisés (comme Cloud Build), et ce dépôt peut être partagé par plusieurs applications. Le dépôt env peut contenir plusieurs branches, chacune d'entre elles correspondant à un environnement spécifique (vous n'utiliserez que l'environnement de production dans ce tutoriel) et faisant référence à une image de conteneur spécifique, ce qui n'est pas le cas avec le dépôt env.
Une fois ce tutoriel terminé, vous disposerez d'un système dans lequel vous pourrez facilement :
- distinguer les déploiements en échec des déploiements réussis en consultant l'historique de Cloud Build ;
- accéder au manifeste actuellement utilisé en consultant la branche production du dépôt env ;
- revenir à n'importe quelle version précédente en exécutant une nouvelle fois la compilation Cloud Build correspondante.
À propos de ce tutoriel
Ce tutoriel utilise Cloud Source Repositories pour héberger des dépôts Git, mais vous pouvez obtenir les mêmes résultats avec des produits tiers, tels que GitHub, Bitbucket ou GitLab.
Ce pipeline ne met pas en œuvre de mécanisme de validation avant le déploiement. Si vous utilisez GitHub, Bitbucket ou GitLab, vous pouvez le modifier pour qu'il utilise une demande d'extraction à cette fin.
Bien que nous recommandions Spinnaker aux équipes souhaitant mettre en œuvre des schémas de déploiement avancés (bleu-vert, analyse Canary, multicloud, etc.), ses fonctionnalités ne sont pas vraiment indispensables au succès d'une stratégie CI/CD pour les petites entreprises et les projets de moindre envergure. Dans ce tutoriel, vous allez apprendre à créer un pipeline CI/CD adapté aux applications hébergées sur GKE à l'aide d'outils.
Pour des raisons de simplicité, ce tutoriel utilise un seul environnement (production) dans le dépôt env, mais vous pouvez étendre le déploiement sur plusieurs environnements si nécessaire.
Objectifs
- Créer les dépôts Git dans Cloud Source Repositories
- Créer une image de conteneur avec Cloud Build et la stocker dans Artifact Registry
- Créer un pipeline CI
- Créer un pipeline CD
- Tester le pipeline CI/CD
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.
Une fois que vous avez terminé les tâches décrites dans ce document, vous pouvez éviter de continuer à payer des frais en supprimant les ressources que vous avez créées. Pour en savoir plus, consultez la section Effectuer un nettoyage.
Avant de commencer
Sélectionnez ou créez un projet Google Cloud.
Activez la facturation pour votre projet.
Ouvrez Cloud Shell pour exécuter les commandes répertoriées dans ce tutoriel. Cloud Shell est un environnement shell interactif pour Google Cloud qui vous permet de gérer vos projets et vos ressources depuis un navigateur Web.
Si la commande
gcloud config get-value project
ne renvoie pas l'ID du projet que vous avez sélectionné, configurez Cloud Shell pour utiliser votre projet.gcloud config set project [PROJECT_ID]
Dans Cloud Shell, activez les API nécessaires.
gcloud services enable container.googleapis.com \ cloudbuild.googleapis.com \ sourcerepo.googleapis.com \ artifactregistry.googleapis.com
Créez un dépôt Docker Artifact Registry nommé
my-repository
dans la régionus-central1
pour stocker vos images de conteneurs.gcloud artifacts repositories create my-repository \ --repository-format=docker \ --location=us-central1
Dans Cloud Shell, créez un cluster GKE que vous utiliserez pour déployer l'exemple d'application de ce tutoriel.
Autopilot
Créez un cluster Autopilot nommé
hello-cloudbuild
:gcloud container clusters create-auto hello-cloudbuild \ --region us-central1
Standard
Créez un cluster standard à nœud unique nommé
hello-cloudbuild
:gcloud container clusters create hello-cloudbuild \ --num-nodes 1 --region us-central1
Si vous n'avez jamais utilisé Git dans Cloud Shell, configurez-le avec votre nom et votre adresse e-mail. Git les utilisera pour vous identifier en tant qu'auteur des commits que vous créerez dans Cloud Shell.
git config --global user.email "YOUR_EMAIL_ADDRESS" git config --global user.name "YOUR_NAME"
Une fois que vous avez terminé ce tutoriel, évitez de continuer à payer des frais en supprimant les ressources que vous avez créées. Pour en savoir plus, consultez la section Effectuer un nettoyage.
Créer les dépôts Git dans Cloud Source Repositories
Dans cette section, vous allez créer les deux dépôts Git (app et env) utilisés dans ce tutoriel, puis initialiser l'application avec un exemple de code.
Dans Cloud Shell, créez les deux dépôts Git.
gcloud source repos create hello-cloudbuild-app gcloud source repos create hello-cloudbuild-env
Clonez l'exemple de code depuis GitHub.
cd ~ git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd ~/kubernetes-engine-samples/management/gitops-style-delivery/
Configurez Cloud Source Repositories en tant que dépôt distant.
PROJECT_ID=$(gcloud config get-value project) git remote add google \ "https://source.developers.google.com/p/${PROJECT_ID}/r/hello-cloudbuild-app"
Le code que vous avez cloné contient une application "Hello World".
Créer une image de conteneur avec Cloud Build
Le code que vous avez cloné contient le fichier Dockerfile suivant :
Vous pouvez utiliser ce fichier Dockerfile pour créer une image de conteneur avec Cloud Build, puis stocker cette image dans Artifact Registry.
Dans Cloud Shell, créez une compilation Cloud Build basée sur le dernier commit à l'aide de la commande suivante :
cd ~/kubernetes-engine-samples/management/gitops-style-delivery/ COMMIT_ID="$(git rev-parse --short=7 HEAD)" gcloud builds submit --tag="us-central1-docker.pkg.dev/${PROJECT_ID}/my-repository/hello-cloudbuild:${COMMIT_ID}" .
Cloud Build diffuse les journaux générés par la création de l'image de conteneur sur votre terminal lorsque vous exécutez cette commande.
Une fois la compilation achevée, vérifiez que votre nouvelle image de conteneur est disponible dans Artifact Registry.
Créer le pipeline d'intégration continue
Dans cette section, vous allez configurer Cloud Build afin qu'il exécute automatiquement un petit test unitaire, qu'il génère l'image de conteneur, puis qu'il déploie cette dernière sur Artifact Registry. L'envoi d'un nouveau commit vers Cloud Source Repositories déclenche automatiquement ce pipeline. Le fichier cloudbuild.yaml
(inclus dans le code) correspond à la configuration du pipeline.
Accédez à la page Déclencheurs de Cloud Build.
Cliquez sur Créer un déclencheur.
Indiquez les options suivantes :
- Dans le champ Nom, saisissez
hello-cloudbuild
. - Sous Événement, sélectionnez Déployer sur une branche.
- Sous Source, sélectionnez le dépôt
hello-cloudbuild-app
et la branche^master$
. - Sous Configuration de la compilation, sélectionnez Fichier de configuration Cloud Build.
- Dans le champ Emplacement du fichier de configuration Cloud Build, saisissez
cloudbuild.yaml
après/
.
- Dans le champ Nom, saisissez
Cliquez sur Créer pour enregistrer le déclencheur de compilation.
Conseil : Si vous devez créer des déclencheurs de compilation pour de nombreux projets, vous pouvez utiliser l'API Build Triggers.
Dans Cloud Shell, transférez le code de l'application vers Cloud Source Repositories pour déclencher le pipeline d'intégration continue (CI) dans Cloud Build.
cd ~/kubernetes-engine-samples/management/gitops-style-delivery/ git push google master
Ouvrez la console Cloud Build.
Les compilations récemment exécutées et terminées s'affichent. Vous pouvez cliquer sur une compilation pour suivre son exécution et examiner ses journaux.
Créer le pipeline de livraison continue
Cloud Build est également utilisé pour le pipeline de livraison continue. Le pipeline s'exécute chaque fois qu'un commit (validation) est déployé sur la branche candidate du dépôt hello-cloudbuild-env. Le pipeline applique la nouvelle version du manifeste au cluster Kubernetes et, en cas de succès, copie le manifeste dans la branche production. Ce processus a les propriétés suivantes :
- La branche candidate correspond à l'historique des tentatives de déploiement.
- La branche production correspond à l'historique des déploiements réussis.
- Dans Cloud Build, une vue permet d'identifier les déploiements réussis et en échec.
- Vous pouvez restaurer n'importe quel déploiement antérieur (opération de "rollback") en exécutant à nouveau la compilation correspondante dans Cloud Build. Lors d'un rollback, la branche production est également mise à jour afin de refléter fidèlement l'historique des déploiements.
Dans cette étape, vous allez modifier le pipeline d'intégration continue pour mettre à jour la branche candidate du dépôt hello-cloudbuild-env, ce qui entraînera le déclenchement du pipeline de livraison continue.
Autoriser Cloud Build à accéder à GKE
Pour déployer l'application dans votre cluster Kubernetes, Cloud Build a besoin du rôle Identity and Access Management de développeur Kubernetes Engine.
Shell
Dans Cloud Shell, exécutez la commande suivante :
PROJECT_NUMBER="$(gcloud projects describe ${PROJECT_ID} --format='get(projectNumber)')" gcloud projects add-iam-policy-binding ${PROJECT_NUMBER} \ --member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \ --role=roles/container.developer
Console
Dans Google Cloud Console, accédez à la page Paramètres de Cloud Build :
Accéder à la page Paramètres de Cloud Build
La page Autorisations de compte de service s'affiche :
Passez le rôle de Développeur sur Kubernetes Engine à l'état Activé.
Initialiser le dépôt hello-cloudbuild-env
Vous devez initialiser le dépôt hello-cloudbuild-env avec deux branches (hello-cloudbuild-env et hello-cloudbuild-env) et un fichier de configuration Cloud Build décrivant le processus de déploiement.
Dans Cloud Shell, clonez le dépôt hello-cloudbuild-env, puis créez la branche hello-cloudbuild-env.
cd ~ gcloud source repos clone hello-cloudbuild-env cd ~/kubernetes-engine-samples/management/gitops-style-delivery/ git checkout -b production
Copiez le fichier
cloudbuild-delivery.yaml
disponible dans le dépôt hello-cloudbuild-app, puis validez la modification.cd ~/kubernetes-engine-samples/management/gitops-style-delivery/ cp ~/hello-cloudbuild-app/cloudbuild-delivery.yaml ~/kubernetes-engine-samples/management/gitops-style-delivery/cloudbuild.yaml git add . git commit -m "Create cloudbuild.yaml for deployment"
Le fichier
cloudbuild-delivery.yaml
décrit le processus de déploiement qui doit être exécuté dans Cloud Build. Ce processus comporte deux étapes :Cloud Build applique le manifeste sur le cluster GKE.
En cas de succès, Cloud Build copie le manifeste sur la branche production.
Créez une branche candidate, puis transférez les deux branches vers Cloud Source Repositories pour qu'elles soient accessibles.
git checkout -b candidate git push origin production git push origin candidate
Accordez le rôle IAM "Rédacteur de dépôt source" au compte de service Cloud Build pour le dépôt hello-cloudbuild-env.
PROJECT_NUMBER="$(gcloud projects describe ${PROJECT_ID} \ --format='get(projectNumber)')" cat >/tmp/hello-cloudbuild-env-policy.yaml <<EOF bindings: - members: - serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com role: roles/source.writer EOF gcloud source repos set-iam-policy \ hello-cloudbuild-env /tmp/hello-cloudbuild-env-policy.yaml
Créer le déclencheur pour le pipeline de livraison continue
Dans cette section, vous allez configurer Cloud Build pour qu'il soit déclenché par un déploiement vers la branche candidate du dépôt hello-cloudbuild-env.
Ouvrez la page Déclencheurs de Cloud Build.
Cliquez sur Créer un déclencheur.
Indiquez les options suivantes :
- Dans le champ Nom, saisissez
hello-cloudbuild-deploy
. - Sous Événement, sélectionnez Déployer sur une branche.
- Sous Source, sélectionnez le dépôt
hello-cloudbuild-env
et la branche^candidate$
. - Dans Configuration : sélectionnez Fichier de configuration Cloud Build (yaml ou json).
- Dans le champ Emplacement du fichier de configuration Cloud Build, saisissez
cloudbuild.yaml
après/
.
- Dans le champ Nom, saisissez
Cliquez sur Créer.
Modifier le pipeline d'intégration continue afin de déclencher le pipeline de livraison continue
Dans cette section, vous allez ajouter certaines étapes au pipeline d'intégration continue pour qu'il génère une nouvelle version du manifeste Kubernetes, puis qu'il la déploie dans le dépôt hello-cloudbuild-env afin de déclencher le pipeline de livraison continue.
Remplacez le fichier
cloudbuild.yaml
par l'exemple étendu du fichiercloudbuild-trigger-cd.yaml
.cd ~/kubernetes-engine-samples/management/gitops-style-delivery/ cp cloudbuild-trigger-cd.yaml cloudbuild.yaml
Le fichier
cloudbuild-trigger-cd.yaml
est une version étendue du fichiercloudbuild.yaml
. Il ajoute des étapes pour générer le nouveau fichier manifeste Kubernetes et déclencher le pipeline de livraison continue.Validez les modifications et déployez-les sur Cloud Source Repositories.
cd ~/kubernetes-engine-samples/management/gitops-style-delivery/ git add cloudbuild.yaml git commit -m "Trigger CD pipeline" git push google master
Cette opération déclenche le pipeline d'intégration continue dans Cloud Build.
Examinez la compilation de l'intégration continue.
Les compilations récemment exécutées et terminées pour le dépôt hello-cloudbuild-app s'affichent. Vous pouvez cliquer sur le nom d'une compilation pour suivre son exécution et examiner ses journaux. La dernière étape de ce pipeline consiste à déployer le nouveau manifeste sur le dépôt hello-cloudbuild-env, ce qui entraîne le déclenchement du pipeline de livraison continue.
Examinez la compilation de livraison continue.
Les compilations récemment exécutées et terminées pour le dépôt hello-cloudbuild-env s'affichent. Vous pouvez cliquer sur le nom d'une compilation pour suivre son exécution et examiner ses journaux.
Tester le pipeline complet
Le pipeline CI/CD complet est maintenant configuré. Dans cette section, vous allez le tester de bout en bout.
Accédez à la page des services GKE.
Accéder aux services Google Kubernetes Engine
La liste contient un seul service nommé hello-cloudbuild, créé par le build de livraison continue récemment terminé.
Cliquez sur le point de terminaison associé au service hello-cloudbuild. Le message "Hello World!" s'affiche. Si le point de terminaison n'apparaît pas ou si vous constatez une erreur de l'équilibreur de charge, vous devrez peut-être attendre quelques minutes que l'initialisation de l'équilibreur de charge se termine. Si nécessaire, cliquez sur Actualiser pour mettre à jour la page.
Dans Cloud Shell, remplacez "Hello World" par "Hello Cloud Build" (dans l'application comme dans le test unitaire).
cd ~/kubernetes-engine-samples/management/gitops-style-delivery/ sed -i 's/Hello World/Hello Cloud Build/g' app.py sed -i 's/Hello World/Hello Cloud Build/g' test_app.py
Validez la modification et déployez-la sur Cloud Source Repositories.
git add app.py test_app.py git commit -m "Hello Cloud Build" git push google master
Cette opération déclenche le pipeline CI/CD complet.
Attendez quelques minutes, puis rechargez l'application dans votre navigateur. "Hello Cloud Build!" s'affiche.
Tester le rollback
Dans cette section, vous allez restaurer la version de l'application qui affiche la mention "Hello World!".
Ouvrez la console Cloud Build pour le dépôt hello-cloudbuild-env.
Cliquez sur la deuxième build (compilation) la plus récente disponible.
Cliquez sur Recompiler.
Une fois la compilation terminée, rechargez l'application dans votre navigateur. "Hello World!" s'affiche de nouveau.
Nettoyer
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.
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Supprimer les ressources
Si vous souhaitez conserver le projet Google Cloud que vous avez utilisé dans ce tutoriel, supprimez les différentes ressources :
Supprimez les dépôts Git locaux.
cd ~ rm -rf ~/hello-cloudbuild-app rm -rf ~/hello-cloudbuild-env
Supprimez les dépôts Git dans Cloud Source Repositories
gcloud source repos delete hello-cloudbuild-app --quiet gcloud source repos delete hello-cloudbuild-env --quiet
Supprimez les déclencheurs Cloud Build.
Ouvrez la page Déclencheurs de Cloud Build.
Pour chaque déclencheur, cliquez sur Plusmore_vert, puis sur Supprimer.
Supprimez le dépôt Docker dans Artifact Registry.
gcloud artifacts repositories delete my-repository \ --location=us-central1
Supprimez l'autorisation accordée à Cloud Build pour la connexion à GKE.
PROJECT_NUMBER="$(gcloud projects describe ${PROJECT_ID} \ --format='get(projectNumber)')" gcloud projects remove-iam-policy-binding ${PROJECT_NUMBER} \ --member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \ --role=roles/container.developer
Supprimez le cluster GKE.
gcloud container clusters delete hello-cloudbuild \ --region us-central1
Étape suivante
- Découvrez certaines fonctionnalités avancées de Cloud Build : Configurer l'ordre des étapes de compilation, Compiler, tester et déployer des artefacts et Créer des étapes de compilation personnalisées.
- Découvrez comment mettre en miroir un dépôt GitHub ou Bitbucket dans Cloud Source Repositories.
- Découvrez comment connecter directement Cloud Build à votre dépôt GitHub.