[{"data":1,"prerenderedAt":2209},["ShallowReactive",2],{"/fr-fr/blog/ci-deployment-and-environments":3,"navigation-fr-fr":1413,"banner-fr-fr":1847,"footer-fr-fr":1855,"blog-post-authors-fr-fr-Ivan Nemytchenko|Cesar Saavedra":2094,"blog-related-posts-fr-fr-ci-deployment-and-environments":2121,"blog-promotions-fr-fr":2146,"next-steps-fr-fr":2200},{"id":4,"title":5,"authors":6,"body":9,"category":1391,"date":1392,"description":1393,"extension":1394,"externalUrl":1395,"faq":1395,"featured":1396,"heroImage":1397,"meta":1398,"navigation":595,"path":1399,"seo":1400,"slug":1404,"stem":1405,"tags":1406,"template":1410,"updatedDate":1411,"__hash__":1412},"blogPosts/fr-fr/blog/ci-deployment-and-environments.md","Comment déployer du code dans des environnements multiples avec GitLab CI",[7,8],"Ivan Nemytchenko","Cesar Saavedra",{"type":10,"value":11,"toc":1373},"minimark",[12,31,39,42,45,50,70,73,121,124,132,152,161,165,173,183,211,214,221,237,281,287,290,306,314,381,384,389,395,401,404,410,414,417,471,474,481,484,488,491,500,503,509,513,529,557,563,572,730,739,745,749,762,917,920,927,930,936,939,943,946,949,960,964,967,973,979,998,1001,1019,1025,1028,1032,1039,1045,1062,1068,1071,1075,1078,1083,1091,1169,1190,1193,1200,1203,1220,1224,1231,1253,1331,1337,1341,1369],[13,14,15,16,23,24,30],"p",{},"Imaginez-vous gestionnaire d’un site d'information. Heureusement, le code de votre projet est déjà hébergé sur GitLab.com et vous utilisez ",[17,18,22],"a",{"href":19,"rel":20,"title":21},"https://docs.gitlab.com/ci/testing/",[],"Test avec GitLab CI/CD","GitLab CI/CD"," pour vos tests. Maintenant, vous souhaitez connaître toutes les possibilités de ",[17,25,29],{"href":26,"rel":27,"title":28},"https://about.gitlab.com/fr-fr/blog/how-to-keep-up-with-ci-cd-best-practices/",[],"Meilleures pratiques CI/CD","déploiement",".",[13,32,33,34,30],{},"Par souci de pertinence, supposons que l'application se compose uniquement de fichiers HTML, sans code côté serveur ni compilation sophistiquée des actifs JS. La plateforme de destination sera également générique, nous utiliserons ",[17,35,38],{"href":36,"rel":37,"title":38},"https://aws.amazon.com/fr/s3/",[],"Amazon S3",[13,40,41],{},"Plutôt que de fournir des extraits de code à copier-coller, nous allons vous partager les principes et les fonctionnalités de GitLab CI, afin que vous puissiez les appliquer dans votre propre pile technologique.",[13,43,44],{},"Déroulons donc notre histoire depuis son commencement, où il n'est pas encore question d'intégration continue.",[46,47,49],"h2",{"id":48},"la-ligne-de-départ","La ligne de départ",[13,51,52,56,57,63,64,69],{},[53,54,55],"strong",{},"Déploiement"," : un ensemble de fichiers HTML devraient apparaître dans votre bucket S3 (déjà configuré pour ",[17,58,62],{"href":59,"rel":60,"title":61},"https://docs.aws.amazon.com/fr_fr/AmazonS3/latest/userguide/HostingWebsiteOnS3Setup.html",[],"Héberger un site web statique avec Amazon S3","héberger un site web statique","). Il y a des millions de façons de procéder. Dans notre cas, nous utiliserons la bibliothèque ",[17,65,68],{"href":66,"rel":67,"title":68},"https://aws.amazon.com/fr/cli/",[],"AWS CLI"," fournie par Amazon.",[13,71,72],{},"La commande complète ressemble à ceci :",[74,75,80],"pre",{"className":76,"code":77,"language":78,"meta":79,"style":79},"language-shell shiki shiki-themes github-light","aws s3 cp ./ s3://yourbucket/ --recursive --exclude \"*\" --include \"*.html\"\n","shell","",[81,82,83],"code",{"__ignoreMap":79},[84,85,88,92,96,99,102,105,109,112,115,118],"span",{"class":86,"line":87},"line",1,[84,89,91],{"class":90},"s7eDp","aws",[84,93,95],{"class":94},"sYBdl"," s3",[84,97,98],{"class":94}," cp",[84,100,101],{"class":94}," ./",[84,103,104],{"class":94}," s3://yourbucket/",[84,106,108],{"class":107},"sYu0t"," --recursive",[84,110,111],{"class":107}," --exclude",[84,113,114],{"class":94}," \"*\"",[84,116,117],{"class":107}," --include",[84,119,120],{"class":94}," \"*.html\"\n",[13,122,123],{},"Le push du code vers le dépôt et le déploiement sont deux processus distincts.",[13,125,126,131],{},[127,128],"img",{"alt":129,"src":130},"Déploiement manuel","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674077/Blog/Content%20Images/19-updated.png","{: .center}",[13,133,134,135,140,141,144,145,148,149,30],{},"Détail important : la commande nécessite de ",[17,136,139],{"href":137,"rel":138},"https://docs.aws.amazon.com/fr_fr/cli/latest/userguide/cli-chap-getting-started.html",[],"fournir les variables d'environnement"," ",[81,142,143],{},"AWS_ACCESS_KEY_ID"," et ",[81,146,147],{},"AWS_SECRET_ACCESS_KEY",". Il vous faudra peut-être aussi spécifier ",[81,150,151],{},"AWS_DEFAULT_REGION",[13,153,154,155,30],{},"Essayons d'automatiser cette procédure avec ",[17,156,160],{"href":157,"rel":158,"title":159},"https://about.gitlab.com/fr-fr/solutions/continuous-integration/",[],"Intégration continue de GitLab","l'intégration continue de GitLab",[46,162,164],{"id":163},"votre-premier-déploiement-automatisé","Votre premier déploiement automatisé",[13,166,167,168,172],{},"GitLab CI offre une grande flexibilité dans l'exécution des commandes. Sa configuration s'adapte à vos besoins, reproduisant l'environnement de votre terminal local. Ajoutez votre script dans le fichier .gitlab-ci.yml et effectuez un push de votre code : l’outil d'intégration continue de GitLab déclenche un ",[169,170,171],"em",{},"job"," et vos commandes sont exécutées.",[13,174,175,176,178,179,182],{},"Précisons maintenant le contexte d'utilisation de cet exemple : il s'agit d'un site de taille modeste, avec une trentaine de visiteurs journaliers, et une seule branche principale de dépôt de code. Commençons par spécifier un ",[169,177,171],{}," avec la commande précédente dans le fichier ",[81,180,181],{},".gitlab-ci.yml"," :",[74,184,188],{"className":185,"code":186,"language":187,"meta":79,"style":79},"language-yaml shiki shiki-themes github-light","deploy:\n  script: aws s3 cp ./ s3://yourbucket/ --recursive --exclude \"*\" --include \"*.html\"\n\n","yaml",[81,189,190,200],{"__ignoreMap":79},[84,191,192,196],{"class":86,"line":87},[84,193,195],{"class":194},"shJU0","deploy",[84,197,199],{"class":198},"sgsFI",":\n",[84,201,203,206,209],{"class":86,"line":202},2,[84,204,205],{"class":194},"  script",[84,207,208],{"class":198},": ",[84,210,77],{"class":94},[13,212,213],{},"Oups, la commande a échoué :",[13,215,216,220],{},[127,217],{"alt":218,"src":219},"Message d'erreur lors de l'exécution d'un job GitLab.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398048/blog/Content%20Images/ci-deployment-and-environments/13.jpg","{: .shadow}",[13,222,223,224,226,227,230,231,234,235,182],{},"Il fallait d'abord vérifier l'existence d'un exécutable ",[81,225,91],{},". Pour installer ",[81,228,229],{},"awscli",", nous avons besoin de ",[81,232,233],{},"pip",", qui est un outil d'installation de paquets Python. Spécifions une image Docker avec Python préinstallé, qui devrait également contenir ",[81,236,233],{},[74,238,240],{"className":185,"code":239,"language":187,"meta":79,"style":79},"deploy:\n  image: python:latest\n  script:\n  - pip install awscli\n  - aws s3 cp ./ s3://yourbucket/ --recursive --exclude \"*\" --include \"*.html\"\n\n",[81,241,242,248,258,265,274],{"__ignoreMap":79},[84,243,244,246],{"class":86,"line":87},[84,245,195],{"class":194},[84,247,199],{"class":198},[84,249,250,253,255],{"class":86,"line":202},[84,251,252],{"class":194},"  image",[84,254,208],{"class":198},[84,256,257],{"class":94},"python:latest\n",[84,259,261,263],{"class":86,"line":260},3,[84,262,205],{"class":194},[84,264,199],{"class":198},[84,266,268,271],{"class":86,"line":267},4,[84,269,270],{"class":198},"  - ",[84,272,273],{"class":94},"pip install awscli\n",[84,275,277,279],{"class":86,"line":276},5,[84,278,270],{"class":198},[84,280,77],{"class":94},[13,282,283,131],{},[127,284],{"alt":285,"src":286},"Déploiement automatisé","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398050/blog/Content%20Images/ci-deployment-and-environments/fail1.png",[13,288,289],{},"Vous effectuez un push de votre code sur GitLab, et il est automatiquement déployé par l’outil CI.",[13,291,292,293,295,296,302,303,305],{},"L'installation d'",[81,294,229],{}," rallonge le temps d'exécution du job, mais pour l'instant ce n'est pas un souci. Pour accélérer le processus, ",[17,297,301],{"href":298,"rel":299,"title":300},"https://hub.docker.com/",[],"Chercher une image Docker","cherchez une image Docker"," avec ",[81,304,229],{}," préinstallé, ou créez une image vous-même.",[13,307,308,309,182],{},"N’oublions pas les variables d'environnement récupérées depuis la ",[17,310,313],{"href":311,"rel":312},"https://console.aws.amazon.com/",[],"console AWS",[74,315,317],{"className":185,"code":316,"language":187,"meta":79,"style":79},"variables:\n  AWS_ACCESS_KEY_ID: \"AKIAIOSFODNN7EXAMPLE\"\n  AWS_SECRET_ACCESS_KEY: \"wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY\"\ndeploy:\n  image: python:latest\n  script:\n  - pip install awscli\n  - aws s3 cp ./ s3://yourbucket/ --recursive --exclude \"*\" --include \"*.html\"\n\n",[81,318,319,326,336,346,352,360,367,374],{"__ignoreMap":79},[84,320,321,324],{"class":86,"line":87},[84,322,323],{"class":194},"variables",[84,325,199],{"class":198},[84,327,328,331,333],{"class":86,"line":202},[84,329,330],{"class":194},"  AWS_ACCESS_KEY_ID",[84,332,208],{"class":198},[84,334,335],{"class":94},"\"AKIAIOSFODNN7EXAMPLE\"\n",[84,337,338,341,343],{"class":86,"line":260},[84,339,340],{"class":194},"  AWS_SECRET_ACCESS_KEY",[84,342,208],{"class":198},[84,344,345],{"class":94},"\"wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY\"\n",[84,347,348,350],{"class":86,"line":267},[84,349,195],{"class":194},[84,351,199],{"class":198},[84,353,354,356,358],{"class":86,"line":276},[84,355,252],{"class":194},[84,357,208],{"class":198},[84,359,257],{"class":94},[84,361,363,365],{"class":86,"line":362},6,[84,364,205],{"class":194},[84,366,199],{"class":198},[84,368,370,372],{"class":86,"line":369},7,[84,371,270],{"class":198},[84,373,273],{"class":94},[84,375,377,379],{"class":86,"line":376},8,[84,378,270],{"class":198},[84,380,77],{"class":94},[13,382,383],{},"Cela devrait fonctionner, mais attention : ce n'est jamais une bonne idée de dévoiler des clés secrètes de votre code, même dans un dépôt privé. Remédions donc à cette situation.",[385,386,388],"h3",{"id":387},"des-secrets-bien-gardés","Des secrets bien gardés",[13,390,391,392,30],{},"GitLab dispose d’un endroit spécialement dédié aux variables secrètes : ",[53,393,394],{},"Paramètres > CI/CD > Variables",[13,396,397],{},[127,398],{"alt":399,"src":400},"Ajouter une variable secrète dans GitLab","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674076/Blog/Content%20Images/add-variable-updated.png",[13,402,403],{},"Tout ce que vous y mettez se transforme en variables d'environnement. En cochant la case « Masquée », vous masquerez la variable dans les job logs. En cochant la case « Protéger la variable », vous n’exporterez la variable uniquement vers les pipelines s'exécutant sur des branches et des étiquettes protégées.",[13,405,406,407,409],{},"Seuls les utilisateurs ayant le statut de propriétaire ou de chargé de maintenance sur un projet auront accès à cette section. Nous pourrions supprimer la section ",[81,408,323],{}," de notre configuration CI, mais nous allons l'utiliser à d'autres fins.",[385,411,413],{"id":412},"savoir-spécifier-et-utiliser-des-variables-non-secrètes","Savoir spécifier et utiliser des variables non-secrètes",[13,415,416],{},"Lorsque votre configuration s'agrandit, il devient pratique de conserver certains paramètres sous formes de variables au début de votre configuration. Le cas présent ne le justifie pas, mais pour les besoins de cette démonstration, nous allons définir le nom du compartiment S3 comme variable :",[74,418,420],{"className":185,"code":419,"language":187,"meta":79,"style":79},"variables:\n  S3_BUCKET_NAME: \"yourbucket\"\ndeploy:\n  image: python:latest\n  script:\n  - pip install awscli\n  - aws s3 cp ./ s3://$S3_BUCKET_NAME/ --recursive --exclude \"*\" --include \"*.html\"\n\n",[81,421,422,428,438,444,452,458,464],{"__ignoreMap":79},[84,423,424,426],{"class":86,"line":87},[84,425,323],{"class":194},[84,427,199],{"class":198},[84,429,430,433,435],{"class":86,"line":202},[84,431,432],{"class":194},"  S3_BUCKET_NAME",[84,434,208],{"class":198},[84,436,437],{"class":94},"\"yourbucket\"\n",[84,439,440,442],{"class":86,"line":260},[84,441,195],{"class":194},[84,443,199],{"class":198},[84,445,446,448,450],{"class":86,"line":267},[84,447,252],{"class":194},[84,449,208],{"class":198},[84,451,257],{"class":94},[84,453,454,456],{"class":86,"line":276},[84,455,205],{"class":194},[84,457,199],{"class":198},[84,459,460,462],{"class":86,"line":362},[84,461,270],{"class":198},[84,463,273],{"class":94},[84,465,466,468],{"class":86,"line":369},[84,467,270],{"class":198},[84,469,470],{"class":94},"aws s3 cp ./ s3://$S3_BUCKET_NAME/ --recursive --exclude \"*\" --include \"*.html\"\n",[13,472,473],{},"Jusqu'ici, tout va bien :",[13,475,476,480],{},[127,477],{"alt":478,"src":479},"Compilation GitLab CI sans erreur","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398050/blog/Content%20Images/ci-deployment-and-environments/14.jpg","{: .shadow.medium.center}",[13,482,483],{},"Dans notre scénario, la fréquentation du site est en hausse, et vous avez embauché un développeur pour vous aider. Voyons comment le workflow GitLab CI s'adapte au travail en équipe.",[46,485,487],{"id":486},"comment-utiliser-gitlab-ci-en-équipe","Comment utiliser GitLab CI en équipe",[13,489,490],{},"Avec deux utilisateurs travaillant dans le même dépôt, il n'est plus pratique d'utiliser la branche principale pour le développement. Vous décidez d'utiliser des branches séparées pour les nouvelles fonctionnalités et les nouveaux articles, et de les fusionner dans la branche principale lorsqu'elles sont prêtes.",[13,492,493,494,497,498,30],{},"Cependant, votre configuration CI actuelle ne prend pas en charge les branches. Chaque push effectué vers GitLab sera déployé sur S3. La solution est simple : il suffit d'ajouter ",[81,495,496],{},"only: main"," au job ",[81,499,195],{},[13,501,502],{},"En plus de ne pas vouloir déployer chaque branche sur l’environnement de production, vous souhaiteriez pouvoir prévisualiser vos modifications depuis les branches de fonctionnalités.",[13,504,505,131],{},[127,506],{"alt":507,"src":508},"Déploiement de la branche principale de GitLab vers AWS S3","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674076/Blog/Content%20Images/15-updated.png",[385,510,512],{"id":511},"comment-configurer-un-environnement-de-test","Comment configurer un environnement de test ?",[13,514,515,516,521,522,528],{},"Matteo, votre nouveau développeur, vous propose d'utiliser la fonctionnalité ",[17,517,520],{"href":518,"rel":519,"title":520},"https://docs.gitlab.com/user/project/pages/",[],"GitLab Pages",", idéale pour prévisualiser votre travail en cours. Afin d'",[17,523,527],{"href":524,"rel":525,"title":526},"https://docs.gitlab.com/user/project/pages/getting_started/pages_ui/",[],"Héberger des sites web sur GitLab Pages","héberger des sites web sur GitLab Pages",", votre fichier de configuration CI doit répondre à trois règles simples :",[530,531,532,542,552],"ul",{},[533,534,535,536,538,539],"li",{},"Le ",[169,537,171],{}," doit être nommé ",[81,540,541],{},"pages",[533,543,544,545,548,549],{},"Il doit y avoir une section ",[81,546,547],{},"artifacts"," avec un dossier ",[81,550,551],{},"public",[533,553,554,555],{},"Tout ce que vous souhaitez héberger doit être placé dans le dossier ",[81,556,551],{},[13,558,559,560],{},"Le contenu du dossier public sera hébergé à l'adresse suivante : ",[81,561,562],{},"http://\u003Cusername>.gitlab.io/\u003Cprojectname>/",[13,564,565,566,182],{},"Voici la configuration complète après avoir appliqué l’",[17,567,571],{"href":568,"rel":569,"title":570},"https://gitlab.com/pages/plain-html/-/blob/main/.gitlab-ci.yml",[],"Exemple de configuration pour les sites web en HTML","exemple de configuration pour les sites web en HTML",[74,573,575],{"className":185,"code":574,"language":187,"meta":79,"style":79},"variables:\n  S3_BUCKET_NAME: \"yourbucket\"\n\ndeploy:\n  image: python:latest\n  script:\n  - pip install awscli\n  - aws s3 cp ./ s3://$S3_BUCKET_NAME/ --recursive --exclude \"*\" --include \"*.html\"\n  only:\n  - main\n\npages:\n  image: alpine:latest\n  script:\n  - mkdir -p ./public\n  - cp ./*.html ./public/\n  artifacts:\n    paths:\n    - public\n  except:\n  - main\n\n",[81,576,577,583,591,597,603,611,617,623,629,637,645,650,657,667,674,682,690,698,706,715,723],{"__ignoreMap":79},[84,578,579,581],{"class":86,"line":87},[84,580,323],{"class":194},[84,582,199],{"class":198},[84,584,585,587,589],{"class":86,"line":202},[84,586,432],{"class":194},[84,588,208],{"class":198},[84,590,437],{"class":94},[84,592,593],{"class":86,"line":260},[84,594,596],{"emptyLinePlaceholder":595},true,"\n",[84,598,599,601],{"class":86,"line":267},[84,600,195],{"class":194},[84,602,199],{"class":198},[84,604,605,607,609],{"class":86,"line":276},[84,606,252],{"class":194},[84,608,208],{"class":198},[84,610,257],{"class":94},[84,612,613,615],{"class":86,"line":362},[84,614,205],{"class":194},[84,616,199],{"class":198},[84,618,619,621],{"class":86,"line":369},[84,620,270],{"class":198},[84,622,273],{"class":94},[84,624,625,627],{"class":86,"line":376},[84,626,270],{"class":198},[84,628,470],{"class":94},[84,630,632,635],{"class":86,"line":631},9,[84,633,634],{"class":194},"  only",[84,636,199],{"class":198},[84,638,640,642],{"class":86,"line":639},10,[84,641,270],{"class":198},[84,643,644],{"class":94},"main\n",[84,646,648],{"class":86,"line":647},11,[84,649,596],{"emptyLinePlaceholder":595},[84,651,653,655],{"class":86,"line":652},12,[84,654,541],{"class":194},[84,656,199],{"class":198},[84,658,660,662,664],{"class":86,"line":659},13,[84,661,252],{"class":194},[84,663,208],{"class":198},[84,665,666],{"class":94},"alpine:latest\n",[84,668,670,672],{"class":86,"line":669},14,[84,671,205],{"class":194},[84,673,199],{"class":198},[84,675,677,679],{"class":86,"line":676},15,[84,678,270],{"class":198},[84,680,681],{"class":94},"mkdir -p ./public\n",[84,683,685,687],{"class":86,"line":684},16,[84,686,270],{"class":198},[84,688,689],{"class":94},"cp ./*.html ./public/\n",[84,691,693,696],{"class":86,"line":692},17,[84,694,695],{"class":194},"  artifacts",[84,697,199],{"class":198},[84,699,701,704],{"class":86,"line":700},18,[84,702,703],{"class":194},"    paths",[84,705,199],{"class":198},[84,707,709,712],{"class":86,"line":708},19,[84,710,711],{"class":198},"    - ",[84,713,714],{"class":94},"public\n",[84,716,718,721],{"class":86,"line":717},20,[84,719,720],{"class":194},"  except",[84,722,199],{"class":198},[84,724,726,728],{"class":86,"line":725},21,[84,727,270],{"class":198},[84,729,644],{"class":94},[13,731,732,733,735,736,738],{},"Nous avons spécifié deux jobs. L'un d'eux déploie le site web pour vos clients sur S3 (",[81,734,195],{},"). L'autre (",[81,737,541],{},") déploie le site web sur GitLab Pages. Nommons-les « Environnement de production » et « Environnement de préproduction ». Toutes les branches seront déployées sur GitLab Pages, à l'exception de la branche principale.",[13,740,741,131],{},[127,742],{"alt":743,"src":744},"Déploiement différencié des branches dans GitLab Pages et S3.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674076/Blog/Content%20Images/16-updated.png",[46,746,748],{"id":747},"introduction-aux-environnements","Introduction aux environnements",[13,750,751,752,758,759,761],{},"GitLab offre la prise en charge de ",[17,753,757],{"href":754,"rel":755,"title":756},"https://docs.gitlab.com/ci/environments/",[],"Environnements GitLab","nombreux environnements"," (dynamiques ou statiques) ; vous devez simplement spécifier l'environnement correspondant pour chaque ",[169,760,171],{}," de déploiement :",[74,763,765],{"className":185,"code":764,"language":187,"meta":79,"style":79},"variables:\n  S3_BUCKET_NAME: \"yourbucket\"\n\ndeploy to production:\n  environment: production\n  image: python:latest\n  script:\n  - pip install awscli\n  - aws s3 cp ./ s3://$S3_BUCKET_NAME/ --recursive --exclude \"*\" --include \"*.html\"\n  only:\n  - main\n\npages:\n  image: alpine:latest\n  environment: staging\n  script:\n  - mkdir -p ./public\n  - cp ./*.html ./public/\n  artifacts:\n    paths:\n    - public\n  except:\n  - main\n\n",[81,766,767,773,781,785,792,802,810,816,822,828,834,840,844,850,858,867,873,879,885,891,897,903,910],{"__ignoreMap":79},[84,768,769,771],{"class":86,"line":87},[84,770,323],{"class":194},[84,772,199],{"class":198},[84,774,775,777,779],{"class":86,"line":202},[84,776,432],{"class":194},[84,778,208],{"class":198},[84,780,437],{"class":94},[84,782,783],{"class":86,"line":260},[84,784,596],{"emptyLinePlaceholder":595},[84,786,787,790],{"class":86,"line":267},[84,788,789],{"class":194},"deploy to production",[84,791,199],{"class":198},[84,793,794,797,799],{"class":86,"line":276},[84,795,796],{"class":194},"  environment",[84,798,208],{"class":198},[84,800,801],{"class":94},"production\n",[84,803,804,806,808],{"class":86,"line":362},[84,805,252],{"class":194},[84,807,208],{"class":198},[84,809,257],{"class":94},[84,811,812,814],{"class":86,"line":369},[84,813,205],{"class":194},[84,815,199],{"class":198},[84,817,818,820],{"class":86,"line":376},[84,819,270],{"class":198},[84,821,273],{"class":94},[84,823,824,826],{"class":86,"line":631},[84,825,270],{"class":198},[84,827,470],{"class":94},[84,829,830,832],{"class":86,"line":639},[84,831,634],{"class":194},[84,833,199],{"class":198},[84,835,836,838],{"class":86,"line":647},[84,837,270],{"class":198},[84,839,644],{"class":94},[84,841,842],{"class":86,"line":652},[84,843,596],{"emptyLinePlaceholder":595},[84,845,846,848],{"class":86,"line":659},[84,847,541],{"class":194},[84,849,199],{"class":198},[84,851,852,854,856],{"class":86,"line":669},[84,853,252],{"class":194},[84,855,208],{"class":198},[84,857,666],{"class":94},[84,859,860,862,864],{"class":86,"line":676},[84,861,796],{"class":194},[84,863,208],{"class":198},[84,865,866],{"class":94},"staging\n",[84,868,869,871],{"class":86,"line":684},[84,870,205],{"class":194},[84,872,199],{"class":198},[84,874,875,877],{"class":86,"line":692},[84,876,270],{"class":198},[84,878,681],{"class":94},[84,880,881,883],{"class":86,"line":700},[84,882,270],{"class":198},[84,884,689],{"class":94},[84,886,887,889],{"class":86,"line":708},[84,888,695],{"class":194},[84,890,199],{"class":198},[84,892,893,895],{"class":86,"line":717},[84,894,703],{"class":194},[84,896,199],{"class":198},[84,898,899,901],{"class":86,"line":725},[84,900,711],{"class":198},[84,902,714],{"class":94},[84,904,906,908],{"class":86,"line":905},22,[84,907,720],{"class":194},[84,909,199],{"class":198},[84,911,913,915],{"class":86,"line":912},23,[84,914,270],{"class":198},[84,916,644],{"class":94},[13,918,919],{},"GitLab garde une trace de tous vos déploiements. Ainsi, vous savez toujours ce qui est actuellement déployé sur vos serveurs :",[13,921,922,926],{},[127,923],{"alt":924,"src":925},"Visualisation des environnements sur GitLab CI/CD.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674076/Blog/Content%20Images/envs-updated.png","{: .shadow.center}",[13,928,929],{},"L'historique complet de vos déploiements sur chacun de vos environnements actuels vous est aussi fourni :",[13,931,932,926],{},[127,933],{"alt":934,"src":935},"Historique des déploiements GitLab.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674077/Blog/Content%20Images/staging-env-detail-updated.png",[13,937,938],{},"Maintenant que tout est automatisé et configuré, de nouveaux défis nous attendent.",[46,940,942],{"id":941},"comment-dépanner-les-déploiements","Comment dépanner les déploiements ?",[13,944,945],{},"Oups ! La branche de fonctionnalités que vous avez poussé sur l'environnement de préproduction vient d'être remplacée par celle de Matteo, qui vient d'effectuer un push de sa propre branche. L'énervement vous gagne, c'est la troisième fois que cela arrive aujourd'hui !",[13,947,948],{},"Et si vous utilisiez Slack pour notifier vos déploiements, afin d'éviter ce genre de désagrément ?",[950,951,952],"blockquote",{},[13,953,954,955,30],{},"Recevez des notifications en utilisant l'",[17,956,959],{"href":957,"rel":958},"https://docs.gitlab.com/user/project/integrations/gitlab_slack_application/",[],"application GitLab pour Slack",[46,961,963],{"id":962},"du-travail-déquipe-à-grande-échelle","Du travail d'équipe à grande échelle",[13,965,966],{},"Quelque temps plus tard, et vous voilà à la tête d'un site web très populaire, et d'une équipe de huit personnes. Mais, désormais, les membres de votre équipe perdent un temps précieux à attendre de pouvoir prévisualiser leur travail. Le déploiement de chaque branche en préproduction n'est plus optimal.",[13,968,969,131],{},[127,970],{"alt":971,"src":972},"File d'attente de branches à examiner en préproduction","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398050/blog/Content%20Images/ci-deployment-and-environments/build.png",[13,974,975,976,978],{},"Il est temps de perfectionner le système. Vous convenez avec votre équipe de fusionner au préalable chaque changement sur la branche de préproduction. La modification du fichier ",[81,977,181],{}," est minime :",[74,980,982],{"className":185,"code":981,"language":187,"meta":79,"style":79},"except:\n- main\n",[81,983,984,991],{"__ignoreMap":79},[84,985,986,989],{"class":86,"line":87},[84,987,988],{"class":194},"except",[84,990,199],{"class":198},[84,992,993,996],{"class":86,"line":202},[84,994,995],{"class":198},"- ",[84,997,644],{"class":94},[13,999,1000],{},"est remplacé par",[74,1002,1004],{"className":185,"code":1003,"language":187,"meta":79,"style":79},"only:\n- staging\n",[81,1005,1006,1013],{"__ignoreMap":79},[84,1007,1008,1011],{"class":86,"line":87},[84,1009,1010],{"class":194},"only",[84,1012,199],{"class":198},[84,1014,1015,1017],{"class":86,"line":202},[84,1016,995],{"class":198},[84,1018,866],{"class":94},[13,1020,1021,131],{},[127,1022],{"alt":1023,"src":1024},"Dessin de développeurs qui fusionnent leurs changements dans une branche de préproduction avant de les déployer sur S3","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674077/Blog/Content%20Images/17-updated.png",[13,1026,1027],{},"Vos collaborateurs doivent fusionner leurs branches de fonctionnalités avant de prévisualiser leur travail en préproduction. Cela nécessite plus de temps et d'efforts, mais tout le monde s'accorde à dire que c'est toujours mieux que d'attendre.",[46,1029,1031],{"id":1030},"comment-gérer-les-urgences","Comment gérer les urgences ?",[13,1033,1034,1035,1038],{},"Il arrive parfois que les choses tournent mal. Quelqu'un a mal fusionné des branches et a effectué un push du résultat directement en production, juste au moment où le hashtag de votre site devenait viral sur les réseaux sociaux. Des milliers de personnes voient des visuels cassés au lieu de votre page d'accueil habituelle. Heureusement, la fonction ",[53,1036,1037],{},"Restaurer l’environnement"," a permis de résoudre le problème en moins d'une minute.",[13,1040,1041,926],{},[127,1042],{"alt":1043,"src":1044},"Fonctionnalité de restauration sur la plateforme GitLab","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674077/Blog/Content%20Images/18-updated.png",[13,1046,1047,1048,1051,1052,1054,1055,1058,1059,182],{},"La fonction de restauration de l'environnement relance le job précédent avec la validation précédente. Vous avez décidé de désactiver le déploiement automatique en production et de passer au déploiement manuel. Pour ce faire, vous devez ajouter  ",[81,1049,1050],{},"when : manual"," à votre ",[169,1053,171],{},". Il n'y aura effectivement plus de déploiement automatique en production. Le déploiement manuel s'effectue en allant dans ",[53,1056,1057],{},"Compilation > Pipelines",", et en cliquant sur ",[53,1060,1061],{},"« Exécuter des jobs manuels ou différés »",[13,1063,1064,926],{},[127,1065],{"alt":1066,"src":1067},"Déploiement manuel sur GitLab.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674077/Blog/Content%20Images/prod-env-rollback-arrow-updated.png",[13,1069,1070],{},"Effectuons maintenant un bond en avant dans le temps. Votre entreprise est devenue une société de plusieurs centaines d'employés travaillant sur le site web, et les compromis précédents ne fonctionnent plus.",[385,1072,1074],{"id":1073},"faire-ses-premiers-pas-avec-les-review-apps","Faire ses premiers pas avec les Review Apps",[13,1076,1077],{},"Logiquement, la nouvelle étape consiste à lancer une instance temporaire de l'application par branche de fonctionnalités pour la revue. Pour cela, nous avons configuré un autre bucket S3. Sa seule particularité est que le contenu du site est placé dans un dossier portant le nom de la branche de développement, de sorte que l’URL ressemble à :",[13,1079,1080],{},[81,1081,1082],{},"http://\u003CREVIEW_S3_BUCKET_NAME>.s3-website-us-east-1.amazonaws.com/\u003Cbranchname>/",[13,1084,1085,1086,140,1088,1090],{},"Voici le remplacement du ",[169,1087,171],{},[81,1089,541],{}," utilisé auparavant :",[74,1092,1094],{"className":185,"code":1093,"language":187,"meta":79,"style":79},"review apps:\n  variables:\n    S3_BUCKET_NAME: \"reviewbucket\"\n  image: python:latest\n  environment: review\n  script:\n  - pip install awscli\n  - mkdir -p ./$CI_BUILD_REF_NAME\n  - cp ./*.html ./$CI_BUILD_REF_NAME/\n  - aws s3 cp ./ s3://$S3_BUCKET_NAME/ --recursive --exclude \"*\" --include \"*.html\"\n\n",[81,1095,1096,1103,1110,1120,1128,1137,1143,1149,1156,1163],{"__ignoreMap":79},[84,1097,1098,1101],{"class":86,"line":87},[84,1099,1100],{"class":194},"review apps",[84,1102,199],{"class":198},[84,1104,1105,1108],{"class":86,"line":202},[84,1106,1107],{"class":194},"  variables",[84,1109,199],{"class":198},[84,1111,1112,1115,1117],{"class":86,"line":260},[84,1113,1114],{"class":194},"    S3_BUCKET_NAME",[84,1116,208],{"class":198},[84,1118,1119],{"class":94},"\"reviewbucket\"\n",[84,1121,1122,1124,1126],{"class":86,"line":267},[84,1123,252],{"class":194},[84,1125,208],{"class":198},[84,1127,257],{"class":94},[84,1129,1130,1132,1134],{"class":86,"line":276},[84,1131,796],{"class":194},[84,1133,208],{"class":198},[84,1135,1136],{"class":94},"review\n",[84,1138,1139,1141],{"class":86,"line":362},[84,1140,205],{"class":194},[84,1142,199],{"class":198},[84,1144,1145,1147],{"class":86,"line":369},[84,1146,270],{"class":198},[84,1148,273],{"class":94},[84,1150,1151,1153],{"class":86,"line":376},[84,1152,270],{"class":198},[84,1154,1155],{"class":94},"mkdir -p ./$CI_BUILD_REF_NAME\n",[84,1157,1158,1160],{"class":86,"line":631},[84,1159,270],{"class":198},[84,1161,1162],{"class":94},"cp ./*.html ./$CI_BUILD_REF_NAME/\n",[84,1164,1165,1167],{"class":86,"line":639},[84,1166,270],{"class":198},[84,1168,470],{"class":94},[13,1170,1171,1172,1175,1176,1182,1183,1186,1187,1189],{},"Ici, il est bon de connaître l'origine de cette variable ",[81,1173,1174],{},"$CI_BUILD_REF_NAME",". GitLab prédéfinit de ",[17,1177,1181],{"href":1178,"rel":1179,"title":1180},"https://docs.gitlab.com/ci/variables/predefined_variables/",[],"Variables d'environnement dans GitLab","nombreuses variables d'environnement"," à utiliser dans vos jobs. Notez que nous avons défini la variable ",[81,1184,1185],{},"S3_BUCKET_NAME"," à l'intérieur du ",[169,1188,171],{},". Vous pouvez ainsi réécrire les définitions de niveau supérieur.",[13,1191,1192],{},"Représentation visuelle de la configuration des Review Apps :",[13,1194,1195,1199],{},[127,1196],{"alt":1197,"src":1198},"Dessin représentant la configuration Review Apps de GitLab.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674076/Blog/Content%20Images/manual-pipeline-arrow-updated.png","{: .illustration}",[13,1201,1202],{},"Les détails de l'implémentation des Review Apps varient selon votre pile technologique et de votre processus de déploiement. Tout ne sera pas aussi simple qu'avec un site HTML statique. Programmer des instances temporaires à la volée avec tous les logiciels et services requis n'est pas chose aisée. Mais tout cela peut être accompli, notamment à l'aide des conteneurs Docker, Chef ou Ansible.",[13,1204,1205,1206,1212,1213,1219],{},"Le déploiement avec ",[17,1207,1211],{"href":1208,"rel":1209,"title":1210},"https://about.gitlab.com/fr-fr/blog/what-is-docker-comprehensive-guide/",[],"Qu'est-ce que Docker ?","Docker"," mériterait d'ailleurs un article complet. Et si vous regrettez l'absence de scénarios plus complexes qu'un simple déploiement en HTML statique, nous vous recommandons de lire ",[17,1214,1218],{"href":1215,"rel":1216,"title":1217},"https://about.gitlab.com/blog/building-an-elixir-release-into-docker-image-using-gitlab-ci-part-1/",[],"Construire une version d'Elixir dans une image Docker en utilisant GitLab CI - Partie 1","cet article",". Abordons maintenant un dernier sujet.",[385,1221,1223],{"id":1222},"déployer-sur-différentes-plateformes","Déployer sur différentes plateformes",[13,1225,1226,1227,1230],{},"Dans la pratique, nous ne sommes pas limités à S3 et à GitLab Pages. Nous hébergeons et déployons nos applications sur différents services. De plus, si vous décidez un jour de passer à une nouvelle plateforme, vous devrez alors réécrire tous vos scripts de déploiement. Vous pourrez alors utiliser une petite merveille appelée ",[81,1228,1229],{},"dpl"," pour vous faciliter la tâche.",[13,1232,1233,1234,1236,1237,1239,1240,1246,1247,1249,1250,1252],{},"Jusqu'ici, nous avons utilisé ",[81,1235,229],{}," pour livrer du code à un service comme Amazon S3. Quel que soit le système utilisé, le principe reste le même : vous exécutez une commande avec certains paramètres et transmettez une clé secrète d'authentification. L'outil de déploiement ",[81,1238,1229],{}," utilise ce principe et fournit une interface unique pour cette ",[17,1241,1245],{"href":1242,"rel":1243,"title":1244},"https://github.com/travis-ci/dpl#supported-providers",[],"Liste de fournisseurs","liste de fournisseurs",". Voici à quoi ressemblerait le déploiement d’un ",[169,1248,171],{}," en production avec ",[81,1251,1229],{},":",[74,1254,1256],{"className":185,"code":1255,"language":187,"meta":79,"style":79},"variables:\n  S3_BUCKET_NAME: \"yourbucket\"\n\ndeploy to production:\n  environment: production\n  image: ruby:latest\n  script:\n  - gem install dpl\n  - dpl --provider=s3 --bucket=$S3_BUCKET_NAME\n  only:\n  - main\n\n",[81,1257,1258,1264,1272,1276,1282,1290,1299,1305,1312,1319,1325],{"__ignoreMap":79},[84,1259,1260,1262],{"class":86,"line":87},[84,1261,323],{"class":194},[84,1263,199],{"class":198},[84,1265,1266,1268,1270],{"class":86,"line":202},[84,1267,432],{"class":194},[84,1269,208],{"class":198},[84,1271,437],{"class":94},[84,1273,1274],{"class":86,"line":260},[84,1275,596],{"emptyLinePlaceholder":595},[84,1277,1278,1280],{"class":86,"line":267},[84,1279,789],{"class":194},[84,1281,199],{"class":198},[84,1283,1284,1286,1288],{"class":86,"line":276},[84,1285,796],{"class":194},[84,1287,208],{"class":198},[84,1289,801],{"class":94},[84,1291,1292,1294,1296],{"class":86,"line":362},[84,1293,252],{"class":194},[84,1295,208],{"class":198},[84,1297,1298],{"class":94},"ruby:latest\n",[84,1300,1301,1303],{"class":86,"line":369},[84,1302,205],{"class":194},[84,1304,199],{"class":198},[84,1306,1307,1309],{"class":86,"line":376},[84,1308,270],{"class":198},[84,1310,1311],{"class":94},"gem install dpl\n",[84,1313,1314,1316],{"class":86,"line":631},[84,1315,270],{"class":198},[84,1317,1318],{"class":94},"dpl --provider=s3 --bucket=$S3_BUCKET_NAME\n",[84,1320,1321,1323],{"class":86,"line":639},[84,1322,634],{"class":194},[84,1324,199],{"class":198},[84,1326,1327,1329],{"class":86,"line":647},[84,1328,270],{"class":198},[84,1330,644],{"class":94},[13,1332,1333,1334,1336],{},"En cas de déploiement sur plusieurs systèmes ou de changements fréquents de plateforme de destination, ",[81,1335,1229],{}," vous aide à uniformiser vos scripts de déploiement.",[46,1338,1340],{"id":1339},"cinq-points-clés-à-retenir","Cinq points clés à retenir",[1342,1343,1344,1347,1360,1363,1366],"ol",{},[533,1345,1346],{},"Un déploiement est une commande (ou un ensemble de commandes) régulièrement exécutée. Il peut donc être exécuté dans GitLab CI.",[533,1348,1349,1350,30],{},"La plupart des commandes à exécuter nécessitent de fournir une ou plusieurs clés secrètes, que vous stockez dans ",[53,1351,1352,1353,1359],{},"Paramètres > ",[17,1354,1358],{"href":1355,"rel":1356,"title":1357},"https://about.gitlab.com/fr-fr/topics/ci-cd/",[],"Qu'est-ce que le CI/CD ?","CI/CD"," > Variables",[533,1361,1362],{},"Avec GitLab CI, vous pouvez spécifier de façon flexible les branches vers lesquelles vous déployez votre code.",[533,1364,1365],{},"GitLab conserve l'historique des déploiements dans tous vos environnements, et vous permet de revenir à n'importe quelle version précédente.",[533,1367,1368],{},"Pour les éléments critiques de votre infrastructure, vous pouvez activer le déploiement manuel depuis l'interface de GitLab, au lieu du déploiement automatisé.",[1370,1371,1372],"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 .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}",{"title":79,"searchDepth":202,"depth":202,"links":1374},[1375,1376,1380,1383,1384,1385,1386,1390],{"id":48,"depth":202,"text":49},{"id":163,"depth":202,"text":164,"children":1377},[1378,1379],{"id":387,"depth":260,"text":388},{"id":412,"depth":260,"text":413},{"id":486,"depth":202,"text":487,"children":1381},[1382],{"id":511,"depth":260,"text":512},{"id":747,"depth":202,"text":748},{"id":941,"depth":202,"text":942},{"id":962,"depth":202,"text":963},{"id":1030,"depth":202,"text":1031,"children":1387},[1388,1389],{"id":1073,"depth":260,"text":1074},{"id":1222,"depth":260,"text":1223},{"id":1339,"depth":202,"text":1340},"engineering","2021-02-05","GitLab CI est à la fois puissant et polyvalent. Découvrez les capacités de cet outil à travers plusieurs scénarios d'utilisation.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749662033/Blog/Hero%20Images/intro.jpg",{},"/fr-fr/blog/ci-deployment-and-environments",{"title":5,"description":1393,"ogTitle":5,"ogDescription":1393,"noIndex":1396,"ogImage":1397,"ogUrl":1401,"ogSiteName":1402,"ogType":1403,"canonicalUrls":1401},"https://about.gitlab.com/blog/ci-deployment-and-environments","https://about.gitlab.com","article","ci-deployment-and-environments","fr-fr/blog/ci-deployment-and-environments",[1407,1408,1409],"CI","CD","tutorial","BlogPost","2024-11-21","1fk8h7W9W62xV-P6c82-cYFdtJsm7AIpVfDJNfiEK_w",{"logo":1414,"freeTrial":1419,"sales":1424,"login":1429,"items":1434,"search":1762,"minimal":1798,"duo":1817,"switchNav":1826,"pricingDeployment":1837},{"config":1415},{"href":1416,"dataGaName":1417,"dataGaLocation":1418},"/fr-fr/","gitlab logo","header",{"text":1420,"config":1421},"Commencer un essai gratuit",{"href":1422,"dataGaName":1423,"dataGaLocation":1418},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr&glm_content=default-saas-trial/","free trial",{"text":1425,"config":1426},"Demander une démo",{"href":1427,"dataGaName":1428,"dataGaLocation":1418},"/fr-fr/sales/?contact-topic=request-demo","sales",{"text":1430,"config":1431},"Connexion",{"href":1432,"dataGaName":1433,"dataGaLocation":1418},"https://gitlab.com/users/sign_in/","sign in",[1435,1464,1565,1570,1684,1740],{"text":1436,"config":1437,"menu":1439},"Plateforme",{"dataNavLevelOne":1438},"platform",{"type":1440,"columns":1441},"cards",[1442,1448,1456],{"title":1436,"description":1443,"link":1444},"La plateforme d'orchestration intelligente pour le DevSecOps",{"text":1445,"config":1446},"Explorer notre plateforme",{"href":1447,"dataGaName":1438,"dataGaLocation":1418},"/fr-fr/platform/",{"title":1449,"description":1450,"link":1451},"GitLab Duo Agent Platform","L'IA agentique pour l'ensemble du cycle de développement logiciel",{"text":1452,"config":1453},"Découvrir GitLab Duo",{"href":1454,"dataGaName":1455,"dataGaLocation":1418},"/fr-fr/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1457,"description":1458,"link":1459},"Pourquoi GitLab ?","Découvrez les principales raisons pour lesquelles les entreprises choisissent GitLab",{"text":1460,"config":1461},"En savoir plus",{"href":1462,"dataGaName":1463,"dataGaLocation":1418},"/fr-fr/why-gitlab/","why gitlab",{"text":1465,"left":595,"config":1466,"menu":1468},"Produit",{"dataNavLevelOne":1467},"solutions",{"type":1469,"link":1470,"columns":1474,"feature":1544},"lists",{"text":1471,"config":1472},"Voir toutes les solutions",{"href":1473,"dataGaName":1467,"dataGaLocation":1418},"/fr-fr/solutions/",[1475,1499,1522],{"title":1476,"description":1477,"link":1478,"items":1483},"Automatisation","CI/CD et automatisation pour accélérer le déploiement",{"config":1479},{"icon":1480,"href":1481,"dataGaName":1482,"dataGaLocation":1418},"AutomatedCodeAlt","/fr-fr/solutions/delivery-automation/","automated software delivery",[1484,1487,1490,1495],{"text":1358,"config":1485},{"href":1486,"dataGaLocation":1418,"dataGaName":1358},"/fr-fr/solutions/continuous-integration/",{"text":1449,"config":1488},{"href":1454,"dataGaLocation":1418,"dataGaName":1489},"gitlab duo agent platform - product menu",{"text":1491,"config":1492},"Gestion du code source",{"href":1493,"dataGaLocation":1418,"dataGaName":1494},"/fr-fr/solutions/source-code-management/","Source Code Management",{"text":1496,"config":1497},"Livraison de logiciels automatisée",{"href":1481,"dataGaLocation":1418,"dataGaName":1498},"Automated software delivery",{"title":1500,"description":1501,"link":1502,"items":1507},"Sécurité","Livrez du code plus rapidement sans compromettre la sécurité",{"config":1503},{"href":1504,"dataGaName":1505,"dataGaLocation":1418,"icon":1506},"/fr-fr/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1508,1512,1517],{"text":1509,"config":1510},"Tests de sécurité des applications",{"href":1504,"dataGaName":1511,"dataGaLocation":1418},"Application security testing",{"text":1513,"config":1514},"Sécurité de la chaîne d'approvisionnement logicielle",{"href":1515,"dataGaLocation":1418,"dataGaName":1516},"/fr-fr/solutions/supply-chain/","Software supply chain security",{"text":1518,"config":1519},"Conformité logicielle",{"href":1520,"dataGaName":1521,"dataGaLocation":1418},"/fr-fr/solutions/software-compliance/","software compliance",{"title":1523,"link":1524,"items":1529},"Mesures",{"config":1525},{"icon":1526,"href":1527,"dataGaName":1528,"dataGaLocation":1418},"DigitalTransformation","/fr-fr/solutions/visibility-measurement/","visibility and measurement",[1530,1534,1539],{"text":1531,"config":1532},"Visibilité et mesures",{"href":1527,"dataGaLocation":1418,"dataGaName":1533},"Visibility and Measurement",{"text":1535,"config":1536},"Gestion de la chaîne de valeur",{"href":1537,"dataGaLocation":1418,"dataGaName":1538},"/fr-fr/solutions/value-stream-management/","Value Stream Management",{"text":1540,"config":1541},"Analyses et informations",{"href":1542,"dataGaLocation":1418,"dataGaName":1543},"/fr-fr/solutions/analytics-and-insights/","Analytics and insights",{"title":1545,"type":1469,"items":1546},"GitLab",[1547,1553,1559],{"text":1548,"config":1549},"Entreprises",{"icon":1550,"href":1551,"dataGaLocation":1418,"dataGaName":1552},"Building","/fr-fr/enterprise/","enterprise",{"text":1554,"config":1555},"Pour les PME",{"icon":1556,"href":1557,"dataGaLocation":1418,"dataGaName":1558},"Work","/fr-fr/small-business/","small business",{"text":1560,"config":1561},"Pour le secteur public",{"icon":1562,"href":1563,"dataGaLocation":1418,"dataGaName":1564},"Organization","/fr-fr/solutions/public-sector/","public sector",{"text":1566,"config":1567},"Tarifs",{"href":1568,"dataGaName":1569,"dataGaLocation":1418,"dataNavLevelOne":1569},"/fr-fr/pricing/","pricing",{"text":1571,"config":1572,"menu":1574},"Ressources",{"dataNavLevelOne":1573},"resources",{"type":1469,"link":1575,"columns":1579,"feature":1673},{"text":1576,"config":1577},"Afficher toutes les ressources",{"href":1578,"dataGaName":1573,"dataGaLocation":1418},"/fr-fr/resources/",[1580,1613,1640],{"title":1581,"items":1582},"Premiers pas",[1583,1588,1593,1598,1603,1608],{"text":1584,"config":1585},"Installation",{"href":1586,"dataGaName":1587,"dataGaLocation":1418},"/fr-fr/install/","install",{"text":1589,"config":1590},"Guides de démarrage",{"href":1591,"dataGaName":1592,"dataGaLocation":1418},"/fr-fr/get-started/","quick setup checklists",{"text":1594,"config":1595},"Apprentissage",{"href":1596,"dataGaLocation":1418,"dataGaName":1597},"https://university.gitlab.com/","learn",{"text":1599,"config":1600},"Documentation",{"href":1601,"dataGaName":1602,"dataGaLocation":1418},"https://docs.gitlab.com/","product documentation",{"text":1604,"config":1605},"Vidéos sur les bonnes pratiques",{"href":1606,"dataGaName":1607,"dataGaLocation":1418},"/fr-fr/getting-started-videos/","best practice videos",{"text":1609,"config":1610},"Intégrations",{"href":1611,"dataGaName":1612,"dataGaLocation":1418},"/fr-fr/integrations/","integrations",{"title":1614,"items":1615},"Découvrir",[1616,1621,1626,1631,1635],{"text":1617,"config":1618},"Témoignages clients",{"href":1619,"dataGaName":1620,"dataGaLocation":1418},"/fr-fr/customers/","customer success stories",{"text":1622,"config":1623},"Blog",{"href":1624,"dataGaName":1625,"dataGaLocation":1418},"/fr-fr/blog/","blog",{"text":1627,"config":1628},"Demo Hub",{"href":1629,"dataGaName":1630,"dataGaLocation":1418},"/fr-fr/demo-hub/","demo hub",{"text":1632,"config":1633},"The Source",{"href":1634,"dataGaName":1625,"dataGaLocation":1418},"/fr-fr/the-source/",{"text":1636,"config":1637},"Travail à distance",{"href":1638,"dataGaName":1639,"dataGaLocation":1418},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1641,"items":1642},"Connecter",[1643,1648,1653,1658,1663,1668],{"text":1644,"config":1645},"Services GitLab",{"href":1646,"dataGaName":1647,"dataGaLocation":1418},"/fr-fr/services/","services",{"text":1649,"config":1650},"Contribuer",{"href":1651,"dataGaName":1652,"dataGaLocation":1418},"https://contributors.gitlab.com","contribute",{"text":1654,"config":1655},"Communauté",{"href":1656,"dataGaName":1657,"dataGaLocation":1418},"/community/","community",{"text":1659,"config":1660},"Forum",{"href":1661,"dataGaName":1662,"dataGaLocation":1418},"https://forum.gitlab.com/","forum",{"text":1664,"config":1665},"Événements",{"href":1666,"dataGaName":1667,"dataGaLocation":1418},"/events/","events",{"text":1669,"config":1670},"Partenaires",{"href":1671,"dataGaName":1672,"dataGaLocation":1418},"/fr-fr/partners/","partners",{"config":1674,"title":1677,"text":1678,"link":1679},{"background":1675,"textColor":1676},"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":1680,"config":1681},"Lire les articles les plus récents",{"href":1682,"dataGaName":1683,"dataGaLocation":1418},"/fr-fr/whats-new/","whats new",{"text":1685,"config":1686,"menu":1688},"Société",{"dataNavLevelOne":1687},"company",{"type":1469,"columns":1689},[1690],{"items":1691},[1692,1697,1703,1705,1710,1715,1720,1725,1730,1735],{"text":1693,"config":1694},"À propos",{"href":1695,"dataGaName":1696,"dataGaLocation":1418},"/fr-fr/company/","about",{"text":1698,"config":1699,"footerGa":1702},"Carrières",{"href":1700,"dataGaName":1701,"dataGaLocation":1418},"/jobs/","jobs",{"dataGaName":1701},{"text":1664,"config":1704},{"href":1666,"dataGaName":1667,"dataGaLocation":1418},{"text":1706,"config":1707},"Leadership",{"href":1708,"dataGaName":1709,"dataGaLocation":1418},"/company/team/e-group/","leadership",{"text":1711,"config":1712},"Manuel",{"href":1713,"dataGaName":1714,"dataGaLocation":1418},"https://handbook.gitlab.com/","handbook",{"text":1716,"config":1717},"Relations avec les investisseurs",{"href":1718,"dataGaName":1719,"dataGaLocation":1418},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1721,"config":1722},"Trust Center",{"href":1723,"dataGaName":1724,"dataGaLocation":1418},"/fr-fr/security/","trust center",{"text":1726,"config":1727},"Centre pour la transparence de l'IA",{"href":1728,"dataGaName":1729,"dataGaLocation":1418},"/fr-fr/ai-transparency-center/","ai transparency center",{"text":1731,"config":1732},"Newsletter",{"href":1733,"dataGaName":1734,"dataGaLocation":1418},"/company/contact/#contact-forms","newsletter",{"text":1736,"config":1737},"Presse",{"href":1738,"dataGaName":1739,"dataGaLocation":1418},"/press/","press",{"text":1741,"config":1742,"menu":1743},"Nous contacter",{"dataNavLevelOne":1687},{"type":1469,"columns":1744},[1745],{"items":1746},[1747,1752,1757],{"text":1748,"config":1749},"Contacter l'équipe commerciale",{"href":1750,"dataGaName":1751,"dataGaLocation":1418},"/fr-fr/sales/","talk to sales",{"text":1753,"config":1754},"Assistance GitLab",{"href":1755,"dataGaName":1756,"dataGaLocation":1418},"https://support.gitlab.com/hc/en-us","support portal",{"text":1758,"config":1759},"Portail clients GitLab",{"href":1760,"dataGaName":1761,"dataGaLocation":1418},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1763,"login":1764,"suggestions":1771},"Fermer",{"text":1765,"link":1766},"Pour rechercher des dépôts et des projets, connectez-vous à",{"text":1767,"config":1768},"GitLab.com",{"href":1432,"dataGaName":1769,"dataGaLocation":1770},"search login","search",{"text":1772,"default":1773},"Suggestions",[1774,1777,1782,1784,1789,1794],{"text":1449,"config":1775},{"href":1454,"dataGaName":1776,"dataGaLocation":1770},"GitLab Duo Agent Platform",{"text":1778,"config":1779},"Suggestions de code (IA)",{"href":1780,"dataGaName":1781,"dataGaLocation":1770},"/fr-fr/solutions/code-suggestions/","Code Suggestions (AI)",{"text":1358,"config":1783},{"href":1486,"dataGaName":1358,"dataGaLocation":1770},{"text":1785,"config":1786},"GitLab sur AWS",{"href":1787,"dataGaName":1788,"dataGaLocation":1770},"/fr-fr/partners/technology-partners/aws/","GitLab on AWS",{"text":1790,"config":1791},"GitLab sur Google Cloud",{"href":1792,"dataGaName":1793,"dataGaLocation":1770},"/fr-fr/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":1795,"config":1796},"Pourquoi utiliser GitLab ?",{"href":1462,"dataGaName":1797,"dataGaLocation":1770},"Why GitLab?",{"freeTrial":1799,"mobileIcon":1804,"desktopIcon":1809,"secondaryButton":1812},{"text":1800,"config":1801},"Commencer votre essai gratuit",{"href":1802,"dataGaName":1423,"dataGaLocation":1803},"https://gitlab.com/-/trials/new/","nav",{"altText":1805,"config":1806},"Icône GitLab",{"src":1807,"dataGaName":1808,"dataGaLocation":1803},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1805,"config":1810},{"src":1811,"dataGaName":1808,"dataGaLocation":1803},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1813,"config":1814},"Commencer",{"href":1815,"dataGaName":1816,"dataGaLocation":1803},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr/get-started/","get started",{"freeTrial":1818,"mobileIcon":1822,"desktopIcon":1824},{"text":1819,"config":1820},"En savoir plus sur GitLab Duo",{"href":1454,"dataGaName":1821,"dataGaLocation":1803},"gitlab duo",{"altText":1805,"config":1823},{"src":1807,"dataGaName":1808,"dataGaLocation":1803},{"altText":1805,"config":1825},{"src":1811,"dataGaName":1808,"dataGaLocation":1803},{"button":1827,"mobileIcon":1832,"desktopIcon":1834},{"text":1828,"config":1829},"/switch",{"href":1830,"dataGaName":1831,"dataGaLocation":1803},"#contact","switch",{"altText":1805,"config":1833},{"src":1807,"dataGaName":1808,"dataGaLocation":1803},{"altText":1805,"config":1835},{"src":1836,"dataGaName":1808,"dataGaLocation":1803},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1838,"mobileIcon":1843,"desktopIcon":1845},{"text":1839,"config":1840},"Retour aux tarifs",{"href":1568,"dataGaName":1841,"dataGaLocation":1803,"icon":1842},"back to pricing","GoBack",{"altText":1805,"config":1844},{"src":1807,"dataGaName":1808,"dataGaLocation":1803},{"altText":1805,"config":1846},{"src":1811,"dataGaName":1808,"dataGaLocation":1803},{"title":1848,"button":1849,"config":1853},"GitLab Orbit est arrivé : la couche de contexte pour les agents d'IA.",{"text":1460,"config":1850},{"href":1851,"dataGaName":1852,"dataGaLocation":1418},"/fr-fr/gitlab-orbit/","orbit",{"layout":1854,"disabled":1396},"release",{"data":1856},{"text":1857,"source":1858,"edit":1864,"contribute":1869,"config":1873,"items":1878,"minimal":2086},"Git est une marque déposée de Software Freedom Conservancy et notre utilisation de « GitLab » est sous licence.",{"text":1859,"config":1860},"Afficher le code source de la page",{"href":1861,"dataGaName":1862,"dataGaLocation":1863},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1865,"config":1866},"Modifier cette page",{"href":1867,"dataGaName":1868,"dataGaLocation":1863},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1649,"config":1870},{"href":1871,"dataGaName":1872,"dataGaLocation":1863},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1874,"facebook":1875,"youtube":1876,"linkedin":1877},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1879,1925,1978,2021,2053],{"title":1566,"links":1880,"subMenu":1895},[1881,1885,1890],{"text":1882,"config":1883},"Voir les forfaits",{"href":1568,"dataGaName":1884,"dataGaLocation":1863},"view plans",{"text":1886,"config":1887},"GitLab Premium",{"href":1888,"dataGaName":1889,"dataGaLocation":1863},"/fr-fr/pricing/premium/","why premium",{"text":1891,"config":1892},"GitLab Ultimate",{"href":1893,"dataGaName":1894,"dataGaLocation":1863},"/fr-fr/pricing/ultimate/","why ultimate",[1896],{"title":1741,"links":1897},[1898,1900,1902,1905,1910,1915,1920],{"text":1748,"config":1899},{"href":1750,"dataGaName":1428,"dataGaLocation":1863},{"text":1753,"config":1901},{"href":1755,"dataGaName":1756,"dataGaLocation":1863},{"text":1903,"config":1904},"Portail clients",{"href":1760,"dataGaName":1761,"dataGaLocation":1863},{"text":1906,"config":1907},"Statut",{"href":1908,"dataGaName":1909,"dataGaLocation":1863},"https://status.gitlab.com/","status",{"text":1911,"config":1912},"Conditions d'utilisation",{"href":1913,"dataGaName":1914,"dataGaLocation":1863},"/terms/","terms of use",{"text":1916,"config":1917},"Politique de confidentialité",{"href":1918,"dataGaName":1919,"dataGaLocation":1863},"/fr-fr/privacy/","privacy statement",{"text":1921,"config":1922},"Gestion des cookies",{"dataGaName":1923,"dataGaLocation":1863,"id":1924,"isOneTrustButton":595},"cookie preferences","ot-sdk-btn",{"title":1465,"links":1926,"subMenu":1935},[1927,1931],{"text":1928,"config":1929},"Plateforme DevSecOps",{"href":1447,"dataGaName":1930,"dataGaLocation":1863},"devsecops platform",{"text":1932,"config":1933},"Développement assisté par l'IA",{"href":1454,"dataGaName":1934,"dataGaLocation":1863},"ai-assisted development",[1936],{"title":1937,"links":1938},"Thèmes",[1939,1943,1948,1953,1958,1963,1968,1973],{"text":1358,"config":1940},{"href":1941,"dataGaName":1942,"dataGaLocation":1863},"/fr-fr/topics/ci-cd/","cicd",{"text":1944,"config":1945},"GitOps",{"href":1946,"dataGaName":1947,"dataGaLocation":1863},"/fr-fr/topics/gitops/","gitops",{"text":1949,"config":1950},"DevOps",{"href":1951,"dataGaName":1952,"dataGaLocation":1863},"/fr-fr/topics/devops/","devops",{"text":1954,"config":1955},"Contrôle de version",{"href":1956,"dataGaName":1957,"dataGaLocation":1863},"/fr-fr/topics/version-control/","version control",{"text":1959,"config":1960},"DevSecOps",{"href":1961,"dataGaName":1962,"dataGaLocation":1863},"/fr-fr/topics/devsecops/","devsecops",{"text":1964,"config":1965},"Cloud-native",{"href":1966,"dataGaName":1967,"dataGaLocation":1863},"/fr-fr/topics/cloud-native/","cloud native",{"text":1969,"config":1970},"IA pour la programmation",{"href":1971,"dataGaName":1972,"dataGaLocation":1863},"/fr-fr/topics/devops/ai-for-coding/","ai for coding",{"text":1974,"config":1975},"IA agentique",{"href":1976,"dataGaName":1977,"dataGaLocation":1863},"/fr-fr/topics/agentic-ai/","agentic ai",{"title":1979,"links":1980},"Solutions",[1981,1984,1986,1991,1994,1997,2000,2003,2005,2008,2011,2016],{"text":1509,"config":1982},{"href":1504,"dataGaName":1983,"dataGaLocation":1863},"Application Security Testing",{"text":1496,"config":1985},{"href":1481,"dataGaName":1482,"dataGaLocation":1863},{"text":1987,"config":1988},"Développement Agile",{"href":1989,"dataGaName":1990,"dataGaLocation":1863},"/fr-fr/solutions/agile-delivery/","agile delivery",{"text":1491,"config":1992},{"href":1493,"dataGaName":1993,"dataGaLocation":1863},"source code management",{"text":1358,"config":1995},{"href":1486,"dataGaName":1996,"dataGaLocation":1863},"continuous integration & delivery",{"text":1535,"config":1998},{"href":1537,"dataGaName":1999,"dataGaLocation":1863},"value stream management",{"text":1944,"config":2001},{"href":2002,"dataGaName":1947,"dataGaLocation":1863},"/fr-fr/solutions/gitops/",{"text":1548,"config":2004},{"href":1551,"dataGaName":1552,"dataGaLocation":1863},{"text":2006,"config":2007},"PME",{"href":1557,"dataGaName":1558,"dataGaLocation":1863},{"text":2009,"config":2010},"Secteur public",{"href":1563,"dataGaName":1564,"dataGaLocation":1863},{"text":2012,"config":2013},"Éducation",{"href":2014,"dataGaName":2015,"dataGaLocation":1863},"/fr-fr/solutions/education/","education",{"text":2017,"config":2018},"Services financiers",{"href":2019,"dataGaName":2020,"dataGaLocation":1863},"/fr-fr/solutions/finance/","financial services",{"title":1571,"links":2022},[2023,2025,2027,2029,2032,2034,2037,2039,2041,2043,2045,2047,2049,2051],{"text":1584,"config":2024},{"href":1586,"dataGaName":1587,"dataGaLocation":1863},{"text":1589,"config":2026},{"href":1591,"dataGaName":1592,"dataGaLocation":1863},{"text":1594,"config":2028},{"href":1596,"dataGaName":1597,"dataGaLocation":1863},{"text":1599,"config":2030},{"href":1601,"dataGaName":2031,"dataGaLocation":1863},"docs",{"text":1622,"config":2033},{"href":1624,"dataGaName":1625,"dataGaLocation":1863},{"text":2035,"config":2036},"Nouveautés",{"href":1682,"dataGaName":1683,"dataGaLocation":1863},{"text":1617,"config":2038},{"href":1619,"dataGaName":1620,"dataGaLocation":1863},{"text":1636,"config":2040},{"href":1638,"dataGaName":1639,"dataGaLocation":1863},{"text":1644,"config":2042},{"href":1646,"dataGaName":1647,"dataGaLocation":1863},{"text":1649,"config":2044},{"href":1651,"dataGaName":1652,"dataGaLocation":1863},{"text":1654,"config":2046},{"href":1656,"dataGaName":1657,"dataGaLocation":1863},{"text":1659,"config":2048},{"href":1661,"dataGaName":1662,"dataGaLocation":1863},{"text":1664,"config":2050},{"href":1666,"dataGaName":1667,"dataGaLocation":1863},{"text":1669,"config":2052},{"href":1671,"dataGaName":1672,"dataGaLocation":1863},{"title":1685,"links":2054},[2055,2057,2059,2061,2063,2065,2070,2075,2077,2079,2081],{"text":1693,"config":2056},{"href":1695,"dataGaName":1687,"dataGaLocation":1863},{"text":1698,"config":2058},{"href":1700,"dataGaName":1701,"dataGaLocation":1863},{"text":1706,"config":2060},{"href":1708,"dataGaName":1709,"dataGaLocation":1863},{"text":1711,"config":2062},{"href":1713,"dataGaName":1714,"dataGaLocation":1863},{"text":1716,"config":2064},{"href":1718,"dataGaName":1719,"dataGaLocation":1863},{"text":2066,"config":2067},"Développement durable",{"href":2068,"dataGaName":2069,"dataGaLocation":1863},"/sustainability/","Sustainability",{"text":2071,"config":2072},"Diversité, inclusion et appartenance (DIB)",{"href":2073,"dataGaName":2074,"dataGaLocation":1863},"/fr-fr/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1721,"config":2076},{"href":1723,"dataGaName":1724,"dataGaLocation":1863},{"text":1731,"config":2078},{"href":1733,"dataGaName":1734,"dataGaLocation":1863},{"text":1736,"config":2080},{"href":1738,"dataGaName":1739,"dataGaLocation":1863},{"text":2082,"config":2083},"Déclaration de transparence sur l'esclavage moderne",{"href":2084,"dataGaName":2085,"dataGaLocation":1863},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":2087},[2088,2090,2092],{"text":1911,"config":2089},{"href":1913,"dataGaName":1914,"dataGaLocation":1863},{"text":1921,"config":2091},{"dataGaName":1923,"dataGaLocation":1863,"id":1924,"isOneTrustButton":595},{"text":1916,"config":2093},{"href":1918,"dataGaName":1919,"dataGaLocation":1863},[2095,2109],{"id":2096,"title":7,"body":1395,"config":2097,"content":2099,"description":1395,"extension":2103,"meta":2104,"navigation":595,"path":2105,"seo":2106,"stem":2107,"__hash__":2108},"blogAuthors/en-us/blog/authors/ivan-nemytchenko.yml",{"template":2098},"BlogAuthor",{"name":7,"config":2100},{"headshot":2101,"ctfId":2102},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659488/Blog/Author%20Headshots/gitlab-logo-extra-whitespace.png","Ivan-Nemytchenko","yml",{},"/en-us/blog/authors/ivan-nemytchenko",{},"en-us/blog/authors/ivan-nemytchenko","LIveI3a-Zqab8RyZk3ijJwKPTck0i-FN_JanwQMOZr4",{"id":2110,"title":8,"body":1395,"config":2111,"content":2112,"description":1395,"extension":2103,"meta":2116,"navigation":595,"path":2117,"seo":2118,"stem":2119,"__hash__":2120},"blogAuthors/en-us/blog/authors/cesar-saavedra.yml",{"template":2098},{"name":8,"config":2113},{"headshot":2114,"ctfId":2115},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659600/Blog/Author%20Headshots/csaavedra1-headshot.jpg","csaavedra1",{},"/en-us/blog/authors/cesar-saavedra",{},"en-us/blog/authors/cesar-saavedra","SMqRf-z0W5m5GROz_dXGjmuIb3YaOwm_n_RfeK16GcA",[2122,2130,2138],{"title":2123,"description":2124,"heroImage":2125,"category":1391,"date":2126,"authors":2127,"slug":2129,"externalUrl":1395},"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",[2128],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":2131,"description":2132,"heroImage":2133,"category":1391,"date":2134,"authors":2135,"slug":2137,"externalUrl":1395},"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",[2136],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"title":2139,"description":2140,"heroImage":2141,"category":1391,"date":2142,"authors":2143,"slug":2145,"externalUrl":1395},"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",[2144],"Omid Khan","5-ways-gitlab-pipeline-logic-solves-real-engineering-problems",{"promotions":2147},[2148,2162,2174,2186],{"id":2149,"categories":2150,"header":2152,"text":2153,"button":2154,"image":2159},"ai-modernization",[2151],"ai","L'IA tient-elle ses promesses à grande échelle ?","Le questionnaire ne prendra pas plus de 5 minutes.",{"text":2155,"config":2156},"Obtenez votre score de maturité IA",{"href":2157,"dataGaName":2158,"dataGaLocation":1625},"/fr-fr/assessments/ai-modernization-assessment/","modernization assessment",{"config":2160},{"src":2161},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":2163,"categories":2164,"header":2166,"text":2153,"button":2167,"image":2171},"devops-modernization",[2165,1962],"product","Vous contentez-vous de gérer des outils ou de livrer des innovations ?",{"text":2168,"config":2169},"Obtenez votre score de maturité DevOps",{"href":2170,"dataGaName":2158,"dataGaLocation":1625},"/fr-fr/assessments/devops-modernization-assessment/",{"config":2172},{"src":2173},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":2175,"categories":2176,"header":2178,"text":2153,"button":2179,"image":2183},"security-modernization",[2177],"security","Faut-il sacrifier la rapidité pour garantir la sécurité ?",{"text":2180,"config":2181},"Obtenez votre score de maturité en matière de sécurité",{"href":2182,"dataGaName":2158,"dataGaLocation":1625},"/fr-fr/assessments/security-modernization-assessment/",{"config":2184},{"src":2185},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":2187,"paths":2188,"header":2191,"text":2192,"button":2193,"image":2198},"github-azure-migration",[2189,2190],"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":2194,"config":2195},"Découvrez les différences entre GitLab et GitHub",{"href":2196,"dataGaName":2197,"dataGaLocation":1625},"/fr-fr/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":2199},{"src":2173},{"header":2201,"blurb":2202,"button":2203,"secondaryButton":2207},"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":1420,"config":2204},{"href":2205,"dataGaName":1423,"dataGaLocation":2206},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/fr-fr/","feature",{"text":1748,"config":2208},{"href":1750,"dataGaName":1428,"dataGaLocation":2206},1786803764666]