[{"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":471,"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\nvotre projet est déjà hébergé sur GitLab.com et vous utilisez [GitLab\nCI/CD](https://docs.gitlab.com/ee/ci/testing/ \"Test avec GitLab CI/CD\") pour\nvos tests. Maintenant, vous souhaitez connaître toutes les possibilités de\n[déploiement](https://about.gitlab.com/fr-fr/blog/how-to-keep-up-with-ci-cd-best-practices/\n\"Meilleures pratiques CI/CD\").\n\n\nPar souci de pertinence, supposons que l'application se compose uniquement\nde fichiers HTML, sans code côté serveur ni compilation sophistiquée des\nactifs JS. La plateforme de destination sera également générique, nous\nutiliserons [Amazon S3](https://aws.amazon.com/fr/s3/ \"Amazon S3\").\n\n\nPlutôt que de fournir des extraits de code à copier-coller, nous allons vous\npartager les principes et les fonctionnalités de GitLab CI, afin que vous\npuissiez les appliquer dans votre propre pile technologique. \n\n\nDéroulons donc notre histoire depuis son commencement, où il n'est pas\nencore question d'intégration continue.\n\n\n## La ligne de départ\n\n\n__Déploiement__ : un ensemble de fichiers HTML devraient apparaître dans\nvotre bucket S3 (déjà configuré pour [héberger un site web\nstatique](https://docs.aws.amazon.com/fr_fr/AmazonS3/latest/userguide/HostingWebsiteOnS3Setup.html\n\"Héberger un site web statique avec Amazon S3\")). Il y a des millions de\nfaçons de procéder. Dans notre cas, nous utiliserons la bibliothèque [AWS\nCLI](https://aws.amazon.com/fr/cli/ \"AWS CLI\") fournie par Amazon. \n\n\nLa commande complète ressemble à ceci :\n\n\n```shell\n\naws s3 cp ./ s3://yourbucket/ --recursive --exclude \"*\" --include \"*.html\"\n\n```\n\n\nLe push du code vers le dépôt et le déploiement sont deux processus\ndistincts.\n\n\n![Déploiement\nmanuel](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674077/Blog/Content%20Images/19-updated.png){:\n.center}\n\n{: .note .text-center}\n\n\nDétail important : la commande nécessite de [fournir les variables\nd'environnement](https://docs.aws.amazon.com/fr_fr/cli/latest/userguide/cli-chap-getting-started.html)\n`AWS_ACCESS_KEY_ID` et `AWS_SECRET_ACCESS_KEY`. Il vous faudra peut-être\naussi spécifier `AWS_DEFAULT_REGION`. \n\n\nEssayons d'automatiser cette procédure avec [l'intégration continue de\nGitLab](https://about.gitlab.com/fr-fr/solutions/continuous-integration/\n\"Intégration continue de GitLab\").\n\n\n## Votre premier déploiement automatisé\n\n\nGitLab CI offre une grande flexibilité dans l'exécution des commandes. Sa\nconfiguration s'adapte à vos besoins, reproduisant l'environnement de votre\nterminal local. Ajoutez votre script dans le fichier .gitlab-ci.yml et\neffectuez un push de votre code : l’outil d'intégration continue de GitLab\ndéclenche un *job* et vos commandes sont exécutées.\n\n\nPrécisons maintenant le contexte d'utilisation de cet exemple : il s'agit\nd'un site de taille modeste, avec une trentaine de visiteurs journaliers, et\nune seule branche principale de dépôt de code. Commençons par spécifier un\n*job* avec la commande précédente dans le fichier `.gitlab-ci.yml` :\n\n\n```yaml\n\ndeploy:\n  script: aws s3 cp ./ s3://yourbucket/ --recursive --exclude \"*\" --include \"*.html\"\n```\n\n\nOups, la commande a échoué :\n\n\n![Message d'erreur lors de l'exécution d'un job\nGitLab.](https://about.gitlab.com/images/blogimages/ci-deployment-and-environments/13.jpg){:\n.shadow}\n\n\nIl fallait d'abord vérifier l'existence d'un exécutable `aws`. Pour\ninstaller `awscli`, nous avons besoin de `pip`, qui est un outil\nd'installation de paquets Python. Spécifions une image Docker avec Python\npréinstallé, qui devrait également contenir `pip` : \n\n\n```yaml\n\ndeploy:\n  image: python:latest\n  script:\n  - pip install awscli\n  - aws s3 cp ./ s3://yourbucket/ --recursive --exclude \"*\" --include \"*.html\"\n```\n\n\n![Déploiement\nautomatisé](https://about.gitlab.com/images/blogimages/ci-deployment-and-environments/fail1.png){:\n.center}\n\n{: .note .text-center}\n\n\nVous effectuez un push de votre code sur GitLab, et il est automatiquement\ndéployé par l’outil CI. \n\n\nL'installation d'`awscli` rallonge le temps d'exécution du job, mais pour\nl'instant ce n'est pas un souci. Pour accélérer le processus, [cherchez une\nimage Docker](https://hub.docker.com/ \"Chercher une image Docker\") avec\n`awscli` préinstallé, ou créez une image vous-même. \n\n\nN’oublions pas les variables d'environnement récupérées depuis la [console\nAWS](https://console.aws.amazon.com/) :\n\n\n```yaml\n\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\n\nCela devrait fonctionner, mais attention : ce n'est jamais une bonne idée de\ndévoiler des clés secrètes de votre code, même dans un dépôt privé.\nRemédions donc à cette situation.\n\n\n### Des secrets bien gardés\n\n\nGitLab dispose d’un endroit spécialement dédié aux variables secrètes :\n__Paramètres > CI/CD > Variables__.\n\n\n![Ajouter une variable secrète dans\nGitLab](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674076/Blog/Content%20Images/add-variable-updated.png)\n\n\nTout ce que vous y mettez se transforme en variables d'environnement. En\ncochant la case « Masquée », vous masquerez la variable dans les job logs.\nEn cochant la case « Protéger la variable », vous n’exporterez la variable\nuniquement vers les pipelines s'exécutant sur des branches et des étiquettes\nprotégées. \n\n\nSeuls les utilisateurs ayant le statut de propriétaire ou de chargé de\nmaintenance sur un projet auront accès à cette section. Nous pourrions\nsupprimer la section `variables` de notre configuration CI, mais nous allons\nl'utiliser à d'autres fins.\n\n\n### Savoir spécifier et utiliser des variables non-secrètes\n\n\nLorsque votre configuration s'agrandit, il devient pratique de conserver\ncertains paramètres sous formes de variables au début de votre\nconfiguration. Le cas présent ne le justifie pas, mais pour les besoins de\ncette démonstration, nous allons définir le nom du compartiment S3 comme\nvariable :\n\n\n```yaml\n\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\n\nJusqu'ici, tout va bien :\n\n\n![Compilation GitLab CI sans\nerreur](https://about.gitlab.com/images/blogimages/ci-deployment-and-environments/14.jpg){:\n.shadow.medium.center}\n\n\nDans notre scénario, la fréquentation du site est en hausse, et vous avez\nembauché un développeur pour vous aider. Voyons comment le workflow GitLab\nCI s'adapte au travail en équipe.\n\n\n## Comment utiliser GitLab CI en équipe\n\n\nAvec deux utilisateurs travaillant dans le même dépôt, il n'est plus\npratique d'utiliser la branche principale pour le développement. Vous\ndécidez d'utiliser des branches séparées pour les nouvelles fonctionnalités\net les nouveaux articles, et de les fusionner dans la branche principale\nlorsqu'elles sont prêtes.\n\n\nCependant, votre configuration CI actuelle ne prend pas en charge les\nbranches. Chaque push effectué vers GitLab sera déployé sur S3. La solution\nest simple : il suffit d'ajouter `only: main` au job `deploy`.\n\n\nEn plus de ne pas vouloir déployer chaque branche sur l’environnement de\nproduction, vous souhaiteriez pouvoir prévisualiser vos modifications depuis\nles branches de fonctionnalités. \n\n\n![Déploiement de la branche principale de GitLab vers AWS\nS3](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674076/Blog/Content%20Images/15-updated.png){:\n.center}\n\n{: .note .text-center}  \n\n\n### Comment configurer un environnement de test ?\n\n\nMatteo, votre nouveau développeur, vous propose d'utiliser la fonctionnalité\n[GitLab Pages](https://docs.gitlab.com/ee/user/project/pages/ \"GitLab\nPages\"), idéale pour prévisualiser votre travail en cours. Afin d'[héberger\ndes sites web sur GitLab\nPages](https://docs.gitlab.com/ee/user/project/pages/getting_started/pages_ui.html\n\"Héberger des sites web sur GitLab Pages\"), votre fichier de configuration\nCI doit répondre à trois règles simples :\n\n\n- Le *job* doit être nommé `pages`\n\n- Il doit y avoir une section `artifacts` avec un dossier `public`\n\n- Tout ce que vous souhaitez héberger doit être placé dans le dossier\n`public`\n\n\nLe contenu du dossier public sera hébergé à l'adresse suivante :\n`http://\u003Cusername>.gitlab.io/\u003Cprojectname>/`\n\n\nVoici la configuration complète après avoir appliqué l’[exemple de\nconfiguration pour les sites web en\nHTML](https://gitlab.com/pages/plain-html/-/blob/main/.gitlab-ci.yml\n\"Exemple de configuration pour les sites web en HTML\") :\n\n\n```yaml\n\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\n\nNous avons spécifié deux jobs. L'un d'eux déploie le site web pour vos\nclients sur S3 (`deploy`). L'autre (`pages`) déploie le site web sur GitLab\nPages. Nommons-les « Environnement de production » et « Environnement de\npréproduction ». Toutes les branches seront déployées sur GitLab Pages, à\nl'exception de la branche principale. \n\n\n![Déploiement différencié des branches dans GitLab Pages et\nS3.](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674076/Blog/Content%20Images/16-updated.png){:\n.center}\n\n{: .note .text-center}\n\n\n## Introduction aux environnements\n\n\nGitLab offre la prise en charge de [nombreux\nenvironnements](https://docs.gitlab.com/ee/ci/environments/ \"Environnements\nGitLab\") (dynamiques ou statiques) ; vous devez simplement spécifier\nl'environnement correspondant pour chaque *job* de déploiement :\n\n\n```yaml\n\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\n\nGitLab garde une trace de tous vos déploiements. Ainsi, vous savez toujours\nce qui est actuellement déployé sur vos serveurs :\n\n\n![Visualisation des environnements sur GitLab\nCI/CD.](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674076/Blog/Content%20Images/envs-updated.png){:\n.shadow.center}\n\n\nL'historique complet de vos déploiements sur chacun de vos environnements\nactuels vous est aussi fourni :\n\n\n![Historique des déploiements\nGitLab.](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674077/Blog/Content%20Images/staging-env-detail-updated.png){:\n.shadow.center}\n\n\nMaintenant que tout est automatisé et configuré, de nouveaux défis nous\nattendent.\n\n\n## Comment dépanner les déploiements ?\n\n\nOups ! La branche de fonctionnalités que vous avez poussé sur\nl'environnement de préproduction vient d'être remplacée par celle de Matteo,\nqui vient d'effectuer un push de sa propre branche. L'énervement vous gagne,\nc'est la troisième fois que cela arrive aujourd'hui ! \n\n\nEt si vous utilisiez Slack pour notifier vos déploiements, afin d'éviter ce\ngenre de désagrément ?\n\n\n> Recevez des notifications en utilisant l'[application GitLab pour\nSlack](https://docs.gitlab.com/ee/user/project/integrations/gitlab_slack_application.html).\n\n\n## Du travail d'équipe à grande échelle\n\n\nQuelque temps plus tard, et vous voilà à la tête d'un site web très\npopulaire, et d'une équipe de huit personnes. Mais, désormais, les membres\nde votre équipe perdent un temps précieux à attendre de pouvoir\nprévisualiser leur travail. Le déploiement de chaque branche en\npréproduction n'est plus optimal.\n\n\n![File d'attente de branches à examiner en\npréproduction](https://about.gitlab.com/images/blogimages/ci-deployment-and-environments/build.png){:\n.center}\n\n\nIl est temps de perfectionner le système. Vous convenez avec votre équipe de\nfusionner au préalable chaque changement sur la branche de préproduction. La\nmodification du fichier `.gitlab-ci.yml` est minime :\n\n\n```yaml\n\nexcept:\n\n- main\n\n```\n\n\nest remplacé par\n\n\n```yaml\n\nonly:\n\n- staging\n\n```\n\n\n![Dessin de développeurs qui fusionnent leurs changements dans une branche\nde préproduction avant de les déployer sur\nS3](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674077/Blog/Content%20Images/17-updated.png){:\n.center}\n\n{: .note .text-center}\n\n\nVos collaborateurs doivent fusionner leurs branches de fonctionnalités avant\nde prévisualiser leur travail en préproduction. Cela nécessite plus de temps\net d'efforts, mais tout le monde s'accorde à dire que c'est toujours mieux\nque d'attendre.\n\n\n## Comment gérer les urgences ?\n\n\nIl arrive parfois que les choses tournent mal. Quelqu'un a mal fusionné des\nbranches et a effectué un push du résultat directement en production, juste\nau moment où le hashtag de votre site devenait viral sur les réseaux\nsociaux. Des milliers de personnes voient des visuels cassés au lieu de\nvotre page d'accueil habituelle. Heureusement, la fonction __Restaurer\nl’environnement__ a permis de résoudre le problème en moins d'une minute.\n\n\n![Fonctionnalité de restauration sur la plateforme\nGitLab](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674077/Blog/Content%20Images/18-updated.png){:\n.shadow.center}\n\n{: .note .text-center}\n\n\nLa fonction de restauration de l'environnement relance le job précédent avec\nla validation précédente. Vous avez décidé de désactiver le déploiement\nautomatique en production et de passer au déploiement manuel. Pour ce faire,\nvous devez ajouter  `when : manual` à votre *job*. Il n'y aura effectivement\nplus de déploiement automatique en production. Le déploiement manuel\ns'effectue en allant dans __Compilation > Pipelines__, et en cliquant sur\n__« Exécuter des jobs manuels ou différés »__ :\n\n\n![Déploiement manuel sur\nGitLab.](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674077/Blog/Content%20Images/prod-env-rollback-arrow-updated.png){:\n.shadow.center}\n\n\nEffectuons maintenant un bond en avant dans le temps. Votre entreprise est\ndevenue une société de plusieurs centaines d'employés travaillant sur le\nsite web, et les compromis précédents ne fonctionnent plus.\n\n\n### Faire ses premiers pas avec les Review Apps\n\n\nLogiquement, la nouvelle étape consiste à lancer une instance temporaire de\nl'application par branche de fonctionnalités pour la revue. Pour cela, nous\navons configuré un autre bucket S3. Sa seule particularité est que le\ncontenu du site est placé dans un dossier portant le nom de la branche de\ndéveloppement, de sorte que l’URL ressemble à :\n\n\n`http://\u003CREVIEW_S3_BUCKET_NAME>.s3-website-us-east-1.amazonaws.com/\u003Cbranchname>/`\n\n\nVoici le remplacement du *job* `pages` utilisé auparavant :\n\n\n```yaml\n\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\n\nIci, il est bon de connaître l'origine de cette variable\n`$CI_BUILD_REF_NAME`. GitLab prédéfinit de [nombreuses variables\nd'environnement](https://docs.gitlab.com/ee/ci/variables/predefined_variables.html\n\"Variables d'environnement dans GitLab\") à utiliser dans vos jobs. Notez que\nnous avons défini la variable `S3_BUCKET_NAME` à l'intérieur du *job*. Vous\npouvez ainsi réécrire les définitions de niveau supérieur. \n\n\nReprésentation visuelle de la configuration des Review Apps :\n\n\n![Dessin représentant la configuration Review Apps de\nGitLab.](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674076/Blog/Content%20Images/manual-pipeline-arrow-updated.png){:\n.illustration}\n\n\nLes détails de l'implémentation des Review Apps varient selon votre pile\ntechnologique et de votre processus de déploiement. Tout ne sera pas aussi\nsimple qu'avec un site HTML statique. Programmer des instances temporaires à\nla volée avec tous les logiciels et services requis n'est pas chose aisée.\nMais tout cela peut être accompli, notamment à l'aide des conteneurs Docker,\nChef ou Ansible.\n\n\nLe déploiement avec Docker mériterait d'ailleurs un article complet. Et si\nvous regrettez l'absence de scénarios plus complexes qu'un simple\ndéploiement en HTML statique, nous vous recommandons de lire [cet\narticle](https://about.gitlab.com/blog/building-an-elixir-release-into-docker-image-using-gitlab-ci-part-1/\n\"Construire une version d'Elixir dans une image Docker en utilisant GitLab\nCI - Partie 1\"). Abordons maintenant un dernier sujet.\n\n\n### Déployer sur différentes plateformes\n\n\nDans la pratique, nous ne sommes pas limités à S3 et à GitLab Pages. Nous\nhébergeons et déployons nos applications sur différents services. De plus,\nsi vous décidez un jour de passer à une nouvelle plateforme, vous devrez\nalors réécrire tous vos scripts de déploiement. Vous pourrez alors utiliser\nune petite merveille appelée `dpl` pour vous faciliter la tâche.\n\n\nJusqu'ici, nous avons utilisé `awscli` pour livrer du code à un service\ncomme Amazon S3. Quel que soit le système utilisé, le principe reste le même\n: vous exécutez une commande avec certains paramètres et transmettez une clé\nsecrète d'authentification. L'outil de déploiement `dpl` utilise ce principe\net fournit une interface unique pour cette [liste de\nfournisseurs](https://github.com/travis-ci/dpl#supported-providers \"Liste de\nfournisseurs\"). Voici à quoi ressemblerait le déploiement d’un *job* en\nproduction avec `dpl`:\n\n\n```yaml\n\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\n\nEn cas de déploiement sur plusieurs systèmes ou de changements fréquents de\nplateforme de destination, `dpl` vous aide à uniformiser vos scripts de\ndéploiement.\n\n\n## Cinq points clés à retenir\n\n\n1. Un déploiement est une commande (ou un ensemble de commandes)\nrégulièrement exécutée. Il peut donc être exécuté dans GitLab CI.\n\n\n2. La plupart des commandes à exécuter nécessitent de fournir une ou\nplusieurs clés secrètes, que vous stockez dans __Paramètres >\n[CI/CD](https://about.gitlab.com/fr-fr/topics/ci-cd/ \"Qu'est-ce que le CI/CD\n?\") > Variables__.\n\n\n3. Avec GitLab CI, vous pouvez spécifier de façon flexible les branches vers\nlesquelles vous déployez votre code.\n\n\n4. GitLab conserve l'historique des déploiements dans tous vos\nenvironnements, et vous permet de revenir à n'importe quelle version\nprécédente.\n\n\n5. Pour les éléments critiques de votre infrastructure, vous pouvez activer\nle déploiement manuel depuis l'interface de GitLab, au lieu du déploiement\nautomatisé.\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","/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,157,162],{"text":153,"config":154},"Application Security Testing",{"href":155,"dataGaName":156,"dataGaLocation":46},"/solutions/application-security-testing/","Application security testing",{"text":158,"config":159},"Sécurité de la chaîne d'approvisionnement logicielle",{"href":160,"dataGaLocation":46,"dataGaName":161},"/fr-fr/solutions/supply-chain/","Software supply chain security",{"text":163,"config":164},"Software Compliance",{"href":165,"dataGaName":163,"dataGaLocation":46},"/solutions/software-compliance/",{"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},"/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},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758208064/dzl0dbift9xdizyelkk4.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},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":438,"config":443},{"src":444,"dataGaName":441,"dataGaLocation":436},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.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,"titleMobile":460,"button":461,"config":466,"_id":468,"_type":32,"_source":34,"_file":469,"_stem":470,"_extension":37},"/shared/fr-fr/banner","La plateforme GitLab Duo Agent est maintenant disponible en version bêta publique !",{"text":462,"config":463},"Essayer la version bêta",{"href":464,"dataGaName":465,"dataGaLocation":46},"/fr-fr/gitlab-duo/agent-platform/","duo banner",{"layout":467},"release","content:shared:fr-fr:banner.yml","shared/fr-fr/banner.yml","shared/fr-fr/banner",{"_path":472,"_dir":40,"_draft":6,"_partial":6,"_locale":7,"data":473,"_id":678,"_type":32,"title":679,"_source":34,"_file":680,"_stem":681,"_extension":37},"/shared/fr-fr/main-footer",{"text":474,"source":475,"edit":481,"contribute":486,"config":491,"items":496,"minimal":669},"Git est une marque déposée de Software Freedom Conservancy et notre utilisation de « GitLab » est sous licence",{"text":476,"config":477},"Afficher le code source de la page",{"href":478,"dataGaName":479,"dataGaLocation":480},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":482,"config":483},"Modifier cette page",{"href":484,"dataGaName":485,"dataGaLocation":480},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":487,"config":488},"Veuillez contribuer",{"href":489,"dataGaName":490,"dataGaLocation":480},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":492,"facebook":493,"youtube":494,"linkedin":495},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[497,520,574,606,640],{"title":64,"links":498,"subMenu":503},[499],{"text":500,"config":501},"Plateforme DevSecOps",{"href":73,"dataGaName":502,"dataGaLocation":480},"devsecops platform",[504],{"title":207,"links":505},[506,510,515],{"text":507,"config":508},"Voir les forfaits",{"href":209,"dataGaName":509,"dataGaLocation":480},"view plans",{"text":511,"config":512},"Pourquoi choisir GitLab Premium ?",{"href":513,"dataGaName":514,"dataGaLocation":480},"/fr-fr/pricing/premium/","why premium",{"text":516,"config":517},"Pourquoi choisir GitLab Ultimate ?",{"href":518,"dataGaName":519,"dataGaLocation":480},"/fr-fr/pricing/ultimate/","why ultimate",{"title":521,"links":522},"Solutions",[523,528,531,533,538,543,547,550,553,558,560,562,564,569],{"text":524,"config":525},"Transformation digitale",{"href":526,"dataGaName":527,"dataGaLocation":480},"/fr-fr/topics/digital-transformation/","digital transformation",{"text":529,"config":530},"Sécurité et conformité",{"href":155,"dataGaName":156,"dataGaLocation":480},{"text":140,"config":532},{"href":123,"dataGaName":124,"dataGaLocation":480},{"text":534,"config":535},"Développement agile",{"href":536,"dataGaName":537,"dataGaLocation":480},"/fr-fr/solutions/agile-delivery/","agile delivery",{"text":539,"config":540},"Transformation cloud",{"href":541,"dataGaName":542,"dataGaLocation":480},"/fr-fr/topics/cloud-native/","cloud transformation",{"text":544,"config":545},"SCM",{"href":137,"dataGaName":546,"dataGaLocation":480},"source code management",{"text":127,"config":548},{"href":129,"dataGaName":549,"dataGaLocation":480},"continuous integration & delivery",{"text":179,"config":551},{"href":181,"dataGaName":552,"dataGaLocation":480},"value stream management",{"text":554,"config":555},"GitOps",{"href":556,"dataGaName":557,"dataGaLocation":480},"/fr-fr/solutions/gitops/","gitops",{"text":192,"config":559},{"href":194,"dataGaName":195,"dataGaLocation":480},{"text":197,"config":561},{"href":199,"dataGaName":200,"dataGaLocation":480},{"text":202,"config":563},{"href":204,"dataGaName":205,"dataGaLocation":480},{"text":565,"config":566},"Formation",{"href":567,"dataGaName":568,"dataGaLocation":480},"/fr-fr/solutions/education/","education",{"text":570,"config":571},"Services financiers",{"href":572,"dataGaName":573,"dataGaLocation":480},"/fr-fr/solutions/finance/","financial services",{"title":212,"links":575},[576,578,580,582,585,587,590,592,594,596,598,600,602,604],{"text":224,"config":577},{"href":226,"dataGaName":227,"dataGaLocation":480},{"text":229,"config":579},{"href":231,"dataGaName":232,"dataGaLocation":480},{"text":234,"config":581},{"href":236,"dataGaName":237,"dataGaLocation":480},{"text":239,"config":583},{"href":241,"dataGaName":584,"dataGaLocation":480},"docs",{"text":262,"config":586},{"href":264,"dataGaName":5},{"text":588,"config":589},"Histoires de réussite client",{"href":259,"dataGaLocation":480},{"text":257,"config":591},{"href":259,"dataGaName":260,"dataGaLocation":480},{"text":266,"config":593},{"href":268,"dataGaName":269,"dataGaLocation":480},{"text":279,"config":595},{"href":281,"dataGaName":282,"dataGaLocation":480},{"text":271,"config":597},{"href":273,"dataGaName":274,"dataGaLocation":480},{"text":284,"config":599},{"href":286,"dataGaName":287,"dataGaLocation":480},{"text":289,"config":601},{"href":291,"dataGaName":292,"dataGaLocation":480},{"text":294,"config":603},{"href":296,"dataGaName":297,"dataGaLocation":480},{"text":299,"config":605},{"href":301,"dataGaName":302,"dataGaLocation":480},{"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":480},{"text":329,"config":611},{"href":331,"dataGaName":332,"dataGaLocation":480},{"text":337,"config":613},{"href":339,"dataGaName":340,"dataGaLocation":480},{"text":342,"config":615},{"href":344,"dataGaName":345,"dataGaLocation":480},{"text":347,"config":617},{"href":349,"dataGaName":350,"dataGaLocation":480},{"text":352,"config":619},{"href":354,"dataGaName":355,"dataGaLocation":480},{"text":621,"config":622},"Sustainability",{"href":623,"dataGaName":621,"dataGaLocation":480},"/sustainability/",{"text":625,"config":626},"Diversité, inclusion et appartenance (DIB)",{"href":627,"dataGaName":628,"dataGaLocation":480},"/fr-fr/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":357,"config":630},{"href":359,"dataGaName":360,"dataGaLocation":480},{"text":367,"config":632},{"href":369,"dataGaName":370,"dataGaLocation":480},{"text":372,"config":634},{"href":374,"dataGaName":375,"dataGaLocation":480},{"text":636,"config":637},"Déclaration de transparence sur l'esclavage moderne",{"href":638,"dataGaName":639,"dataGaLocation":480},"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":480},{"text":386,"config":646},{"href":388,"dataGaName":389,"dataGaLocation":480},{"text":391,"config":648},{"href":393,"dataGaName":394,"dataGaLocation":480},{"text":650,"config":651},"Statut",{"href":652,"dataGaName":653,"dataGaLocation":480},"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":480},"/fr-fr/privacy/","privacy statement",{"text":665,"config":666},"Préférences en matière de cookies",{"dataGaName":667,"dataGaLocation":480,"id":668,"isOneTrustButton":109},"cookie preferences","ot-sdk-btn",{"items":670},[671,673,676],{"text":655,"config":672},{"href":657,"dataGaName":658,"dataGaLocation":480},{"text":674,"config":675},"Politique de confidentialité",{"href":662,"dataGaName":663,"dataGaLocation":480},{"text":665,"config":677},{"dataGaName":667,"dataGaLocation":480,"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",1758662372248]