[{"data":1,"prerenderedAt":3552},["ShallowReactive",2],{"/fr-fr/blog/how-to-build-ci-cd-observability-at-scale":3,"navigation-fr-fr":2779,"banner-fr-fr":3200,"footer-fr-fr":3209,"blog-post-authors-fr-fr-Paul Meresanu":3450,"blog-related-posts-fr-fr-how-to-build-ci-cd-observability-at-scale":3465,"blog-promotions-fr-fr":3490,"next-steps-fr-fr":3543},{"id":4,"title":5,"authors":6,"body":8,"category":2758,"date":2759,"description":2760,"extension":2761,"externalUrl":2762,"featured":2763,"heroImage":2764,"meta":2765,"navigation":188,"path":2766,"seo":2767,"slug":2771,"stem":2772,"tags":2773,"template":2777,"updatedDate":2762,"__hash__":2778},"blogPosts/fr-fr/blog/how-to-build-ci-cd-observability-at-scale.md","Comment mettre en place l'observabilité CI/CD à grande échelle",[7],"Paul Meresanu",{"type":9,"value":10,"toc":2731},"minimark",[11,20,23,26,29,34,37,59,63,66,92,95,102,105,119,124,142,146,149,154,239,243,703,707,943,947,1246,1250,1257,1263,1702,1706,1709,1912,1916,1961,1965,1969,2108,2112,2212,2216,2356,2360,2364,2475,2479,2531,2535,2539,2542,2680,2684,2687,2710,2714,2717,2727],[12,13,14,15,19],"p",{},"L'optimisation du CI/CD commence par la visibilité. Pour bâtir une plateforme DevOps performante à l'échelle de l'entreprise, il ",[16,17,18],"strong",{},"est essentiel"," de comprendre les performances des pipelines et les schémas d'exécution des jobs, ainsi que de disposer d'indicateurs opérationnels quantifiables, en particulier pour les organisations qui exploitent des instances GitLab Self-Managed.",[12,21,22],{},"Afin d'aider les clients GitLab à maximiser leur investissement dans la plateforme, nous avons développé la solution GitLab CI/CD Observability dans le cadre de notre programme Platform Excellence. Celle-ci transforme les indicateurs bruts des pipelines en informations opérationnelles exploitables.",[12,24,25],{},"Un acteur majeur du secteur des services financiers s'est associé au Customer Success Architect GitLab pour gagner en visibilité sur son déploiement GitLab Self-Managed. Ensemble, nous avons mis en œuvre une solution d'observabilité conteneurisée combinant l'outil open source gitlab-ci-pipelines-exporter avec une infrastructure Prometheus et Grafana de niveau entreprise.",[12,27,28],{},"Dans cet article, vous découvrirez les défis rencontrés par cette organisation dans la gestion de ses pipelines à grande échelle, ainsi que la manière dont la solution GitLab CI/CD Observability y a répondu grâce à une mise en œuvre pratique de bout en bout.",[30,31,33],"h2",{"id":32},"le-défi-mesurer-les-performances-cicd","Le défi : mesurer les performances CI/CD",[12,35,36],{},"Avant de mettre en place une solution d'observabilité, il est essentiel de définir vos paramètres de mesure :",[38,39,40,47,53],"ul",{},[41,42,43,46],"li",{},[16,44,45],{},"Quels indicateurs sont importants ?"," La durée des pipelines, les taux de réussite des jobs, les temps d'attente, l'utilisation des runners ?",[41,48,49,52],{},[16,50,51],{},"Qui a besoin de cette visibilité ?"," Les développeurs, les ingénieurs DevOps, les équipes plateforme, la direction ?",[41,54,55,58],{},[16,56,57],{},"Quelles décisions ces paramètres permettront-ils d'éclairer ?"," Les investissements dans l'infrastructure, la correction des goulots d'étranglement, la planification des ressources ?",[30,60,62],{"id":61},"architecture-de-la-solution-un-ensemble-complet-de-tableaux-de-bord-pour-lobservabilité","Architecture de la solution : un ensemble complet de tableaux de bord pour l'observabilité",[12,64,65],{},"Une fois déployée, la pile d'observabilité fournit un ensemble de tableaux de bord Grafana avec une visibilité en temps réel et historique sur votre plateforme CI/CD. Un déploiement type comprend les éléments suivants :",[38,67,68,74,80,86],{},[41,69,70,73],{},[16,71,72],{},"Tableau de bord d'aperçu des pipelines :"," une vue globale avec le nombre total d'exécutions de pipelines, les taux de réussite et d'échec dans le temps (sous forme de graphiques à barres empilées ou de séries temporelles) et les tendances de durée moyenne des pipelines. Les panneaux utilisent des indicateurs de statut par code couleur (vert pour la réussite, rouge pour l'échec, orange pour les annulations) afin que les équipes plateforme puissent repérer les problèmes en un coup d'œil.",[41,75,76,79],{},[16,77,78],{},"Tableau de bord des performances des jobs :"," des panneaux détaillés montrent la distribution des durées de chaque job (histogramme), le top 10 des jobs les plus lents par durée moyenne et des cartes thermiques des échecs de jobs par projet et par étape. C'est ici que les équipes identifient les jobs qui constituent des goulots d'étranglement à optimiser.",[41,81,82,85],{},[16,83,84],{},"Tableau de bord des runners et de l'infrastructure :"," combine les indicateurs système de Node Exporter (processeur, mémoire, disque) avec les données de temps d'attente des pipelines pour corréler la saturation de l'infrastructure avec les temps d'attente des pipelines. Cet outil est précieux pour les décisions de planification des ressources, comme le dimensionnement des pools de runners ou la montée en gamme des instances.",[41,87,88,91],{},[16,89,90],{},"Tableau de bord de la fréquence de déploiement :"," suit le nombre de déploiements et leur durée au fil du temps par environnement, en alignement avec les métriques DORA. Il aide les responsables d'ingénierie à évaluer le débit de livraison et la dérive des environnements (commits en retard par rapport à la branche principale).",[12,93,94],{},"Chaque tableau de bord est provisionné automatiquement via le provisionnement par fichier de Grafana, ce qui garantit un déploiement cohérent d'un environnement à l'autre. Les tableaux de bord peuvent être personnalisés davantage grâce aux variables Grafana pour filtrer par projet, branche de référence ou plage temporelle.",[12,96,97],{},[98,99],"img",{"alt":100,"src":101},"Architecture de la solution","https://res.cloudinary.com/about-gitlab-com/image/upload/v1777382608/Blog/Imported/blog-building-ci-cd-observability-stack-for-gitlab-self-managed/image1.png",[12,103,104],{},"La solution nécessite deux exporters :",[38,106,107,113],{},[41,108,109,112],{},[16,110,111],{},"Pipeline Exporter :"," collecte les indicateurs CI/CD via l'API GitLab (durée des pipelines, statut des jobs, déploiements)",[41,114,115,118],{},[16,116,117],{},"Node Exporter :"," collecte les indicateurs système (processeur, mémoire, disque) pour la corrélation avec l'infrastructure",[12,120,121],{},[16,122,123],{},"Prérequis :",[38,125,126,129,135],{},[41,127,128],{},"GitLab Self-Managed version 18.1+",[41,130,131,134],{},[16,132,133],{},"Plateforme d'orchestration de conteneurs :"," un cluster Kubernetes (recommandé pour les déploiements d'entreprise) ou un environnement d'exécution de conteneur tel que Docker/Podman pour les environnements de moindre envergure ou les études de faisabilité. Le guide de déploiement principal ci-dessous cible Kubernetes ; une alternative Docker Compose est fournie en annexe pour les tests et évaluations dans un environnement local",[41,136,137,138,141],{},"Jeton d'accès personnel GitLab (portée ",[16,139,140],{},"read_api",")",[30,143,145],{"id":144},"déploiement-kubernetes-recommandé","Déploiement Kubernetes (recommandé)",[12,147,148],{},"Pour les environnements d'entreprise, déployez chaque composant sous forme de déploiement distinct au sein d'un espace de nommage dédié. Cette approche s'intègre à l'infrastructure de cluster existante, à la gestion des secrets et aux politiques réseau.",[150,151,153],"h3",{"id":152},"_1-créer-lespace-de-nommage-et-le-secret","1. Créer l'espace de nommage et le secret",[155,156,161],"pre",{"className":157,"code":158,"language":159,"meta":160,"style":160},"language-bash shiki shiki-themes github-light","kubectl create namespace gitlab-observability\n\n# Create the GitLab token secret (see Secrets Management section below\n# for enterprise-grade approaches using external secret operators)\nkubectl create secret generic gitlab-token \\\n  --from-literal=token=glpat-xxxxxxxxxxxx \\\n  -n gitlab-observability\n","bash","",[162,163,164,183,190,197,203,223,231],"code",{"__ignoreMap":160},[165,166,169,173,177,180],"span",{"class":167,"line":168},"line",1,[165,170,172],{"class":171},"s7eDp","kubectl",[165,174,176],{"class":175},"sYBdl"," create",[165,178,179],{"class":175}," namespace",[165,181,182],{"class":175}," gitlab-observability\n",[165,184,186],{"class":167,"line":185},2,[165,187,189],{"emptyLinePlaceholder":188},true,"\n",[165,191,193],{"class":167,"line":192},3,[165,194,196],{"class":195},"sAwPA","# Create the GitLab token secret (see Secrets Management section below\n",[165,198,200],{"class":167,"line":199},4,[165,201,202],{"class":195},"# for enterprise-grade approaches using external secret operators)\n",[165,204,206,208,210,213,216,219],{"class":167,"line":205},5,[165,207,172],{"class":171},[165,209,176],{"class":175},[165,211,212],{"class":175}," secret",[165,214,215],{"class":175}," generic",[165,217,218],{"class":175}," gitlab-token",[165,220,222],{"class":221},"sYu0t"," \\\n",[165,224,226,229],{"class":167,"line":225},6,[165,227,228],{"class":221},"  --from-literal=token=glpat-xxxxxxxxxxxx",[165,230,222],{"class":221},[165,232,234,237],{"class":167,"line":233},7,[165,235,236],{"class":221},"  -n",[165,238,182],{"class":175},[150,240,242],{"id":241},"_2-déployer-le-pipeline-exporter","2. Déployer le Pipeline Exporter",[155,244,248],{"className":245,"code":246,"language":247,"meta":160,"style":160},"language-yaml shiki shiki-themes github-light","# exporter-deployment.yaml\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: gitlab-ci-pipelines-exporter\n  namespace: gitlab-observability\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: gitlab-ci-pipelines-exporter\n  template:\n    metadata:\n      labels:\n        app: gitlab-ci-pipelines-exporter\n    spec:\n      containers:\n        - name: exporter\n          image: mvisonneau/gitlab-ci-pipelines-exporter:latest\n          ports:\n            - containerPort: 8080\n          env:\n            - name: GCPE_GITLAB_TOKEN\n              valueFrom:\n                secretKeyRef:\n                  name: gitlab-token\n                  key: token\n            - name: GCPE_CONFIG\n              value: /etc/gcpe/config.yml\n          volumeMounts:\n            - name: config\n              mountPath: /etc/gcpe\n      volumes:\n        - name: config\n          configMap:\n            name: gcpe-config\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: gitlab-ci-pipelines-exporter\n  namespace: gitlab-observability\nspec:\n  selector:\n    app: gitlab-ci-pipelines-exporter\n  ports:\n    - port: 8080\n      targetPort: 8080\n","yaml",[162,249,250,255,268,278,286,296,306,313,324,332,340,350,358,366,374,384,392,400,414,425,433,447,455,467,475,483,494,505,517,528,536,548,559,567,578,586,597,603,613,623,630,639,648,655,662,672,680,693],{"__ignoreMap":160},[165,251,252],{"class":167,"line":168},[165,253,254],{"class":195},"# exporter-deployment.yaml\n",[165,256,257,261,265],{"class":167,"line":185},[165,258,260],{"class":259},"shJU0","apiVersion",[165,262,264],{"class":263},"sgsFI",": ",[165,266,267],{"class":175},"apps/v1\n",[165,269,270,273,275],{"class":167,"line":192},[165,271,272],{"class":259},"kind",[165,274,264],{"class":263},[165,276,277],{"class":175},"Deployment\n",[165,279,280,283],{"class":167,"line":199},[165,281,282],{"class":259},"metadata",[165,284,285],{"class":263},":\n",[165,287,288,291,293],{"class":167,"line":205},[165,289,290],{"class":259},"  name",[165,292,264],{"class":263},[165,294,295],{"class":175},"gitlab-ci-pipelines-exporter\n",[165,297,298,301,303],{"class":167,"line":225},[165,299,300],{"class":259},"  namespace",[165,302,264],{"class":263},[165,304,305],{"class":175},"gitlab-observability\n",[165,307,308,311],{"class":167,"line":233},[165,309,310],{"class":259},"spec",[165,312,285],{"class":263},[165,314,316,319,321],{"class":167,"line":315},8,[165,317,318],{"class":259},"  replicas",[165,320,264],{"class":263},[165,322,323],{"class":221},"1\n",[165,325,327,330],{"class":167,"line":326},9,[165,328,329],{"class":259},"  selector",[165,331,285],{"class":263},[165,333,335,338],{"class":167,"line":334},10,[165,336,337],{"class":259},"    matchLabels",[165,339,285],{"class":263},[165,341,343,346,348],{"class":167,"line":342},11,[165,344,345],{"class":259},"      app",[165,347,264],{"class":263},[165,349,295],{"class":175},[165,351,353,356],{"class":167,"line":352},12,[165,354,355],{"class":259},"  template",[165,357,285],{"class":263},[165,359,361,364],{"class":167,"line":360},13,[165,362,363],{"class":259},"    metadata",[165,365,285],{"class":263},[165,367,369,372],{"class":167,"line":368},14,[165,370,371],{"class":259},"      labels",[165,373,285],{"class":263},[165,375,377,380,382],{"class":167,"line":376},15,[165,378,379],{"class":259},"        app",[165,381,264],{"class":263},[165,383,295],{"class":175},[165,385,387,390],{"class":167,"line":386},16,[165,388,389],{"class":259},"    spec",[165,391,285],{"class":263},[165,393,395,398],{"class":167,"line":394},17,[165,396,397],{"class":259},"      containers",[165,399,285],{"class":263},[165,401,403,406,409,411],{"class":167,"line":402},18,[165,404,405],{"class":263},"        - ",[165,407,408],{"class":259},"name",[165,410,264],{"class":263},[165,412,413],{"class":175},"exporter\n",[165,415,417,420,422],{"class":167,"line":416},19,[165,418,419],{"class":259},"          image",[165,421,264],{"class":263},[165,423,424],{"class":175},"mvisonneau/gitlab-ci-pipelines-exporter:latest\n",[165,426,428,431],{"class":167,"line":427},20,[165,429,430],{"class":259},"          ports",[165,432,285],{"class":263},[165,434,436,439,442,444],{"class":167,"line":435},21,[165,437,438],{"class":263},"            - ",[165,440,441],{"class":259},"containerPort",[165,443,264],{"class":263},[165,445,446],{"class":221},"8080\n",[165,448,450,453],{"class":167,"line":449},22,[165,451,452],{"class":259},"          env",[165,454,285],{"class":263},[165,456,458,460,462,464],{"class":167,"line":457},23,[165,459,438],{"class":263},[165,461,408],{"class":259},[165,463,264],{"class":263},[165,465,466],{"class":175},"GCPE_GITLAB_TOKEN\n",[165,468,470,473],{"class":167,"line":469},24,[165,471,472],{"class":259},"              valueFrom",[165,474,285],{"class":263},[165,476,478,481],{"class":167,"line":477},25,[165,479,480],{"class":259},"                secretKeyRef",[165,482,285],{"class":263},[165,484,486,489,491],{"class":167,"line":485},26,[165,487,488],{"class":259},"                  name",[165,490,264],{"class":263},[165,492,493],{"class":175},"gitlab-token\n",[165,495,497,500,502],{"class":167,"line":496},27,[165,498,499],{"class":259},"                  key",[165,501,264],{"class":263},[165,503,504],{"class":175},"token\n",[165,506,508,510,512,514],{"class":167,"line":507},28,[165,509,438],{"class":263},[165,511,408],{"class":259},[165,513,264],{"class":263},[165,515,516],{"class":175},"GCPE_CONFIG\n",[165,518,520,523,525],{"class":167,"line":519},29,[165,521,522],{"class":259},"              value",[165,524,264],{"class":263},[165,526,527],{"class":175},"/etc/gcpe/config.yml\n",[165,529,531,534],{"class":167,"line":530},30,[165,532,533],{"class":259},"          volumeMounts",[165,535,285],{"class":263},[165,537,539,541,543,545],{"class":167,"line":538},31,[165,540,438],{"class":263},[165,542,408],{"class":259},[165,544,264],{"class":263},[165,546,547],{"class":175},"config\n",[165,549,551,554,556],{"class":167,"line":550},32,[165,552,553],{"class":259},"              mountPath",[165,555,264],{"class":263},[165,557,558],{"class":175},"/etc/gcpe\n",[165,560,562,565],{"class":167,"line":561},33,[165,563,564],{"class":259},"      volumes",[165,566,285],{"class":263},[165,568,570,572,574,576],{"class":167,"line":569},34,[165,571,405],{"class":263},[165,573,408],{"class":259},[165,575,264],{"class":263},[165,577,547],{"class":175},[165,579,581,584],{"class":167,"line":580},35,[165,582,583],{"class":259},"          configMap",[165,585,285],{"class":263},[165,587,589,592,594],{"class":167,"line":588},36,[165,590,591],{"class":259},"            name",[165,593,264],{"class":263},[165,595,596],{"class":175},"gcpe-config\n",[165,598,600],{"class":167,"line":599},37,[165,601,602],{"class":171},"---\n",[165,604,606,608,610],{"class":167,"line":605},38,[165,607,260],{"class":259},[165,609,264],{"class":263},[165,611,612],{"class":175},"v1\n",[165,614,616,618,620],{"class":167,"line":615},39,[165,617,272],{"class":259},[165,619,264],{"class":263},[165,621,622],{"class":175},"Service\n",[165,624,626,628],{"class":167,"line":625},40,[165,627,282],{"class":259},[165,629,285],{"class":263},[165,631,633,635,637],{"class":167,"line":632},41,[165,634,290],{"class":259},[165,636,264],{"class":263},[165,638,295],{"class":175},[165,640,642,644,646],{"class":167,"line":641},42,[165,643,300],{"class":259},[165,645,264],{"class":263},[165,647,305],{"class":175},[165,649,651,653],{"class":167,"line":650},43,[165,652,310],{"class":259},[165,654,285],{"class":263},[165,656,658,660],{"class":167,"line":657},44,[165,659,329],{"class":259},[165,661,285],{"class":263},[165,663,665,668,670],{"class":167,"line":664},45,[165,666,667],{"class":259},"    app",[165,669,264],{"class":263},[165,671,295],{"class":175},[165,673,675,678],{"class":167,"line":674},46,[165,676,677],{"class":259},"  ports",[165,679,285],{"class":263},[165,681,683,686,689,691],{"class":167,"line":682},47,[165,684,685],{"class":263},"    - ",[165,687,688],{"class":259},"port",[165,690,264],{"class":263},[165,692,446],{"class":221},[165,694,696,699,701],{"class":167,"line":695},48,[165,697,698],{"class":259},"      targetPort",[165,700,264],{"class":263},[165,702,446],{"class":221},[150,704,706],{"id":705},"_3-déployer-node-exporter-daemonset","3. Déployer Node Exporter (DaemonSet)",[155,708,710],{"className":245,"code":709,"language":247,"meta":160,"style":160},"# node-exporter-daemonset.yaml\napiVersion: apps/v1\nkind: DaemonSet\nmetadata:\n  name: node-exporter\n  namespace: gitlab-observability\nspec:\n  selector:\n    matchLabels:\n      app: node-exporter\n  template:\n    metadata:\n      labels:\n        app: node-exporter\n    spec:\n      containers:\n        - name: node-exporter\n          image: prom/node-exporter:latest\n          ports:\n            - containerPort: 9100\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: node-exporter\n  namespace: gitlab-observability\nspec:\n  selector:\n    app: node-exporter\n  ports:\n    - port: 9100\n      targetPort: 9100\n",[162,711,712,717,725,734,740,749,757,763,769,775,783,789,795,801,809,815,821,831,840,846,857,861,869,877,883,891,899,905,911,919,925,935],{"__ignoreMap":160},[165,713,714],{"class":167,"line":168},[165,715,716],{"class":195},"# node-exporter-daemonset.yaml\n",[165,718,719,721,723],{"class":167,"line":185},[165,720,260],{"class":259},[165,722,264],{"class":263},[165,724,267],{"class":175},[165,726,727,729,731],{"class":167,"line":192},[165,728,272],{"class":259},[165,730,264],{"class":263},[165,732,733],{"class":175},"DaemonSet\n",[165,735,736,738],{"class":167,"line":199},[165,737,282],{"class":259},[165,739,285],{"class":263},[165,741,742,744,746],{"class":167,"line":205},[165,743,290],{"class":259},[165,745,264],{"class":263},[165,747,748],{"class":175},"node-exporter\n",[165,750,751,753,755],{"class":167,"line":225},[165,752,300],{"class":259},[165,754,264],{"class":263},[165,756,305],{"class":175},[165,758,759,761],{"class":167,"line":233},[165,760,310],{"class":259},[165,762,285],{"class":263},[165,764,765,767],{"class":167,"line":315},[165,766,329],{"class":259},[165,768,285],{"class":263},[165,770,771,773],{"class":167,"line":326},[165,772,337],{"class":259},[165,774,285],{"class":263},[165,776,777,779,781],{"class":167,"line":334},[165,778,345],{"class":259},[165,780,264],{"class":263},[165,782,748],{"class":175},[165,784,785,787],{"class":167,"line":342},[165,786,355],{"class":259},[165,788,285],{"class":263},[165,790,791,793],{"class":167,"line":352},[165,792,363],{"class":259},[165,794,285],{"class":263},[165,796,797,799],{"class":167,"line":360},[165,798,371],{"class":259},[165,800,285],{"class":263},[165,802,803,805,807],{"class":167,"line":368},[165,804,379],{"class":259},[165,806,264],{"class":263},[165,808,748],{"class":175},[165,810,811,813],{"class":167,"line":376},[165,812,389],{"class":259},[165,814,285],{"class":263},[165,816,817,819],{"class":167,"line":386},[165,818,397],{"class":259},[165,820,285],{"class":263},[165,822,823,825,827,829],{"class":167,"line":394},[165,824,405],{"class":263},[165,826,408],{"class":259},[165,828,264],{"class":263},[165,830,748],{"class":175},[165,832,833,835,837],{"class":167,"line":402},[165,834,419],{"class":259},[165,836,264],{"class":263},[165,838,839],{"class":175},"prom/node-exporter:latest\n",[165,841,842,844],{"class":167,"line":416},[165,843,430],{"class":259},[165,845,285],{"class":263},[165,847,848,850,852,854],{"class":167,"line":427},[165,849,438],{"class":263},[165,851,441],{"class":259},[165,853,264],{"class":263},[165,855,856],{"class":221},"9100\n",[165,858,859],{"class":167,"line":435},[165,860,602],{"class":171},[165,862,863,865,867],{"class":167,"line":449},[165,864,260],{"class":259},[165,866,264],{"class":263},[165,868,612],{"class":175},[165,870,871,873,875],{"class":167,"line":457},[165,872,272],{"class":259},[165,874,264],{"class":263},[165,876,622],{"class":175},[165,878,879,881],{"class":167,"line":469},[165,880,282],{"class":259},[165,882,285],{"class":263},[165,884,885,887,889],{"class":167,"line":477},[165,886,290],{"class":259},[165,888,264],{"class":263},[165,890,748],{"class":175},[165,892,893,895,897],{"class":167,"line":485},[165,894,300],{"class":259},[165,896,264],{"class":263},[165,898,305],{"class":175},[165,900,901,903],{"class":167,"line":496},[165,902,310],{"class":259},[165,904,285],{"class":263},[165,906,907,909],{"class":167,"line":507},[165,908,329],{"class":259},[165,910,285],{"class":263},[165,912,913,915,917],{"class":167,"line":519},[165,914,667],{"class":259},[165,916,264],{"class":263},[165,918,748],{"class":175},[165,920,921,923],{"class":167,"line":530},[165,922,677],{"class":259},[165,924,285],{"class":263},[165,926,927,929,931,933],{"class":167,"line":538},[165,928,685],{"class":263},[165,930,688],{"class":259},[165,932,264],{"class":263},[165,934,856],{"class":221},[165,936,937,939,941],{"class":167,"line":550},[165,938,698],{"class":259},[165,940,264],{"class":263},[165,942,856],{"class":221},[150,944,946],{"id":945},"_4-déployer-prometheus","4. Déployer Prometheus",[155,948,950],{"className":245,"code":949,"language":247,"meta":160,"style":160},"# prometheus-deployment.yaml\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: prometheus\n  namespace: gitlab-observability\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: prometheus\n  template:\n    metadata:\n      labels:\n        app: prometheus\n    spec:\n      containers:\n        - name: prometheus\n          image: prom/prometheus:latest\n          ports:\n            - containerPort: 9090\n          volumeMounts:\n            - name: config\n              mountPath: /etc/prometheus\n      volumes:\n        - name: config\n          configMap:\n            name: prometheus-config\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: prometheus\n  namespace: gitlab-observability\nspec:\n  selector:\n    app: prometheus\n  ports:\n    - port: 9090\n      targetPort: 9090\n",[162,951,952,957,965,973,979,988,996,1002,1010,1016,1022,1030,1036,1042,1048,1056,1062,1068,1078,1087,1093,1104,1110,1120,1129,1135,1145,1151,1160,1164,1172,1180,1186,1194,1202,1208,1214,1222,1228,1238],{"__ignoreMap":160},[165,953,954],{"class":167,"line":168},[165,955,956],{"class":195},"# prometheus-deployment.yaml\n",[165,958,959,961,963],{"class":167,"line":185},[165,960,260],{"class":259},[165,962,264],{"class":263},[165,964,267],{"class":175},[165,966,967,969,971],{"class":167,"line":192},[165,968,272],{"class":259},[165,970,264],{"class":263},[165,972,277],{"class":175},[165,974,975,977],{"class":167,"line":199},[165,976,282],{"class":259},[165,978,285],{"class":263},[165,980,981,983,985],{"class":167,"line":205},[165,982,290],{"class":259},[165,984,264],{"class":263},[165,986,987],{"class":175},"prometheus\n",[165,989,990,992,994],{"class":167,"line":225},[165,991,300],{"class":259},[165,993,264],{"class":263},[165,995,305],{"class":175},[165,997,998,1000],{"class":167,"line":233},[165,999,310],{"class":259},[165,1001,285],{"class":263},[165,1003,1004,1006,1008],{"class":167,"line":315},[165,1005,318],{"class":259},[165,1007,264],{"class":263},[165,1009,323],{"class":221},[165,1011,1012,1014],{"class":167,"line":326},[165,1013,329],{"class":259},[165,1015,285],{"class":263},[165,1017,1018,1020],{"class":167,"line":334},[165,1019,337],{"class":259},[165,1021,285],{"class":263},[165,1023,1024,1026,1028],{"class":167,"line":342},[165,1025,345],{"class":259},[165,1027,264],{"class":263},[165,1029,987],{"class":175},[165,1031,1032,1034],{"class":167,"line":352},[165,1033,355],{"class":259},[165,1035,285],{"class":263},[165,1037,1038,1040],{"class":167,"line":360},[165,1039,363],{"class":259},[165,1041,285],{"class":263},[165,1043,1044,1046],{"class":167,"line":368},[165,1045,371],{"class":259},[165,1047,285],{"class":263},[165,1049,1050,1052,1054],{"class":167,"line":376},[165,1051,379],{"class":259},[165,1053,264],{"class":263},[165,1055,987],{"class":175},[165,1057,1058,1060],{"class":167,"line":386},[165,1059,389],{"class":259},[165,1061,285],{"class":263},[165,1063,1064,1066],{"class":167,"line":394},[165,1065,397],{"class":259},[165,1067,285],{"class":263},[165,1069,1070,1072,1074,1076],{"class":167,"line":402},[165,1071,405],{"class":263},[165,1073,408],{"class":259},[165,1075,264],{"class":263},[165,1077,987],{"class":175},[165,1079,1080,1082,1084],{"class":167,"line":416},[165,1081,419],{"class":259},[165,1083,264],{"class":263},[165,1085,1086],{"class":175},"prom/prometheus:latest\n",[165,1088,1089,1091],{"class":167,"line":427},[165,1090,430],{"class":259},[165,1092,285],{"class":263},[165,1094,1095,1097,1099,1101],{"class":167,"line":435},[165,1096,438],{"class":263},[165,1098,441],{"class":259},[165,1100,264],{"class":263},[165,1102,1103],{"class":221},"9090\n",[165,1105,1106,1108],{"class":167,"line":449},[165,1107,533],{"class":259},[165,1109,285],{"class":263},[165,1111,1112,1114,1116,1118],{"class":167,"line":457},[165,1113,438],{"class":263},[165,1115,408],{"class":259},[165,1117,264],{"class":263},[165,1119,547],{"class":175},[165,1121,1122,1124,1126],{"class":167,"line":469},[165,1123,553],{"class":259},[165,1125,264],{"class":263},[165,1127,1128],{"class":175},"/etc/prometheus\n",[165,1130,1131,1133],{"class":167,"line":477},[165,1132,564],{"class":259},[165,1134,285],{"class":263},[165,1136,1137,1139,1141,1143],{"class":167,"line":485},[165,1138,405],{"class":263},[165,1140,408],{"class":259},[165,1142,264],{"class":263},[165,1144,547],{"class":175},[165,1146,1147,1149],{"class":167,"line":496},[165,1148,583],{"class":259},[165,1150,285],{"class":263},[165,1152,1153,1155,1157],{"class":167,"line":507},[165,1154,591],{"class":259},[165,1156,264],{"class":263},[165,1158,1159],{"class":175},"prometheus-config\n",[165,1161,1162],{"class":167,"line":519},[165,1163,602],{"class":171},[165,1165,1166,1168,1170],{"class":167,"line":530},[165,1167,260],{"class":259},[165,1169,264],{"class":263},[165,1171,612],{"class":175},[165,1173,1174,1176,1178],{"class":167,"line":538},[165,1175,272],{"class":259},[165,1177,264],{"class":263},[165,1179,622],{"class":175},[165,1181,1182,1184],{"class":167,"line":550},[165,1183,282],{"class":259},[165,1185,285],{"class":263},[165,1187,1188,1190,1192],{"class":167,"line":561},[165,1189,290],{"class":259},[165,1191,264],{"class":263},[165,1193,987],{"class":175},[165,1195,1196,1198,1200],{"class":167,"line":569},[165,1197,300],{"class":259},[165,1199,264],{"class":263},[165,1201,305],{"class":175},[165,1203,1204,1206],{"class":167,"line":580},[165,1205,310],{"class":259},[165,1207,285],{"class":263},[165,1209,1210,1212],{"class":167,"line":588},[165,1211,329],{"class":259},[165,1213,285],{"class":263},[165,1215,1216,1218,1220],{"class":167,"line":599},[165,1217,667],{"class":259},[165,1219,264],{"class":263},[165,1221,987],{"class":175},[165,1223,1224,1226],{"class":167,"line":605},[165,1225,677],{"class":259},[165,1227,285],{"class":263},[165,1229,1230,1232,1234,1236],{"class":167,"line":615},[165,1231,685],{"class":263},[165,1233,688],{"class":259},[165,1235,264],{"class":263},[165,1237,1103],{"class":221},[165,1239,1240,1242,1244],{"class":167,"line":625},[165,1241,698],{"class":259},[165,1243,264],{"class":263},[165,1245,1103],{"class":221},[150,1247,1249],{"id":1248},"_5-déployer-grafana","5. Déployer Grafana",[12,1251,1252,1253,1256],{},"Le déploiement Grafana ci-dessous démarre avec l'authentification désactivée (",[162,1254,1255],{},"GF_AUTH_ANONYMOUS_ENABLED: true",") pour faciliter la configuration initiale.",[12,1258,1259,1262],{},[16,1260,1261],{},"Ce paramètre permet à toute personne ayant accès au réseau de consulter l'ensemble des tableaux de bord sans s'authentifier."," Pour les déploiements en production, supprimez cette variable ou définissez-la sur « false » et configurez un fournisseur d'authentification approprié (LDAP, SAML/SSO ou OAuth) afin de restreindre l'accès aux utilisateurs autorisés.",[155,1264,1266],{"className":245,"code":1265,"language":247,"meta":160,"style":160},"# grafana-deployment.yaml\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: grafana\n  namespace: gitlab-observability\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: grafana\n  template:\n    metadata:\n      labels:\n        app: grafana\n    spec:\n      containers:\n        - name: grafana\n          image: grafana/grafana:10.0.0\n          ports:\n            - containerPort: 3000\n          env:\n            # REMOVE or set to 'false' for production.\n            # When 'true', any user with network access can\n            # view dashboards without authentication.\n            - name: GF_AUTH_ANONYMOUS_ENABLED\n              value: 'true'\n          volumeMounts:\n            - name: dashboards-provider\n              mountPath: /etc/grafana/provisioning/dashboards\n            - name: datasources\n              mountPath: /etc/grafana/provisioning/datasources\n            - name: dashboards\n              mountPath: /var/lib/grafana/dashboards\n      volumes:\n        - name: dashboards-provider\n          configMap:\n            name: grafana-dashboards-provider\n        - name: datasources\n          configMap:\n            name: grafana-datasources\n        - name: dashboards\n          configMap:\n            name: grafana-dashboards\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: grafana\n  namespace: gitlab-observability\nspec:\n  selector:\n    app: grafana\n  ports:\n    - port: 3000\n      targetPort: 3000\n",[162,1267,1268,1273,1281,1289,1295,1304,1312,1318,1326,1332,1338,1346,1352,1358,1364,1372,1378,1384,1394,1403,1409,1420,1426,1431,1436,1441,1452,1461,1467,1478,1487,1498,1507,1518,1527,1533,1543,1549,1558,1568,1574,1583,1593,1599,1608,1612,1620,1628,1634,1643,1652,1659,1666,1675,1682,1693],{"__ignoreMap":160},[165,1269,1270],{"class":167,"line":168},[165,1271,1272],{"class":195},"# grafana-deployment.yaml\n",[165,1274,1275,1277,1279],{"class":167,"line":185},[165,1276,260],{"class":259},[165,1278,264],{"class":263},[165,1280,267],{"class":175},[165,1282,1283,1285,1287],{"class":167,"line":192},[165,1284,272],{"class":259},[165,1286,264],{"class":263},[165,1288,277],{"class":175},[165,1290,1291,1293],{"class":167,"line":199},[165,1292,282],{"class":259},[165,1294,285],{"class":263},[165,1296,1297,1299,1301],{"class":167,"line":205},[165,1298,290],{"class":259},[165,1300,264],{"class":263},[165,1302,1303],{"class":175},"grafana\n",[165,1305,1306,1308,1310],{"class":167,"line":225},[165,1307,300],{"class":259},[165,1309,264],{"class":263},[165,1311,305],{"class":175},[165,1313,1314,1316],{"class":167,"line":233},[165,1315,310],{"class":259},[165,1317,285],{"class":263},[165,1319,1320,1322,1324],{"class":167,"line":315},[165,1321,318],{"class":259},[165,1323,264],{"class":263},[165,1325,323],{"class":221},[165,1327,1328,1330],{"class":167,"line":326},[165,1329,329],{"class":259},[165,1331,285],{"class":263},[165,1333,1334,1336],{"class":167,"line":334},[165,1335,337],{"class":259},[165,1337,285],{"class":263},[165,1339,1340,1342,1344],{"class":167,"line":342},[165,1341,345],{"class":259},[165,1343,264],{"class":263},[165,1345,1303],{"class":175},[165,1347,1348,1350],{"class":167,"line":352},[165,1349,355],{"class":259},[165,1351,285],{"class":263},[165,1353,1354,1356],{"class":167,"line":360},[165,1355,363],{"class":259},[165,1357,285],{"class":263},[165,1359,1360,1362],{"class":167,"line":368},[165,1361,371],{"class":259},[165,1363,285],{"class":263},[165,1365,1366,1368,1370],{"class":167,"line":376},[165,1367,379],{"class":259},[165,1369,264],{"class":263},[165,1371,1303],{"class":175},[165,1373,1374,1376],{"class":167,"line":386},[165,1375,389],{"class":259},[165,1377,285],{"class":263},[165,1379,1380,1382],{"class":167,"line":394},[165,1381,397],{"class":259},[165,1383,285],{"class":263},[165,1385,1386,1388,1390,1392],{"class":167,"line":402},[165,1387,405],{"class":263},[165,1389,408],{"class":259},[165,1391,264],{"class":263},[165,1393,1303],{"class":175},[165,1395,1396,1398,1400],{"class":167,"line":416},[165,1397,419],{"class":259},[165,1399,264],{"class":263},[165,1401,1402],{"class":175},"grafana/grafana:10.0.0\n",[165,1404,1405,1407],{"class":167,"line":427},[165,1406,430],{"class":259},[165,1408,285],{"class":263},[165,1410,1411,1413,1415,1417],{"class":167,"line":435},[165,1412,438],{"class":263},[165,1414,441],{"class":259},[165,1416,264],{"class":263},[165,1418,1419],{"class":221},"3000\n",[165,1421,1422,1424],{"class":167,"line":449},[165,1423,452],{"class":259},[165,1425,285],{"class":263},[165,1427,1428],{"class":167,"line":457},[165,1429,1430],{"class":195},"            # REMOVE or set to 'false' for production.\n",[165,1432,1433],{"class":167,"line":469},[165,1434,1435],{"class":195},"            # When 'true', any user with network access can\n",[165,1437,1438],{"class":167,"line":477},[165,1439,1440],{"class":195},"            # view dashboards without authentication.\n",[165,1442,1443,1445,1447,1449],{"class":167,"line":485},[165,1444,438],{"class":263},[165,1446,408],{"class":259},[165,1448,264],{"class":263},[165,1450,1451],{"class":175},"GF_AUTH_ANONYMOUS_ENABLED\n",[165,1453,1454,1456,1458],{"class":167,"line":496},[165,1455,522],{"class":259},[165,1457,264],{"class":263},[165,1459,1460],{"class":175},"'true'\n",[165,1462,1463,1465],{"class":167,"line":507},[165,1464,533],{"class":259},[165,1466,285],{"class":263},[165,1468,1469,1471,1473,1475],{"class":167,"line":519},[165,1470,438],{"class":263},[165,1472,408],{"class":259},[165,1474,264],{"class":263},[165,1476,1477],{"class":175},"dashboards-provider\n",[165,1479,1480,1482,1484],{"class":167,"line":530},[165,1481,553],{"class":259},[165,1483,264],{"class":263},[165,1485,1486],{"class":175},"/etc/grafana/provisioning/dashboards\n",[165,1488,1489,1491,1493,1495],{"class":167,"line":538},[165,1490,438],{"class":263},[165,1492,408],{"class":259},[165,1494,264],{"class":263},[165,1496,1497],{"class":175},"datasources\n",[165,1499,1500,1502,1504],{"class":167,"line":550},[165,1501,553],{"class":259},[165,1503,264],{"class":263},[165,1505,1506],{"class":175},"/etc/grafana/provisioning/datasources\n",[165,1508,1509,1511,1513,1515],{"class":167,"line":561},[165,1510,438],{"class":263},[165,1512,408],{"class":259},[165,1514,264],{"class":263},[165,1516,1517],{"class":175},"dashboards\n",[165,1519,1520,1522,1524],{"class":167,"line":569},[165,1521,553],{"class":259},[165,1523,264],{"class":263},[165,1525,1526],{"class":175},"/var/lib/grafana/dashboards\n",[165,1528,1529,1531],{"class":167,"line":580},[165,1530,564],{"class":259},[165,1532,285],{"class":263},[165,1534,1535,1537,1539,1541],{"class":167,"line":588},[165,1536,405],{"class":263},[165,1538,408],{"class":259},[165,1540,264],{"class":263},[165,1542,1477],{"class":175},[165,1544,1545,1547],{"class":167,"line":599},[165,1546,583],{"class":259},[165,1548,285],{"class":263},[165,1550,1551,1553,1555],{"class":167,"line":605},[165,1552,591],{"class":259},[165,1554,264],{"class":263},[165,1556,1557],{"class":175},"grafana-dashboards-provider\n",[165,1559,1560,1562,1564,1566],{"class":167,"line":615},[165,1561,405],{"class":263},[165,1563,408],{"class":259},[165,1565,264],{"class":263},[165,1567,1497],{"class":175},[165,1569,1570,1572],{"class":167,"line":625},[165,1571,583],{"class":259},[165,1573,285],{"class":263},[165,1575,1576,1578,1580],{"class":167,"line":632},[165,1577,591],{"class":259},[165,1579,264],{"class":263},[165,1581,1582],{"class":175},"grafana-datasources\n",[165,1584,1585,1587,1589,1591],{"class":167,"line":641},[165,1586,405],{"class":263},[165,1588,408],{"class":259},[165,1590,264],{"class":263},[165,1592,1517],{"class":175},[165,1594,1595,1597],{"class":167,"line":650},[165,1596,583],{"class":259},[165,1598,285],{"class":263},[165,1600,1601,1603,1605],{"class":167,"line":657},[165,1602,591],{"class":259},[165,1604,264],{"class":263},[165,1606,1607],{"class":175},"grafana-dashboards\n",[165,1609,1610],{"class":167,"line":664},[165,1611,602],{"class":171},[165,1613,1614,1616,1618],{"class":167,"line":674},[165,1615,260],{"class":259},[165,1617,264],{"class":263},[165,1619,612],{"class":175},[165,1621,1622,1624,1626],{"class":167,"line":682},[165,1623,272],{"class":259},[165,1625,264],{"class":263},[165,1627,622],{"class":175},[165,1629,1630,1632],{"class":167,"line":695},[165,1631,282],{"class":259},[165,1633,285],{"class":263},[165,1635,1637,1639,1641],{"class":167,"line":1636},49,[165,1638,290],{"class":259},[165,1640,264],{"class":263},[165,1642,1303],{"class":175},[165,1644,1646,1648,1650],{"class":167,"line":1645},50,[165,1647,300],{"class":259},[165,1649,264],{"class":263},[165,1651,305],{"class":175},[165,1653,1655,1657],{"class":167,"line":1654},51,[165,1656,310],{"class":259},[165,1658,285],{"class":263},[165,1660,1662,1664],{"class":167,"line":1661},52,[165,1663,329],{"class":259},[165,1665,285],{"class":263},[165,1667,1669,1671,1673],{"class":167,"line":1668},53,[165,1670,667],{"class":259},[165,1672,264],{"class":263},[165,1674,1303],{"class":175},[165,1676,1678,1680],{"class":167,"line":1677},54,[165,1679,677],{"class":259},[165,1681,285],{"class":263},[165,1683,1685,1687,1689,1691],{"class":167,"line":1684},55,[165,1686,685],{"class":263},[165,1688,688],{"class":259},[165,1690,264],{"class":263},[165,1692,1419],{"class":221},[165,1694,1696,1698,1700],{"class":167,"line":1695},56,[165,1697,698],{"class":259},[165,1699,264],{"class":263},[165,1701,1419],{"class":221},[150,1703,1705],{"id":1704},"_6-configurer-la-politique-réseau","6. Configurer la politique réseau",[12,1707,1708],{},"Restreignez le trafic entre pods aux seuls chemins de communication nécessaires :",[155,1710,1712],{"className":245,"code":1711,"language":247,"meta":160,"style":160},"# network-policy.yaml\napiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n  name: observability-policy\n  namespace: gitlab-observability\nspec:\n  podSelector: {}\n  policyTypes:\n    - Ingress\n  ingress:\n    # Prometheus scrapes exporter and node-exporter\n    - from:\n        - podSelector:\n            matchLabels:\n              app: prometheus\n      ports:\n        - port: 8080\n        - port: 9100\n    # Grafana queries Prometheus\n    - from:\n        - podSelector:\n            matchLabels:\n              app: grafana\n      ports:\n        - port: 9090\n",[162,1713,1714,1719,1728,1737,1743,1752,1760,1766,1774,1781,1788,1795,1800,1809,1818,1825,1834,1841,1851,1861,1866,1874,1882,1888,1896,1902],{"__ignoreMap":160},[165,1715,1716],{"class":167,"line":168},[165,1717,1718],{"class":195},"# network-policy.yaml\n",[165,1720,1721,1723,1725],{"class":167,"line":185},[165,1722,260],{"class":259},[165,1724,264],{"class":263},[165,1726,1727],{"class":175},"networking.k8s.io/v1\n",[165,1729,1730,1732,1734],{"class":167,"line":192},[165,1731,272],{"class":259},[165,1733,264],{"class":263},[165,1735,1736],{"class":175},"NetworkPolicy\n",[165,1738,1739,1741],{"class":167,"line":199},[165,1740,282],{"class":259},[165,1742,285],{"class":263},[165,1744,1745,1747,1749],{"class":167,"line":205},[165,1746,290],{"class":259},[165,1748,264],{"class":263},[165,1750,1751],{"class":175},"observability-policy\n",[165,1753,1754,1756,1758],{"class":167,"line":225},[165,1755,300],{"class":259},[165,1757,264],{"class":263},[165,1759,305],{"class":175},[165,1761,1762,1764],{"class":167,"line":233},[165,1763,310],{"class":259},[165,1765,285],{"class":263},[165,1767,1768,1771],{"class":167,"line":315},[165,1769,1770],{"class":259},"  podSelector",[165,1772,1773],{"class":263},": {}\n",[165,1775,1776,1779],{"class":167,"line":326},[165,1777,1778],{"class":259},"  policyTypes",[165,1780,285],{"class":263},[165,1782,1783,1785],{"class":167,"line":334},[165,1784,685],{"class":263},[165,1786,1787],{"class":175},"Ingress\n",[165,1789,1790,1793],{"class":167,"line":342},[165,1791,1792],{"class":259},"  ingress",[165,1794,285],{"class":263},[165,1796,1797],{"class":167,"line":352},[165,1798,1799],{"class":195},"    # Prometheus scrapes exporter and node-exporter\n",[165,1801,1802,1804,1807],{"class":167,"line":360},[165,1803,685],{"class":263},[165,1805,1806],{"class":259},"from",[165,1808,285],{"class":263},[165,1810,1811,1813,1816],{"class":167,"line":368},[165,1812,405],{"class":263},[165,1814,1815],{"class":259},"podSelector",[165,1817,285],{"class":263},[165,1819,1820,1823],{"class":167,"line":376},[165,1821,1822],{"class":259},"            matchLabels",[165,1824,285],{"class":263},[165,1826,1827,1830,1832],{"class":167,"line":386},[165,1828,1829],{"class":259},"              app",[165,1831,264],{"class":263},[165,1833,987],{"class":175},[165,1835,1836,1839],{"class":167,"line":394},[165,1837,1838],{"class":259},"      ports",[165,1840,285],{"class":263},[165,1842,1843,1845,1847,1849],{"class":167,"line":402},[165,1844,405],{"class":263},[165,1846,688],{"class":259},[165,1848,264],{"class":263},[165,1850,446],{"class":221},[165,1852,1853,1855,1857,1859],{"class":167,"line":416},[165,1854,405],{"class":263},[165,1856,688],{"class":259},[165,1858,264],{"class":263},[165,1860,856],{"class":221},[165,1862,1863],{"class":167,"line":427},[165,1864,1865],{"class":195},"    # Grafana queries Prometheus\n",[165,1867,1868,1870,1872],{"class":167,"line":435},[165,1869,685],{"class":263},[165,1871,1806],{"class":259},[165,1873,285],{"class":263},[165,1875,1876,1878,1880],{"class":167,"line":449},[165,1877,405],{"class":263},[165,1879,1815],{"class":259},[165,1881,285],{"class":263},[165,1883,1884,1886],{"class":167,"line":457},[165,1885,1822],{"class":259},[165,1887,285],{"class":263},[165,1889,1890,1892,1894],{"class":167,"line":469},[165,1891,1829],{"class":259},[165,1893,264],{"class":263},[165,1895,1303],{"class":175},[165,1897,1898,1900],{"class":167,"line":477},[165,1899,1838],{"class":259},[165,1901,285],{"class":263},[165,1903,1904,1906,1908,1910],{"class":167,"line":485},[165,1905,405],{"class":263},[165,1907,688],{"class":259},[165,1909,264],{"class":263},[165,1911,1103],{"class":221},[150,1913,1915],{"id":1914},"_7-valider","7. Valider",[155,1917,1919],{"className":157,"code":1918,"language":159,"meta":160,"style":160},"kubectl get pods -n gitlab-observability\nkubectl port-forward svc/grafana 3000:3000 -n gitlab-observability\ncurl http://localhost:3000/api/health\n",[162,1920,1921,1936,1953],{"__ignoreMap":160},[165,1922,1923,1925,1928,1931,1934],{"class":167,"line":168},[165,1924,172],{"class":171},[165,1926,1927],{"class":175}," get",[165,1929,1930],{"class":175}," pods",[165,1932,1933],{"class":221}," -n",[165,1935,182],{"class":175},[165,1937,1938,1940,1943,1946,1949,1951],{"class":167,"line":185},[165,1939,172],{"class":171},[165,1941,1942],{"class":175}," port-forward",[165,1944,1945],{"class":175}," svc/grafana",[165,1947,1948],{"class":175}," 3000:3000",[165,1950,1933],{"class":221},[165,1952,182],{"class":175},[165,1954,1955,1958],{"class":167,"line":192},[165,1956,1957],{"class":171},"curl",[165,1959,1960],{"class":175}," http://localhost:3000/api/health\n",[30,1962,1964],{"id":1963},"référence-de-configuration","Référence de configuration",[150,1966,1968],{"id":1967},"configuration-de-lexporter","Configuration de l'exporter",[155,1970,1972],{"className":245,"code":1971,"language":247,"meta":160,"style":160},"# gitlab-ci-pipelines-exporter.yml (ConfigMap: gcpe-config)\nlog:\n  level: info\ngitlab:\n  url: https://gitlab.your-domain.com\n  maximum_requests_per_second: 10\nproject_defaults:\n  pull:\n    pipeline:\n      jobs:\n        enabled: true\nwildcards:\n  - owner:\n      name: your-group-name\n      kind: group\n    archived: false\n",[162,1973,1974,1979,1986,1996,2003,2013,2023,2030,2037,2044,2051,2061,2068,2078,2088,2098],{"__ignoreMap":160},[165,1975,1976],{"class":167,"line":168},[165,1977,1978],{"class":195},"# gitlab-ci-pipelines-exporter.yml (ConfigMap: gcpe-config)\n",[165,1980,1981,1984],{"class":167,"line":185},[165,1982,1983],{"class":259},"log",[165,1985,285],{"class":263},[165,1987,1988,1991,1993],{"class":167,"line":192},[165,1989,1990],{"class":259},"  level",[165,1992,264],{"class":263},[165,1994,1995],{"class":175},"info\n",[165,1997,1998,2001],{"class":167,"line":199},[165,1999,2000],{"class":259},"gitlab",[165,2002,285],{"class":263},[165,2004,2005,2008,2010],{"class":167,"line":205},[165,2006,2007],{"class":259},"  url",[165,2009,264],{"class":263},[165,2011,2012],{"class":175},"https://gitlab.your-domain.com\n",[165,2014,2015,2018,2020],{"class":167,"line":225},[165,2016,2017],{"class":259},"  maximum_requests_per_second",[165,2019,264],{"class":263},[165,2021,2022],{"class":221},"10\n",[165,2024,2025,2028],{"class":167,"line":233},[165,2026,2027],{"class":259},"project_defaults",[165,2029,285],{"class":263},[165,2031,2032,2035],{"class":167,"line":315},[165,2033,2034],{"class":259},"  pull",[165,2036,285],{"class":263},[165,2038,2039,2042],{"class":167,"line":326},[165,2040,2041],{"class":259},"    pipeline",[165,2043,285],{"class":263},[165,2045,2046,2049],{"class":167,"line":334},[165,2047,2048],{"class":259},"      jobs",[165,2050,285],{"class":263},[165,2052,2053,2056,2058],{"class":167,"line":342},[165,2054,2055],{"class":259},"        enabled",[165,2057,264],{"class":263},[165,2059,2060],{"class":221},"true\n",[165,2062,2063,2066],{"class":167,"line":352},[165,2064,2065],{"class":259},"wildcards",[165,2067,285],{"class":263},[165,2069,2070,2073,2076],{"class":167,"line":360},[165,2071,2072],{"class":263},"  - ",[165,2074,2075],{"class":259},"owner",[165,2077,285],{"class":263},[165,2079,2080,2083,2085],{"class":167,"line":368},[165,2081,2082],{"class":259},"      name",[165,2084,264],{"class":263},[165,2086,2087],{"class":175},"your-group-name\n",[165,2089,2090,2093,2095],{"class":167,"line":376},[165,2091,2092],{"class":259},"      kind",[165,2094,264],{"class":263},[165,2096,2097],{"class":175},"group\n",[165,2099,2100,2103,2105],{"class":167,"line":386},[165,2101,2102],{"class":259},"    archived",[165,2104,264],{"class":263},[165,2106,2107],{"class":221},"false\n",[150,2109,2111],{"id":2110},"configuration-de-prometheus","Configuration de Prometheus",[155,2113,2115],{"className":245,"code":2114,"language":247,"meta":160,"style":160},"# prometheus.yml (ConfigMap: prometheus-config)\nglobal:\n  scrape_interval: 15s\nscrape_configs:\n  - job_name: 'gitlab-ci-pipelines-exporter'\n    static_configs:\n      - targets: ['gitlab-ci-pipelines-exporter:8080']\n  - job_name: 'node-exporter'\n    static_configs:\n      - targets: ['node-exporter:9100']\n",[162,2116,2117,2122,2129,2139,2146,2158,2165,2182,2193,2199],{"__ignoreMap":160},[165,2118,2119],{"class":167,"line":168},[165,2120,2121],{"class":195},"# prometheus.yml (ConfigMap: prometheus-config)\n",[165,2123,2124,2127],{"class":167,"line":185},[165,2125,2126],{"class":259},"global",[165,2128,285],{"class":263},[165,2130,2131,2134,2136],{"class":167,"line":192},[165,2132,2133],{"class":259},"  scrape_interval",[165,2135,264],{"class":263},[165,2137,2138],{"class":175},"15s\n",[165,2140,2141,2144],{"class":167,"line":199},[165,2142,2143],{"class":259},"scrape_configs",[165,2145,285],{"class":263},[165,2147,2148,2150,2153,2155],{"class":167,"line":205},[165,2149,2072],{"class":263},[165,2151,2152],{"class":259},"job_name",[165,2154,264],{"class":263},[165,2156,2157],{"class":175},"'gitlab-ci-pipelines-exporter'\n",[165,2159,2160,2163],{"class":167,"line":225},[165,2161,2162],{"class":259},"    static_configs",[165,2164,285],{"class":263},[165,2166,2167,2170,2173,2176,2179],{"class":167,"line":233},[165,2168,2169],{"class":263},"      - ",[165,2171,2172],{"class":259},"targets",[165,2174,2175],{"class":263},": [",[165,2177,2178],{"class":175},"'gitlab-ci-pipelines-exporter:8080'",[165,2180,2181],{"class":263},"]\n",[165,2183,2184,2186,2188,2190],{"class":167,"line":315},[165,2185,2072],{"class":263},[165,2187,2152],{"class":259},[165,2189,264],{"class":263},[165,2191,2192],{"class":175},"'node-exporter'\n",[165,2194,2195,2197],{"class":167,"line":326},[165,2196,2162],{"class":259},[165,2198,285],{"class":263},[165,2200,2201,2203,2205,2207,2210],{"class":167,"line":334},[165,2202,2169],{"class":263},[165,2204,2172],{"class":259},[165,2206,2175],{"class":263},[165,2208,2209],{"class":175},"'node-exporter:9100'",[165,2211,2181],{"class":263},[150,2213,2215],{"id":2214},"sources-de-données-grafana","Sources de données Grafana",[155,2217,2219],{"className":245,"code":2218,"language":247,"meta":160,"style":160},"# datasources.yml (ConfigMap: grafana-datasources)\napiVersion: 1\ndatasources:\n  - name: Prometheus\n    type: prometheus\n    access: proxy\n    url: http://prometheus:9090\n    isDefault: true\n# dashboards.yml (ConfigMap: grafana-dashboards-provider)\napiVersion: 1\nproviders:\n  - name: 'default'\n    folder: 'GitLab CI/CD'\n    type: file\n    options:\n      path: /var/lib/grafana/dashboards\n",[162,2220,2221,2226,2234,2241,2252,2261,2271,2281,2290,2295,2303,2310,2321,2331,2340,2347],{"__ignoreMap":160},[165,2222,2223],{"class":167,"line":168},[165,2224,2225],{"class":195},"# datasources.yml (ConfigMap: grafana-datasources)\n",[165,2227,2228,2230,2232],{"class":167,"line":185},[165,2229,260],{"class":259},[165,2231,264],{"class":263},[165,2233,323],{"class":221},[165,2235,2236,2239],{"class":167,"line":192},[165,2237,2238],{"class":259},"datasources",[165,2240,285],{"class":263},[165,2242,2243,2245,2247,2249],{"class":167,"line":199},[165,2244,2072],{"class":263},[165,2246,408],{"class":259},[165,2248,264],{"class":263},[165,2250,2251],{"class":175},"Prometheus\n",[165,2253,2254,2257,2259],{"class":167,"line":205},[165,2255,2256],{"class":259},"    type",[165,2258,264],{"class":263},[165,2260,987],{"class":175},[165,2262,2263,2266,2268],{"class":167,"line":225},[165,2264,2265],{"class":259},"    access",[165,2267,264],{"class":263},[165,2269,2270],{"class":175},"proxy\n",[165,2272,2273,2276,2278],{"class":167,"line":233},[165,2274,2275],{"class":259},"    url",[165,2277,264],{"class":263},[165,2279,2280],{"class":175},"http://prometheus:9090\n",[165,2282,2283,2286,2288],{"class":167,"line":315},[165,2284,2285],{"class":259},"    isDefault",[165,2287,264],{"class":263},[165,2289,2060],{"class":221},[165,2291,2292],{"class":167,"line":326},[165,2293,2294],{"class":195},"# dashboards.yml (ConfigMap: grafana-dashboards-provider)\n",[165,2296,2297,2299,2301],{"class":167,"line":334},[165,2298,260],{"class":259},[165,2300,264],{"class":263},[165,2302,323],{"class":221},[165,2304,2305,2308],{"class":167,"line":342},[165,2306,2307],{"class":259},"providers",[165,2309,285],{"class":263},[165,2311,2312,2314,2316,2318],{"class":167,"line":352},[165,2313,2072],{"class":263},[165,2315,408],{"class":259},[165,2317,264],{"class":263},[165,2319,2320],{"class":175},"'default'\n",[165,2322,2323,2326,2328],{"class":167,"line":360},[165,2324,2325],{"class":259},"    folder",[165,2327,264],{"class":263},[165,2329,2330],{"class":175},"'GitLab CI/CD'\n",[165,2332,2333,2335,2337],{"class":167,"line":368},[165,2334,2256],{"class":259},[165,2336,264],{"class":263},[165,2338,2339],{"class":175},"file\n",[165,2341,2342,2345],{"class":167,"line":376},[165,2343,2344],{"class":259},"    options",[165,2346,285],{"class":263},[165,2348,2349,2352,2354],{"class":167,"line":386},[165,2350,2351],{"class":259},"      path",[165,2353,264],{"class":263},[165,2355,1526],{"class":175},[30,2357,2359],{"id":2358},"indicateurs-clés","Indicateurs clés",[150,2361,2363],{"id":2362},"indicateurs-du-pipeline-exporter","Indicateurs du Pipeline Exporter",[2365,2366,2367,2381],"table",{},[2368,2369,2370],"thead",{},[2371,2372,2373,2378],"tr",{},[2374,2375,2377],"th",{"align":2376},"left","Indicateur",[2374,2379,2380],{"align":2376},"Description",[2382,2383,2384,2395,2405,2415,2425,2435,2445,2455,2465],"tbody",{},[2371,2385,2386,2392],{},[2387,2388,2389],"td",{"align":2376},[162,2390,2391],{},"gitlab_ci_pipeline_duration_seconds",[2387,2393,2394],{"align":2376},"Durée d'exécution du pipeline",[2371,2396,2397,2402],{},[2387,2398,2399],{"align":2376},[162,2400,2401],{},"gitlab_ci_pipeline_status",[2387,2403,2404],{"align":2376},"Réussite/échec du pipeline par projet",[2371,2406,2407,2412],{},[2387,2408,2409],{"align":2376},[162,2410,2411],{},"gitlab_ci_pipeline_job_duration_seconds",[2387,2413,2414],{"align":2376},"Durée d'exécution de chaque job",[2371,2416,2417,2422],{},[2387,2418,2419],{"align":2376},[162,2420,2421],{},"gitlab_ci_pipeline_job_status",[2387,2423,2424],{"align":2376},"Statut de réussite/d'échec du job",[2371,2426,2427,2432],{},[2387,2428,2429],{"align":2376},[162,2430,2431],{},"gitlab_ci_pipeline_job_artifact_size_bytes",[2387,2433,2434],{"align":2376},"Consommation de stockage des artefacts",[2371,2436,2437,2442],{},[2387,2438,2439],{"align":2376},[162,2440,2441],{},"gitlab_ci_pipeline_coverage",[2387,2443,2444],{"align":2376},"Pourcentage de couverture de code",[2371,2446,2447,2452],{},[2387,2448,2449],{"align":2376},[162,2450,2451],{},"gitlab_ci_environment_deployment_count",[2387,2453,2454],{"align":2376},"Fréquence de déploiement",[2371,2456,2457,2462],{},[2387,2458,2459],{"align":2376},[162,2460,2461],{},"gitlab_ci_environment_deployment_duration_seconds",[2387,2463,2464],{"align":2376},"Durée d'exécution du déploiement",[2371,2466,2467,2472],{},[2387,2468,2469],{"align":2376},[162,2470,2471],{},"gitlab_ci_environment_behind_commits_count",[2387,2473,2474],{"align":2376},"Dérive de l'environnement par rapport à la branche principale",[150,2476,2478],{"id":2477},"indicateurs-de-node-exporter","Indicateurs de Node Exporter",[2365,2480,2481,2489],{},[2368,2482,2483],{},[2371,2484,2485,2487],{},[2374,2486,2377],{"align":2376},[2374,2488,2380],{"align":2376},[2382,2490,2491,2501,2511,2521],{},[2371,2492,2493,2498],{},[2387,2494,2495],{"align":2376},[162,2496,2497],{},"node_cpu_seconds_total",[2387,2499,2500],{"align":2376},"Utilisation du processeur",[2371,2502,2503,2508],{},[2387,2504,2505],{"align":2376},[162,2506,2507],{},"node_memory_MemAvailable_bytes",[2387,2509,2510],{"align":2376},"Mémoire disponible",[2371,2512,2513,2518],{},[2387,2514,2515],{"align":2376},[162,2516,2517],{},"node_filesystem_avail_bytes",[2387,2519,2520],{"align":2376},"Espace disque disponible",[2371,2522,2523,2528],{},[2387,2524,2525],{"align":2376},[162,2526,2527],{},"node_load1",[2387,2529,2530],{"align":2376},"Charge moyenne sur 1 minute",[30,2532,2534],{"id":2533},"dépannage","Dépannage",[150,2536,2538],{"id":2537},"installation-de-plugins-grafana-dans-un-environnement-air-gapped","Installation de plugins Grafana dans un environnement air-gapped",[12,2540,2541],{},"Pour les environnements hors ligne, installez les plugins manuellement. Exemple pour Kubernetes :",[155,2543,2545],{"className":157,"code":2544,"language":159,"meta":160,"style":160},"# Copy plugin zip into the Grafana pod\nkubectl cp grafana-polystat-panel-2.1.16.zip \\\n  gitlab-observability/grafana-\u003Cpod-id>:/tmp/\n# Extract plugin\nkubectl exec -it -n gitlab-observability deploy/grafana -- \\\n  sh -c \"unzip /tmp/grafana-polystat-panel-2.1.16.zip -d /var/lib/grafana/plugins/\"\n# Restart Grafana pod\nkubectl rollout restart deployment/grafana -n gitlab-observability\n# Verify installation\nkubectl exec -it -n gitlab-observability deploy/grafana -- \\\n  ls -al /var/lib/grafana/plugins/\n",[162,2546,2547,2552,2564,2585,2590,2613,2624,2629,2646,2651,2669],{"__ignoreMap":160},[165,2548,2549],{"class":167,"line":168},[165,2550,2551],{"class":195},"# Copy plugin zip into the Grafana pod\n",[165,2553,2554,2556,2559,2562],{"class":167,"line":185},[165,2555,172],{"class":171},[165,2557,2558],{"class":175}," cp",[165,2560,2561],{"class":175}," grafana-polystat-panel-2.1.16.zip",[165,2563,222],{"class":221},[165,2565,2566,2569,2573,2576,2579,2582],{"class":167,"line":192},[165,2567,2568],{"class":175},"  gitlab-observability/grafana-",[165,2570,2572],{"class":2571},"sD7c4","\u003C",[165,2574,2575],{"class":175},"pod-i",[165,2577,2578],{"class":263},"d",[165,2580,2581],{"class":2571},">",[165,2583,2584],{"class":175},":/tmp/\n",[165,2586,2587],{"class":167,"line":199},[165,2588,2589],{"class":195},"# Extract plugin\n",[165,2591,2592,2594,2597,2600,2602,2605,2608,2611],{"class":167,"line":205},[165,2593,172],{"class":171},[165,2595,2596],{"class":175}," exec",[165,2598,2599],{"class":221}," -it",[165,2601,1933],{"class":221},[165,2603,2604],{"class":175}," gitlab-observability",[165,2606,2607],{"class":175}," deploy/grafana",[165,2609,2610],{"class":221}," --",[165,2612,222],{"class":221},[165,2614,2615,2618,2621],{"class":167,"line":225},[165,2616,2617],{"class":175},"  sh",[165,2619,2620],{"class":221}," -c",[165,2622,2623],{"class":175}," \"unzip /tmp/grafana-polystat-panel-2.1.16.zip -d /var/lib/grafana/plugins/\"\n",[165,2625,2626],{"class":167,"line":233},[165,2627,2628],{"class":195},"# Restart Grafana pod\n",[165,2630,2631,2633,2636,2639,2642,2644],{"class":167,"line":315},[165,2632,172],{"class":171},[165,2634,2635],{"class":175}," rollout",[165,2637,2638],{"class":175}," restart",[165,2640,2641],{"class":175}," deployment/grafana",[165,2643,1933],{"class":221},[165,2645,182],{"class":175},[165,2647,2648],{"class":167,"line":326},[165,2649,2650],{"class":195},"# Verify installation\n",[165,2652,2653,2655,2657,2659,2661,2663,2665,2667],{"class":167,"line":334},[165,2654,172],{"class":171},[165,2656,2596],{"class":175},[165,2658,2599],{"class":221},[165,2660,1933],{"class":221},[165,2662,2604],{"class":175},[165,2664,2607],{"class":175},[165,2666,2610],{"class":221},[165,2668,222],{"class":221},[165,2670,2671,2674,2677],{"class":167,"line":342},[165,2672,2673],{"class":175},"  ls",[165,2675,2676],{"class":221}," -al",[165,2678,2679],{"class":175}," /var/lib/grafana/plugins/\n",[30,2681,2683],{"id":2682},"points-importants-pour-les-environnements-dentreprise","Points importants pour les environnements d'entreprise",[12,2685,2686],{},"Pour les secteurs réglementés, veillez à respecter les points suivants :",[38,2688,2689,2698,2704],{},[41,2690,2691,2694,2695,2697],{},[16,2692,2693],{},"Sécurité des jetons :"," stockez les jetons d'accès personnel GitLab dans un gestionnaire de secrets dédié plutôt que de les coder en dur dans les ConfigMaps. Appliquez des politiques de rotation des jetons et limitez la portée à ",[16,2696,140],{}," uniquement.",[41,2699,2700,2703],{},[16,2701,2702],{},"Segmentation réseau :"," déployez derrière un proxy inverse avec terminaison TLS. Sur Kubernetes, utilisez un contrôleur Ingress avec provisionnement automatisé des certificats.",[41,2705,2706,2709],{},[16,2707,2708],{},"Authentification :"," configurez Grafana avec le fournisseur d'identité de votre organisation (SAML, LDAP ou OAuth/OIDC) afin d'appliquer un contrôle d'accès basé sur les rôles aux tableaux de bord.",[30,2711,2713],{"id":2712},"pourquoi-gitlab","Pourquoi GitLab ?",[12,2715,2716],{},"Le design axé sur les API de GitLab permet de créer des solutions d'observabilité personnalisées qui complètent les fonctionnalités natives telles que l'analyse du flux de valeur et les métriques DORA. L'architecture ouverte permet aux organisations d'intégrer des outils open source éprouvés, comme gitlab-ci-pipelines-exporter, directement dans leur infrastructure d'entreprise existante, sans perturber les workflows établis.",[12,2718,2719,2720,2726],{},"À mesure que votre maturité en matière d'observabilité progresse, les fonctionnalités intégrées de GitLab Observability constituent une prochaine étape naturelle, car elles offrent une visibilité plus approfondie et intégrée sans outils supplémentaires. Découvrez les capacités disponibles nativement dans la plateforme pour ",[2721,2722,2725],"a",{"href":2723,"rel":2724},"https://docs.gitlab.com/operations/observability/observability/",[],"GitLab Observability",".",[2728,2729,2730],"style",{},"html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}",{"title":160,"searchDepth":185,"depth":185,"links":2732},[2733,2734,2735,2744,2749,2753,2756,2757],{"id":32,"depth":185,"text":33},{"id":61,"depth":185,"text":62},{"id":144,"depth":185,"text":145,"children":2736},[2737,2738,2739,2740,2741,2742,2743],{"id":152,"depth":192,"text":153},{"id":241,"depth":192,"text":242},{"id":705,"depth":192,"text":706},{"id":945,"depth":192,"text":946},{"id":1248,"depth":192,"text":1249},{"id":1704,"depth":192,"text":1705},{"id":1914,"depth":192,"text":1915},{"id":1963,"depth":185,"text":1964,"children":2745},[2746,2747,2748],{"id":1967,"depth":192,"text":1968},{"id":2110,"depth":192,"text":2111},{"id":2214,"depth":192,"text":2215},{"id":2358,"depth":185,"text":2359,"children":2750},[2751,2752],{"id":2362,"depth":192,"text":2363},{"id":2477,"depth":192,"text":2478},{"id":2533,"depth":185,"text":2534,"children":2754},[2755],{"id":2537,"depth":192,"text":2538},{"id":2682,"depth":185,"text":2683},{"id":2712,"depth":185,"text":2713},"engineering","2026-05-18","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.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/f_auto,q_auto,c_lfill/v1774465167/n5hlvrsrheadeccyr1oz.png",{},"/fr-fr/blog/how-to-build-ci-cd-observability-at-scale",{"config":2768,"description":2769,"title":2770},{"noIndex":2763},"Découvrez comment exploiter Prometheus et Grafana pour obtenir des indicateurs opérationnels sur vos pipelines GitLab Self-Managed. Guide pratique complet.","Observabilité CI/CD à grande échelle avec GitLab","how-to-build-ci-cd-observability-at-scale","fr-fr/blog/how-to-build-ci-cd-observability-at-scale",[2774,2775,2776],"CI/CD","product","tutorial","BlogPost","vdtEPbMyMxcRQF2ilbZuxQ9ya3CADuSgc-_IEncsMu0",{"logo":2780,"freeTrial":2785,"sales":2790,"login":2795,"items":2800,"search":3115,"minimal":3151,"duo":3170,"switchNav":3179,"pricingDeployment":3190},{"config":2781},{"href":2782,"dataGaName":2783,"dataGaLocation":2784},"/fr-fr/","gitlab logo","header",{"text":2786,"config":2787},"Commencer un essai gratuit",{"href":2788,"dataGaName":2789,"dataGaLocation":2784},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr&glm_content=default-saas-trial/","free trial",{"text":2791,"config":2792},"Contacter l’équipe commerciale",{"href":2793,"dataGaName":2794,"dataGaLocation":2784},"/fr-fr/sales/","sales",{"text":2796,"config":2797},"Connexion",{"href":2798,"dataGaName":2799,"dataGaLocation":2784},"https://gitlab.com/users/sign_in/","sign in",[2801,2829,2930,2935,3039,3095],{"text":2802,"config":2803,"menu":2805},"Plateforme",{"dataNavLevelOne":2804},"platform",{"type":2806,"columns":2807},"cards",[2808,2814,2822],{"title":2802,"description":2809,"link":2810},"La plateforme d’orchestration intelligente pour le DevSecOps",{"text":2811,"config":2812},"Explorer notre plateforme",{"href":2813,"dataGaName":2804,"dataGaLocation":2784},"/fr-fr/platform/",{"title":2815,"description":2816,"link":2817},"GitLab Duo Agent Platform","L’IA agentique pour l’ensemble du cycle de développement logiciel",{"text":2818,"config":2819},"Découvrir GitLab Duo",{"href":2820,"dataGaName":2821,"dataGaLocation":2784},"/fr-fr/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":2713,"description":2823,"link":2824},"Découvrez les principales raisons pour lesquelles les entreprises choisissent GitLab",{"text":2825,"config":2826},"En savoir plus",{"href":2827,"dataGaName":2828,"dataGaLocation":2784},"/fr-fr/why-gitlab/","why gitlab",{"text":2830,"left":188,"config":2831,"menu":2833},"Produit",{"dataNavLevelOne":2832},"solutions",{"type":2834,"link":2835,"columns":2839,"feature":2909},"lists",{"text":2836,"config":2837},"Voir toutes les solutions",{"href":2838,"dataGaName":2832,"dataGaLocation":2784},"/fr-fr/solutions/",[2840,2864,2887],{"title":2841,"description":2842,"link":2843,"items":2848},"Automatisation","CI/CD et automatisation pour accélérer le déploiement",{"config":2844},{"icon":2845,"href":2846,"dataGaName":2847,"dataGaLocation":2784},"AutomatedCodeAlt","/fr-fr/solutions/delivery-automation/","automated software delivery",[2849,2852,2855,2860],{"text":2774,"config":2850},{"href":2851,"dataGaLocation":2784,"dataGaName":2774},"/fr-fr/solutions/continuous-integration/",{"text":2815,"config":2853},{"href":2820,"dataGaLocation":2784,"dataGaName":2854},"gitlab duo agent platform - product menu",{"text":2856,"config":2857},"Gestion du code source",{"href":2858,"dataGaLocation":2784,"dataGaName":2859},"/fr-fr/solutions/source-code-management/","Source Code Management",{"text":2861,"config":2862},"Livraison de logiciels automatisée",{"href":2846,"dataGaLocation":2784,"dataGaName":2863},"Automated software delivery",{"title":2865,"description":2866,"link":2867,"items":2872},"Sécurité","Livrez du code plus rapidement sans compromettre la sécurité",{"config":2868},{"href":2869,"dataGaName":2870,"dataGaLocation":2784,"icon":2871},"/fr-fr/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[2873,2877,2882],{"text":2874,"config":2875},"Tests de sécurité des applications",{"href":2869,"dataGaName":2876,"dataGaLocation":2784},"Application security testing",{"text":2878,"config":2879},"Sécurité de la chaîne d’approvisionnement logicielle",{"href":2880,"dataGaLocation":2784,"dataGaName":2881},"/fr-fr/solutions/supply-chain/","Software supply chain security",{"text":2883,"config":2884},"Conformité logicielle",{"href":2885,"dataGaName":2886,"dataGaLocation":2784},"/fr-fr/solutions/software-compliance/","software compliance",{"title":2888,"link":2889,"items":2894},"Mesures",{"config":2890},{"icon":2891,"href":2892,"dataGaName":2893,"dataGaLocation":2784},"DigitalTransformation","/fr-fr/solutions/visibility-measurement/","visibility and measurement",[2895,2899,2904],{"text":2896,"config":2897},"Visibilité et mesures",{"href":2892,"dataGaLocation":2784,"dataGaName":2898},"Visibility and Measurement",{"text":2900,"config":2901},"Gestion de la chaîne de valeur",{"href":2902,"dataGaLocation":2784,"dataGaName":2903},"/fr-fr/solutions/value-stream-management/","Value Stream Management",{"text":2905,"config":2906},"Analyses et informations",{"href":2907,"dataGaLocation":2784,"dataGaName":2908},"/fr-fr/solutions/analytics-and-insights/","Analytics and insights",{"title":2910,"type":2834,"items":2911},"GitLab",[2912,2918,2924],{"text":2913,"config":2914},"Pour les entreprises",{"icon":2915,"href":2916,"dataGaLocation":2784,"dataGaName":2917},"Building","/fr-fr/enterprise/","enterprise",{"text":2919,"config":2920},"Pour les PME",{"icon":2921,"href":2922,"dataGaLocation":2784,"dataGaName":2923},"Work","/fr-fr/small-business/","small business",{"text":2925,"config":2926},"Pour le secteur public",{"icon":2927,"href":2928,"dataGaLocation":2784,"dataGaName":2929},"Organization","/fr-fr/solutions/public-sector/","public sector",{"text":2931,"config":2932},"Tarifs",{"href":2933,"dataGaName":2934,"dataGaLocation":2784,"dataNavLevelOne":2934},"/fr-fr/pricing/","pricing",{"text":2936,"config":2937,"menu":2939},"Ressources",{"dataNavLevelOne":2938},"resources",{"type":2834,"link":2940,"columns":2944,"feature":3028},{"text":2941,"config":2942},"Afficher toutes les ressources",{"href":2943,"dataGaName":2938,"dataGaLocation":2784},"/fr-fr/resources/",[2945,2978,3000],{"title":2946,"items":2947},"Premiers pas",[2948,2953,2958,2963,2968,2973],{"text":2949,"config":2950},"Installation",{"href":2951,"dataGaName":2952,"dataGaLocation":2784},"/fr-fr/install/","install",{"text":2954,"config":2955},"Guides de démarrage",{"href":2956,"dataGaName":2957,"dataGaLocation":2784},"/fr-fr/get-started/","quick setup checklists",{"text":2959,"config":2960},"Apprentissage",{"href":2961,"dataGaLocation":2784,"dataGaName":2962},"https://university.gitlab.com/","learn",{"text":2964,"config":2965},"Documentation",{"href":2966,"dataGaName":2967,"dataGaLocation":2784},"https://docs.gitlab.com/","product documentation",{"text":2969,"config":2970},"Vidéos sur les bonnes pratiques",{"href":2971,"dataGaName":2972,"dataGaLocation":2784},"/fr-fr/getting-started-videos/","best practice videos",{"text":2974,"config":2975},"Intégrations",{"href":2976,"dataGaName":2977,"dataGaLocation":2784},"/fr-fr/integrations/","integrations",{"title":2979,"items":2980},"Découvrir",[2981,2986,2991,2995],{"text":2982,"config":2983},"Témoignages clients",{"href":2984,"dataGaName":2985,"dataGaLocation":2784},"/fr-fr/customers/","customer success stories",{"text":2987,"config":2988},"Blog",{"href":2989,"dataGaName":2990,"dataGaLocation":2784},"/fr-fr/blog/","blog",{"text":2992,"config":2993},"The Source",{"href":2994,"dataGaName":2990,"dataGaLocation":2784},"/fr-fr/the-source/",{"text":2996,"config":2997},"Travail à distance",{"href":2998,"dataGaName":2999,"dataGaLocation":2784},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":3001,"items":3002},"Connecter",[3003,3008,3013,3018,3023],{"text":3004,"config":3005},"Services GitLab",{"href":3006,"dataGaName":3007,"dataGaLocation":2784},"/fr-fr/services/","services",{"text":3009,"config":3010},"Communauté",{"href":3011,"dataGaName":3012,"dataGaLocation":2784},"/community/","community",{"text":3014,"config":3015},"Forum",{"href":3016,"dataGaName":3017,"dataGaLocation":2784},"https://forum.gitlab.com/","forum",{"text":3019,"config":3020},"Événements",{"href":3021,"dataGaName":3022,"dataGaLocation":2784},"/events/","events",{"text":3024,"config":3025},"Partenaires",{"href":3026,"dataGaName":3027,"dataGaLocation":2784},"/fr-fr/partners/","partners",{"config":3029,"title":3032,"text":3033,"link":3034},{"background":3030,"textColor":3031},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","Nouveautés de GitLab","Restez informé des dernières fonctionnalités et améliorations.",{"text":3035,"config":3036},"Lire les articles les plus récents",{"href":3037,"dataGaName":3038,"dataGaLocation":2784},"/fr-fr/whats-new/","whats new",{"text":3040,"config":3041,"menu":3043},"Société",{"dataNavLevelOne":3042},"company",{"type":2834,"columns":3044},[3045],{"items":3046},[3047,3052,3058,3060,3065,3070,3075,3080,3085,3090],{"text":3048,"config":3049},"À propos",{"href":3050,"dataGaName":3051,"dataGaLocation":2784},"/fr-fr/company/","about",{"text":3053,"config":3054,"footerGa":3057},"Carrières",{"href":3055,"dataGaName":3056,"dataGaLocation":2784},"/jobs/","jobs",{"dataGaName":3056},{"text":3019,"config":3059},{"href":3021,"dataGaName":3022,"dataGaLocation":2784},{"text":3061,"config":3062},"Leadership",{"href":3063,"dataGaName":3064,"dataGaLocation":2784},"/company/team/e-group/","leadership",{"text":3066,"config":3067},"Manuel",{"href":3068,"dataGaName":3069,"dataGaLocation":2784},"https://handbook.gitlab.com/","handbook",{"text":3071,"config":3072},"Relations avec les investisseurs",{"href":3073,"dataGaName":3074,"dataGaLocation":2784},"https://ir.gitlab.com/","investor relations",{"text":3076,"config":3077},"Trust Center",{"href":3078,"dataGaName":3079,"dataGaLocation":2784},"/fr-fr/security/","trust center",{"text":3081,"config":3082},"Centre pour la transparence de l’IA",{"href":3083,"dataGaName":3084,"dataGaLocation":2784},"/fr-fr/ai-transparency-center/","ai transparency center",{"text":3086,"config":3087},"Newsletter",{"href":3088,"dataGaName":3089,"dataGaLocation":2784},"/company/contact/#contact-forms","newsletter",{"text":3091,"config":3092},"Presse",{"href":3093,"dataGaName":3094,"dataGaLocation":2784},"/press/","press",{"text":3096,"config":3097,"menu":3098},"Nous contacter",{"dataNavLevelOne":3042},{"type":2834,"columns":3099},[3100],{"items":3101},[3102,3105,3110],{"text":2791,"config":3103},{"href":2793,"dataGaName":3104,"dataGaLocation":2784},"talk to sales",{"text":3106,"config":3107},"Portail d'assistance",{"href":3108,"dataGaName":3109,"dataGaLocation":2784},"https://support.gitlab.com","support portal",{"text":3111,"config":3112},"Portail clients GitLab",{"href":3113,"dataGaName":3114,"dataGaLocation":2784},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":3116,"login":3117,"suggestions":3124},"Fermer",{"text":3118,"link":3119},"Pour rechercher des dépôts et des projets, connectez-vous à",{"text":3120,"config":3121},"GitLab.com",{"href":2798,"dataGaName":3122,"dataGaLocation":3123},"search login","search",{"text":3125,"default":3126},"Suggestions",[3127,3130,3135,3137,3142,3147],{"text":2815,"config":3128},{"href":2820,"dataGaName":3129,"dataGaLocation":3123},"GitLab Duo Agent Platform",{"text":3131,"config":3132},"Suggestions de code (IA)",{"href":3133,"dataGaName":3134,"dataGaLocation":3123},"/fr-fr/solutions/code-suggestions/","Code Suggestions (AI)",{"text":2774,"config":3136},{"href":2851,"dataGaName":2774,"dataGaLocation":3123},{"text":3138,"config":3139},"GitLab sur AWS",{"href":3140,"dataGaName":3141,"dataGaLocation":3123},"/fr-fr/partners/technology-partners/aws/","GitLab on AWS",{"text":3143,"config":3144},"GitLab sur Google Cloud",{"href":3145,"dataGaName":3146,"dataGaLocation":3123},"/fr-fr/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":3148,"config":3149},"Pourquoi utiliser GitLab ?",{"href":2827,"dataGaName":3150,"dataGaLocation":3123},"Why GitLab?",{"freeTrial":3152,"mobileIcon":3157,"desktopIcon":3162,"secondaryButton":3165},{"text":3153,"config":3154},"Commencer votre essai gratuit",{"href":3155,"dataGaName":2789,"dataGaLocation":3156},"https://gitlab.com/-/trials/new/","nav",{"altText":3158,"config":3159},"Icône GitLab",{"src":3160,"dataGaName":3161,"dataGaLocation":3156},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":3158,"config":3163},{"src":3164,"dataGaName":3161,"dataGaLocation":3156},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":3166,"config":3167},"Commencer",{"href":3168,"dataGaName":3169,"dataGaLocation":3156},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr/get-started/","get started",{"freeTrial":3171,"mobileIcon":3175,"desktopIcon":3177},{"text":3172,"config":3173},"En savoir plus sur GitLab Duo",{"href":2820,"dataGaName":3174,"dataGaLocation":3156},"gitlab duo",{"altText":3158,"config":3176},{"src":3160,"dataGaName":3161,"dataGaLocation":3156},{"altText":3158,"config":3178},{"src":3164,"dataGaName":3161,"dataGaLocation":3156},{"button":3180,"mobileIcon":3185,"desktopIcon":3187},{"text":3181,"config":3182},"/switch",{"href":3183,"dataGaName":3184,"dataGaLocation":3156},"#contact","switch",{"altText":3158,"config":3186},{"src":3160,"dataGaName":3161,"dataGaLocation":3156},{"altText":3158,"config":3188},{"src":3189,"dataGaName":3161,"dataGaLocation":3156},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":3191,"mobileIcon":3196,"desktopIcon":3198},{"text":3192,"config":3193},"Retour aux tarifs",{"href":2933,"dataGaName":3194,"dataGaLocation":3156,"icon":3195},"back to pricing","GoBack",{"altText":3158,"config":3197},{"src":3160,"dataGaName":3161,"dataGaLocation":3156},{"altText":3158,"config":3199},{"src":3164,"dataGaName":3161,"dataGaLocation":3156},{"title":3201,"button":3202,"config":3207},"Découvrez comment l'IA agentique transforme la livraison logicielle",{"text":3203,"config":3204},"Rejoindre GitLab Transcend en direct le 10 juin",{"href":3205,"dataGaName":3206,"dataGaLocation":2784},"/fr-fr/events/transcend/virtual/","transcend event",{"layout":3208,"disabled":2763},"release",{"data":3210},{"text":3211,"source":3212,"edit":3218,"contribute":3223,"config":3228,"items":3233,"minimal":3441},"Git est une marque déposée de Software Freedom Conservancy et notre utilisation de « GitLab » est sous licence.",{"text":3213,"config":3214},"Afficher le code source de la page",{"href":3215,"dataGaName":3216,"dataGaLocation":3217},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":3219,"config":3220},"Modifier cette page",{"href":3221,"dataGaName":3222,"dataGaLocation":3217},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":3224,"config":3225},"Veuillez contribuer",{"href":3226,"dataGaName":3227,"dataGaLocation":3217},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":3229,"facebook":3230,"youtube":3231,"linkedin":3232},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[3234,3281,3334,3378,3408],{"title":2931,"links":3235,"subMenu":3250},[3236,3240,3245],{"text":3237,"config":3238},"Voir les forfaits",{"href":2933,"dataGaName":3239,"dataGaLocation":3217},"view plans",{"text":3241,"config":3242},"GitLab Premium",{"href":3243,"dataGaName":3244,"dataGaLocation":3217},"/fr-fr/pricing/premium/","why premium",{"text":3246,"config":3247},"GitLab Ultimate",{"href":3248,"dataGaName":3249,"dataGaLocation":3217},"/fr-fr/pricing/ultimate/","why ultimate",[3251],{"title":3096,"links":3252},[3253,3256,3259,3261,3266,3271,3276],{"text":3254,"config":3255},"Contacter l'équipe commerciale",{"href":2793,"dataGaName":2794,"dataGaLocation":3217},{"text":3257,"config":3258},"Assistance GitLab",{"href":3108,"dataGaName":3109,"dataGaLocation":3217},{"text":3111,"config":3260},{"href":3113,"dataGaName":3114,"dataGaLocation":3217},{"text":3262,"config":3263},"Statut",{"href":3264,"dataGaName":3265,"dataGaLocation":3217},"https://status.gitlab.com/","status",{"text":3267,"config":3268},"Conditions d'utilisation",{"href":3269,"dataGaName":3270,"dataGaLocation":3217},"/terms/","terms of use",{"text":3272,"config":3273},"Politique de confidentialité",{"href":3274,"dataGaName":3275,"dataGaLocation":3217},"/fr-fr/privacy/","privacy statement",{"text":3277,"config":3278},"Gérer vos cookies",{"dataGaName":3279,"dataGaLocation":3217,"id":3280,"isOneTrustButton":188},"cookie preferences","ot-sdk-btn",{"title":2830,"links":3282,"subMenu":3291},[3283,3287],{"text":3284,"config":3285},"Plateforme DevSecOps",{"href":2813,"dataGaName":3286,"dataGaLocation":3217},"devsecops platform",{"text":3288,"config":3289},"Développement assisté par l'IA",{"href":2820,"dataGaName":3290,"dataGaLocation":3217},"ai-assisted development",[3292],{"title":3293,"links":3294},"Thèmes",[3295,3299,3304,3309,3314,3319,3324,3329],{"text":2774,"config":3296},{"href":3297,"dataGaName":3298,"dataGaLocation":3217},"/fr-fr/topics/ci-cd/","cicd",{"text":3300,"config":3301},"GitOps",{"href":3302,"dataGaName":3303,"dataGaLocation":3217},"/fr-fr/topics/gitops/","gitops",{"text":3305,"config":3306},"DevOps",{"href":3307,"dataGaName":3308,"dataGaLocation":3217},"/fr-fr/topics/devops/","devops",{"text":3310,"config":3311},"Contrôle de version",{"href":3312,"dataGaName":3313,"dataGaLocation":3217},"/fr-fr/topics/version-control/","version control",{"text":3315,"config":3316},"DevSecOps",{"href":3317,"dataGaName":3318,"dataGaLocation":3217},"/fr-fr/topics/devsecops/","devsecops",{"text":3320,"config":3321},"Cloud-native",{"href":3322,"dataGaName":3323,"dataGaLocation":3217},"/fr-fr/topics/cloud-native/","cloud native",{"text":3325,"config":3326},"IA pour la programmation",{"href":3327,"dataGaName":3328,"dataGaLocation":3217},"/fr-fr/topics/devops/ai-for-coding/","ai for coding",{"text":3330,"config":3331},"IA agentique",{"href":3332,"dataGaName":3333,"dataGaLocation":3217},"/fr-fr/topics/agentic-ai/","agentic ai",{"title":3335,"links":3336},"Solutions",[3337,3340,3342,3347,3350,3353,3356,3359,3362,3365,3368,3373],{"text":2874,"config":3338},{"href":2869,"dataGaName":3339,"dataGaLocation":3217},"Application Security Testing",{"text":2861,"config":3341},{"href":2846,"dataGaName":2847,"dataGaLocation":3217},{"text":3343,"config":3344},"Développement Agile",{"href":3345,"dataGaName":3346,"dataGaLocation":3217},"/fr-fr/solutions/agile-delivery/","agile delivery",{"text":2856,"config":3348},{"href":2858,"dataGaName":3349,"dataGaLocation":3217},"source code management",{"text":2774,"config":3351},{"href":2851,"dataGaName":3352,"dataGaLocation":3217},"continuous integration & delivery",{"text":2900,"config":3354},{"href":2902,"dataGaName":3355,"dataGaLocation":3217},"value stream management",{"text":3300,"config":3357},{"href":3358,"dataGaName":3303,"dataGaLocation":3217},"/fr-fr/solutions/gitops/",{"text":3360,"config":3361},"Entreprises",{"href":2916,"dataGaName":2917,"dataGaLocation":3217},{"text":3363,"config":3364},"PME",{"href":2922,"dataGaName":2923,"dataGaLocation":3217},{"text":3366,"config":3367},"Secteur public",{"href":2928,"dataGaName":2929,"dataGaLocation":3217},{"text":3369,"config":3370},"Éducation",{"href":3371,"dataGaName":3372,"dataGaLocation":3217},"/fr-fr/solutions/education/","education",{"text":3374,"config":3375},"Services financiers",{"href":3376,"dataGaName":3377,"dataGaLocation":3217},"/fr-fr/solutions/finance/","financial services",{"title":2936,"links":3379},[3380,3382,3384,3386,3389,3391,3394,3396,3398,3400,3402,3404,3406],{"text":2949,"config":3381},{"href":2951,"dataGaName":2952,"dataGaLocation":3217},{"text":2954,"config":3383},{"href":2956,"dataGaName":2957,"dataGaLocation":3217},{"text":2959,"config":3385},{"href":2961,"dataGaName":2962,"dataGaLocation":3217},{"text":2964,"config":3387},{"href":2966,"dataGaName":3388,"dataGaLocation":3217},"docs",{"text":2987,"config":3390},{"href":2989,"dataGaName":2990,"dataGaLocation":3217},{"text":3392,"config":3393},"Quoi de neuf",{"href":3037,"dataGaName":3038,"dataGaLocation":3217},{"text":2982,"config":3395},{"href":2984,"dataGaName":2985,"dataGaLocation":3217},{"text":2996,"config":3397},{"href":2998,"dataGaName":2999,"dataGaLocation":3217},{"text":3004,"config":3399},{"href":3006,"dataGaName":3007,"dataGaLocation":3217},{"text":3009,"config":3401},{"href":3011,"dataGaName":3012,"dataGaLocation":3217},{"text":3014,"config":3403},{"href":3016,"dataGaName":3017,"dataGaLocation":3217},{"text":3019,"config":3405},{"href":3021,"dataGaName":3022,"dataGaLocation":3217},{"text":3024,"config":3407},{"href":3026,"dataGaName":3027,"dataGaLocation":3217},{"title":3040,"links":3409},[3410,3412,3414,3416,3418,3420,3425,3430,3432,3434,3436],{"text":3048,"config":3411},{"href":3050,"dataGaName":3042,"dataGaLocation":3217},{"text":3053,"config":3413},{"href":3055,"dataGaName":3056,"dataGaLocation":3217},{"text":3061,"config":3415},{"href":3063,"dataGaName":3064,"dataGaLocation":3217},{"text":3066,"config":3417},{"href":3068,"dataGaName":3069,"dataGaLocation":3217},{"text":3071,"config":3419},{"href":3073,"dataGaName":3074,"dataGaLocation":3217},{"text":3421,"config":3422},"Développement durable",{"href":3423,"dataGaName":3424,"dataGaLocation":3217},"/sustainability/","Sustainability",{"text":3426,"config":3427},"Diversité, inclusion et appartenance (DIB)",{"href":3428,"dataGaName":3429,"dataGaLocation":3217},"/fr-fr/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":3076,"config":3431},{"href":3078,"dataGaName":3079,"dataGaLocation":3217},{"text":3086,"config":3433},{"href":3088,"dataGaName":3089,"dataGaLocation":3217},{"text":3091,"config":3435},{"href":3093,"dataGaName":3094,"dataGaLocation":3217},{"text":3437,"config":3438},"Déclaration de transparence sur l'esclavage moderne",{"href":3439,"dataGaName":3440,"dataGaLocation":3217},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":3442},[3443,3445,3448],{"text":3267,"config":3444},{"href":3269,"dataGaName":3270,"dataGaLocation":3217},{"text":3446,"config":3447},"Gestion des cookies",{"dataGaName":3279,"dataGaLocation":3217,"id":3280,"isOneTrustButton":188},{"text":3272,"config":3449},{"href":3274,"dataGaName":3275,"dataGaLocation":3217},[3451],{"id":3452,"title":7,"body":2762,"config":3453,"content":3456,"description":2762,"extension":3459,"meta":3460,"navigation":188,"path":3461,"seo":3462,"stem":3463,"__hash__":3464},"blogAuthors/en-us/blog/authors/paul-meresanu.yml",{"template":3454,"gitlabHandle":3455},"BlogAuthor","pmeresanu",{"name":7,"role":160,"config":3457},{"headshot":3458},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1750267141/qpw5ayteg0sewyh7s8xi.png","yml",{},"/en-us/blog/authors/paul-meresanu",{},"en-us/blog/authors/paul-meresanu","S41feQ9U81y4EVDx5pEECPqpIEiKTCDLBOmNwjLyE1E",[3466,3474,3482],{"title":3467,"description":3468,"heroImage":3469,"category":2758,"date":3470,"authors":3471,"slug":3473,"externalUrl":2762},"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",[3472],"Omid Khan","5-ways-gitlab-pipeline-logic-solves-real-engineering-problems",{"title":3475,"description":3476,"heroImage":3477,"category":2758,"date":3478,"authors":3479,"slug":3481,"externalUrl":2762},"Comment utiliser le registre de conteneurs GitLab avec les images durcies Docker","Simplifiez la gestion des images de conteneurs grâce à ce guide pas à pas.","https://res.cloudinary.com/about-gitlab-com/image/upload/f_auto,q_auto,c_lfill/v1772111172/mwhgbjawn62kymfwrhle.png","2026-04-01",[3480],"Tim Rizzi","using-gitlab-container-virtual-registry-with-docker-hardened-images",{"title":3483,"description":3484,"heroImage":3485,"category":2758,"date":3486,"authors":3487,"slug":3489,"externalUrl":2762},"GitLab Duo Agentic Chat : renforcez votre code avec les règles personnalisées","Découvrez comment l'IA peut comprendre votre code source, suivre vos conventions et générer du code prêt pour la production avec un minimum de cycles de revue.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750099203/Blog/Hero%20Images/Blog/Hero%20Images/blog-image-template-1800x945%20%2820%29_2bJGC5ZP3WheoqzlLT05C5_1750099203484.png","2026-02-10",[3488],"Michael Friedrich","custom-rules-duo-agentic-chat-deep-dive",{"promotions":3491},[3492,3506,3517,3529],{"id":3493,"categories":3494,"header":3496,"text":3497,"button":3498,"image":3503},"ai-modernization",[3495],"ai","L'IA tient-elle ses promesses à grande échelle ?","Le questionnaire ne prendra pas plus de 5 minutes.",{"text":3499,"config":3500},"Obtenez votre score de maturité IA",{"href":3501,"dataGaName":3502,"dataGaLocation":2990},"/fr-fr/assessments/ai-modernization-assessment/","modernization assessment",{"config":3504},{"src":3505},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":3507,"categories":3508,"header":3509,"text":3497,"button":3510,"image":3514},"devops-modernization",[2775,3318],"Vous contentez-vous de gérer des outils ou de livrer des innovations ?",{"text":3511,"config":3512},"Obtenez votre score de maturité DevOps",{"href":3513,"dataGaName":3502,"dataGaLocation":2990},"/fr-fr/assessments/devops-modernization-assessment/",{"config":3515},{"src":3516},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":3518,"categories":3519,"header":3521,"text":3497,"button":3522,"image":3526},"security-modernization",[3520],"security","Faut-il sacrifier la rapidité pour garantir la sécurité ?",{"text":3523,"config":3524},"Obtenez votre score de maturité en matière de sécurité",{"href":3525,"dataGaName":3502,"dataGaLocation":2990},"/fr-fr/assessments/security-modernization-assessment/",{"config":3527},{"src":3528},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":3530,"paths":3531,"header":3534,"text":3535,"button":3536,"image":3541},"github-azure-migration",[3532,3533],"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":3537,"config":3538},"Découvrez les différences entre GitLab et GitHub",{"href":3539,"dataGaName":3540,"dataGaLocation":2990},"/fr-fr/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":3542},{"src":3516},{"header":3544,"blurb":3545,"button":3546,"secondaryButton":3550},"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":2786,"config":3547},{"href":3548,"dataGaName":2789,"dataGaLocation":3549},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/fr-fr/","feature",{"text":3254,"config":3551},{"href":2793,"dataGaName":2794,"dataGaLocation":3549},1781392681041]