[{"data":1,"prerenderedAt":1077},["ShallowReactive",2],{"/fr-fr/blog/building-a-gitlab-ci-cd-pipeline-for-a-monorepo-the-easy-way":3,"navigation-fr-fr":293,"banner-fr-fr":727,"footer-fr-fr":735,"blog-post-authors-fr-fr-Sam Morris":974,"blog-related-posts-fr-fr-building-a-gitlab-ci-cd-pipeline-for-a-monorepo-the-easy-way":989,"blog-promotions-fr-fr":1014,"next-steps-fr-fr":1068},{"id":4,"title":5,"authors":6,"body":8,"category":271,"date":272,"description":273,"extension":274,"externalUrl":275,"faq":275,"featured":276,"heroImage":277,"meta":278,"navigation":279,"path":280,"seo":281,"slug":285,"stem":286,"tags":287,"template":290,"updatedDate":291,"__hash__":292},"blogPosts/fr-fr/blog/building-a-gitlab-ci-cd-pipeline-for-a-monorepo-the-easy-way.md","GitLab CI/CD : comment créer facilement un pipeline pour un monorepo",[7],"Sam Morris",{"type":9,"value":10,"toc":265},"minimark",[11,30,35,38,49,53,64,69,79,88,91,104,107,110,113,116,119,121,129,132,135,138,140,161,165,178,208,214,217,224,230,236,242,257],[12,13,14,15,22,23,29],"p",{},"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 ",[16,17,21],"a",{"href":18,"rel":19,"title":20},"https://about.gitlab.com/fr-fr/topics/version-control/",[],"Qu'est-ce que le contrôle de version ? ","contrôle de version"," pour l'ensemble du code, tirer parti des capacités avancées des ",[16,24,28],{"href":25,"rel":26,"title":27},"https://about.gitlab.com/fr-fr/topics/ci-cd/cicd-pipeline/",[],"Qu'est-ce qu'un pipeline CI/CD ? ","pipelines CI/CD"," de GitLab pouvait s'avérer complexe... jusqu'à l'arrivée d'une nouvelle fonctionnalité dans GitLab 16.4 !",[31,32,34],"h2",{"id":33},"le-cas-idéal-des-pipelines-cicd-indépendants-pour-un-monorepo","Le cas idéal : des pipelines CI/CD indépendants pour un monorepo",[12,36,37],{},"Lorsque 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.",[12,39,40,41,45,46,48],{},"Techniquement, cela revient à configurer un fichier de pipeline ",[42,43,44],"code",{},".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 ",[42,47,44],{}," agit comme un plan de contrôle qui déclenche le pipeline approprié en fonction des modifications apportées au code.",[31,50,52],{"id":51},"ancienne-approche-le-contournement","Ancienne approche : le contournement",[12,54,55,56,59,60,63],{},"Avant 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.\nPrenons un exemple concret : un monorepo avec deux répertoires, ",[42,57,58],{},"java"," et ",[42,61,62],{},"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.",[12,65,66,68],{},[42,67,44],{}," :",[70,71,77],"pre",{"className":72,"code":74,"language":75,"meta":76},[73],"language-text","stages:\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","text","",[42,78,74],{"__ignoreMap":76},[12,80,81,82,87],{},"Pour 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 ",[16,83,86],{"href":84,"rel":85},"https://docs.gitlab.com/ci/jobs/#hide-jobs",[],"jobs masqués"," 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'j.gitlab-ci.yml':",[12,89,90],{},"'''\nstages:",[92,93,94,98,101],"ul",{},[95,96,97],"li",{},"build",[95,99,100],{},"test",[95,102,103],{},"deploy",[12,105,106],{},".java-common:\nrules:\n- changes:\n- ../java/*'",[12,108,109],{},"java-build-job:\nextends: .java-common\nstage: build\nscript:\n- echo \"Building Java\"",[12,111,112],{},"java-test-job:\nextends: .java-common\nstage: test\nscript:\n- echo \"Testing Java\"",[12,114,115],{},"'''",[12,117,118],{},"'py.gitlab-ci.yml':",[12,120,90],{},[92,122,123,125,127],{},[95,124,97],{},[95,126,100],{},[95,128,103],{},[12,130,131],{},".python-common:\nrules:\n- changes:\n- \"../python/*\"",[12,133,134],{},"python-build-job:\nextends: .python-common\nstage: build\nscript:\n- echo \"Building Python\"",[12,136,137],{},"python-test-job:\nextends: .python-common\nstage: test\nscript:\n- echo \"Testing Python\"",[12,139,115],{},[12,141,142,143,146,147,152,153,156,157,160],{},"Cette 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 (",[42,144,145],{},"rules","), car cela entraînait des conflits de clés et leurs ",[16,148,151],{"href":149,"rel":150},"https://docs.gitlab.com/ci/yaml/#extends",[],"valeurs n'étaient pas fusionnées",".\nMalgré tout, avec cette méthode, le pipeline est opérationnel, incluant les jobs j.gitlab-ci.yml dès que le répertoire ",[42,154,155],{},"java/"," est mis à jour, et les jobs py.gitlab-ci.yml dès que le répertoire ",[42,158,159],{},"python/"," est mis à jour.",[31,162,164],{"id":163},"nouvelle-approche-linclusion-conditionnelle-des-fichiers-de-pipeline","Nouvelle approche : l'inclusion conditionnelle des fichiers de pipeline",[166,167,170,171],"figure",{"className":168},[169],"video_container","\n  ",[172,173,177],"iframe",{"src":174,"frameBorder":175,"allowFullScreen":176},"https://www.youtube.com/embed/6phvk8jioAo?si=y6ztZODvUtM-cHmZ","0","true"," ",[12,179,180,181,193,194,188,196,199,200,202,203,205,206,68],{},"Avec le lancement de GitLab 16.4, nous avons introduit une nouvelle fonctionnalité : la possibilité d'utiliser le terme ",[16,182,185,188,189,192],{"href":183,"rel":184},"https://docs.gitlab.com/ci/yaml/includes/#include-with-ruleschanges",[],[42,186,187],{},"include"," avec ",[42,190,191],{},"rules:changes"," dans les pipelines CI/CD",". Auparavant, vous pouviez utiliser l'option ",[42,195,187],{},[42,197,198],{},"rules:if",", mais pas avec ",[42,201,191],{},". Cette nouvelle version est donc une amélioration majeure. Désormais, vous pouvez simplement utiliser le terme ",[42,204,187],{}," et définir les règles du monorepo dans la configuration du pipeline de votre projet.\nNouveau fichier ",[42,207,44],{},[70,209,212],{"className":210,"code":211,"language":75,"meta":76},[73],"stages:\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",[42,213,211],{"__ignoreMap":76},[12,215,216],{},"Ainsi, 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.",[12,218,219,220,223],{},"Nouveau fichier ",[42,221,222],{},"j.gitlab-ci.yml"," (Java) :",[70,225,228],{"className":226,"code":227,"language":75,"meta":76},[73],"stages:\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",[42,229,227],{"__ignoreMap":76},[12,231,219,232,235],{},[42,233,234],{},"py.gitlab-ci.yml"," (Python) :",[70,237,240],{"className":238,"code":239,"language":75,"meta":76},[73],"stages:\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",[42,241,239],{"__ignoreMap":76},[12,243,244,245,253,254,256],{},"Cette 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 ",[16,246,249,250],{"href":247,"rel":248},"https://docs.gitlab.com/ci/jobs/job_troubleshooting/#jobs-or-pipelines-run-unexpectedly-when-using-changes",[],"les jobs peuvent s'exécuter de manière inattendue lors de l'utilisation de ",[42,251,252],{},"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 ",[42,255,191],{}," 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.",[12,258,259,260,188,262,264],{},"En fin de compte, les monorepos constituent une stratégie adaptée à GitLab et à l'approche CI/CD. La fonctionnalité ",[42,261,187],{},[42,263,191],{}," 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.",{"title":76,"searchDepth":266,"depth":266,"links":267},2,[268,269,270],{"id":33,"depth":266,"text":34},{"id":51,"depth":266,"text":52},{"id":163,"depth":266,"text":164},"engineering","2024-07-30","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.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749660151/Blog/Hero%20Images/blog-image-template-1800x945__26_.png",{},true,"/fr-fr/blog/building-a-gitlab-ci-cd-pipeline-for-a-monorepo-the-easy-way",{"title":5,"description":273,"ogTitle":5,"ogDescription":273,"noIndex":276,"ogImage":277,"ogUrl":282,"ogSiteName":283,"ogType":284,"canonicalUrls":282},"https://about.gitlab.com/blog/building-a-gitlab-ci-cd-pipeline-for-a-monorepo-the-easy-way","https://about.gitlab.com","article","building-a-gitlab-ci-cd-pipeline-for-a-monorepo-the-easy-way","fr-fr/blog/building-a-gitlab-ci-cd-pipeline-for-a-monorepo-the-easy-way",[288,289],"CI/CD","tutorial","BlogPost","2025-05-27","BrmlNJp2TvBupFWGGD_feMo2too3_0oPu7jyKzhhSLk",{"logo":294,"freeTrial":299,"sales":304,"login":309,"items":314,"search":642,"minimal":678,"duo":697,"switchNav":706,"pricingDeployment":717},{"config":295},{"href":296,"dataGaName":297,"dataGaLocation":298},"/fr-fr/","gitlab logo","header",{"text":300,"config":301},"Commencer un essai gratuit",{"href":302,"dataGaName":303,"dataGaLocation":298},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr&glm_content=default-saas-trial/","free trial",{"text":305,"config":306},"Demander une démo",{"href":307,"dataGaName":308,"dataGaLocation":298},"/fr-fr/sales/?contact-topic=request-demo","sales",{"text":310,"config":311},"Connexion",{"href":312,"dataGaName":313,"dataGaLocation":298},"https://gitlab.com/users/sign_in/","sign in",[315,344,445,450,564,620],{"text":316,"config":317,"menu":319},"Plateforme",{"dataNavLevelOne":318},"platform",{"type":320,"columns":321},"cards",[322,328,336],{"title":316,"description":323,"link":324},"La plateforme d'orchestration intelligente pour le DevSecOps",{"text":325,"config":326},"Explorer notre plateforme",{"href":327,"dataGaName":318,"dataGaLocation":298},"/fr-fr/platform/",{"title":329,"description":330,"link":331},"GitLab Duo Agent Platform","L'IA agentique pour l'ensemble du cycle de développement logiciel",{"text":332,"config":333},"Découvrir GitLab Duo",{"href":334,"dataGaName":335,"dataGaLocation":298},"/fr-fr/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":337,"description":338,"link":339},"Pourquoi GitLab ?","Découvrez les principales raisons pour lesquelles les entreprises choisissent GitLab",{"text":340,"config":341},"En savoir plus",{"href":342,"dataGaName":343,"dataGaLocation":298},"/fr-fr/why-gitlab/","why gitlab",{"text":345,"left":279,"config":346,"menu":348},"Produit",{"dataNavLevelOne":347},"solutions",{"type":349,"link":350,"columns":354,"feature":424},"lists",{"text":351,"config":352},"Voir toutes les solutions",{"href":353,"dataGaName":347,"dataGaLocation":298},"/fr-fr/solutions/",[355,379,402],{"title":356,"description":357,"link":358,"items":363},"Automatisation","CI/CD et automatisation pour accélérer le déploiement",{"config":359},{"icon":360,"href":361,"dataGaName":362,"dataGaLocation":298},"AutomatedCodeAlt","/fr-fr/solutions/delivery-automation/","automated software delivery",[364,367,370,375],{"text":288,"config":365},{"href":366,"dataGaLocation":298,"dataGaName":288},"/fr-fr/solutions/continuous-integration/",{"text":329,"config":368},{"href":334,"dataGaLocation":298,"dataGaName":369},"gitlab duo agent platform - product menu",{"text":371,"config":372},"Gestion du code source",{"href":373,"dataGaLocation":298,"dataGaName":374},"/fr-fr/solutions/source-code-management/","Source Code Management",{"text":376,"config":377},"Livraison de logiciels automatisée",{"href":361,"dataGaLocation":298,"dataGaName":378},"Automated software delivery",{"title":380,"description":381,"link":382,"items":387},"Sécurité","Livrez du code plus rapidement sans compromettre la sécurité",{"config":383},{"href":384,"dataGaName":385,"dataGaLocation":298,"icon":386},"/fr-fr/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[388,392,397],{"text":389,"config":390},"Tests de sécurité des applications",{"href":384,"dataGaName":391,"dataGaLocation":298},"Application security testing",{"text":393,"config":394},"Sécurité de la chaîne d'approvisionnement logicielle",{"href":395,"dataGaLocation":298,"dataGaName":396},"/fr-fr/solutions/supply-chain/","Software supply chain security",{"text":398,"config":399},"Conformité logicielle",{"href":400,"dataGaName":401,"dataGaLocation":298},"/fr-fr/solutions/software-compliance/","software compliance",{"title":403,"link":404,"items":409},"Mesures",{"config":405},{"icon":406,"href":407,"dataGaName":408,"dataGaLocation":298},"DigitalTransformation","/fr-fr/solutions/visibility-measurement/","visibility and measurement",[410,414,419],{"text":411,"config":412},"Visibilité et mesures",{"href":407,"dataGaLocation":298,"dataGaName":413},"Visibility and Measurement",{"text":415,"config":416},"Gestion de la chaîne de valeur",{"href":417,"dataGaLocation":298,"dataGaName":418},"/fr-fr/solutions/value-stream-management/","Value Stream Management",{"text":420,"config":421},"Analyses et informations",{"href":422,"dataGaLocation":298,"dataGaName":423},"/fr-fr/solutions/analytics-and-insights/","Analytics and insights",{"title":425,"type":349,"items":426},"GitLab",[427,433,439],{"text":428,"config":429},"Entreprises",{"icon":430,"href":431,"dataGaLocation":298,"dataGaName":432},"Building","/fr-fr/enterprise/","enterprise",{"text":434,"config":435},"Pour les PME",{"icon":436,"href":437,"dataGaLocation":298,"dataGaName":438},"Work","/fr-fr/small-business/","small business",{"text":440,"config":441},"Pour le secteur public",{"icon":442,"href":443,"dataGaLocation":298,"dataGaName":444},"Organization","/fr-fr/solutions/public-sector/","public sector",{"text":446,"config":447},"Tarifs",{"href":448,"dataGaName":449,"dataGaLocation":298,"dataNavLevelOne":449},"/fr-fr/pricing/","pricing",{"text":451,"config":452,"menu":454},"Ressources",{"dataNavLevelOne":453},"resources",{"type":349,"link":455,"columns":459,"feature":553},{"text":456,"config":457},"Afficher toutes les ressources",{"href":458,"dataGaName":453,"dataGaLocation":298},"/fr-fr/resources/",[460,493,520],{"title":461,"items":462},"Premiers pas",[463,468,473,478,483,488],{"text":464,"config":465},"Installation",{"href":466,"dataGaName":467,"dataGaLocation":298},"/fr-fr/install/","install",{"text":469,"config":470},"Guides de démarrage",{"href":471,"dataGaName":472,"dataGaLocation":298},"/fr-fr/get-started/","quick setup checklists",{"text":474,"config":475},"Apprentissage",{"href":476,"dataGaLocation":298,"dataGaName":477},"https://university.gitlab.com/","learn",{"text":479,"config":480},"Documentation",{"href":481,"dataGaName":482,"dataGaLocation":298},"https://docs.gitlab.com/","product documentation",{"text":484,"config":485},"Vidéos sur les bonnes pratiques",{"href":486,"dataGaName":487,"dataGaLocation":298},"/fr-fr/getting-started-videos/","best practice videos",{"text":489,"config":490},"Intégrations",{"href":491,"dataGaName":492,"dataGaLocation":298},"/fr-fr/integrations/","integrations",{"title":494,"items":495},"Découvrir",[496,501,506,511,515],{"text":497,"config":498},"Témoignages clients",{"href":499,"dataGaName":500,"dataGaLocation":298},"/fr-fr/customers/","customer success stories",{"text":502,"config":503},"Blog",{"href":504,"dataGaName":505,"dataGaLocation":298},"/fr-fr/blog/","blog",{"text":507,"config":508},"Demo Hub",{"href":509,"dataGaName":510,"dataGaLocation":298},"/fr-fr/demo-hub/","demo hub",{"text":512,"config":513},"The Source",{"href":514,"dataGaName":505,"dataGaLocation":298},"/fr-fr/the-source/",{"text":516,"config":517},"Travail à distance",{"href":518,"dataGaName":519,"dataGaLocation":298},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":521,"items":522},"Connecter",[523,528,533,538,543,548],{"text":524,"config":525},"Services GitLab",{"href":526,"dataGaName":527,"dataGaLocation":298},"/fr-fr/services/","services",{"text":529,"config":530},"Contribuer",{"href":531,"dataGaName":532,"dataGaLocation":298},"https://contributors.gitlab.com","contribute",{"text":534,"config":535},"Communauté",{"href":536,"dataGaName":537,"dataGaLocation":298},"/community/","community",{"text":539,"config":540},"Forum",{"href":541,"dataGaName":542,"dataGaLocation":298},"https://forum.gitlab.com/","forum",{"text":544,"config":545},"Événements",{"href":546,"dataGaName":547,"dataGaLocation":298},"/events/","events",{"text":549,"config":550},"Partenaires",{"href":551,"dataGaName":552,"dataGaLocation":298},"/fr-fr/partners/","partners",{"config":554,"title":557,"text":558,"link":559},{"background":555,"textColor":556},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","Nouveautés de GitLab","Découvrez les dernières fonctionnalités et améliorations.",{"text":560,"config":561},"Lire les articles les plus récents",{"href":562,"dataGaName":563,"dataGaLocation":298},"/fr-fr/whats-new/","whats new",{"text":565,"config":566,"menu":568},"Société",{"dataNavLevelOne":567},"company",{"type":349,"columns":569},[570],{"items":571},[572,577,583,585,590,595,600,605,610,615],{"text":573,"config":574},"À propos",{"href":575,"dataGaName":576,"dataGaLocation":298},"/fr-fr/company/","about",{"text":578,"config":579,"footerGa":582},"Carrières",{"href":580,"dataGaName":581,"dataGaLocation":298},"/jobs/","jobs",{"dataGaName":581},{"text":544,"config":584},{"href":546,"dataGaName":547,"dataGaLocation":298},{"text":586,"config":587},"Leadership",{"href":588,"dataGaName":589,"dataGaLocation":298},"/company/team/e-group/","leadership",{"text":591,"config":592},"Manuel",{"href":593,"dataGaName":594,"dataGaLocation":298},"https://handbook.gitlab.com/","handbook",{"text":596,"config":597},"Relations avec les investisseurs",{"href":598,"dataGaName":599,"dataGaLocation":298},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":601,"config":602},"Trust Center",{"href":603,"dataGaName":604,"dataGaLocation":298},"/fr-fr/security/","trust center",{"text":606,"config":607},"Centre pour la transparence de l'IA",{"href":608,"dataGaName":609,"dataGaLocation":298},"/fr-fr/ai-transparency-center/","ai transparency center",{"text":611,"config":612},"Newsletter",{"href":613,"dataGaName":614,"dataGaLocation":298},"/company/contact/#contact-forms","newsletter",{"text":616,"config":617},"Presse",{"href":618,"dataGaName":619,"dataGaLocation":298},"/press/","press",{"text":621,"config":622,"menu":623},"Nous contacter",{"dataNavLevelOne":567},{"type":349,"columns":624},[625],{"items":626},[627,632,637],{"text":628,"config":629},"Contacter l'équipe commerciale",{"href":630,"dataGaName":631,"dataGaLocation":298},"/fr-fr/sales/","talk to sales",{"text":633,"config":634},"Assistance GitLab",{"href":635,"dataGaName":636,"dataGaLocation":298},"https://support.gitlab.com/hc/en-us","support portal",{"text":638,"config":639},"Portail clients GitLab",{"href":640,"dataGaName":641,"dataGaLocation":298},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":643,"login":644,"suggestions":651},"Fermer",{"text":645,"link":646},"Pour rechercher des dépôts et des projets, connectez-vous à",{"text":647,"config":648},"GitLab.com",{"href":312,"dataGaName":649,"dataGaLocation":650},"search login","search",{"text":652,"default":653},"Suggestions",[654,657,662,664,669,674],{"text":329,"config":655},{"href":334,"dataGaName":656,"dataGaLocation":650},"GitLab Duo Agent Platform",{"text":658,"config":659},"Suggestions de code (IA)",{"href":660,"dataGaName":661,"dataGaLocation":650},"/fr-fr/solutions/code-suggestions/","Code Suggestions (AI)",{"text":288,"config":663},{"href":366,"dataGaName":288,"dataGaLocation":650},{"text":665,"config":666},"GitLab sur AWS",{"href":667,"dataGaName":668,"dataGaLocation":650},"/fr-fr/partners/technology-partners/aws/","GitLab on AWS",{"text":670,"config":671},"GitLab sur Google Cloud",{"href":672,"dataGaName":673,"dataGaLocation":650},"/fr-fr/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":675,"config":676},"Pourquoi utiliser GitLab ?",{"href":342,"dataGaName":677,"dataGaLocation":650},"Why GitLab?",{"freeTrial":679,"mobileIcon":684,"desktopIcon":689,"secondaryButton":692},{"text":680,"config":681},"Commencer votre essai gratuit",{"href":682,"dataGaName":303,"dataGaLocation":683},"https://gitlab.com/-/trials/new/","nav",{"altText":685,"config":686},"Icône GitLab",{"src":687,"dataGaName":688,"dataGaLocation":683},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":685,"config":690},{"src":691,"dataGaName":688,"dataGaLocation":683},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":693,"config":694},"Commencer",{"href":695,"dataGaName":696,"dataGaLocation":683},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr/get-started/","get started",{"freeTrial":698,"mobileIcon":702,"desktopIcon":704},{"text":699,"config":700},"En savoir plus sur GitLab Duo",{"href":334,"dataGaName":701,"dataGaLocation":683},"gitlab duo",{"altText":685,"config":703},{"src":687,"dataGaName":688,"dataGaLocation":683},{"altText":685,"config":705},{"src":691,"dataGaName":688,"dataGaLocation":683},{"button":707,"mobileIcon":712,"desktopIcon":714},{"text":708,"config":709},"/switch",{"href":710,"dataGaName":711,"dataGaLocation":683},"#contact","switch",{"altText":685,"config":713},{"src":687,"dataGaName":688,"dataGaLocation":683},{"altText":685,"config":715},{"src":716,"dataGaName":688,"dataGaLocation":683},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":718,"mobileIcon":723,"desktopIcon":725},{"text":719,"config":720},"Retour aux tarifs",{"href":448,"dataGaName":721,"dataGaLocation":683,"icon":722},"back to pricing","GoBack",{"altText":685,"config":724},{"src":687,"dataGaName":688,"dataGaLocation":683},{"altText":685,"config":726},{"src":691,"dataGaName":688,"dataGaLocation":683},{"title":728,"button":729,"config":733},"GitLab Orbit est arrivé : la couche de contexte pour les agents d'IA.",{"text":340,"config":730},{"href":731,"dataGaName":732,"dataGaLocation":298},"/fr-fr/gitlab-orbit/","orbit",{"layout":734,"disabled":276},"release",{"data":736},{"text":737,"source":738,"edit":744,"contribute":749,"config":753,"items":758,"minimal":966},"Git est une marque déposée de Software Freedom Conservancy et notre utilisation de « GitLab » est sous licence.",{"text":739,"config":740},"Afficher le code source de la page",{"href":741,"dataGaName":742,"dataGaLocation":743},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":745,"config":746},"Modifier cette page",{"href":747,"dataGaName":748,"dataGaLocation":743},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":529,"config":750},{"href":751,"dataGaName":752,"dataGaLocation":743},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":754,"facebook":755,"youtube":756,"linkedin":757},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[759,805,858,901,933],{"title":446,"links":760,"subMenu":775},[761,765,770],{"text":762,"config":763},"Voir les forfaits",{"href":448,"dataGaName":764,"dataGaLocation":743},"view plans",{"text":766,"config":767},"GitLab Premium",{"href":768,"dataGaName":769,"dataGaLocation":743},"/fr-fr/pricing/premium/","why premium",{"text":771,"config":772},"GitLab Ultimate",{"href":773,"dataGaName":774,"dataGaLocation":743},"/fr-fr/pricing/ultimate/","why ultimate",[776],{"title":621,"links":777},[778,780,782,785,790,795,800],{"text":628,"config":779},{"href":630,"dataGaName":308,"dataGaLocation":743},{"text":633,"config":781},{"href":635,"dataGaName":636,"dataGaLocation":743},{"text":783,"config":784},"Portail clients",{"href":640,"dataGaName":641,"dataGaLocation":743},{"text":786,"config":787},"Statut",{"href":788,"dataGaName":789,"dataGaLocation":743},"https://status.gitlab.com/","status",{"text":791,"config":792},"Conditions d'utilisation",{"href":793,"dataGaName":794,"dataGaLocation":743},"/terms/","terms of use",{"text":796,"config":797},"Politique de confidentialité",{"href":798,"dataGaName":799,"dataGaLocation":743},"/fr-fr/privacy/","privacy statement",{"text":801,"config":802},"Gestion des cookies",{"dataGaName":803,"dataGaLocation":743,"id":804,"isOneTrustButton":279},"cookie preferences","ot-sdk-btn",{"title":345,"links":806,"subMenu":815},[807,811],{"text":808,"config":809},"Plateforme DevSecOps",{"href":327,"dataGaName":810,"dataGaLocation":743},"devsecops platform",{"text":812,"config":813},"Développement assisté par l'IA",{"href":334,"dataGaName":814,"dataGaLocation":743},"ai-assisted development",[816],{"title":817,"links":818},"Thèmes",[819,823,828,833,838,843,848,853],{"text":288,"config":820},{"href":821,"dataGaName":822,"dataGaLocation":743},"/fr-fr/topics/ci-cd/","cicd",{"text":824,"config":825},"GitOps",{"href":826,"dataGaName":827,"dataGaLocation":743},"/fr-fr/topics/gitops/","gitops",{"text":829,"config":830},"DevOps",{"href":831,"dataGaName":832,"dataGaLocation":743},"/fr-fr/topics/devops/","devops",{"text":834,"config":835},"Contrôle de version",{"href":836,"dataGaName":837,"dataGaLocation":743},"/fr-fr/topics/version-control/","version control",{"text":839,"config":840},"DevSecOps",{"href":841,"dataGaName":842,"dataGaLocation":743},"/fr-fr/topics/devsecops/","devsecops",{"text":844,"config":845},"Cloud-native",{"href":846,"dataGaName":847,"dataGaLocation":743},"/fr-fr/topics/cloud-native/","cloud native",{"text":849,"config":850},"IA pour la programmation",{"href":851,"dataGaName":852,"dataGaLocation":743},"/fr-fr/topics/devops/ai-for-coding/","ai for coding",{"text":854,"config":855},"IA agentique",{"href":856,"dataGaName":857,"dataGaLocation":743},"/fr-fr/topics/agentic-ai/","agentic ai",{"title":859,"links":860},"Solutions",[861,864,866,871,874,877,880,883,885,888,891,896],{"text":389,"config":862},{"href":384,"dataGaName":863,"dataGaLocation":743},"Application Security Testing",{"text":376,"config":865},{"href":361,"dataGaName":362,"dataGaLocation":743},{"text":867,"config":868},"Développement Agile",{"href":869,"dataGaName":870,"dataGaLocation":743},"/fr-fr/solutions/agile-delivery/","agile delivery",{"text":371,"config":872},{"href":373,"dataGaName":873,"dataGaLocation":743},"source code management",{"text":288,"config":875},{"href":366,"dataGaName":876,"dataGaLocation":743},"continuous integration & delivery",{"text":415,"config":878},{"href":417,"dataGaName":879,"dataGaLocation":743},"value stream management",{"text":824,"config":881},{"href":882,"dataGaName":827,"dataGaLocation":743},"/fr-fr/solutions/gitops/",{"text":428,"config":884},{"href":431,"dataGaName":432,"dataGaLocation":743},{"text":886,"config":887},"PME",{"href":437,"dataGaName":438,"dataGaLocation":743},{"text":889,"config":890},"Secteur public",{"href":443,"dataGaName":444,"dataGaLocation":743},{"text":892,"config":893},"Éducation",{"href":894,"dataGaName":895,"dataGaLocation":743},"/fr-fr/solutions/education/","education",{"text":897,"config":898},"Services financiers",{"href":899,"dataGaName":900,"dataGaLocation":743},"/fr-fr/solutions/finance/","financial services",{"title":451,"links":902},[903,905,907,909,912,914,917,919,921,923,925,927,929,931],{"text":464,"config":904},{"href":466,"dataGaName":467,"dataGaLocation":743},{"text":469,"config":906},{"href":471,"dataGaName":472,"dataGaLocation":743},{"text":474,"config":908},{"href":476,"dataGaName":477,"dataGaLocation":743},{"text":479,"config":910},{"href":481,"dataGaName":911,"dataGaLocation":743},"docs",{"text":502,"config":913},{"href":504,"dataGaName":505,"dataGaLocation":743},{"text":915,"config":916},"Nouveautés",{"href":562,"dataGaName":563,"dataGaLocation":743},{"text":497,"config":918},{"href":499,"dataGaName":500,"dataGaLocation":743},{"text":516,"config":920},{"href":518,"dataGaName":519,"dataGaLocation":743},{"text":524,"config":922},{"href":526,"dataGaName":527,"dataGaLocation":743},{"text":529,"config":924},{"href":531,"dataGaName":532,"dataGaLocation":743},{"text":534,"config":926},{"href":536,"dataGaName":537,"dataGaLocation":743},{"text":539,"config":928},{"href":541,"dataGaName":542,"dataGaLocation":743},{"text":544,"config":930},{"href":546,"dataGaName":547,"dataGaLocation":743},{"text":549,"config":932},{"href":551,"dataGaName":552,"dataGaLocation":743},{"title":565,"links":934},[935,937,939,941,943,945,950,955,957,959,961],{"text":573,"config":936},{"href":575,"dataGaName":567,"dataGaLocation":743},{"text":578,"config":938},{"href":580,"dataGaName":581,"dataGaLocation":743},{"text":586,"config":940},{"href":588,"dataGaName":589,"dataGaLocation":743},{"text":591,"config":942},{"href":593,"dataGaName":594,"dataGaLocation":743},{"text":596,"config":944},{"href":598,"dataGaName":599,"dataGaLocation":743},{"text":946,"config":947},"Développement durable",{"href":948,"dataGaName":949,"dataGaLocation":743},"/sustainability/","Sustainability",{"text":951,"config":952},"Diversité, inclusion et appartenance (DIB)",{"href":953,"dataGaName":954,"dataGaLocation":743},"/fr-fr/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":601,"config":956},{"href":603,"dataGaName":604,"dataGaLocation":743},{"text":611,"config":958},{"href":613,"dataGaName":614,"dataGaLocation":743},{"text":616,"config":960},{"href":618,"dataGaName":619,"dataGaLocation":743},{"text":962,"config":963},"Déclaration de transparence sur l'esclavage moderne",{"href":964,"dataGaName":965,"dataGaLocation":743},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":967},[968,970,972],{"text":791,"config":969},{"href":793,"dataGaName":794,"dataGaLocation":743},{"text":801,"config":971},{"dataGaName":803,"dataGaLocation":743,"id":804,"isOneTrustButton":279},{"text":796,"config":973},{"href":798,"dataGaName":799,"dataGaLocation":743},[975],{"id":976,"title":7,"body":275,"config":977,"content":979,"description":275,"extension":983,"meta":984,"navigation":279,"path":985,"seo":986,"stem":987,"__hash__":988},"blogAuthors/en-us/blog/authors/sam-morris.yml",{"template":978},"BlogAuthor",{"name":7,"config":980},{"headshot":981,"ctfId":982},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749660148/Blog/Author%20Headshots/sam_morris.png","6JTrhUIqSCU30Y9KZOaan8","yml",{},"/en-us/blog/authors/sam-morris",{},"en-us/blog/authors/sam-morris","DfL241G6FQ5wNU6XYJLCEQLvnWBnyKnAi3wCPxOqBzE",[990,998,1006],{"title":991,"description":992,"heroImage":993,"category":271,"date":994,"authors":995,"slug":997,"externalUrl":275},"Green DevOps : l'importance de mesurer le bilan carbone de vos pipelines CI/CD","Les pipelines CI/CD ont un bilan carbone caché. Découvrez pourquoi il est crucial de le mesurer et comment vous lancer avec Eco CI et Carmen dans GitLab.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1765809212/noh0mdfn9o94ry9ykura.png","2026-07-22",[996],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":999,"description":1000,"heroImage":1001,"category":271,"date":1002,"authors":1003,"slug":1005,"externalUrl":275},"Comment mettre en place l'observabilité CI/CD à grande échelle","Ce guide pratique consacré à l'analyse des pipelines GitLab aide les utilisateurs de GitLab Self-Managed à obtenir des indicateurs opérationnels exploitables grâce à Prometheus et Grafana.","https://res.cloudinary.com/about-gitlab-com/image/upload/f_auto,q_auto,c_lfill/v1774465167/n5hlvrsrheadeccyr1oz.png","2026-05-18",[1004],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"title":1007,"description":1008,"heroImage":1009,"category":271,"date":1010,"authors":1011,"slug":1013,"externalUrl":275},"5 modèles de pipeline GitLab pour résoudre vos enjeux d'ingénierie","Découvrez comment faire évoluer votre approche CI/CD avec des modèles composables pour les monorepos, les microservices, les environnements et la gouvernance.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1772721753/frfsm1qfscwrmsyzj1qn.png","2026-05-06",[1012],"Omid Khan","5-ways-gitlab-pipeline-logic-solves-real-engineering-problems",{"promotions":1015},[1016,1030,1042,1054],{"id":1017,"categories":1018,"header":1020,"text":1021,"button":1022,"image":1027},"ai-modernization",[1019],"ai","L'IA tient-elle ses promesses à grande échelle ?","Le questionnaire ne prendra pas plus de 5 minutes.",{"text":1023,"config":1024},"Obtenez votre score de maturité IA",{"href":1025,"dataGaName":1026,"dataGaLocation":505},"/fr-fr/assessments/ai-modernization-assessment/","modernization assessment",{"config":1028},{"src":1029},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1031,"categories":1032,"header":1034,"text":1021,"button":1035,"image":1039},"devops-modernization",[1033,842],"product","Vous contentez-vous de gérer des outils ou de livrer des innovations ?",{"text":1036,"config":1037},"Obtenez votre score de maturité DevOps",{"href":1038,"dataGaName":1026,"dataGaLocation":505},"/fr-fr/assessments/devops-modernization-assessment/",{"config":1040},{"src":1041},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1043,"categories":1044,"header":1046,"text":1021,"button":1047,"image":1051},"security-modernization",[1045],"security","Faut-il sacrifier la rapidité pour garantir la sécurité ?",{"text":1048,"config":1049},"Obtenez votre score de maturité en matière de sécurité",{"href":1050,"dataGaName":1026,"dataGaLocation":505},"/fr-fr/assessments/security-modernization-assessment/",{"config":1052},{"src":1053},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1055,"paths":1056,"header":1059,"text":1060,"button":1061,"image":1066},"github-azure-migration",[1057,1058],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Votre équipe est-elle prête pour la migration de GitHub vers Azure ?","GitHub a déjà commencé sa migration vers Azure. Découvrez ce que cela signifie pour vous.",{"text":1062,"config":1063},"Découvrez les différences entre GitLab et GitHub",{"href":1064,"dataGaName":1065,"dataGaLocation":505},"/fr-fr/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1067},{"src":1041},{"header":1069,"blurb":1070,"button":1071,"secondaryButton":1075},"Commencez à développer plus rapidement dès aujourd'hui","Découvrez ce que votre équipe peut accomplir avec la plateforme d'orchestration intelligente pour le DevSecOps.\n",{"text":300,"config":1072},{"href":1073,"dataGaName":303,"dataGaLocation":1074},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/fr-fr/","feature",{"text":628,"config":1076},{"href":630,"dataGaName":308,"dataGaLocation":1074},1786803764025]