[{"data":1,"prerenderedAt":720},["ShallowReactive",2],{"/fr-fr/blog/ci-deployment-and-environments/":3,"navigation-fr-fr":38,"banner-fr-fr":458,"footer-fr-fr":470,"Ivan Nemytchenko-Cesar Saavedra":682,"next-steps-fr-fr":705},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"seo":8,"content":16,"config":28,"_id":31,"_type":32,"title":33,"_source":34,"_file":35,"_stem":36,"_extension":37},"/fr-fr/blog/ci-deployment-and-environments","blog",false,"",{"title":9,"description":10,"ogTitle":9,"ogDescription":10,"noIndex":6,"ogImage":11,"ogUrl":12,"ogSiteName":13,"ogType":14,"canonicalUrls":12,"schema":15},"Comment déployer du code dans des environnements multiples avec GitLab CI","GitLab CI est à la fois puissant et polyvalent. Découvrez les capacités de cet outil à travers plusieurs scénarios d'utilisation.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749662033/Blog/Hero%20Images/intro.jpg","https://about.gitlab.com/blog/ci-deployment-and-environments","https://about.gitlab.com","article","\n                        {\n        \"@context\": \"https://schema.org\",\n        \"@type\": \"Article\",\n        \"headline\": \"Comment déployer du code dans des environnements multiples avec GitLab CI\",\n        \"author\": [{\"@type\":\"Person\",\"name\":\"Ivan Nemytchenko\"},{\"@type\":\"Person\",\"name\":\"Cesar Saavedra\"}],\n        \"datePublished\": \"2021-02-05\",\n      }",{"title":9,"description":10,"authors":17,"heroImage":11,"date":20,"body":21,"category":22,"tags":23,"updatedDate":27},[18,19],"Ivan Nemytchenko","Cesar Saavedra","2021-02-05","Imaginez-vous gestionnaire d’un site d'information. Heureusement, le code de votre projet est déjà hébergé sur GitLab.com et vous utilisez [GitLab CI/CD](https://docs.gitlab.com/ee/ci/testing/ \"Test avec GitLab CI/CD\") pour vos tests. Maintenant, vous souhaitez connaître toutes les possibilités de [déploiement](https://about.gitlab.com/fr-fr/blog/how-to-keep-up-with-ci-cd-best-practices/ \"Meilleures pratiques CI/CD\").\n\nPar souci de pertinence, supposons que l'application se compose uniquement de fichiers HTML, sans code côté serveur ni compilation sophistiquée des actifs JS. La plateforme de destination sera également générique, nous utiliserons [Amazon S3](https://aws.amazon.com/fr/s3/ \"Amazon S3\").\n\nPlutôt que de fournir des extraits de code à copier-coller, nous allons vous partager les principes et les fonctionnalités de GitLab CI, afin que vous puissiez les appliquer dans votre propre pile technologique. \n\nDéroulons donc notre histoire depuis son commencement, où il n'est pas encore question d'intégration continue.\n\n## La ligne de départ\n\n__Déploiement__ : un ensemble de fichiers HTML devraient apparaître dans votre bucket S3 (déjà configuré pour [héberger un site web statique](https://docs.aws.amazon.com/fr_fr/AmazonS3/latest/userguide/HostingWebsiteOnS3Setup.html \"Héberger un site web statique avec Amazon S3\")). Il y a des millions de façons de procéder. Dans notre cas, nous utiliserons la bibliothèque [AWS CLI](https://aws.amazon.com/fr/cli/ \"AWS CLI\") fournie par Amazon. \n\nLa commande complète ressemble à ceci :\n\n```shell\naws s3 cp ./ s3://yourbucket/ --recursive --exclude \"*\" --include \"*.html\"\n```\n\nLe push du code vers le dépôt et le déploiement sont deux processus distincts.\n\n![Déploiement manuel](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674077/Blog/Content%20Images/19-updated.png){: .center}\n{: .note .text-center}\n\nDétail important : la commande nécessite de [fournir les variables d'environnement](https://docs.aws.amazon.com/fr_fr/cli/latest/userguide/cli-chap-getting-started.html) `AWS_ACCESS_KEY_ID` et `AWS_SECRET_ACCESS_KEY`. Il vous faudra peut-être aussi spécifier `AWS_DEFAULT_REGION`. \n\nEssayons d'automatiser cette procédure avec [l'intégration continue de GitLab](https://about.gitlab.com/fr-fr/solutions/continuous-integration/ \"Intégration continue de GitLab\").\n\n## Votre premier déploiement automatisé\n\nGitLab CI offre une grande flexibilité dans l'exécution des commandes. Sa configuration s'adapte à vos besoins, reproduisant l'environnement de votre terminal local. Ajoutez votre script dans le fichier .gitlab-ci.yml et effectuez un push de votre code : l’outil d'intégration continue de GitLab déclenche un *job* et vos commandes sont exécutées.\n\nPrécisons maintenant le contexte d'utilisation de cet exemple : il s'agit d'un site de taille modeste, avec une trentaine de visiteurs journaliers, et une seule branche principale de dépôt de code. Commençons par spécifier un *job* avec la commande précédente dans le fichier `.gitlab-ci.yml` :\n\n```yaml\ndeploy:\n  script: aws s3 cp ./ s3://yourbucket/ --recursive --exclude \"*\" --include \"*.html\"\n```\n\nOups, la commande a échoué :\n\n![Message d'erreur lors de l'exécution d'un job GitLab.](https://about.gitlab.com/images/blogimages/ci-deployment-and-environments/13.jpg){: .shadow}\n\nIl fallait d'abord vérifier l'existence d'un exécutable `aws`. Pour installer `awscli`, nous avons besoin de `pip`, qui est un outil d'installation de paquets Python. Spécifions une image Docker avec Python préinstallé, qui devrait également contenir `pip` : \n\n```yaml\ndeploy:\n  image: python:latest\n  script:\n  - pip install awscli\n  - aws s3 cp ./ s3://yourbucket/ --recursive --exclude \"*\" --include \"*.html\"\n```\n\n![Déploiement automatisé](https://about.gitlab.com/images/blogimages/ci-deployment-and-environments/fail1.png){: .center}\n{: .note .text-center}\n\nVous effectuez un push de votre code sur GitLab, et il est automatiquement déployé par l’outil CI. \n\nL'installation d'`awscli` rallonge le temps d'exécution du job, mais pour l'instant ce n'est pas un souci. Pour accélérer le processus, [cherchez une image Docker](https://hub.docker.com/ \"Chercher une image Docker\") avec `awscli` préinstallé, ou créez une image vous-même. \n\nN’oublions pas les variables d'environnement récupérées depuis la [console AWS](https://console.aws.amazon.com/) :\n\n```yaml\nvariables:\n  AWS_ACCESS_KEY_ID: \"AKIAIOSFODNN7EXAMPLE\"\n  AWS_SECRET_ACCESS_KEY: \"wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY\"\ndeploy:\n  image: python:latest\n  script:\n  - pip install awscli\n  - aws s3 cp ./ s3://yourbucket/ --recursive --exclude \"*\" --include \"*.html\"\n```\n\nCela devrait fonctionner, mais attention : ce n'est jamais une bonne idée de dévoiler des clés secrètes de votre code, même dans un dépôt privé. Remédions donc à cette situation.\n\n### Des secrets bien gardés\n\nGitLab dispose d’un endroit spécialement dédié aux variables secrètes : __Paramètres > CI/CD > Variables__.\n\n![Ajouter une variable secrète dans GitLab](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674076/Blog/Content%20Images/add-variable-updated.png)\n\nTout ce que vous y mettez se transforme en variables d'environnement. En cochant la case « Masquée », vous masquerez la variable dans les job logs. En cochant la case « Protéger la variable », vous n’exporterez la variable uniquement vers les pipelines s'exécutant sur des branches et des étiquettes protégées. \n\nSeuls les utilisateurs ayant le statut de propriétaire ou de chargé de maintenance sur un projet auront accès à cette section. Nous pourrions supprimer la section `variables` de notre configuration CI, mais nous allons l'utiliser à d'autres fins.\n\n### Savoir spécifier et utiliser des variables non-secrètes\n\nLorsque votre configuration s'agrandit, il devient pratique de conserver certains paramètres sous formes de variables au début de votre configuration. Le cas présent ne le justifie pas, mais pour les besoins de cette démonstration, nous allons définir le nom du compartiment S3 comme variable :\n\n```yaml\nvariables:\n  S3_BUCKET_NAME: \"yourbucket\"\ndeploy:\n  image: python:latest\n  script:\n  - pip install awscli\n  - aws s3 cp ./ s3://$S3_BUCKET_NAME/ --recursive --exclude \"*\" --include \"*.html\"\n```\n\nJusqu'ici, tout va bien :\n\n![Compilation GitLab CI sans erreur](https://about.gitlab.com/images/blogimages/ci-deployment-and-environments/14.jpg){: .shadow.medium.center}\n\nDans notre scénario, la fréquentation du site est en hausse, et vous avez embauché un développeur pour vous aider. Voyons comment le workflow GitLab CI s'adapte au travail en équipe.\n\n## Comment utiliser GitLab CI en équipe\n\nAvec deux utilisateurs travaillant dans le même dépôt, il n'est plus pratique d'utiliser la branche principale pour le développement. Vous décidez d'utiliser des branches séparées pour les nouvelles fonctionnalités et les nouveaux articles, et de les fusionner dans la branche principale lorsqu'elles sont prêtes.\n\nCependant, votre configuration CI actuelle ne prend pas en charge les branches. Chaque push effectué vers GitLab sera déployé sur S3. La solution est simple : il suffit d'ajouter `only: main` au job `deploy`.\n\nEn plus de ne pas vouloir déployer chaque branche sur l’environnement de production, vous souhaiteriez pouvoir prévisualiser vos modifications depuis les branches de fonctionnalités. \n\n![Déploiement de la branche principale de GitLab vers AWS S3](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674076/Blog/Content%20Images/15-updated.png){: .center}\n{: .note .text-center}  \n\n### Comment configurer un environnement de test ?\n\nMatteo, votre nouveau développeur, vous propose d'utiliser la fonctionnalité [GitLab Pages](https://docs.gitlab.com/ee/user/project/pages/ \"GitLab Pages\"), idéale pour prévisualiser votre travail en cours. Afin d'[héberger des sites web sur GitLab Pages](https://docs.gitlab.com/ee/user/project/pages/getting_started/pages_ui.html \"Héberger des sites web sur GitLab Pages\"), votre fichier de configuration CI doit répondre à trois règles simples :\n\n- Le *job* doit être nommé `pages`\n- Il doit y avoir une section `artifacts` avec un dossier `public`\n- Tout ce que vous souhaitez héberger doit être placé dans le dossier `public`\n\nLe contenu du dossier public sera hébergé à l'adresse suivante : `http://\u003Cusername>.gitlab.io/\u003Cprojectname>/`\n\nVoici la configuration complète après avoir appliqué l’[exemple de configuration pour les sites web en HTML](https://gitlab.com/pages/plain-html/-/blob/main/.gitlab-ci.yml \"Exemple de configuration pour les sites web en HTML\") :\n\n```yaml\nvariables:\n  S3_BUCKET_NAME: \"yourbucket\"\n\ndeploy:\n  image: python:latest\n  script:\n  - pip install awscli\n  - aws s3 cp ./ s3://$S3_BUCKET_NAME/ --recursive --exclude \"*\" --include \"*.html\"\n  only:\n  - main\n\npages:\n  image: alpine:latest\n  script:\n  - mkdir -p ./public\n  - cp ./*.html ./public/\n  artifacts:\n    paths:\n    - public\n  except:\n  - main\n```\n\nNous avons spécifié deux jobs. L'un d'eux déploie le site web pour vos clients sur S3 (`deploy`). L'autre (`pages`) déploie le site web sur GitLab Pages. Nommons-les « Environnement de production » et « Environnement de préproduction ». Toutes les branches seront déployées sur GitLab Pages, à l'exception de la branche principale. \n\n![Déploiement différencié des branches dans GitLab Pages et S3.](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674076/Blog/Content%20Images/16-updated.png){: .center}\n{: .note .text-center}\n\n## Introduction aux environnements\n\nGitLab offre la prise en charge de [nombreux environnements](https://docs.gitlab.com/ee/ci/environments/ \"Environnements GitLab\") (dynamiques ou statiques) ; vous devez simplement spécifier l'environnement correspondant pour chaque *job* de déploiement :\n\n```yaml\nvariables:\n  S3_BUCKET_NAME: \"yourbucket\"\n\ndeploy to production:\n  environment: production\n  image: python:latest\n  script:\n  - pip install awscli\n  - aws s3 cp ./ s3://$S3_BUCKET_NAME/ --recursive --exclude \"*\" --include \"*.html\"\n  only:\n  - main\n\npages:\n  image: alpine:latest\n  environment: staging\n  script:\n  - mkdir -p ./public\n  - cp ./*.html ./public/\n  artifacts:\n    paths:\n    - public\n  except:\n  - main\n```\n\nGitLab garde une trace de tous vos déploiements. Ainsi, vous savez toujours ce qui est actuellement déployé sur vos serveurs :\n\n![Visualisation des environnements sur GitLab CI/CD.](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674076/Blog/Content%20Images/envs-updated.png){: .shadow.center}\n\nL'historique complet de vos déploiements sur chacun de vos environnements actuels vous est aussi fourni :\n\n![Historique des déploiements GitLab.](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674077/Blog/Content%20Images/staging-env-detail-updated.png){: .shadow.center}\n\nMaintenant que tout est automatisé et configuré, de nouveaux défis nous attendent.\n\n## Comment dépanner les déploiements ?\n\nOups ! La branche de fonctionnalités que vous avez poussé sur l'environnement de préproduction vient d'être remplacée par celle de Matteo, qui vient d'effectuer un push de sa propre branche. L'énervement vous gagne, c'est la troisième fois que cela arrive aujourd'hui ! \n\nEt si vous utilisiez Slack pour notifier vos déploiements, afin d'éviter ce genre de désagrément ?\n\n> Recevez des notifications en utilisant l'[application GitLab pour Slack](https://docs.gitlab.com/ee/user/project/integrations/gitlab_slack_application.html).\n\n## Du travail d'équipe à grande échelle\n\nQuelque temps plus tard, et vous voilà à la tête d'un site web très populaire, et d'une équipe de huit personnes. Mais, désormais, les membres de votre équipe perdent un temps précieux à attendre de pouvoir prévisualiser leur travail. Le déploiement de chaque branche en préproduction n'est plus optimal.\n\n![File d'attente de branches à examiner en préproduction](https://about.gitlab.com/images/blogimages/ci-deployment-and-environments/build.png){: .center}\n\nIl est temps de perfectionner le système. Vous convenez avec votre équipe de fusionner au préalable chaque changement sur la branche de préproduction. La modification du fichier `.gitlab-ci.yml` est minime :\n\n```yaml\nexcept:\n- main\n```\n\nest remplacé par\n\n```yaml\nonly:\n- staging\n```\n\n![Dessin de développeurs qui fusionnent leurs changements dans une branche de préproduction avant de les déployer sur S3](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674077/Blog/Content%20Images/17-updated.png){: .center}\n{: .note .text-center}\n\nVos collaborateurs doivent fusionner leurs branches de fonctionnalités avant de prévisualiser leur travail en préproduction. Cela nécessite plus de temps et d'efforts, mais tout le monde s'accorde à dire que c'est toujours mieux que d'attendre.\n\n## Comment gérer les urgences ?\n\nIl arrive parfois que les choses tournent mal. Quelqu'un a mal fusionné des branches et a effectué un push du résultat directement en production, juste au moment où le hashtag de votre site devenait viral sur les réseaux sociaux. Des milliers de personnes voient des visuels cassés au lieu de votre page d'accueil habituelle. Heureusement, la fonction __Restaurer l’environnement__ a permis de résoudre le problème en moins d'une minute.\n\n![Fonctionnalité de restauration sur la plateforme GitLab](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674077/Blog/Content%20Images/18-updated.png){: .shadow.center}\n{: .note .text-center}\n\nLa fonction de restauration de l'environnement relance le job précédent avec la validation précédente. Vous avez décidé de désactiver le déploiement automatique en production et de passer au déploiement manuel. Pour ce faire, vous devez ajouter  `when : manual` à votre *job*. Il n'y aura effectivement plus de déploiement automatique en production. Le déploiement manuel s'effectue en allant dans __Compilation > Pipelines__, et en cliquant sur __« Exécuter des jobs manuels ou différés »__ :\n\n![Déploiement manuel sur GitLab.](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674077/Blog/Content%20Images/prod-env-rollback-arrow-updated.png){: .shadow.center}\n\nEffectuons maintenant un bond en avant dans le temps. Votre entreprise est devenue une société de plusieurs centaines d'employés travaillant sur le site web, et les compromis précédents ne fonctionnent plus.\n\n### Faire ses premiers pas avec les Review Apps\n\nLogiquement, la nouvelle étape consiste à lancer une instance temporaire de l'application par branche de fonctionnalités pour la revue. Pour cela, nous avons configuré un autre bucket S3. Sa seule particularité est que le contenu du site est placé dans un dossier portant le nom de la branche de développement, de sorte que l’URL ressemble à :\n\n`http://\u003CREVIEW_S3_BUCKET_NAME>.s3-website-us-east-1.amazonaws.com/\u003Cbranchname>/`\n\nVoici le remplacement du *job* `pages` utilisé auparavant :\n\n```yaml\nreview apps:\n  variables:\n    S3_BUCKET_NAME: \"reviewbucket\"\n  image: python:latest\n  environment: review\n  script:\n  - pip install awscli\n  - mkdir -p ./$CI_BUILD_REF_NAME\n  - cp ./*.html ./$CI_BUILD_REF_NAME/\n  - aws s3 cp ./ s3://$S3_BUCKET_NAME/ --recursive --exclude \"*\" --include \"*.html\"\n```\n\nIci, il est bon de connaître l'origine de cette variable `$CI_BUILD_REF_NAME`. GitLab prédéfinit de [nombreuses variables d'environnement](https://docs.gitlab.com/ee/ci/variables/predefined_variables.html \"Variables d'environnement dans GitLab\") à utiliser dans vos jobs. Notez que nous avons défini la variable `S3_BUCKET_NAME` à l'intérieur du *job*. Vous pouvez ainsi réécrire les définitions de niveau supérieur. \n\nReprésentation visuelle de la configuration des Review Apps :\n\n![Dessin représentant la configuration Review Apps de GitLab.](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674076/Blog/Content%20Images/manual-pipeline-arrow-updated.png){: .illustration}\n\nLes détails de l'implémentation des Review Apps varient selon votre pile technologique et de votre processus de déploiement. Tout ne sera pas aussi simple qu'avec un site HTML statique. Programmer des instances temporaires à la volée avec tous les logiciels et services requis n'est pas chose aisée. Mais tout cela peut être accompli, notamment à l'aide des conteneurs Docker, Chef ou Ansible.\n\nLe déploiement avec Docker mériterait d'ailleurs un article complet. Et si vous regrettez l'absence de scénarios plus complexes qu'un simple déploiement en HTML statique, nous vous recommandons de lire [cet article](https://about.gitlab.com/blog/building-an-elixir-release-into-docker-image-using-gitlab-ci-part-1/ \"Construire une version d'Elixir dans une image Docker en utilisant GitLab CI - Partie 1\"). Abordons maintenant un dernier sujet.\n\n### Déployer sur différentes plateformes\n\nDans la pratique, nous ne sommes pas limités à S3 et à GitLab Pages. Nous hébergeons et déployons nos applications sur différents services. De plus, si vous décidez un jour de passer à une nouvelle plateforme, vous devrez alors réécrire tous vos scripts de déploiement. Vous pourrez alors utiliser une petite merveille appelée `dpl` pour vous faciliter la tâche.\n\nJusqu'ici, nous avons utilisé `awscli` pour livrer du code à un service comme Amazon S3. Quel que soit le système utilisé, le principe reste le même : vous exécutez une commande avec certains paramètres et transmettez une clé secrète d'authentification. L'outil de déploiement `dpl` utilise ce principe et fournit une interface unique pour cette [liste de fournisseurs](https://github.com/travis-ci/dpl#supported-providers \"Liste de fournisseurs\"). Voici à quoi ressemblerait le déploiement d’un *job* en production avec `dpl`:\n\n```yaml\nvariables:\n  S3_BUCKET_NAME: \"yourbucket\"\n\ndeploy to production:\n  environment: production\n  image: ruby:latest\n  script:\n  - gem install dpl\n  - dpl --provider=s3 --bucket=$S3_BUCKET_NAME\n  only:\n  - main\n```\n\nEn cas de déploiement sur plusieurs systèmes ou de changements fréquents de plateforme de destination, `dpl` vous aide à uniformiser vos scripts de déploiement.\n\n## Cinq points clés à retenir\n\n1. Un déploiement est une commande (ou un ensemble de commandes) régulièrement exécutée. Il peut donc être exécuté dans GitLab CI.\n\n2. La plupart des commandes à exécuter nécessitent de fournir une ou plusieurs clés secrètes, que vous stockez dans __Paramètres > [CI/CD](https://about.gitlab.com/fr-fr/topics/ci-cd/ \"Qu'est-ce que le CI/CD ?\") > Variables__.\n\n3. Avec GitLab CI, vous pouvez spécifier de façon flexible les branches vers lesquelles vous déployez votre code.\n\n4. GitLab conserve l'historique des déploiements dans tous vos environnements, et vous permet de revenir à n'importe quelle version précédente.\n\n5. Pour les éléments critiques de votre infrastructure, vous pouvez activer le déploiement manuel depuis l'interface de GitLab, au lieu du déploiement automatisé.\n","engineering",[24,25,26],"CI","CD","tutorial","2024-11-21",{"slug":29,"featured":6,"template":30},"ci-deployment-and-environments","BlogPost","content:fr-fr:blog:ci-deployment-and-environments.yml","yaml","Ci Deployment And Environments","content","fr-fr/blog/ci-deployment-and-environments.yml","fr-fr/blog/ci-deployment-and-environments","yml",{"_path":39,"_dir":40,"_draft":6,"_partial":6,"_locale":7,"data":41,"_id":454,"_type":32,"title":455,"_source":34,"_file":456,"_stem":457,"_extension":37},"/shared/fr-fr/main-navigation","fr-fr",{"logo":42,"freeTrial":47,"sales":52,"login":57,"items":62,"search":395,"minimal":431,"duo":445},{"config":43},{"href":44,"dataGaName":45,"dataGaLocation":46},"/fr-fr/","gitlab logo","header",{"text":48,"config":49},"Commencer un essai gratuit",{"href":50,"dataGaName":51,"dataGaLocation":46},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":53,"config":54},"Contacter l'équipe commerciale",{"href":55,"dataGaName":56,"dataGaLocation":46},"/fr-fr/sales/","sales",{"text":58,"config":59},"Connexion",{"href":60,"dataGaName":61,"dataGaLocation":46},"https://gitlab.com/users/sign_in/","sign in",[63,107,206,211,316,376],{"text":64,"config":65,"cards":67,"footer":90},"Plateforme",{"dataNavLevelOne":66},"platform",[68,74,82],{"title":64,"description":69,"link":70},"La plateforme DevSecOps alimentée par l'IA la plus complète",{"text":71,"config":72},"Découvrir notre plateforme",{"href":73,"dataGaName":66,"dataGaLocation":46},"/fr-fr/platform/",{"title":75,"description":76,"link":77},"GitLab Duo (IA)","Créez des logiciels plus rapidement en tirant parti de l'IA à chaque étape du développement",{"text":78,"config":79},"Découvrez GitLab Duo",{"href":80,"dataGaName":81,"dataGaLocation":46},"/fr-fr/gitlab-duo/","gitlab duo ai",{"title":83,"description":84,"link":85},"Choisir GitLab","10 raisons pour lesquelles les entreprises choisissent GitLab",{"text":86,"config":87},"En savoir plus",{"href":88,"dataGaName":89,"dataGaLocation":46},"/fr-fr/why-gitlab/","why gitlab",{"title":91,"items":92},"Démarrer avec",[93,98,103],{"text":94,"config":95},"Ingénierie de plateforme",{"href":96,"dataGaName":97,"dataGaLocation":46},"/fr-fr/solutions/platform-engineering/","platform engineering",{"text":99,"config":100},"Expérience développeur",{"href":101,"dataGaName":102,"dataGaLocation":46},"/fr-fr/developer-experience/","Developer experience",{"text":104,"config":105},"MLOps",{"href":106,"dataGaName":104,"dataGaLocation":46},"/fr-fr/topics/devops/the-role-of-ai-in-devops/",{"text":108,"left":109,"config":110,"link":112,"lists":116,"footer":188},"Produit",true,{"dataNavLevelOne":111},"solutions",{"text":113,"config":114},"Voir toutes les solutions",{"href":115,"dataGaName":111,"dataGaLocation":46},"/fr-fr/solutions/",[117,143,166],{"title":118,"description":119,"link":120,"items":125},"Automatisation","CI/CD et automatisation pour accélérer le déploiement",{"config":121},{"icon":122,"href":123,"dataGaName":124,"dataGaLocation":46},"AutomatedCodeAlt","/fr-fr/solutions/delivery-automation/","automated software delivery",[126,130,134,139],{"text":127,"config":128},"CI/CD",{"href":129,"dataGaLocation":46,"dataGaName":127},"/fr-fr/solutions/continuous-integration/",{"text":131,"config":132},"Développement assisté par l'IA",{"href":80,"dataGaLocation":46,"dataGaName":133},"AI assisted development",{"text":135,"config":136},"Gestion du code source",{"href":137,"dataGaLocation":46,"dataGaName":138},"/fr-fr/solutions/source-code-management/","Source Code Management",{"text":140,"config":141},"Livraison de logiciels automatisée",{"href":123,"dataGaLocation":46,"dataGaName":142},"Automated software delivery",{"title":144,"description":145,"link":146,"items":151},"Securité","Livrez du code plus rapidement sans compromettre la sécurité",{"config":147},{"href":148,"dataGaName":149,"dataGaLocation":46,"icon":150},"/fr-fr/solutions/security-compliance/","security and compliance","ShieldCheckLight",[152,156,161],{"text":153,"config":154},"Sécurité et conformité",{"href":148,"dataGaLocation":46,"dataGaName":155},"Security & Compliance",{"text":157,"config":158},"Sécurité de la chaîne d'approvisionnement logicielle",{"href":159,"dataGaLocation":46,"dataGaName":160},"/fr-fr/solutions/supply-chain/","Software supply chain security",{"text":162,"config":163},"Conformité et gouvernance",{"href":164,"dataGaLocation":46,"dataGaName":165},"/fr-fr/solutions/continuous-software-compliance/","Compliance and governance",{"title":167,"link":168,"items":173},"Mesures",{"config":169},{"icon":170,"href":171,"dataGaName":172,"dataGaLocation":46},"DigitalTransformation","/fr-fr/solutions/visibility-measurement/","visibility and measurement",[174,178,183],{"text":175,"config":176},"Visibilité et mesures",{"href":171,"dataGaLocation":46,"dataGaName":177},"Visibility and Measurement",{"text":179,"config":180},"Gestion de la chaîne de valeur",{"href":181,"dataGaLocation":46,"dataGaName":182},"/fr-fr/solutions/value-stream-management/","Value Stream Management",{"text":184,"config":185},"Données d'analyse et informations clés",{"href":186,"dataGaLocation":46,"dataGaName":187},"/fr-fr/solutions/analytics-and-insights/","Analytics and insights",{"title":189,"items":190},"GitLab pour",[191,196,201],{"text":192,"config":193},"Entreprises",{"href":194,"dataGaLocation":46,"dataGaName":195},"/fr-fr/enterprise/","enterprise",{"text":197,"config":198},"PME",{"href":199,"dataGaLocation":46,"dataGaName":200},"/fr-fr/small-business/","small business",{"text":202,"config":203},"Secteur public",{"href":204,"dataGaLocation":46,"dataGaName":205},"/fr-fr/solutions/public-sector/","public sector",{"text":207,"config":208},"Tarifs",{"href":209,"dataGaName":210,"dataGaLocation":46,"dataNavLevelOne":210},"/fr-fr/pricing/","pricing",{"text":212,"config":213,"link":215,"lists":219,"feature":303},"Ressources",{"dataNavLevelOne":214},"resources",{"text":216,"config":217},"Afficher toutes les ressources",{"href":218,"dataGaName":214,"dataGaLocation":46},"/fr-fr/resources/",[220,253,275],{"title":221,"items":222},"Premiers pas",[223,228,233,238,243,248],{"text":224,"config":225},"Installation",{"href":226,"dataGaName":227,"dataGaLocation":46},"/fr-fr/install/","install",{"text":229,"config":230},"Guides de démarrage rapide",{"href":231,"dataGaName":232,"dataGaLocation":46},"/fr-fr/get-started/","quick setup checklists",{"text":234,"config":235},"Apprentissage",{"href":236,"dataGaLocation":46,"dataGaName":237},"https://university.gitlab.com/","learn",{"text":239,"config":240},"Documentation sur le produit",{"href":241,"dataGaName":242,"dataGaLocation":46},"https://docs.gitlab.com/","product documentation",{"text":244,"config":245},"Vidéos sur les bonnes pratiques",{"href":246,"dataGaName":247,"dataGaLocation":46},"/fr-fr/getting-started-videos/","best practice videos",{"text":249,"config":250},"Intégrations",{"href":251,"dataGaName":252,"dataGaLocation":46},"/fr-fr/integrations/","integrations",{"title":254,"items":255},"Découvrir",[256,261,265,270],{"text":257,"config":258},"Histoires de succès client",{"href":259,"dataGaName":260,"dataGaLocation":46},"/fr-fr/customers/","customer success stories",{"text":262,"config":263},"Blog",{"href":264,"dataGaName":5,"dataGaLocation":46},"/fr-fr/blog/",{"text":266,"config":267},"Travail à distance",{"href":268,"dataGaName":269,"dataGaLocation":46},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"text":271,"config":272},"TeamOps",{"href":273,"dataGaName":274,"dataGaLocation":46},"/fr-fr/teamops/","teamops",{"title":276,"items":277},"Connecter",[278,283,288,293,298],{"text":279,"config":280},"Services GitLab",{"href":281,"dataGaName":282,"dataGaLocation":46},"/fr-fr/services/","services",{"text":284,"config":285},"Communauté",{"href":286,"dataGaName":287,"dataGaLocation":46},"/community/","community",{"text":289,"config":290},"Forum",{"href":291,"dataGaName":292,"dataGaLocation":46},"https://forum.gitlab.com/","forum",{"text":294,"config":295},"Événements",{"href":296,"dataGaName":297,"dataGaLocation":46},"/events/","events",{"text":299,"config":300},"Partenaires",{"href":301,"dataGaName":302,"dataGaLocation":46},"/fr-fr/partners/","partners",{"backgroundColor":304,"textColor":305,"text":306,"image":307,"link":311},"#2f2a6b","#fff","L'avenir du développement logiciel. Tendances et perspectives.",{"altText":308,"config":309},"carte promo The Source",{"src":310},"/images/navigation/the-source-promo-card.svg",{"text":312,"config":313},"Lire les articles les plus récents",{"href":314,"dataGaName":315,"dataGaLocation":46},"/fr-fr/the-source/","the source",{"text":317,"config":318,"lists":320},"Société",{"dataNavLevelOne":319},"company",[321],{"items":322},[323,328,334,336,341,346,351,356,361,366,371],{"text":324,"config":325},"À propos",{"href":326,"dataGaName":327,"dataGaLocation":46},"/fr-fr/company/","about",{"text":329,"config":330,"footerGa":333},"Emplois",{"href":331,"dataGaName":332,"dataGaLocation":46},"/jobs/","jobs",{"dataGaName":332},{"text":294,"config":335},{"href":296,"dataGaName":297,"dataGaLocation":46},{"text":337,"config":338},"Leadership",{"href":339,"dataGaName":340,"dataGaLocation":46},"/company/team/e-group/","leadership",{"text":342,"config":343},"Équipe",{"href":344,"dataGaName":345,"dataGaLocation":46},"/company/team/","team",{"text":347,"config":348},"Manuel",{"href":349,"dataGaName":350,"dataGaLocation":46},"https://handbook.gitlab.com/","handbook",{"text":352,"config":353},"Relations avec les investisseurs",{"href":354,"dataGaName":355,"dataGaLocation":46},"https://ir.gitlab.com/","investor relations",{"text":357,"config":358},"Centre de confiance",{"href":359,"dataGaName":360,"dataGaLocation":46},"/fr-fr/security/","trust center",{"text":362,"config":363},"Centre pour la transparence de l'IA",{"href":364,"dataGaName":365,"dataGaLocation":46},"/fr-fr/ai-transparency-center/","ai transparency center",{"text":367,"config":368},"Newsletter",{"href":369,"dataGaName":370,"dataGaLocation":46},"/company/contact/","newsletter",{"text":372,"config":373},"Presse",{"href":374,"dataGaName":375,"dataGaLocation":46},"/press/","press",{"text":377,"config":378,"lists":379},"Nous contacter",{"dataNavLevelOne":319},[380],{"items":381},[382,385,390],{"text":53,"config":383},{"href":55,"dataGaName":384,"dataGaLocation":46},"talk to sales",{"text":386,"config":387},"Aide",{"href":388,"dataGaName":389,"dataGaLocation":46},"/support/","get help",{"text":391,"config":392},"Portail clients GitLab",{"href":393,"dataGaName":394,"dataGaLocation":46},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":396,"login":397,"suggestions":404},"Fermer",{"text":398,"link":399},"Pour rechercher des dépôts et des projets, connectez-vous à",{"text":400,"config":401},"gitlab.com",{"href":60,"dataGaName":402,"dataGaLocation":403},"search login","search",{"text":405,"default":406},"Suggestions",[407,410,415,417,422,427],{"text":75,"config":408},{"href":80,"dataGaName":409,"dataGaLocation":403},"GitLab Duo (AI)",{"text":411,"config":412},"Suggestions de code (IA)",{"href":413,"dataGaName":414,"dataGaLocation":403},"/fr-fr/solutions/code-suggestions/","Code Suggestions (AI)",{"text":127,"config":416},{"href":129,"dataGaName":127,"dataGaLocation":403},{"text":418,"config":419},"GitLab sur AWS",{"href":420,"dataGaName":421,"dataGaLocation":403},"/fr-fr/partners/technology-partners/aws/","GitLab on AWS",{"text":423,"config":424},"GitLab sur Google Cloud ",{"href":425,"dataGaName":426,"dataGaLocation":403},"/fr-fr/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":428,"config":429},"Pourquoi utiliser GitLab ?",{"href":88,"dataGaName":430,"dataGaLocation":403},"Why GitLab?",{"freeTrial":432,"mobileIcon":437,"desktopIcon":442},{"text":433,"config":434},"Commencer votre essai gratuit",{"href":435,"dataGaName":51,"dataGaLocation":436},"https://gitlab.com/-/trials/new/","nav",{"altText":438,"config":439},"Icône GitLab",{"src":440,"dataGaName":441,"dataGaLocation":436},"/images/brand/gitlab-logo-tanuki.svg","gitlab icon",{"altText":438,"config":443},{"src":444,"dataGaName":441,"dataGaLocation":436},"/images/brand/gitlab-logo-type.svg",{"freeTrial":446,"mobileIcon":450,"desktopIcon":452},{"text":447,"config":448},"En savoir plus sur GitLab Duo",{"href":80,"dataGaName":449,"dataGaLocation":436},"gitlab duo",{"altText":438,"config":451},{"src":440,"dataGaName":441,"dataGaLocation":436},{"altText":438,"config":453},{"src":444,"dataGaName":441,"dataGaLocation":436},"content:shared:fr-fr:main-navigation.yml","Main Navigation","shared/fr-fr/main-navigation.yml","shared/fr-fr/main-navigation",{"_path":459,"_dir":40,"_draft":6,"_partial":6,"_locale":7,"title":460,"button":461,"config":465,"_id":467,"_type":32,"_source":34,"_file":468,"_stem":469,"_extension":37},"/shared/fr-fr/banner","GitLab Duo Agent Platform est maintenant disponible en version bêta publique !",{"text":86,"config":462},{"href":463,"dataGaName":464,"dataGaLocation":46},"/gitlab-duo/agent-platform/","duo banner",{"layout":466},"release","content:shared:fr-fr:banner.yml","shared/fr-fr/banner.yml","shared/fr-fr/banner",{"_path":471,"_dir":40,"_draft":6,"_partial":6,"_locale":7,"data":472,"_id":678,"_type":32,"title":679,"_source":34,"_file":680,"_stem":681,"_extension":37},"/shared/fr-fr/main-footer",{"text":473,"source":474,"edit":480,"contribute":485,"config":490,"items":495,"minimal":669},"Git est une marque déposée de Software Freedom Conservancy et notre utilisation de « GitLab » est sous licence",{"text":475,"config":476},"Afficher le code source de la page",{"href":477,"dataGaName":478,"dataGaLocation":479},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":481,"config":482},"Modifier cette page",{"href":483,"dataGaName":484,"dataGaLocation":479},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":486,"config":487},"Veuillez contribuer",{"href":488,"dataGaName":489,"dataGaLocation":479},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":491,"facebook":492,"youtube":493,"linkedin":494},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[496,519,573,606,640],{"title":64,"links":497,"subMenu":502},[498],{"text":499,"config":500},"Plateforme DevSecOps",{"href":73,"dataGaName":501,"dataGaLocation":479},"devsecops platform",[503],{"title":207,"links":504},[505,509,514],{"text":506,"config":507},"Voir les forfaits",{"href":209,"dataGaName":508,"dataGaLocation":479},"view plans",{"text":510,"config":511},"Pourquoi choisir GitLab Premium ?",{"href":512,"dataGaName":513,"dataGaLocation":479},"/fr-fr/pricing/premium/","why premium",{"text":515,"config":516},"Pourquoi choisir GitLab Ultimate ?",{"href":517,"dataGaName":518,"dataGaLocation":479},"/fr-fr/pricing/ultimate/","why ultimate",{"title":520,"links":521},"Solutions",[522,527,530,532,537,542,546,549,552,557,559,561,563,568],{"text":523,"config":524},"Transformation digitale",{"href":525,"dataGaName":526,"dataGaLocation":479},"/fr-fr/topics/digital-transformation/","digital transformation",{"text":153,"config":528},{"href":148,"dataGaName":529,"dataGaLocation":479},"security & compliance",{"text":140,"config":531},{"href":123,"dataGaName":124,"dataGaLocation":479},{"text":533,"config":534},"Développement agile",{"href":535,"dataGaName":536,"dataGaLocation":479},"/fr-fr/solutions/agile-delivery/","agile delivery",{"text":538,"config":539},"Transformation cloud",{"href":540,"dataGaName":541,"dataGaLocation":479},"/fr-fr/topics/cloud-native/","cloud transformation",{"text":543,"config":544},"SCM",{"href":137,"dataGaName":545,"dataGaLocation":479},"source code management",{"text":127,"config":547},{"href":129,"dataGaName":548,"dataGaLocation":479},"continuous integration & delivery",{"text":179,"config":550},{"href":181,"dataGaName":551,"dataGaLocation":479},"value stream management",{"text":553,"config":554},"GitOps",{"href":555,"dataGaName":556,"dataGaLocation":479},"/fr-fr/solutions/gitops/","gitops",{"text":192,"config":558},{"href":194,"dataGaName":195,"dataGaLocation":479},{"text":197,"config":560},{"href":199,"dataGaName":200,"dataGaLocation":479},{"text":202,"config":562},{"href":204,"dataGaName":205,"dataGaLocation":479},{"text":564,"config":565},"Formation",{"href":566,"dataGaName":567,"dataGaLocation":479},"/fr-fr/solutions/education/","education",{"text":569,"config":570},"Services financiers",{"href":571,"dataGaName":572,"dataGaLocation":479},"/fr-fr/solutions/finance/","financial services",{"title":212,"links":574},[575,577,579,581,584,586,590,592,594,596,598,600,602,604],{"text":224,"config":576},{"href":226,"dataGaName":227,"dataGaLocation":479},{"text":229,"config":578},{"href":231,"dataGaName":232,"dataGaLocation":479},{"text":234,"config":580},{"href":236,"dataGaName":237,"dataGaLocation":479},{"text":239,"config":582},{"href":241,"dataGaName":583,"dataGaLocation":479},"docs",{"text":262,"config":585},{"href":264,"dataGaName":5},{"text":587,"config":588},"Histoires de réussite client",{"href":589,"dataGaLocation":479},"/customers/",{"text":257,"config":591},{"href":259,"dataGaName":260,"dataGaLocation":479},{"text":266,"config":593},{"href":268,"dataGaName":269,"dataGaLocation":479},{"text":279,"config":595},{"href":281,"dataGaName":282,"dataGaLocation":479},{"text":271,"config":597},{"href":273,"dataGaName":274,"dataGaLocation":479},{"text":284,"config":599},{"href":286,"dataGaName":287,"dataGaLocation":479},{"text":289,"config":601},{"href":291,"dataGaName":292,"dataGaLocation":479},{"text":294,"config":603},{"href":296,"dataGaName":297,"dataGaLocation":479},{"text":299,"config":605},{"href":301,"dataGaName":302,"dataGaLocation":479},{"title":317,"links":607},[608,610,612,614,616,618,620,624,629,631,633,635],{"text":324,"config":609},{"href":326,"dataGaName":319,"dataGaLocation":479},{"text":329,"config":611},{"href":331,"dataGaName":332,"dataGaLocation":479},{"text":337,"config":613},{"href":339,"dataGaName":340,"dataGaLocation":479},{"text":342,"config":615},{"href":344,"dataGaName":345,"dataGaLocation":479},{"text":347,"config":617},{"href":349,"dataGaName":350,"dataGaLocation":479},{"text":352,"config":619},{"href":354,"dataGaName":355,"dataGaLocation":479},{"text":621,"config":622},"Sustainability",{"href":623,"dataGaName":621,"dataGaLocation":479},"/sustainability/",{"text":625,"config":626},"Diversité, inclusion et appartenance (DIB)",{"href":627,"dataGaName":628,"dataGaLocation":479},"/fr-fr/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":357,"config":630},{"href":359,"dataGaName":360,"dataGaLocation":479},{"text":367,"config":632},{"href":369,"dataGaName":370,"dataGaLocation":479},{"text":372,"config":634},{"href":374,"dataGaName":375,"dataGaLocation":479},{"text":636,"config":637},"Déclaration de transparence sur l'esclavage moderne",{"href":638,"dataGaName":639,"dataGaLocation":479},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"title":377,"links":641},[642,645,647,649,654,659,664],{"text":643,"config":644},"Échanger avec un expert",{"href":55,"dataGaName":56,"dataGaLocation":479},{"text":386,"config":646},{"href":388,"dataGaName":389,"dataGaLocation":479},{"text":391,"config":648},{"href":393,"dataGaName":394,"dataGaLocation":479},{"text":650,"config":651},"Statut",{"href":652,"dataGaName":653,"dataGaLocation":479},"https://status.gitlab.com/","status",{"text":655,"config":656},"Conditions d'utilisation",{"href":657,"dataGaName":658},"/terms/","terms of use",{"text":660,"config":661},"Déclaration de confidentialité",{"href":662,"dataGaName":663,"dataGaLocation":479},"/fr-fr/privacy/","privacy statement",{"text":665,"config":666},"Préférences en matière de cookies",{"dataGaName":667,"dataGaLocation":479,"id":668,"isOneTrustButton":109},"cookie preferences","ot-sdk-btn",{"items":670},[671,673,676],{"text":655,"config":672},{"href":657,"dataGaName":658,"dataGaLocation":479},{"text":674,"config":675},"Politique de confidentialité",{"href":662,"dataGaName":663,"dataGaLocation":479},{"text":665,"config":677},{"dataGaName":667,"dataGaLocation":479,"id":668,"isOneTrustButton":109},"content:shared:fr-fr:main-footer.yml","Main Footer","shared/fr-fr/main-footer.yml","shared/fr-fr/main-footer",[683,695],{"_path":684,"_dir":685,"_draft":6,"_partial":6,"_locale":7,"content":686,"config":690,"_id":692,"_type":32,"title":18,"_source":34,"_file":693,"_stem":694,"_extension":37},"/en-us/blog/authors/ivan-nemytchenko","authors",{"name":18,"config":687},{"headshot":688,"ctfId":689},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659488/Blog/Author%20Headshots/gitlab-logo-extra-whitespace.png","Ivan-Nemytchenko",{"template":691},"BlogAuthor","content:en-us:blog:authors:ivan-nemytchenko.yml","en-us/blog/authors/ivan-nemytchenko.yml","en-us/blog/authors/ivan-nemytchenko",{"_path":696,"_dir":685,"_draft":6,"_partial":6,"_locale":7,"content":697,"config":701,"_id":702,"_type":32,"title":19,"_source":34,"_file":703,"_stem":704,"_extension":37},"/en-us/blog/authors/cesar-saavedra",{"name":19,"config":698},{"headshot":699,"ctfId":700},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659600/Blog/Author%20Headshots/csaavedra1-headshot.jpg","csaavedra1",{"template":691},"content:en-us:blog:authors:cesar-saavedra.yml","en-us/blog/authors/cesar-saavedra.yml","en-us/blog/authors/cesar-saavedra",{"_path":706,"_dir":40,"_draft":6,"_partial":6,"_locale":7,"header":707,"eyebrow":708,"blurb":709,"button":710,"secondaryButton":714,"_id":716,"_type":32,"title":717,"_source":34,"_file":718,"_stem":719,"_extension":37},"/shared/fr-fr/next-steps","Commencez à livrer des logiciels de meilleurs qualité plus rapidement","Plus de 50 % des entreprises du classement Fortune 100 font confiance à GitLab","Découvrez comment la plateforme DevSecOps intelligente\n\n\npeut aider votre équipe.\n",{"text":48,"config":711},{"href":712,"dataGaName":51,"dataGaLocation":713},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":53,"config":715},{"href":55,"dataGaName":56,"dataGaLocation":713},"content:shared:fr-fr:next-steps.yml","Next Steps","shared/fr-fr/next-steps.yml","shared/fr-fr/next-steps",1754424560805]