[{"data":1,"prerenderedAt":707},["ShallowReactive",2],{"/fr-fr/blog/building-a-gitlab-ci-cd-pipeline-for-a-monorepo-the-easy-way/":3,"navigation-fr-fr":36,"banner-fr-fr":455,"footer-fr-fr":467,"Sam Morris":679,"next-steps-fr-fr":692},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"seo":8,"content":16,"config":26,"_id":29,"_type":30,"title":31,"_source":32,"_file":33,"_stem":34,"_extension":35},"/fr-fr/blog/building-a-gitlab-ci-cd-pipeline-for-a-monorepo-the-easy-way","blog",false,"",{"title":9,"description":10,"ogTitle":9,"ogDescription":10,"noIndex":6,"ogImage":11,"ogUrl":12,"ogSiteName":13,"ogType":14,"canonicalUrls":12,"schema":15},"GitLab CI/CD : comment créer facilement un pipeline pour un monorepo","Découvrez comment configurer un pipeline CI/CD dans GitLab pour un dépôt monorepo et simplifier l'hébergement de plusieurs applications dans un seul dépôt.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749660151/Blog/Hero%20Images/blog-image-template-1800x945__26_.png","https://about.gitlab.com/blog/building-a-gitlab-ci-cd-pipeline-for-a-monorepo-the-easy-way","https://about.gitlab.com","article","\n                        {\n        \"@context\": \"https://schema.org\",\n        \"@type\": \"Article\",\n        \"headline\": \"GitLab CI/CD : comment créer facilement un pipeline pour un monorepo\",\n        \"author\": [{\"@type\":\"Person\",\"name\":\"Sam Morris\"}],\n        \"datePublished\": \"2024-07-30\",\n      }\n                  ",{"title":9,"description":10,"authors":17,"heroImage":11,"date":19,"body":20,"category":21,"tags":22,"updatedDate":25},[18],"Sam Morris","2024-07-30","Les monorepos permettent d’héberger le code de plusieurs applications au sein d'un seul dépôt. Dans GitLab, cela consiste à organiser le code source de chaque application dans des répertoires distincts au sein d'un même projet. Bien que cette approche facilite le [contrôle de version](https://about.gitlab.com/fr-fr/topics/version-control/ \"Qu'est-ce que le contrôle de version ? \") pour l'ensemble du code, tirer parti des capacités avancées des [pipelines CI/CD](https://about.gitlab.com/fr-fr/topics/ci-cd/cicd-pipeline/ \"Qu'est-ce qu'un pipeline CI/CD ? \") de GitLab pouvait s'avérer complexe... jusqu'à l'arrivée d'une nouvelle fonctionnalité dans GitLab 16.4 !\n\n## Le cas idéal : des pipelines CI/CD indépendants pour un monorepo\n\nLorsque plusieurs applications coexistent dans un même dépôt, il est logique de vouloir disposer de pipelines CI/CD distincts pour chacune d'elles. Par exemple, si l'un de vos projets regroupe une application .NET et une application Spring, chacune d'elle nécessitera des jobs de compilation et de test différents. L'idéal serait donc de pouvoir découpler ces pipelines pour qu'ils s'exécutent uniquement lorsque des modifications sont apportées au code source de l'application concernée.\n\nTechniquement, cela revient à configurer un fichier de pipeline `.gitlab-ci.yml` au niveau du projet, qui inclut des fichiers YAML spécifiques basés sur les modifications détectées dans certains répertoires. Le fichier de pipeline `.gitlab-ci.yml` agit comme un plan de contrôle qui déclenche le pipeline approprié en fonction des modifications apportées au code.\n\n## Ancienne approche : le contournement\n\nAvant l'introduction de nouvelles fonctionnalités dans GitLab 16.4, il n'était pas possible d'inclure directement un fichier YAML en fonction des modifications apportées à un répertoire ou un fichier spécifique. Une solution de contournement était toutefois disponible. \n\nPrenons un exemple concret : un monorepo avec deux répertoires, `java` et `python`, contenant respectivement le code source d'une application Java et d'une application Python. Chaque répertoire disposait d'un fichier YAML propre à l'application pour gérer sa compilation. Le fichier de pipeline principal du projet incluait simplement les deux fichiers YAML des applications, mais une logique de gestion des modifications devait être directement intégrée dans ces fichiers.\n\n`.gitlab-ci.yml` :\n\n```\nstages:\n  - build\n  - test\n  - deploy\n\ntop-level-job:\n  stage: build\n  script:\n    - echo \"Hello world...\"\n\ninclude:\n  - local: '/java/j.gitlab-ci.yml'\n  - local: '/python/py.gitlab-ci.yml'\n\n```\n\nPour chaque application, il était nécessaire de créer un job masqué (par exemple, .java-common ou .python-common), qui ne s'exécutait qu'en présence de modifications apportées au répertoire correspondant. Les [jobs masqués](https://docs.gitlab.com/ee/ci/jobs/#hide-jobs) ne s'exécutaient pas par défaut. Ils servaient à centraliser la logique de déclenchement et à la réutiliser dans d'autres jobs. Cependant, cela impliquait d'étendre le job masqué dans chaque pipeline afin de respecter les règles de détection des modifications, qui déclenchaient alors le job d'exécution du pipeline. \n\n'j.gitlab-ci.yml':\n\n'''\nstages:\n  - build\n  - test\n  - deploy\n\n.java-common:\n  rules:\n    - changes:\n      - ../java/*'\n\njava-build-job:\n  extends: .java-common\n  stage: build\n  script:\n    - echo \"Building Java\"\n\njava-test-job:\n  extends: .java-common\n  stage: test\n  script:\n    - echo \"Testing Java\"\n\n'''\n\n'py.gitlab-ci.yml':\n\n'''\nstages:\n  - build\n  - test\n  - deploy\n\n.python-common:\n  rules:\n    - changes:\n      - \"../python/*\"\n\npython-build-job:\n  extends: .python-common\n  stage: build\n  script:\n    - echo \"Building Python\"\n\npython-test-job:\n  extends: .python-common\n  stage: test\n  script:\n    - echo \"Testing Python\"\n\n'''\n\nCette méthode fonctionnait, mais présentait des inconvénients majeurs. En effet, chaque pipeline devait étendre le job masqué pour chaque autre job dans le fichier YAML afin de respecter les règles de déclenchement. Elle avait pour conséquence la création de code redondant et l'augmentation du risque d'erreur humaine. De plus, les jobs étendus n'acceptaient pas de clés en double. Vous ne pouviez donc pas définir votre propre logique de règles (`rules`), car cela entraînait des conflits de clés et leurs [valeurs n'étaient pas fusionnées](https://docs.gitlab.com/ee/ci/yaml/index.html#extends). \n\nMalgré tout, avec cette méthode, le pipeline est opérationnel, incluant les jobs j.gitlab-ci.yml dès que le répertoire `java/` est mis à jour, et les jobs py.gitlab-ci.yml dès que le répertoire `python/` est mis à jour. \n\n## Nouvelle approche : l'inclusion conditionnelle des fichiers de pipeline\n\n\u003C!-- blank line -->\n\u003Cfigure class=\"video_container\">\n  \u003Ciframe src=\"https://www.youtube.com/embed/6phvk8jioAo?si=y6ztZODvUtM-cHmZ\" frameborder=\"0\" allowfullscreen=\"true\"> \u003C/iframe>\n\u003C/figure>\n\u003C!-- blank line ->\n\nAvec le lancement de GitLab 16.4, nous avons introduit une nouvelle fonctionnalité : la possibilité d'utiliser le terme [`include` avec `rules:changes` dans les pipelines CI/CD](https://docs.gitlab.com/ee/ci/yaml/includes.html#include-with-ruleschanges). Auparavant, vous pouviez utiliser l'option `include` avec `rules:if`, mais pas avec `rules:changes`. Cette nouvelle version est donc une amélioration majeure. Désormais, vous pouvez simplement utiliser le terme `include` et définir les règles du monorepo dans la configuration du pipeline de votre projet. \n\nNouveau fichier `.gitlab-ci.yml` :\n\n```\nstages:\n  - build\n  - test\n\ntop-level-job:\n  stage: build\n  script:\n    - echo \"Hello world...\"\n\ninclude:\n  - local: '/java/j.gitlab-ci.yml'\n    rules:\n      - changes:\n        - 'java/*'\n  - local: '/python/py.gitlab-ci.yml'\n    rules:\n      - changes:\n        - 'python/*'\n\n```\n\nAinsi, le fichier YAML de chaque application se concentre exclusivement sur les jobs nécessaires à cette application, comme la compilation et le test du code, sans avoir à étendre à plusieurs reprises un job masqué. Cette approche permet une plus grande flexibilité dans les définitions de job et les ingénieurs n'ont plus besoin de réécrire le code des configurations.\n\nNouveau fichier `j.gitlab-ci.yml` (Java) :\n\n```\nstages:\n  - build\n  - test\n  - deploy\n\njava-build-job:\n  stage: build\n  script:\n    - echo \"Building Java\"\n\njava-test-job:\n  stage: test\n  script:\n    - echo \"Testing Java\"\n\n```\n\nNouveau fichier `py.gitlab-ci.yml` (Python) :\n```\nstages:\n  - build\n  - test\n  - deploy\n\npython-build-job:\n  stage: build\n  script:\n    - echo \"Building Python\"\n\npython-test-job:\n  stage: test\n  script:\n    - echo \"Testing Python\"\n\n```\n\nCette méthode permet d'inclure les jobs Java et Python uniquement lorsque leurs répertoires respectifs sont modifiés. Cependant, il convient de noter que [les jobs peuvent s'exécuter de manière inattendue lors de l'utilisation de `changes`](https://docs.gitlab.com/ee/ci/jobs/job_troubleshooting.html#jobs-or-pipelines-run-unexpectedly-when-using-changes). La règle de déclenchement des modifications est toujours évaluée comme vraie lors du push d'une nouvelle branche ou d'un nouveau tag dans GitLab. Ainsi, tous les jobs inclus dans le pipeline s'exécuteront lors du premier push d'une branche, même si des règles `rules:changes` spécifiques sont définies. Vous pouvez résoudre ce problème en créant d'abord votre branche de fonctionnalité, puis en ouvrant une merge request pour commencer votre développement, car le premier push vers la branche lors de sa création forcera l'exécution de tous les jobs.\n\nEn fin de compte, les monorepos constituent une stratégie adaptée à GitLab et à l'approche CI/CD. La fonctionnalité `include` avec `rules:changes` est une bonne pratique que nous recommandons lors de l'utilisation de GitLab CI avec des monorepos. Pour utiliser les monorepos, commencez par essayer Gitlab Ultimate gratuitement dès aujourd'hui.\n","engineering",[23,24],"CI/CD","tutorial","2025-05-27",{"slug":27,"featured":6,"template":28},"building-a-gitlab-ci-cd-pipeline-for-a-monorepo-the-easy-way","BlogPost","content:fr-fr:blog:building-a-gitlab-ci-cd-pipeline-for-a-monorepo-the-easy-way.yml","yaml","Building A Gitlab Ci Cd Pipeline For A Monorepo The Easy Way","content","fr-fr/blog/building-a-gitlab-ci-cd-pipeline-for-a-monorepo-the-easy-way.yml","fr-fr/blog/building-a-gitlab-ci-cd-pipeline-for-a-monorepo-the-easy-way","yml",{"_path":37,"_dir":38,"_draft":6,"_partial":6,"_locale":7,"data":39,"_id":451,"_type":30,"title":452,"_source":32,"_file":453,"_stem":454,"_extension":35},"/shared/fr-fr/main-navigation","fr-fr",{"logo":40,"freeTrial":45,"sales":50,"login":55,"items":60,"search":392,"minimal":428,"duo":442},{"config":41},{"href":42,"dataGaName":43,"dataGaLocation":44},"/fr-fr/","gitlab logo","header",{"text":46,"config":47},"Commencer un essai gratuit",{"href":48,"dataGaName":49,"dataGaLocation":44},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":51,"config":52},"Contacter l'équipe commerciale",{"href":53,"dataGaName":54,"dataGaLocation":44},"/fr-fr/sales/","sales",{"text":56,"config":57},"Connexion",{"href":58,"dataGaName":59,"dataGaLocation":44},"https://gitlab.com/users/sign_in/","sign in",[61,105,203,208,313,373],{"text":62,"config":63,"cards":65,"footer":88},"Plateforme",{"dataNavLevelOne":64},"platform",[66,72,80],{"title":62,"description":67,"link":68},"La plateforme DevSecOps alimentée par l'IA la plus complète",{"text":69,"config":70},"Découvrir notre plateforme",{"href":71,"dataGaName":64,"dataGaLocation":44},"/fr-fr/platform/",{"title":73,"description":74,"link":75},"GitLab Duo (IA)","Créez des logiciels plus rapidement en tirant parti de l'IA à chaque étape du développement",{"text":76,"config":77},"Découvrez GitLab Duo",{"href":78,"dataGaName":79,"dataGaLocation":44},"/fr-fr/gitlab-duo/","gitlab duo ai",{"title":81,"description":82,"link":83},"Choisir GitLab","10 raisons pour lesquelles les entreprises choisissent GitLab",{"text":84,"config":85},"En savoir plus",{"href":86,"dataGaName":87,"dataGaLocation":44},"/fr-fr/why-gitlab/","why gitlab",{"title":89,"items":90},"Démarrer avec",[91,96,101],{"text":92,"config":93},"Ingénierie de plateforme",{"href":94,"dataGaName":95,"dataGaLocation":44},"/fr-fr/solutions/platform-engineering/","platform engineering",{"text":97,"config":98},"Expérience développeur",{"href":99,"dataGaName":100,"dataGaLocation":44},"/fr-fr/developer-experience/","Developer experience",{"text":102,"config":103},"MLOps",{"href":104,"dataGaName":102,"dataGaLocation":44},"/fr-fr/topics/devops/the-role-of-ai-in-devops/",{"text":106,"left":107,"config":108,"link":110,"lists":114,"footer":185},"Produit",true,{"dataNavLevelOne":109},"solutions",{"text":111,"config":112},"Voir toutes les solutions",{"href":113,"dataGaName":109,"dataGaLocation":44},"/fr-fr/solutions/",[115,140,163],{"title":116,"description":117,"link":118,"items":123},"Automatisation","CI/CD et automatisation pour accélérer le déploiement",{"config":119},{"icon":120,"href":121,"dataGaName":122,"dataGaLocation":44},"AutomatedCodeAlt","/fr-fr/solutions/delivery-automation/","automated software delivery",[124,127,131,136],{"text":23,"config":125},{"href":126,"dataGaLocation":44,"dataGaName":23},"/fr-fr/solutions/continuous-integration/",{"text":128,"config":129},"Développement assisté par l'IA",{"href":78,"dataGaLocation":44,"dataGaName":130},"AI assisted development",{"text":132,"config":133},"Gestion du code source",{"href":134,"dataGaLocation":44,"dataGaName":135},"/fr-fr/solutions/source-code-management/","Source Code Management",{"text":137,"config":138},"Livraison de logiciels automatisée",{"href":121,"dataGaLocation":44,"dataGaName":139},"Automated software delivery",{"title":141,"description":142,"link":143,"items":148},"Securité","Livrez du code plus rapidement sans compromettre la sécurité",{"config":144},{"href":145,"dataGaName":146,"dataGaLocation":44,"icon":147},"/fr-fr/solutions/security-compliance/","security and compliance","ShieldCheckLight",[149,153,158],{"text":150,"config":151},"Sécurité et conformité",{"href":145,"dataGaLocation":44,"dataGaName":152},"Security & Compliance",{"text":154,"config":155},"Sécurité de la chaîne d'approvisionnement logicielle",{"href":156,"dataGaLocation":44,"dataGaName":157},"/fr-fr/solutions/supply-chain/","Software supply chain security",{"text":159,"config":160},"Conformité et gouvernance",{"href":161,"dataGaLocation":44,"dataGaName":162},"/fr-fr/solutions/continuous-software-compliance/","Compliance and governance",{"title":164,"link":165,"items":170},"Mesures",{"config":166},{"icon":167,"href":168,"dataGaName":169,"dataGaLocation":44},"DigitalTransformation","/fr-fr/solutions/visibility-measurement/","visibility and measurement",[171,175,180],{"text":172,"config":173},"Visibilité et mesures",{"href":168,"dataGaLocation":44,"dataGaName":174},"Visibility and Measurement",{"text":176,"config":177},"Gestion de la chaîne de valeur",{"href":178,"dataGaLocation":44,"dataGaName":179},"/fr-fr/solutions/value-stream-management/","Value Stream Management",{"text":181,"config":182},"Données d'analyse et informations clés",{"href":183,"dataGaLocation":44,"dataGaName":184},"/fr-fr/solutions/analytics-and-insights/","Analytics and insights",{"title":186,"items":187},"GitLab pour",[188,193,198],{"text":189,"config":190},"Entreprises",{"href":191,"dataGaLocation":44,"dataGaName":192},"/fr-fr/enterprise/","enterprise",{"text":194,"config":195},"PME",{"href":196,"dataGaLocation":44,"dataGaName":197},"/fr-fr/small-business/","small business",{"text":199,"config":200},"Secteur public",{"href":201,"dataGaLocation":44,"dataGaName":202},"/fr-fr/solutions/public-sector/","public sector",{"text":204,"config":205},"Tarifs",{"href":206,"dataGaName":207,"dataGaLocation":44,"dataNavLevelOne":207},"/fr-fr/pricing/","pricing",{"text":209,"config":210,"link":212,"lists":216,"feature":300},"Ressources",{"dataNavLevelOne":211},"resources",{"text":213,"config":214},"Afficher toutes les ressources",{"href":215,"dataGaName":211,"dataGaLocation":44},"/fr-fr/resources/",[217,250,272],{"title":218,"items":219},"Premiers pas",[220,225,230,235,240,245],{"text":221,"config":222},"Installation",{"href":223,"dataGaName":224,"dataGaLocation":44},"/fr-fr/install/","install",{"text":226,"config":227},"Guides de démarrage rapide",{"href":228,"dataGaName":229,"dataGaLocation":44},"/fr-fr/get-started/","quick setup checklists",{"text":231,"config":232},"Apprentissage",{"href":233,"dataGaLocation":44,"dataGaName":234},"https://university.gitlab.com/","learn",{"text":236,"config":237},"Documentation sur le produit",{"href":238,"dataGaName":239,"dataGaLocation":44},"https://docs.gitlab.com/","product documentation",{"text":241,"config":242},"Vidéos sur les bonnes pratiques",{"href":243,"dataGaName":244,"dataGaLocation":44},"/fr-fr/getting-started-videos/","best practice videos",{"text":246,"config":247},"Intégrations",{"href":248,"dataGaName":249,"dataGaLocation":44},"/fr-fr/integrations/","integrations",{"title":251,"items":252},"Découvrir",[253,258,262,267],{"text":254,"config":255},"Histoires de succès client",{"href":256,"dataGaName":257,"dataGaLocation":44},"/fr-fr/customers/","customer success stories",{"text":259,"config":260},"Blog",{"href":261,"dataGaName":5,"dataGaLocation":44},"/fr-fr/blog/",{"text":263,"config":264},"Travail à distance",{"href":265,"dataGaName":266,"dataGaLocation":44},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"text":268,"config":269},"TeamOps",{"href":270,"dataGaName":271,"dataGaLocation":44},"/fr-fr/teamops/","teamops",{"title":273,"items":274},"Connecter",[275,280,285,290,295],{"text":276,"config":277},"Services GitLab",{"href":278,"dataGaName":279,"dataGaLocation":44},"/fr-fr/services/","services",{"text":281,"config":282},"Communauté",{"href":283,"dataGaName":284,"dataGaLocation":44},"/community/","community",{"text":286,"config":287},"Forum",{"href":288,"dataGaName":289,"dataGaLocation":44},"https://forum.gitlab.com/","forum",{"text":291,"config":292},"Événements",{"href":293,"dataGaName":294,"dataGaLocation":44},"/events/","events",{"text":296,"config":297},"Partenaires",{"href":298,"dataGaName":299,"dataGaLocation":44},"/fr-fr/partners/","partners",{"backgroundColor":301,"textColor":302,"text":303,"image":304,"link":308},"#2f2a6b","#fff","L'avenir du développement logiciel. Tendances et perspectives.",{"altText":305,"config":306},"carte promo The Source",{"src":307},"/images/navigation/the-source-promo-card.svg",{"text":309,"config":310},"Lire les articles les plus récents",{"href":311,"dataGaName":312,"dataGaLocation":44},"/fr-fr/the-source/","the source",{"text":314,"config":315,"lists":317},"Société",{"dataNavLevelOne":316},"company",[318],{"items":319},[320,325,331,333,338,343,348,353,358,363,368],{"text":321,"config":322},"À propos",{"href":323,"dataGaName":324,"dataGaLocation":44},"/fr-fr/company/","about",{"text":326,"config":327,"footerGa":330},"Emplois",{"href":328,"dataGaName":329,"dataGaLocation":44},"/jobs/","jobs",{"dataGaName":329},{"text":291,"config":332},{"href":293,"dataGaName":294,"dataGaLocation":44},{"text":334,"config":335},"Leadership",{"href":336,"dataGaName":337,"dataGaLocation":44},"/company/team/e-group/","leadership",{"text":339,"config":340},"Équipe",{"href":341,"dataGaName":342,"dataGaLocation":44},"/company/team/","team",{"text":344,"config":345},"Manuel",{"href":346,"dataGaName":347,"dataGaLocation":44},"https://handbook.gitlab.com/","handbook",{"text":349,"config":350},"Relations avec les investisseurs",{"href":351,"dataGaName":352,"dataGaLocation":44},"https://ir.gitlab.com/","investor relations",{"text":354,"config":355},"Centre de confiance",{"href":356,"dataGaName":357,"dataGaLocation":44},"/fr-fr/security/","trust center",{"text":359,"config":360},"Centre pour la transparence de l'IA",{"href":361,"dataGaName":362,"dataGaLocation":44},"/fr-fr/ai-transparency-center/","ai transparency center",{"text":364,"config":365},"Newsletter",{"href":366,"dataGaName":367,"dataGaLocation":44},"/company/contact/","newsletter",{"text":369,"config":370},"Presse",{"href":371,"dataGaName":372,"dataGaLocation":44},"/press/","press",{"text":374,"config":375,"lists":376},"Nous contacter",{"dataNavLevelOne":316},[377],{"items":378},[379,382,387],{"text":51,"config":380},{"href":53,"dataGaName":381,"dataGaLocation":44},"talk to sales",{"text":383,"config":384},"Aide",{"href":385,"dataGaName":386,"dataGaLocation":44},"/support/","get help",{"text":388,"config":389},"Portail clients GitLab",{"href":390,"dataGaName":391,"dataGaLocation":44},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":393,"login":394,"suggestions":401},"Fermer",{"text":395,"link":396},"Pour rechercher des dépôts et des projets, connectez-vous à",{"text":397,"config":398},"gitlab.com",{"href":58,"dataGaName":399,"dataGaLocation":400},"search login","search",{"text":402,"default":403},"Suggestions",[404,407,412,414,419,424],{"text":73,"config":405},{"href":78,"dataGaName":406,"dataGaLocation":400},"GitLab Duo (AI)",{"text":408,"config":409},"Suggestions de code (IA)",{"href":410,"dataGaName":411,"dataGaLocation":400},"/fr-fr/solutions/code-suggestions/","Code Suggestions (AI)",{"text":23,"config":413},{"href":126,"dataGaName":23,"dataGaLocation":400},{"text":415,"config":416},"GitLab sur AWS",{"href":417,"dataGaName":418,"dataGaLocation":400},"/fr-fr/partners/technology-partners/aws/","GitLab on AWS",{"text":420,"config":421},"GitLab sur Google Cloud ",{"href":422,"dataGaName":423,"dataGaLocation":400},"/fr-fr/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":425,"config":426},"Pourquoi utiliser GitLab ?",{"href":86,"dataGaName":427,"dataGaLocation":400},"Why GitLab?",{"freeTrial":429,"mobileIcon":434,"desktopIcon":439},{"text":430,"config":431},"Commencer votre essai gratuit",{"href":432,"dataGaName":49,"dataGaLocation":433},"https://gitlab.com/-/trials/new/","nav",{"altText":435,"config":436},"Icône GitLab",{"src":437,"dataGaName":438,"dataGaLocation":433},"/images/brand/gitlab-logo-tanuki.svg","gitlab icon",{"altText":435,"config":440},{"src":441,"dataGaName":438,"dataGaLocation":433},"/images/brand/gitlab-logo-type.svg",{"freeTrial":443,"mobileIcon":447,"desktopIcon":449},{"text":444,"config":445},"En savoir plus sur GitLab Duo",{"href":78,"dataGaName":446,"dataGaLocation":433},"gitlab duo",{"altText":435,"config":448},{"src":437,"dataGaName":438,"dataGaLocation":433},{"altText":435,"config":450},{"src":441,"dataGaName":438,"dataGaLocation":433},"content:shared:fr-fr:main-navigation.yml","Main Navigation","shared/fr-fr/main-navigation.yml","shared/fr-fr/main-navigation",{"_path":456,"_dir":38,"_draft":6,"_partial":6,"_locale":7,"title":457,"titleMobile":457,"button":458,"config":462,"_id":464,"_type":30,"_source":32,"_file":465,"_stem":466,"_extension":35},"/shared/fr-fr/banner","La plateforme GitLab Duo Agent est maintenant en bêta publique !",{"text":84,"config":459},{"href":460,"dataGaName":461,"dataGaLocation":44},"/fr-fr/gitlab-duo/agent-platform/","duo banner",{"layout":463},"release","content:shared:fr-fr:banner.yml","shared/fr-fr/banner.yml","shared/fr-fr/banner",{"_path":468,"_dir":38,"_draft":6,"_partial":6,"_locale":7,"data":469,"_id":675,"_type":30,"title":676,"_source":32,"_file":677,"_stem":678,"_extension":35},"/shared/fr-fr/main-footer",{"text":470,"source":471,"edit":477,"contribute":482,"config":487,"items":492,"minimal":666},"Git est une marque déposée de Software Freedom Conservancy et notre utilisation de « GitLab » est sous licence",{"text":472,"config":473},"Afficher le code source de la page",{"href":474,"dataGaName":475,"dataGaLocation":476},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":478,"config":479},"Modifier cette page",{"href":480,"dataGaName":481,"dataGaLocation":476},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":483,"config":484},"Veuillez contribuer",{"href":485,"dataGaName":486,"dataGaLocation":476},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":488,"facebook":489,"youtube":490,"linkedin":491},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[493,516,570,603,637],{"title":62,"links":494,"subMenu":499},[495],{"text":496,"config":497},"Plateforme DevSecOps",{"href":71,"dataGaName":498,"dataGaLocation":476},"devsecops platform",[500],{"title":204,"links":501},[502,506,511],{"text":503,"config":504},"Voir les forfaits",{"href":206,"dataGaName":505,"dataGaLocation":476},"view plans",{"text":507,"config":508},"Pourquoi choisir GitLab Premium ?",{"href":509,"dataGaName":510,"dataGaLocation":476},"/fr-fr/pricing/premium/","why premium",{"text":512,"config":513},"Pourquoi choisir GitLab Ultimate ?",{"href":514,"dataGaName":515,"dataGaLocation":476},"/fr-fr/pricing/ultimate/","why ultimate",{"title":517,"links":518},"Solutions",[519,524,527,529,534,539,543,546,549,554,556,558,560,565],{"text":520,"config":521},"Transformation digitale",{"href":522,"dataGaName":523,"dataGaLocation":476},"/fr-fr/topics/digital-transformation/","digital transformation",{"text":150,"config":525},{"href":145,"dataGaName":526,"dataGaLocation":476},"security & compliance",{"text":137,"config":528},{"href":121,"dataGaName":122,"dataGaLocation":476},{"text":530,"config":531},"Développement agile",{"href":532,"dataGaName":533,"dataGaLocation":476},"/fr-fr/solutions/agile-delivery/","agile delivery",{"text":535,"config":536},"Transformation cloud",{"href":537,"dataGaName":538,"dataGaLocation":476},"/fr-fr/topics/cloud-native/","cloud transformation",{"text":540,"config":541},"SCM",{"href":134,"dataGaName":542,"dataGaLocation":476},"source code management",{"text":23,"config":544},{"href":126,"dataGaName":545,"dataGaLocation":476},"continuous integration & delivery",{"text":176,"config":547},{"href":178,"dataGaName":548,"dataGaLocation":476},"value stream management",{"text":550,"config":551},"GitOps",{"href":552,"dataGaName":553,"dataGaLocation":476},"/fr-fr/solutions/gitops/","gitops",{"text":189,"config":555},{"href":191,"dataGaName":192,"dataGaLocation":476},{"text":194,"config":557},{"href":196,"dataGaName":197,"dataGaLocation":476},{"text":199,"config":559},{"href":201,"dataGaName":202,"dataGaLocation":476},{"text":561,"config":562},"Formation",{"href":563,"dataGaName":564,"dataGaLocation":476},"/fr-fr/solutions/education/","education",{"text":566,"config":567},"Services financiers",{"href":568,"dataGaName":569,"dataGaLocation":476},"/fr-fr/solutions/finance/","financial services",{"title":209,"links":571},[572,574,576,578,581,583,587,589,591,593,595,597,599,601],{"text":221,"config":573},{"href":223,"dataGaName":224,"dataGaLocation":476},{"text":226,"config":575},{"href":228,"dataGaName":229,"dataGaLocation":476},{"text":231,"config":577},{"href":233,"dataGaName":234,"dataGaLocation":476},{"text":236,"config":579},{"href":238,"dataGaName":580,"dataGaLocation":476},"docs",{"text":259,"config":582},{"href":261,"dataGaName":5},{"text":584,"config":585},"Histoires de réussite client",{"href":586,"dataGaLocation":476},"/customers/",{"text":254,"config":588},{"href":256,"dataGaName":257,"dataGaLocation":476},{"text":263,"config":590},{"href":265,"dataGaName":266,"dataGaLocation":476},{"text":276,"config":592},{"href":278,"dataGaName":279,"dataGaLocation":476},{"text":268,"config":594},{"href":270,"dataGaName":271,"dataGaLocation":476},{"text":281,"config":596},{"href":283,"dataGaName":284,"dataGaLocation":476},{"text":286,"config":598},{"href":288,"dataGaName":289,"dataGaLocation":476},{"text":291,"config":600},{"href":293,"dataGaName":294,"dataGaLocation":476},{"text":296,"config":602},{"href":298,"dataGaName":299,"dataGaLocation":476},{"title":314,"links":604},[605,607,609,611,613,615,617,621,626,628,630,632],{"text":321,"config":606},{"href":323,"dataGaName":316,"dataGaLocation":476},{"text":326,"config":608},{"href":328,"dataGaName":329,"dataGaLocation":476},{"text":334,"config":610},{"href":336,"dataGaName":337,"dataGaLocation":476},{"text":339,"config":612},{"href":341,"dataGaName":342,"dataGaLocation":476},{"text":344,"config":614},{"href":346,"dataGaName":347,"dataGaLocation":476},{"text":349,"config":616},{"href":351,"dataGaName":352,"dataGaLocation":476},{"text":618,"config":619},"Sustainability",{"href":620,"dataGaName":618,"dataGaLocation":476},"/sustainability/",{"text":622,"config":623},"Diversité, inclusion et appartenance (DIB)",{"href":624,"dataGaName":625,"dataGaLocation":476},"/fr-fr/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":354,"config":627},{"href":356,"dataGaName":357,"dataGaLocation":476},{"text":364,"config":629},{"href":366,"dataGaName":367,"dataGaLocation":476},{"text":369,"config":631},{"href":371,"dataGaName":372,"dataGaLocation":476},{"text":633,"config":634},"Déclaration de transparence sur l'esclavage moderne",{"href":635,"dataGaName":636,"dataGaLocation":476},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"title":374,"links":638},[639,642,644,646,651,656,661],{"text":640,"config":641},"Échanger avec un expert",{"href":53,"dataGaName":54,"dataGaLocation":476},{"text":383,"config":643},{"href":385,"dataGaName":386,"dataGaLocation":476},{"text":388,"config":645},{"href":390,"dataGaName":391,"dataGaLocation":476},{"text":647,"config":648},"Statut",{"href":649,"dataGaName":650,"dataGaLocation":476},"https://status.gitlab.com/","status",{"text":652,"config":653},"Conditions d'utilisation",{"href":654,"dataGaName":655},"/terms/","terms of use",{"text":657,"config":658},"Déclaration de confidentialité",{"href":659,"dataGaName":660,"dataGaLocation":476},"/fr-fr/privacy/","privacy statement",{"text":662,"config":663},"Préférences en matière de cookies",{"dataGaName":664,"dataGaLocation":476,"id":665,"isOneTrustButton":107},"cookie preferences","ot-sdk-btn",{"items":667},[668,670,673],{"text":652,"config":669},{"href":654,"dataGaName":655,"dataGaLocation":476},{"text":671,"config":672},"Politique de confidentialité",{"href":659,"dataGaName":660,"dataGaLocation":476},{"text":662,"config":674},{"dataGaName":664,"dataGaLocation":476,"id":665,"isOneTrustButton":107},"content:shared:fr-fr:main-footer.yml","Main Footer","shared/fr-fr/main-footer.yml","shared/fr-fr/main-footer",[680],{"_path":681,"_dir":682,"_draft":6,"_partial":6,"_locale":7,"content":683,"config":687,"_id":689,"_type":30,"title":18,"_source":32,"_file":690,"_stem":691,"_extension":35},"/en-us/blog/authors/sam-morris","authors",{"name":18,"config":684},{"headshot":685,"ctfId":686},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749660148/Blog/Author%20Headshots/sam_morris.png","6JTrhUIqSCU30Y9KZOaan8",{"template":688},"BlogAuthor","content:en-us:blog:authors:sam-morris.yml","en-us/blog/authors/sam-morris.yml","en-us/blog/authors/sam-morris",{"_path":693,"_dir":38,"_draft":6,"_partial":6,"_locale":7,"header":694,"eyebrow":695,"blurb":696,"button":697,"secondaryButton":701,"_id":703,"_type":30,"title":704,"_source":32,"_file":705,"_stem":706,"_extension":35},"/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":46,"config":698},{"href":699,"dataGaName":49,"dataGaLocation":700},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":51,"config":702},{"href":53,"dataGaName":54,"dataGaLocation":700},"content:shared:fr-fr:next-steps.yml","Next Steps","shared/fr-fr/next-steps.yml","shared/fr-fr/next-steps",1753309566896]