[{"data":1,"prerenderedAt":2243},["ShallowReactive",2],{"/fr-fr/blog/we-need-to-talk-no-proxy":3,"navigation-fr-fr":1459,"banner-fr-fr":1893,"footer-fr-fr":1901,"blog-post-authors-fr-fr-Stan Hu":2140,"blog-related-posts-fr-fr-we-need-to-talk-no-proxy":2155,"blog-promotions-fr-fr":2180,"next-steps-fr-fr":2234},{"id":4,"title":5,"authors":6,"body":8,"category":1436,"date":1437,"description":1438,"extension":1439,"externalUrl":1440,"faq":1440,"featured":1441,"heroImage":1442,"meta":1443,"navigation":1444,"path":1445,"seo":1446,"slug":1450,"stem":1451,"tags":1452,"template":1457,"updatedDate":1440,"__hash__":1458},"blogPosts/fr-fr/blog/we-need-to-talk-no-proxy.md","Pouvons-nous standardiser la variable d'environnement NO_PROXY ?",[7],"Stan Hu",{"type":9,"value":10,"toc":1420},"minimark",[11,28,33,36,62,69,97,103,120,137,154,161,165,192,200,259,291,295,304,309,319,479,505,511,514,516,532,548,559,754,774,854,866,921,937,941,944,979,986,991,1000,1039,1049,1056,1068,1125,1131,1141,1205,1220,1281,1286,1305,1309,1312,1319,1324,1329,1365,1371,1377,1404,1408,1416],[12,13,14,15,19,20,23,24,27],"p",{},"Si vous avez déjà utilisé un serveur proxy Web, vous êtes probablement familier avec les variables d’environnement ",[16,17,18],"code",{},"http_proxy"," ou ",[16,21,22],{},"HTTP_PROXY",". Cependant, vous l'êtes peut-être moins avec la variable ",[16,25,26],{},"no_proxy"," qui permet d’exclure le trafic destiné à certains hôtes d'utiliser le proxy. Bien que le protocole HTTP soit standardisé, aucune norme ne précise comment utiliser ces variables. Par conséquent, les clients Web prennent en charge ces variables de manière différente.\nDécouvrez dans cet article tout ce que vous devez savoir sur la variable d’environnement no_proxy, ainsi qu’un cas pratique d’un de nos clients GitLab.",[29,30,32],"h2",{"id":31},"comprendre-http_proxy-https_proxy-et-no_proxy","Comprendre http_proxy, https_proxy et no_proxy",[12,34,35],{},"De nos jours, la plupart des clients Web permettent de se connecter à des serveurs proxy via les variables d'environnement suivantes :",[37,38,39,47,55],"ul",{},[40,41,42,44,45],"li",{},[16,43,18],{}," / ",[16,46,22],{},[40,48,49,44,52],{},[16,50,51],{},"https_proxy",[16,53,54],{},"HTTPS_PROXY",[40,56,57,44,59],{},[16,58,26],{},[16,60,61],{},"NO_PROXY",[12,63,64,65,68],{},"Ces variables indiquent au client l'URL à utiliser pour accéder aux serveurs proxy et quelles exceptions appliquer.\nPar exemple, si vous avez un serveur proxy attaché à ",[16,66,67],{},"http://alice.example.com:8080",", vous pourriez l’utiliser via :",[70,71,76],"pre",{"className":72,"code":73,"language":74,"meta":75,"style":75},"language-sh shiki shiki-themes github-light","export http_proxy=http://alice.example.com:8080\n","sh","",[16,77,78],{"__ignoreMap":75},[79,80,83,87,91,94],"span",{"class":81,"line":82},"line",1,[79,84,86],{"class":85},"sD7c4","export",[79,88,90],{"class":89},"sgsFI"," http_proxy",[79,92,93],{"class":85},"=",[79,95,96],{"class":89},"http://alice.example.com:8080\n",[12,98,99,100,102],{},"Mais quel serveur proxy sera utilisé si Maxime définit aussi la version en majuscules : ",[16,101,22],{}," ?",[70,104,106],{"className":72,"code":105,"language":74,"meta":75,"style":75},"export HTTP_PROXY=http://maxime.example.com:8080\n",[16,107,108],{"__ignoreMap":75},[79,109,110,112,115,117],{"class":81,"line":82},[79,111,86],{"class":85},[79,113,114],{"class":89}," HTTP_PROXY",[79,116,93],{"class":85},[79,118,119],{"class":89},"http://maxime.example.com:8080\n",[12,121,122,123,126,127,130,131,133,134,136],{},"Aussi surprenant que cela puisse paraître, cela dépend. Dans certains cas, le proxy d'Alice est utilisé, dans d'autres cas, c'est celui de Maxime. Nous y reviendrons plus loin dans cet article.\nQue se passe-t-il si vous souhaitez définir des exceptions ? Par exemple, admettons que vous souhaitez utiliser un serveur proxy pour tout, sauf pour ",[16,124,125],{},"internal.example.com"," et ",[16,128,129],{},"internal2.example.com",". C'est ici que la variable ",[16,132,26],{}," entre en jeu. Vous paramétrez alors ",[16,135,26],{}," comme suit :",[70,138,140],{"className":72,"code":139,"language":74,"meta":75,"style":75},"export no_proxy=internal.example.com,internal2.example.com\n",[16,141,142],{"__ignoreMap":75},[79,143,144,146,149,151],{"class":81,"line":82},[79,145,86],{"class":85},[79,147,148],{"class":89}," no_proxy",[79,150,93],{"class":85},[79,152,153],{"class":89},"internal.example.com,internal2.example.com\n",[12,155,156,157,160],{},"Et si vous souhaitez exclure certaines adresses IP ? Faut-il utiliser des astérisques ou des caractères génériques ? Ou bien utiliser des blocs CIDR (comme ",[16,158,159],{},"192.168.1.1/32",") ? Même réponse : cela dépend.",[29,162,164],{"id":163},"lévolution-des-variables-proxy-et-no_proxy","L'évolution des variables proxy et no_proxy",[12,166,167,168,171,172,126,174,176,177,179,180,126,182,191],{},"En 1994, la plupart des clients Web utilisaient la bibliothèque logicielle ",[16,169,170],{},"libwww"," du CERN, qui prenait en charge les variables d'environnement ",[16,173,18],{},[16,175,26],{},". ",[16,178,170],{}," utilisait uniquement la forme en minuscules de ",[16,181,18],{},[183,184,187,188,190],"a",{"href":185,"rel":186},"https://github.com/w3c/libwww/blob/8678b3dcb4191065ca39caea54bb1beba809a617/Library/src/HTAccess.c#L234-L239",[],"la syntaxe de ",[16,189,26],{}," était simple"," :",[70,193,198],{"className":194,"code":196,"language":197,"meta":75},[195],"language-text","no_proxy is a comma- or space-separated list of machine\nor domain names, with optional :port part.  If no :port\npart is present, it applies to all ports on that domain.\n\nExample:\n        no_proxy=\"cern.ch,some.domain:8001\"\n","text",[16,199,196],{"__ignoreMap":75},[12,201,202,203,205,206,209,210,213,214,224,225,227,228,230,231,233,234,236,237,240,241,250,251,253,254,126,256,258],{},"De nouveaux clients sont apparus, ajoutant leurs propres implémentations HTTP sans les relier à ",[16,204,170],{},". En janvier 1996, Hrvoje Niksic publie ",[16,207,208],{},"geturl",", le prédécesseur de ce qu'on connaît aujourd'hui sous le nom de ",[16,211,212],{},"wget",". Un mois plus tard, ",[183,215,218,220,221,223],{"href":216,"rel":217},"https://ftp.sunet.se/mirror/archive/ftp.sunet.se/pub/www/utilities/wget/old-versions/",[],[16,219,208],{}," prend en charge ",[16,222,18],{}," dans la version v1.1",". En mai 1996, ",[16,226,208],{}," v1.3 ajoute la prise en charge de ",[16,229,26],{},". Tout comme ",[16,232,170],{},", ",[16,235,208],{}," n'accepte que les minuscules.\nEn janvier 1998, Daniel Stenberg publie ",[16,238,239],{},"curl"," v5.1, ",[183,242,245,246,126,248],{"href":243,"rel":244},"https://github.com/curl/curl/blob/ae1912cb0d494b48d514d937826c9fe83ec96c4d/CHANGES#L929-L944",[],"qui prend en charge les variables ",[16,247,18],{},[16,249,26],{},". De plus, ",[16,252,239],{}," accepte désormais les majuscules, ",[16,255,22],{},[16,257,61],{},".",[12,260,261,265,266,273,274,276,277,282,283,285,286,233,288,290],{},[262,263,264],"strong",{},"Nota Bene :"," en mars 2009, ",[183,267,270,272],{"href":268,"rel":269},"https://github.com/curl/curl/releases/tag/curl-7_19_4",[],[16,271,239],{}," v7.19.4"," abandonne la prise en compte de la forme en majuscules de ",[16,275,22],{}," ",[183,278,281],{"href":279,"rel":280},"https://github.com/curl/curl/blob/30e7641d7d2eb46c0b67c0c495a0ea7e52333ee2/lib/url.c#L2250-L2261",[],"en raison de problèmes de sécurité",". Cependant, même si ",[16,284,239],{}," n'accepte plus ",[16,287,22],{},[16,289,54],{}," fonctionne toujours.",[29,292,294],{"id":293},"gestion-des-variables-du-serveur-proxy","Gestion des variables du serveur proxy",[12,296,297,298,303],{},"Suite aux ",[183,299,302],{"href":300,"rel":301},"https://gitlab.com/gitlab-com/support/support-team-meta/-/issues/2991",[],"recherches de notre collègue Nourdin el Bacha",", nous comprenons que la gestion des variables du serveur proxy varie en fonction du langage ou de l'outil utilisé.",[305,306,308],"h3",{"id":307},"http_proxy-et-https_proxy","http_proxy et https_proxy",[12,310,311,312,314,315,318],{},"Dans ce tableau, chaque ligne représente une variable, et chaque colonne correspond à l'outil (comme ",[16,313,239],{},") ou au langage (comme ",[16,316,317],{},"Ruby",") auquel elle s'applique :",[320,321,322,343],"table",{},[323,324,325],"thead",{},[326,327,328,331,333,335,337,340],"tr",{},[329,330],"th",{},[329,332,239],{},[329,334,212],{},[329,336,317],{},[329,338,339],{},"Python",[329,341,342],{},"Go",[344,345,346,364,393,409,425,443],"tbody",{},[326,347,348,353,356,358,360,362],{},[349,350,351],"td",{},[16,352,18],{},[349,354,355],{},"Oui",[349,357,355],{},[349,359,355],{},[349,361,355],{},[349,363,355],{},[326,365,366,370,373,375,384,391],{},[349,367,368],{},[16,369,22],{},[349,371,372],{},"Non",[349,374,372],{},[349,376,377,378,383],{},"Oui (",[183,379,382],{"href":380,"rel":381},"https://github.com/ruby/ruby/blob/0ed71b37fa9af134fdd5a7fd1cebd171eba83541/lib/uri/generic.rb#L1519",[],"Mise en garde",")",[349,385,386,387,390],{},"Oui (si ",[16,388,389],{},"REQUEST_METHOD"," n'est pas dans env)",[349,392,355],{},[326,394,395,399,401,403,405,407],{},[349,396,397],{},[16,398,51],{},[349,400,355],{},[349,402,355],{},[349,404,355],{},[349,406,355],{},[349,408,355],{},[326,410,411,415,417,419,421,423],{},[349,412,413],{},[16,414,54],{},[349,416,355],{},[349,418,372],{},[349,420,355],{},[349,422,355],{},[349,424,355],{},[326,426,427,430,433,436,438,440],{},[349,428,429],{},"Casse de caractères",[349,431,432],{},"Minuscules",[349,434,435],{},"Minuscules uniquement",[349,437,432],{},[349,439,432],{},[349,441,442],{},"Majuscules",[326,444,445,448,455,461,467,473],{},[349,446,447],{},"Sources",[349,449,450],{},[183,451,454],{"href":452,"rel":453},"https://github.com/curl/curl/blob/30e7641d7d2eb46c0b67c0c495a0ea7e52333ee2/lib/url.c#L2250-L2266",[],"source",[349,456,457],{},[183,458,454],{"href":459,"rel":460},"https://github.com/jay/wget/blob/099d8ee3da3a6eea5635581ae517035165f400a5/src/retr.c#L1222-L1239",[],[349,462,463],{},[183,464,454],{"href":465,"rel":466},"https://github.com/ruby/ruby/blob/0ed71b37fa9af134fdd5a7fd1cebd171eba83541/lib/uri/generic.rb#L1474-L1543",[],[349,468,469],{},[183,470,454],{"href":471,"rel":472},"https://github.com/python/cpython/blob/030a713183084594659aefd77b76fe30178e23c8/Lib/urllib/request.py#L2488-L2517",[],[349,474,475],{},[183,476,454],{"href":477,"rel":478},"https://github.com/golang/go/blob/682a1d2176b02337460aeede0ff9e49429525195/src/vendor/golang.org/x/net/http/httpproxy/proxy.go#L82-L97",[],[12,480,481,482,126,484,486,487,489,490,493,494,496,497,258],{},"Notez que ",[16,483,18],{},[16,485,51],{}," sont toujours pris en charge, alors que ",[16,488,22],{}," ne l'est pas. Python (via ",[16,491,492],{},"urllib",") ne facilite pas les choses : ",[16,495,22],{}," peut être utilisé ",[183,498,501,502,504],{"href":499,"rel":500},"https://github.com/python/cpython/blob/030a713183084594659aefd77b76fe30178e23c8/Lib/urllib/request.py#L2504-L2508",[],"tant que ",[16,503,389],{}," n'est pas défini dans l'environnement",[12,506,507,508,510],{},"Les variables d'environnement sont normalement définies en majuscules, mais puisque ",[16,509,18],{}," est apparu en premier, il est devenu de fait la norme. En cas de doute, optez pour la forme en minuscules, car elle est universellement prise en charge.",[12,512,513],{},"Contrairement à la plupart des implémentations, Go essaie d'abord la forme en majuscules avant revenir à la version en minuscules. Nous verrons plus tard pourquoi cela a causé du tort à notre client GitLab.",[305,515,26],{"id":26},[12,517,518,519,526,527,529,530,136],{},"Certains utilisateurs ont signalé le ",[183,520,523,524],{"href":521,"rel":522},"https://github.com/curl/curl/issues/1208",[],"manque d'indications sur ",[16,525,26],{},". Puisque ",[16,528,26],{}," définit une liste d'exceptions, des questions sur son fonctionnement se posent.\nPar exemple, vous configurez votre ",[16,531,26],{},[70,533,535],{"className":72,"code":534,"language":74,"meta":75,"style":75},"export no_proxy=example.com\n",[16,536,537],{"__ignoreMap":75},[79,538,539,541,543,545],{"class":81,"line":82},[79,540,86],{"class":85},[79,542,148],{"class":89},[79,544,93],{"class":85},[79,546,547],{"class":89},"example.com\n",[12,549,550,551,554,555,558],{},"Est-ce que cela signifie que le domaine doit être une correspondance exacte ou que ",[16,552,553],{},"subdomain.example.com"," corresponde aussi à cette configuration ?\nLe tableau suivant présente les différentes configurations. Toutes les implémentations correspondent aux suffixes, comme le montre la ligne « ",[16,556,557],{},"correspondance des suffixes"," ».",[320,560,561,577],{},[323,562,563],{},[326,564,565,567,569,571,573,575],{},[329,566],{},[329,568,239],{},[329,570,212],{},[329,572,317],{},[329,574,339],{},[329,576,342],{},[344,578,579,595,611,625,640,657,675,690,705,720],{},[326,580,581,585,587,589,591,593],{},[349,582,583],{},[16,584,26],{},[349,586,355],{},[349,588,355],{},[349,590,355],{},[349,592,355],{},[349,594,355],{},[326,596,597,601,603,605,607,609],{},[349,598,599],{},[16,600,61],{},[349,602,355],{},[349,604,372],{},[349,606,355],{},[349,608,355],{},[349,610,355],{},[326,612,613,615,617,619,621,623],{},[349,614,429],{},[349,616,432],{},[349,618,435],{},[349,620,432],{},[349,622,432],{},[349,624,442],{},[326,626,627,630,632,634,636,638],{},[349,628,629],{},"Correspondance des suffixes ?",[349,631,355],{},[349,633,355],{},[349,635,355],{},[349,637,355],{},[349,639,355],{},[326,641,642,647,649,651,653,655],{},[349,643,644,645,102],{},"Points initiaux ",[16,646,258],{},[349,648,355],{},[349,650,372],{},[349,652,355],{},[349,654,355],{},[349,656,372],{},[326,658,659,665,667,669,671,673],{},[349,660,661,664],{},[16,662,663],{},"*"," fait correspondre tous les hôtes",[349,666,355],{},[349,668,372],{},[349,670,372],{},[349,672,355],{},[349,674,355],{},[326,676,677,680,682,684,686,688],{},[349,678,679],{},"Prise en charge des expressions régulières ?",[349,681,372],{},[349,683,372],{},[349,685,372],{},[349,687,372],{},[349,689,372],{},[326,691,692,695,697,699,701,703],{},[349,693,694],{},"Prise en charge des blocs CIDR ?",[349,696,372],{},[349,698,372],{},[349,700,355],{},[349,702,372],{},[349,704,355],{},[326,706,707,710,712,714,716,718],{},[349,708,709],{},"Détection des adresses IP de bouclage ?",[349,711,372],{},[349,713,372],{},[349,715,372],{},[349,717,372],{},[349,719,355],{},[326,721,722,724,730,736,742,748],{},[349,723,447],{},[349,725,726],{},[183,727,454],{"href":728,"rel":729},"https://github.com/curl/curl/blob/30e7641d7d2eb46c0b67c0c495a0ea7e52333ee2/lib/url.c#L2152-L2206",[],[349,731,732],{},[183,733,454],{"href":734,"rel":735},"https://github.com/jay/wget/blob/099d8ee3da3a6eea5635581ae517035165f400a5/src/retr.c#L1266-L1274",[],[349,737,738],{},[183,739,454],{"href":740,"rel":741},"https://github.com/ruby/ruby/blob/0ed71b37fa9af134fdd5a7fd1cebd171eba83541/lib/uri/generic.rb#L1545-L1554",[],[349,743,744],{},[183,745,454],{"href":746,"rel":747},"https://github.com/python/cpython/blob/030a713183084594659aefd77b76fe30178e23c8/Lib/urllib/request.py#L2519-L2551",[],[349,749,750],{},[183,751,454],{"href":752,"rel":753},"https://github.com/golang/go/blob/682a1d2176b02337460aeede0ff9e49429525195/src/vendor/golang.org/x/net/http/httpproxy/proxy.go#L170-L206",[],[12,755,756,757,759,760,762,763,126,765,767,768,770,771,773],{},"Cependant, si ",[16,758,26],{}," est précédé d'un ",[16,761,258],{},", cela implique des changements.\nPar exemple, ",[16,764,239],{},[16,766,212],{}," se comportent différemment. ",[16,769,239],{}," supprime le ",[16,772,258],{}," dans la configuration pour se coller au suffixe du domaine. Il contourne ainsi le proxy :",[70,775,777],{"className":72,"code":776,"language":74,"meta":75,"style":75},"$ env https_proxy=http://non.existent/ no_proxy=.gitlab.com curl https://gitlab.com\n\u003Chtml>\u003Cbody>You are being \u003Ca href=\"https://about.gitlab.com/\">redirected\u003C/a>.\u003C/body>\u003C/html>\n",[16,778,779,801],{"__ignoreMap":75},[79,780,781,785,789,792,795,798],{"class":81,"line":82},[79,782,784],{"class":783},"s7eDp","$",[79,786,788],{"class":787},"sYBdl"," env",[79,790,791],{"class":787}," https_proxy=http://non.existent/",[79,793,794],{"class":787}," no_proxy=.gitlab.com",[79,796,797],{"class":787}," curl",[79,799,800],{"class":787}," https://gitlab.com\n",[79,802,804,807,810,813,816,818,821,823,826,828,831,833,836,838,840,842,845,848,851],{"class":81,"line":803},2,[79,805,806],{"class":85},"\u003C",[79,808,809],{"class":89},"html>\u003Cbody",[79,811,812],{"class":85},">",[79,814,815],{"class":89},"You are being ",[79,817,806],{"class":85},[79,819,820],{"class":89},"a href",[79,822,93],{"class":85},[79,824,825],{"class":787},"\"https://about.gitlab.com/\"",[79,827,812],{"class":85},[79,829,830],{"class":787},"redirected",[79,832,806],{"class":85},[79,834,835],{"class":787},"/a",[79,837,812],{"class":85},[79,839,258],{"class":787},[79,841,806],{"class":85},[79,843,844],{"class":787},"/body",[79,846,847],{"class":89},">\u003C",[79,849,850],{"class":787},"/html",[79,852,853],{"class":85},">\n",[12,855,856,857,859,860,862,863,865],{},"Néanmoins, ",[16,858,212],{}," ne supprime pas le ",[16,861,258],{}," et utilise la correspondance exacte avec le nom d'hôte. Par conséquent, ",[16,864,212],{}," essaie d'utiliser un proxy si un domaine de premier niveau est utilisé :",[70,867,869],{"className":72,"code":868,"language":74,"meta":75,"style":75},"$ env https_proxy=http://non.existent/ no_proxy=.gitlab.com wget https://gitlab.com\nResolving non.existent (non.existent)... failed: Name or service not known.\nwget: unable to resolve host address 'non.existent'\n",[16,870,871,886,897],{"__ignoreMap":75},[79,872,873,875,877,879,881,884],{"class":81,"line":82},[79,874,784],{"class":783},[79,876,788],{"class":787},[79,878,791],{"class":787},[79,880,794],{"class":787},[79,882,883],{"class":787}," wget",[79,885,800],{"class":787},[79,887,888,891,894],{"class":81,"line":803},[79,889,890],{"class":783},"Resolving",[79,892,893],{"class":787}," non.existent",[79,895,896],{"class":89}," (non.existent)... failed: Name or service not known.\n",[79,898,900,903,906,909,912,915,918],{"class":81,"line":899},3,[79,901,902],{"class":783},"wget:",[79,904,905],{"class":787}," unable",[79,907,908],{"class":787}," to",[79,910,911],{"class":787}," resolve",[79,913,914],{"class":787}," host",[79,916,917],{"class":787}," address",[79,919,920],{"class":787}," 'non.existent'\n",[12,922,923,924,926,927,929,930,932,933,936],{},"Toutes les implémentations ne prennent pas en charge les expressions régulières (regex). Utiliser des regex peut compliquer la configuration puisqu'elles peuvent prendre différentes variantes (comme PCRE ou POSIX). L'utilisation d'expressions régulières entraîne également de potentielles failles de sécurité et de performance.\nConfigurer ",[16,925,26],{}," avec un astérisque (",[16,928,663],{},") peut désactiver l'utilisation de proxy pour toutes les adresses, bien que ce principe ne soit pas appliqué tout le temps.\nAu moment de décider de l'utilisation d'un proxy, aucune implémentation n'effectue de recherche DNS pour résoudre un nom d'hôte en adresse IP. Il est préférable d'éviter de spécifier les adresses IP dans ",[16,931,26],{}," à moins que le client ne les utilise explicitement.\nIl en va de même pour les blocs CIDR, tels que ",[16,934,935],{},"18.240.0.1/24",". Ces blocs ne fonctionnent que si la requête est faite directement à une adresse IP. Seuls les environnements de développement Go et Ruby permettent l'utilisation de blocs CIDR. Go désactive même automatiquement l'utilisation d'un proxy si une adresse IP de bouclage est détectée, ce qui n'est pas le cas dans d'autres implémentations.",[29,938,940],{"id":939},"pourquoi-les-paramètres-du-proxy-sont-ils-importants","Pourquoi les paramètres du proxy sont-ils importants ?",[12,942,943],{},"Si votre application est codée en plusieurs langages et doit fonctionner avec un pare-feu avec un serveur proxy, il est important de faire attention à ces différences.\nPar exemple, GitLab est composé d'éléments codés en Ruby et d'autres en Go. Un de nos clients a configuré son proxy de la façon suivante :",[70,945,949],{"className":946,"code":947,"language":948,"meta":75,"style":75},"language-yaml shiki shiki-themes github-light","HTTP_PROXY: http://proxy.company.com\nHTTPS_PROXY: http://proxy.company.com\nNO_PROXY: .correct-company.com\n","yaml",[16,950,951,962,970],{"__ignoreMap":75},[79,952,953,956,959],{"class":81,"line":82},[79,954,22],{"class":955},"shJU0",[79,957,958],{"class":89},": ",[79,960,961],{"class":787},"http://proxy.company.com\n",[79,963,964,966,968],{"class":81,"line":803},[79,965,54],{"class":955},[79,967,958],{"class":89},[79,969,961],{"class":787},[79,971,972,974,976],{"class":81,"line":899},[79,973,61],{"class":955},[79,975,958],{"class":89},[79,977,978],{"class":787},".correct-company.com\n",[12,980,981,982,985],{},"Il a ensuite signalé un problème avec GitLab : - Un ",[16,983,984],{},"git push"," à partir de la ligne de commande a fonctionné.",[37,987,988],{},[40,989,990],{},"Les modifications Git effectuées à partir de l'interface Web ont échoué.",[12,992,993,994,999],{},"Nos ingénieurs ont découvert qu'un problème de configuration de ",[183,995,998],{"href":996,"rel":997,"title":998},"https://about.gitlab.com/fr-fr/blog/kubernetes-the-container-orchestration-solution/",[],"Kubernetes"," entraînait le maintien de valeurs obsolètes. L'environnement ressemblait à :",[70,1001,1003],{"className":946,"code":1002,"language":948,"meta":75,"style":75},"HTTP_PROXY: http://proxy.company.com\nHTTPS_PROXY: http://proxy.company.com\nNO_PROXY: .correct-company.com\nno_proxy: .wrong-company.com\n",[16,1004,1005,1013,1021,1029],{"__ignoreMap":75},[79,1006,1007,1009,1011],{"class":81,"line":82},[79,1008,22],{"class":955},[79,1010,958],{"class":89},[79,1012,961],{"class":787},[79,1014,1015,1017,1019],{"class":81,"line":803},[79,1016,54],{"class":955},[79,1018,958],{"class":89},[79,1020,961],{"class":787},[79,1022,1023,1025,1027],{"class":81,"line":899},[79,1024,61],{"class":955},[79,1026,958],{"class":89},[79,1028,978],{"class":787},[79,1030,1032,1034,1036],{"class":81,"line":1031},4,[79,1033,26],{"class":955},[79,1035,958],{"class":89},[79,1037,1038],{"class":787},".wrong-company.com\n",[12,1040,1041,1042,126,1044,1046,1047,258],{},"Les irrégularités entre ",[16,1043,26],{},[16,1045,61],{}," ont entraîné des alertes. Supprimer l'entrée incorrecte ou uniformiser les variables auraient pu résoudre le problème. Observons ce qu'il s'est passé.\nRappelez-vous que : - Ruby priorise ",[16,1048,26],{},[37,1050,1051],{},[40,1052,1053,1054,258],{},"Go priorise ",[16,1055,61],{},[12,1057,1058,1059,1064,1065,1067],{},"Par conséquent, les services codées en Go, comme ",[183,1060,1063],{"href":1061,"rel":1062},"https://docs.gitlab.com/development/workhorse/",[],"GitLab Workhorse",", ont un bon paramétrage du proxy. Un ",[16,1066,984],{}," depuis la ligne de commande a fonctionné car les services Go gèrent cette activité :",[70,1069,1073],{"className":1070,"code":1071,"language":1072,"meta":75,"style":75},"language-mermaid shiki shiki-themes github-light","sequenceDiagram\n    autonumber\n    participant C as Client\n    participant W as Workhorse\n    participant G as Gitaly\n    C->>W: git push\n    W->>G: gRPC: PostReceivePack\n    G->>W: OK\n    W->>C: OK\n","mermaid",[16,1074,1075,1080,1085,1090,1095,1101,1107,1113,1119],{"__ignoreMap":75},[79,1076,1077],{"class":81,"line":82},[79,1078,1079],{"class":89},"sequenceDiagram\n",[79,1081,1082],{"class":81,"line":803},[79,1083,1084],{"class":89},"    autonumber\n",[79,1086,1087],{"class":81,"line":899},[79,1088,1089],{"class":89},"    participant C as Client\n",[79,1091,1092],{"class":81,"line":1031},[79,1093,1094],{"class":89},"    participant W as Workhorse\n",[79,1096,1098],{"class":81,"line":1097},5,[79,1099,1100],{"class":89},"    participant G as Gitaly\n",[79,1102,1104],{"class":81,"line":1103},6,[79,1105,1106],{"class":89},"    C->>W: git push\n",[79,1108,1110],{"class":81,"line":1109},7,[79,1111,1112],{"class":89},"    W->>G: gRPC: PostReceivePack\n",[79,1114,1116],{"class":81,"line":1115},8,[79,1117,1118],{"class":89},"    G->>W: OK\n",[79,1120,1122],{"class":81,"line":1121},9,[79,1123,1124],{"class":89},"    W->>C: OK\n",[12,1126,1127,1128,1130],{},"L'appel gRPC de l'étape 2 n'a jamais tenté d'utiliser le proxy car ",[16,1129,26],{}," a été configuré correctement pour se connecter directement à Gitaly.",[12,1132,1133,1134,1137,1138,1140],{},"Cependant, lorsqu'un utilisateur effectue une modification dans l'interface utilisateur, Gitaly transmet la requête au service ",[16,1135,1136],{},"gitaly-ruby",", qui est écrit en Ruby. ",[16,1139,1136],{}," effectue des modifications dans le dépôt et renvoie un rapport via un appel gRPC à son processus parent. Malheureusement, comme le montre l'étape 4 ci-dessous, l'étape de reporting n'a pas eu lieu :",[70,1142,1144],{"className":1070,"code":1143,"language":1072,"meta":75,"style":75},"sequenceDiagram\n    autonumber\n    participant C as Client\n    participant R as Rails\n    participant G as Gitaly\n    participant GR as gitaly-ruby\n    participant P as Proxy\n    C->>R: Change file in UI\n    R->>G: gRPC: UserCommitFiles\n    G->>GR: gRPC: UserCommitFiles\n    GR->>P: CONNECT\n    P->>GR: FAIL\n",[16,1145,1146,1150,1154,1158,1163,1167,1172,1177,1182,1187,1193,1199],{"__ignoreMap":75},[79,1147,1148],{"class":81,"line":82},[79,1149,1079],{"class":89},[79,1151,1152],{"class":81,"line":803},[79,1153,1084],{"class":89},[79,1155,1156],{"class":81,"line":899},[79,1157,1089],{"class":89},[79,1159,1160],{"class":81,"line":1031},[79,1161,1162],{"class":89},"    participant R as Rails\n",[79,1164,1165],{"class":81,"line":1097},[79,1166,1100],{"class":89},[79,1168,1169],{"class":81,"line":1103},[79,1170,1171],{"class":89},"    participant GR as gitaly-ruby\n",[79,1173,1174],{"class":81,"line":1109},[79,1175,1176],{"class":89},"    participant P as Proxy\n",[79,1178,1179],{"class":81,"line":1115},[79,1180,1181],{"class":89},"    C->>R: Change file in UI\n",[79,1183,1184],{"class":81,"line":1121},[79,1185,1186],{"class":89},"    R->>G: gRPC: UserCommitFiles\n",[79,1188,1190],{"class":81,"line":1189},10,[79,1191,1192],{"class":89},"    G->>GR: gRPC: UserCommitFiles\n",[79,1194,1196],{"class":81,"line":1195},11,[79,1197,1198],{"class":89},"    GR->>P: CONNECT\n",[79,1200,1202],{"class":81,"line":1201},12,[79,1203,1204],{"class":89},"    P->>GR: FAIL\n",[12,1206,1207,1208,1210,1211,1213,1214,1216,1217,1219],{},"Puisque gRPC utilise HTTP/2 comme mode de transport, ",[16,1209,1136],{}," tente de se connecter au proxy (il était connecté à une configuration erronée de ",[16,1212,26],{},"). Le proxy a immédiatement rejeté la requête HTTP, ce qui a entraîné l'erreur du push sur l'interface Web.\nAprès la suppression des minuscules ",[16,1215,26],{}," de l'environnement, les pushs depuis l'interface utilisateur ont fonctionné comme prévu. ",[16,1218,1136],{}," s'est connecté au processus parent Gitaly. L'étape 4 a donc fonctionné comme suit :",[70,1221,1223],{"className":1070,"code":1222,"language":1072,"meta":75,"style":75},"sequenceDiagram\n    autonumber\n    participant C as Client\n    participant R as Rails\n    participant G as Gitaly\n    participant GR as gitaly-ruby\n    participant P as Proxy\n    C->>R: Change file in UI\n    R->>G: gRPC: UserCommitFiles\n    G->>GR: gRPC: UserCommitFiles\n    GR->>G: OK\n    G->>R: OK\n    R->>C: OK\n",[16,1224,1225,1229,1233,1237,1241,1245,1249,1253,1257,1261,1265,1270,1275],{"__ignoreMap":75},[79,1226,1227],{"class":81,"line":82},[79,1228,1079],{"class":89},[79,1230,1231],{"class":81,"line":803},[79,1232,1084],{"class":89},[79,1234,1235],{"class":81,"line":899},[79,1236,1089],{"class":89},[79,1238,1239],{"class":81,"line":1031},[79,1240,1162],{"class":89},[79,1242,1243],{"class":81,"line":1097},[79,1244,1100],{"class":89},[79,1246,1247],{"class":81,"line":1103},[79,1248,1171],{"class":89},[79,1250,1251],{"class":81,"line":1109},[79,1252,1176],{"class":89},[79,1254,1255],{"class":81,"line":1115},[79,1256,1181],{"class":89},[79,1258,1259],{"class":81,"line":1121},[79,1260,1186],{"class":89},[79,1262,1263],{"class":81,"line":1189},[79,1264,1192],{"class":89},[79,1266,1267],{"class":81,"line":1195},[79,1268,1269],{"class":89},"    GR->>G: OK\n",[79,1271,1272],{"class":81,"line":1201},[79,1273,1274],{"class":89},"    G->>R: OK\n",[79,1276,1278],{"class":81,"line":1277},13,[79,1279,1280],{"class":89},"    R->>C: OK\n",[1282,1283,1285],"h4",{"id":1284},"pourquoi-faut-il-privilégier-un-proxy-https","Pourquoi faut-il privilégier un proxy HTTPS ?",[12,1287,1288,1289,1291,1292,1295,1296,1299,1300,258],{},"Notez que le client a défini ",[16,1290,54],{}," sur un proxy HTTP non crypté : ",[16,1293,1294],{},"http://"," est préféré à ",[16,1297,1298],{},"https://",". Bien que ce ne soit pas idéal en termes de sécurité, certaines équipes de développement utilisent cette méthode pour éviter les problèmes de certificats TLS (et donc, des problèmes de connexion pour les utilisateurs finaux).\nSi un proxy HTTPS avait été spécifié, nous n’aurions pas rencontré ce problème. Lorsqu'un proxy HTTPS est utilisé, gRPC ignore ce paramètre car ",[183,1301,1304],{"href":1302,"rel":1303},"https://github.com/grpc/grpc/issues/20939",[],"les proxy HTTPS ne sont pas pris en charge",[29,1306,1308],{"id":1307},"le-plus-petit-dénominateur-commun","Le plus petit dénominateur commun",[12,1310,1311],{},"Personne ne devrait définir des valeurs irrégulières avec des paramètres de proxy en minuscules et en majuscules. Cependant, si vous devez gérer une stack dans plusieurs langages, vous pourrez configurer les paramètres de proxy HTTP selon le plus petit dénominateur commun.",[305,1313,1315,126,1317],{"id":1314},"http_proxy-et-https_proxy-1",[16,1316,18],{},[16,1318,51],{},[12,1320,1321,1323],{},[16,1322,22],{}," n'est pas toujours pris en charge ou recommandé. Préférez toujours le format en minuscules et si vous devez absolument utiliser la version en majuscules, vérifiez qu'elles partagent la même valeur.",[305,1325,1327],{"id":1326},"no_proxy-1",[16,1328,26],{},[1330,1331,1332,1335,1342,1345,1356,1362],"ol",{},[40,1333,1334],{},"Adoptez le format en minuscules.",[40,1336,1337,1338,1341],{},"Utilisez les valeurs ",[16,1339,1340],{},"hostname:port"," séparées par des virgules.",[40,1343,1344],{},"Les adresses IP sont acceptables, mais les noms d'hôtes ne sont pas résolus.",[40,1346,1347,1348,1351,1352,1355],{},"Les suffixes correspondent toujours (",[16,1349,1350],{},"example.com"," correspondra à ",[16,1353,1354],{},"test.example.com",").",[40,1357,1358,1359,1361],{},"Évitez d'utiliser le point initial (",[16,1360,258],{},") pour les domaines de premier niveau.",[40,1363,1364],{},"Veillez à ne pas utiliser de correspondances de blocs CIDR. Seuls Go et Ruby les prennent en charge.",[29,1366,1368,1369],{"id":1367},"standardiser-no_proxy","Standardiser ",[16,1370,26],{},[12,1372,1373,1374,1376],{},"Connaître le plus petit dénominateur commun aide à éviter des problèmes si ces définitions sont copiées pour différents clients Web. Mais est-ce que ",[16,1375,26],{}," et les autres configurations de proxy requièrent une version standard documentée plutôt qu'une convention ad hoc ?\nVoici quelques points qui peuvent vous aider :",[1330,1378,1379,1387,1396],{},[40,1380,1381,1382,1384,1385,1355],{},"Préférez le format en minuscules aux variantes en majuscules (",[16,1383,18],{}," devrait être utilisé avant ",[16,1386,22],{},[40,1388,1389,1390,1392,1393,1395],{},"Utilisez des valeurs ",[16,1391,1340],{}," séparées par des virgules (chaque valeur peut inclure des espaces facultatifs.). 3. Ne faites pas de recherche DNS et évitez les expressions régulières (regex). 4. Appliquez ",[16,1394,663],{}," pour faire correspondre tous les hôtes.",[40,1397,1398,1399,1401,1402,1355],{},"Supprimez les points initiaux (",[16,1400,258],{},") et faites correspondre les suffixes de domaine. 6. Prenez en charge la correspondance des blocs CIDR. 7. Évitez les suppositions sur des adresses IP spéciales (comme les adresses de bouclage dans ",[16,1403,26],{},[29,1405,1407],{"id":1406},"conclusion","Conclusion",[12,1409,1410,1411,126,1413,1415],{},"Plus de 30 ans se sont écoulés depuis la sortie du premier serveur proxy Web. Depuis, les principes fondamentaux pour configurer un client Web grâce à des variables n'ont pas vraiment changé. Néanmoins, certaines subtilités ont vu le jour.\nÀ travers un cas pratique, vous avez découvert qu'une définition erronée des variables ",[16,1412,26],{},[16,1414,61],{}," a entraîné des heures de travail pour résoudre le problème, en raison de différences d'acceptation de configuration entre Ruby et Go.\nEn mettant en évidence ces différences, nous espérons vous éviter de futurs problèmes dans votre stack de production. Et qui sait, nous verrons peut-être voir le jour une standardisation au niveau des chargés de maintenance des clients Web.",[1417,1418,1419],"style",{},"html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}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 .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}",{"title":75,"searchDepth":803,"depth":803,"links":1421},[1422,1423,1424,1428,1429,1433,1435],{"id":31,"depth":803,"text":32},{"id":163,"depth":803,"text":164},{"id":293,"depth":803,"text":294,"children":1425},[1426,1427],{"id":307,"depth":899,"text":308},{"id":26,"depth":899,"text":26},{"id":939,"depth":803,"text":940},{"id":1307,"depth":803,"text":1308,"children":1430},[1431,1432],{"id":1314,"depth":899,"text":308},{"id":1326,"depth":899,"text":26},{"id":1367,"depth":803,"text":1434},"Standardiser no_proxy",{"id":1406,"depth":803,"text":1407},"engineering","2021-01-27","Découvrez notre guide complet sur no_proxy, la configuration des paramètres\ndu proxy, ainsi que les spécificités de no_proxy, http_proxy et https_proxy.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659507/Blog/Hero%20Images/AdobeStock_623844718.jpg",{},true,"/fr-fr/blog/we-need-to-talk-no-proxy",{"title":5,"description":1438,"ogTitle":5,"ogDescription":1438,"noIndex":1441,"ogImage":1442,"ogUrl":1447,"ogSiteName":1448,"ogType":1449,"canonicalUrls":1447},"https://about.gitlab.com/blog/we-need-to-talk-no-proxy","https://about.gitlab.com","article","we-need-to-talk-no-proxy","fr-fr/blog/we-need-to-talk-no-proxy",[1453,1454,1455,1456],"community","careers","user stories","startups","BlogPost","HDRuROe9LLpt3qcqT5KHVJ9F3weM26OFvGxti0wLyVY",{"logo":1460,"freeTrial":1465,"sales":1470,"login":1475,"items":1480,"search":1808,"minimal":1844,"duo":1863,"switchNav":1872,"pricingDeployment":1883},{"config":1461},{"href":1462,"dataGaName":1463,"dataGaLocation":1464},"/fr-fr/","gitlab logo","header",{"text":1466,"config":1467},"Commencer un essai gratuit",{"href":1468,"dataGaName":1469,"dataGaLocation":1464},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr&glm_content=default-saas-trial/","free trial",{"text":1471,"config":1472},"Demander une démo",{"href":1473,"dataGaName":1474,"dataGaLocation":1464},"/fr-fr/sales/?contact-topic=request-demo","sales",{"text":1476,"config":1477},"Connexion",{"href":1478,"dataGaName":1479,"dataGaLocation":1464},"https://gitlab.com/users/sign_in/","sign in",[1481,1510,1612,1617,1730,1786],{"text":1482,"config":1483,"menu":1485},"Plateforme",{"dataNavLevelOne":1484},"platform",{"type":1486,"columns":1487},"cards",[1488,1494,1502],{"title":1482,"description":1489,"link":1490},"La plateforme d'orchestration intelligente pour le DevSecOps",{"text":1491,"config":1492},"Explorer notre plateforme",{"href":1493,"dataGaName":1484,"dataGaLocation":1464},"/fr-fr/platform/",{"title":1495,"description":1496,"link":1497},"GitLab Duo Agent Platform","L'IA agentique pour l'ensemble du cycle de développement logiciel",{"text":1498,"config":1499},"Découvrir GitLab Duo",{"href":1500,"dataGaName":1501,"dataGaLocation":1464},"/fr-fr/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1503,"description":1504,"link":1505},"Pourquoi GitLab ?","Découvrez les principales raisons pour lesquelles les entreprises choisissent GitLab",{"text":1506,"config":1507},"En savoir plus",{"href":1508,"dataGaName":1509,"dataGaLocation":1464},"/fr-fr/why-gitlab/","why gitlab",{"text":1511,"left":1444,"config":1512,"menu":1514},"Produit",{"dataNavLevelOne":1513},"solutions",{"type":1515,"link":1516,"columns":1520,"feature":1591},"lists",{"text":1517,"config":1518},"Voir toutes les solutions",{"href":1519,"dataGaName":1513,"dataGaLocation":1464},"/fr-fr/solutions/",[1521,1546,1569],{"title":1522,"description":1523,"link":1524,"items":1529},"Automatisation","CI/CD et automatisation pour accélérer le déploiement",{"config":1525},{"icon":1526,"href":1527,"dataGaName":1528,"dataGaLocation":1464},"AutomatedCodeAlt","/fr-fr/solutions/delivery-automation/","automated software delivery",[1530,1534,1537,1542],{"text":1531,"config":1532},"CI/CD",{"href":1533,"dataGaLocation":1464,"dataGaName":1531},"/fr-fr/solutions/continuous-integration/",{"text":1495,"config":1535},{"href":1500,"dataGaLocation":1464,"dataGaName":1536},"gitlab duo agent platform - product menu",{"text":1538,"config":1539},"Gestion du code source",{"href":1540,"dataGaLocation":1464,"dataGaName":1541},"/fr-fr/solutions/source-code-management/","Source Code Management",{"text":1543,"config":1544},"Livraison de logiciels automatisée",{"href":1527,"dataGaLocation":1464,"dataGaName":1545},"Automated software delivery",{"title":1547,"description":1548,"link":1549,"items":1554},"Sécurité","Livrez du code plus rapidement sans compromettre la sécurité",{"config":1550},{"href":1551,"dataGaName":1552,"dataGaLocation":1464,"icon":1553},"/fr-fr/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1555,1559,1564],{"text":1556,"config":1557},"Tests de sécurité des applications",{"href":1551,"dataGaName":1558,"dataGaLocation":1464},"Application security testing",{"text":1560,"config":1561},"Sécurité de la chaîne d'approvisionnement logicielle",{"href":1562,"dataGaLocation":1464,"dataGaName":1563},"/fr-fr/solutions/supply-chain/","Software supply chain security",{"text":1565,"config":1566},"Conformité logicielle",{"href":1567,"dataGaName":1568,"dataGaLocation":1464},"/fr-fr/solutions/software-compliance/","software compliance",{"title":1570,"link":1571,"items":1576},"Mesures",{"config":1572},{"icon":1573,"href":1574,"dataGaName":1575,"dataGaLocation":1464},"DigitalTransformation","/fr-fr/solutions/visibility-measurement/","visibility and measurement",[1577,1581,1586],{"text":1578,"config":1579},"Visibilité et mesures",{"href":1574,"dataGaLocation":1464,"dataGaName":1580},"Visibility and Measurement",{"text":1582,"config":1583},"Gestion de la chaîne de valeur",{"href":1584,"dataGaLocation":1464,"dataGaName":1585},"/fr-fr/solutions/value-stream-management/","Value Stream Management",{"text":1587,"config":1588},"Analyses et informations",{"href":1589,"dataGaLocation":1464,"dataGaName":1590},"/fr-fr/solutions/analytics-and-insights/","Analytics and insights",{"title":1592,"type":1515,"items":1593},"GitLab",[1594,1600,1606],{"text":1595,"config":1596},"Entreprises",{"icon":1597,"href":1598,"dataGaLocation":1464,"dataGaName":1599},"Building","/fr-fr/enterprise/","enterprise",{"text":1601,"config":1602},"Pour les PME",{"icon":1603,"href":1604,"dataGaLocation":1464,"dataGaName":1605},"Work","/fr-fr/small-business/","small business",{"text":1607,"config":1608},"Pour le secteur public",{"icon":1609,"href":1610,"dataGaLocation":1464,"dataGaName":1611},"Organization","/fr-fr/solutions/public-sector/","public sector",{"text":1613,"config":1614},"Tarifs",{"href":1615,"dataGaName":1616,"dataGaLocation":1464,"dataNavLevelOne":1616},"/fr-fr/pricing/","pricing",{"text":1618,"config":1619,"menu":1621},"Ressources",{"dataNavLevelOne":1620},"resources",{"type":1515,"link":1622,"columns":1626,"feature":1719},{"text":1623,"config":1624},"Afficher toutes les ressources",{"href":1625,"dataGaName":1620,"dataGaLocation":1464},"/fr-fr/resources/",[1627,1660,1687],{"title":1628,"items":1629},"Premiers pas",[1630,1635,1640,1645,1650,1655],{"text":1631,"config":1632},"Installation",{"href":1633,"dataGaName":1634,"dataGaLocation":1464},"/fr-fr/install/","install",{"text":1636,"config":1637},"Guides de démarrage",{"href":1638,"dataGaName":1639,"dataGaLocation":1464},"/fr-fr/get-started/","quick setup checklists",{"text":1641,"config":1642},"Apprentissage",{"href":1643,"dataGaLocation":1464,"dataGaName":1644},"https://university.gitlab.com/","learn",{"text":1646,"config":1647},"Documentation",{"href":1648,"dataGaName":1649,"dataGaLocation":1464},"https://docs.gitlab.com/","product documentation",{"text":1651,"config":1652},"Vidéos sur les bonnes pratiques",{"href":1653,"dataGaName":1654,"dataGaLocation":1464},"/fr-fr/getting-started-videos/","best practice videos",{"text":1656,"config":1657},"Intégrations",{"href":1658,"dataGaName":1659,"dataGaLocation":1464},"/fr-fr/integrations/","integrations",{"title":1661,"items":1662},"Découvrir",[1663,1668,1673,1678,1682],{"text":1664,"config":1665},"Témoignages clients",{"href":1666,"dataGaName":1667,"dataGaLocation":1464},"/fr-fr/customers/","customer success stories",{"text":1669,"config":1670},"Blog",{"href":1671,"dataGaName":1672,"dataGaLocation":1464},"/fr-fr/blog/","blog",{"text":1674,"config":1675},"Demo Hub",{"href":1676,"dataGaName":1677,"dataGaLocation":1464},"/fr-fr/demo-hub/","demo hub",{"text":1679,"config":1680},"The Source",{"href":1681,"dataGaName":1672,"dataGaLocation":1464},"/fr-fr/the-source/",{"text":1683,"config":1684},"Travail à distance",{"href":1685,"dataGaName":1686,"dataGaLocation":1464},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1688,"items":1689},"Connecter",[1690,1695,1700,1704,1709,1714],{"text":1691,"config":1692},"Services GitLab",{"href":1693,"dataGaName":1694,"dataGaLocation":1464},"/fr-fr/services/","services",{"text":1696,"config":1697},"Contribuer",{"href":1698,"dataGaName":1699,"dataGaLocation":1464},"https://contributors.gitlab.com","contribute",{"text":1701,"config":1702},"Communauté",{"href":1703,"dataGaName":1453,"dataGaLocation":1464},"/community/",{"text":1705,"config":1706},"Forum",{"href":1707,"dataGaName":1708,"dataGaLocation":1464},"https://forum.gitlab.com/","forum",{"text":1710,"config":1711},"Événements",{"href":1712,"dataGaName":1713,"dataGaLocation":1464},"/events/","events",{"text":1715,"config":1716},"Partenaires",{"href":1717,"dataGaName":1718,"dataGaLocation":1464},"/fr-fr/partners/","partners",{"config":1720,"title":1723,"text":1724,"link":1725},{"background":1721,"textColor":1722},"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":1726,"config":1727},"Lire les articles les plus récents",{"href":1728,"dataGaName":1729,"dataGaLocation":1464},"/fr-fr/whats-new/","whats new",{"text":1731,"config":1732,"menu":1734},"Société",{"dataNavLevelOne":1733},"company",{"type":1515,"columns":1735},[1736],{"items":1737},[1738,1743,1749,1751,1756,1761,1766,1771,1776,1781],{"text":1739,"config":1740},"À propos",{"href":1741,"dataGaName":1742,"dataGaLocation":1464},"/fr-fr/company/","about",{"text":1744,"config":1745,"footerGa":1748},"Carrières",{"href":1746,"dataGaName":1747,"dataGaLocation":1464},"/jobs/","jobs",{"dataGaName":1747},{"text":1710,"config":1750},{"href":1712,"dataGaName":1713,"dataGaLocation":1464},{"text":1752,"config":1753},"Leadership",{"href":1754,"dataGaName":1755,"dataGaLocation":1464},"/company/team/e-group/","leadership",{"text":1757,"config":1758},"Manuel",{"href":1759,"dataGaName":1760,"dataGaLocation":1464},"https://handbook.gitlab.com/","handbook",{"text":1762,"config":1763},"Relations avec les investisseurs",{"href":1764,"dataGaName":1765,"dataGaLocation":1464},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1767,"config":1768},"Trust Center",{"href":1769,"dataGaName":1770,"dataGaLocation":1464},"/fr-fr/security/","trust center",{"text":1772,"config":1773},"Centre pour la transparence de l'IA",{"href":1774,"dataGaName":1775,"dataGaLocation":1464},"/fr-fr/ai-transparency-center/","ai transparency center",{"text":1777,"config":1778},"Newsletter",{"href":1779,"dataGaName":1780,"dataGaLocation":1464},"/company/contact/#contact-forms","newsletter",{"text":1782,"config":1783},"Presse",{"href":1784,"dataGaName":1785,"dataGaLocation":1464},"/press/","press",{"text":1787,"config":1788,"menu":1789},"Nous contacter",{"dataNavLevelOne":1733},{"type":1515,"columns":1790},[1791],{"items":1792},[1793,1798,1803],{"text":1794,"config":1795},"Contacter l'équipe commerciale",{"href":1796,"dataGaName":1797,"dataGaLocation":1464},"/fr-fr/sales/","talk to sales",{"text":1799,"config":1800},"Assistance GitLab",{"href":1801,"dataGaName":1802,"dataGaLocation":1464},"https://support.gitlab.com/hc/en-us","support portal",{"text":1804,"config":1805},"Portail clients GitLab",{"href":1806,"dataGaName":1807,"dataGaLocation":1464},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1809,"login":1810,"suggestions":1817},"Fermer",{"text":1811,"link":1812},"Pour rechercher des dépôts et des projets, connectez-vous à",{"text":1813,"config":1814},"GitLab.com",{"href":1478,"dataGaName":1815,"dataGaLocation":1816},"search login","search",{"text":1818,"default":1819},"Suggestions",[1820,1823,1828,1830,1835,1840],{"text":1495,"config":1821},{"href":1500,"dataGaName":1822,"dataGaLocation":1816},"GitLab Duo Agent Platform",{"text":1824,"config":1825},"Suggestions de code (IA)",{"href":1826,"dataGaName":1827,"dataGaLocation":1816},"/fr-fr/solutions/code-suggestions/","Code Suggestions (AI)",{"text":1531,"config":1829},{"href":1533,"dataGaName":1531,"dataGaLocation":1816},{"text":1831,"config":1832},"GitLab sur AWS",{"href":1833,"dataGaName":1834,"dataGaLocation":1816},"/fr-fr/partners/technology-partners/aws/","GitLab on AWS",{"text":1836,"config":1837},"GitLab sur Google Cloud",{"href":1838,"dataGaName":1839,"dataGaLocation":1816},"/fr-fr/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":1841,"config":1842},"Pourquoi utiliser GitLab ?",{"href":1508,"dataGaName":1843,"dataGaLocation":1816},"Why GitLab?",{"freeTrial":1845,"mobileIcon":1850,"desktopIcon":1855,"secondaryButton":1858},{"text":1846,"config":1847},"Commencer votre essai gratuit",{"href":1848,"dataGaName":1469,"dataGaLocation":1849},"https://gitlab.com/-/trials/new/","nav",{"altText":1851,"config":1852},"Icône GitLab",{"src":1853,"dataGaName":1854,"dataGaLocation":1849},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1851,"config":1856},{"src":1857,"dataGaName":1854,"dataGaLocation":1849},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1859,"config":1860},"Commencer",{"href":1861,"dataGaName":1862,"dataGaLocation":1849},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr/get-started/","get started",{"freeTrial":1864,"mobileIcon":1868,"desktopIcon":1870},{"text":1865,"config":1866},"En savoir plus sur GitLab Duo",{"href":1500,"dataGaName":1867,"dataGaLocation":1849},"gitlab duo",{"altText":1851,"config":1869},{"src":1853,"dataGaName":1854,"dataGaLocation":1849},{"altText":1851,"config":1871},{"src":1857,"dataGaName":1854,"dataGaLocation":1849},{"button":1873,"mobileIcon":1878,"desktopIcon":1880},{"text":1874,"config":1875},"/switch",{"href":1876,"dataGaName":1877,"dataGaLocation":1849},"#contact","switch",{"altText":1851,"config":1879},{"src":1853,"dataGaName":1854,"dataGaLocation":1849},{"altText":1851,"config":1881},{"src":1882,"dataGaName":1854,"dataGaLocation":1849},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1884,"mobileIcon":1889,"desktopIcon":1891},{"text":1885,"config":1886},"Retour aux tarifs",{"href":1615,"dataGaName":1887,"dataGaLocation":1849,"icon":1888},"back to pricing","GoBack",{"altText":1851,"config":1890},{"src":1853,"dataGaName":1854,"dataGaLocation":1849},{"altText":1851,"config":1892},{"src":1857,"dataGaName":1854,"dataGaLocation":1849},{"title":1894,"button":1895,"config":1899},"GitLab Orbit est arrivé : la couche de contexte pour les agents d'IA.",{"text":1506,"config":1896},{"href":1897,"dataGaName":1898,"dataGaLocation":1464},"/fr-fr/gitlab-orbit/","orbit",{"layout":1900,"disabled":1441},"release",{"data":1902},{"text":1903,"source":1904,"edit":1910,"contribute":1915,"config":1919,"items":1924,"minimal":2132},"Git est une marque déposée de Software Freedom Conservancy et notre utilisation de « GitLab » est sous licence.",{"text":1905,"config":1906},"Afficher le code source de la page",{"href":1907,"dataGaName":1908,"dataGaLocation":1909},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1911,"config":1912},"Modifier cette page",{"href":1913,"dataGaName":1914,"dataGaLocation":1909},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1696,"config":1916},{"href":1917,"dataGaName":1918,"dataGaLocation":1909},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1920,"facebook":1921,"youtube":1922,"linkedin":1923},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1925,1971,2024,2067,2099],{"title":1613,"links":1926,"subMenu":1941},[1927,1931,1936],{"text":1928,"config":1929},"Voir les forfaits",{"href":1615,"dataGaName":1930,"dataGaLocation":1909},"view plans",{"text":1932,"config":1933},"GitLab Premium",{"href":1934,"dataGaName":1935,"dataGaLocation":1909},"/fr-fr/pricing/premium/","why premium",{"text":1937,"config":1938},"GitLab Ultimate",{"href":1939,"dataGaName":1940,"dataGaLocation":1909},"/fr-fr/pricing/ultimate/","why ultimate",[1942],{"title":1787,"links":1943},[1944,1946,1948,1951,1956,1961,1966],{"text":1794,"config":1945},{"href":1796,"dataGaName":1474,"dataGaLocation":1909},{"text":1799,"config":1947},{"href":1801,"dataGaName":1802,"dataGaLocation":1909},{"text":1949,"config":1950},"Portail clients",{"href":1806,"dataGaName":1807,"dataGaLocation":1909},{"text":1952,"config":1953},"Statut",{"href":1954,"dataGaName":1955,"dataGaLocation":1909},"https://status.gitlab.com/","status",{"text":1957,"config":1958},"Conditions d'utilisation",{"href":1959,"dataGaName":1960,"dataGaLocation":1909},"/terms/","terms of use",{"text":1962,"config":1963},"Politique de confidentialité",{"href":1964,"dataGaName":1965,"dataGaLocation":1909},"/fr-fr/privacy/","privacy statement",{"text":1967,"config":1968},"Gestion des cookies",{"dataGaName":1969,"dataGaLocation":1909,"id":1970,"isOneTrustButton":1444},"cookie preferences","ot-sdk-btn",{"title":1511,"links":1972,"subMenu":1981},[1973,1977],{"text":1974,"config":1975},"Plateforme DevSecOps",{"href":1493,"dataGaName":1976,"dataGaLocation":1909},"devsecops platform",{"text":1978,"config":1979},"Développement assisté par l'IA",{"href":1500,"dataGaName":1980,"dataGaLocation":1909},"ai-assisted development",[1982],{"title":1983,"links":1984},"Thèmes",[1985,1989,1994,1999,2004,2009,2014,2019],{"text":1531,"config":1986},{"href":1987,"dataGaName":1988,"dataGaLocation":1909},"/fr-fr/topics/ci-cd/","cicd",{"text":1990,"config":1991},"GitOps",{"href":1992,"dataGaName":1993,"dataGaLocation":1909},"/fr-fr/topics/gitops/","gitops",{"text":1995,"config":1996},"DevOps",{"href":1997,"dataGaName":1998,"dataGaLocation":1909},"/fr-fr/topics/devops/","devops",{"text":2000,"config":2001},"Contrôle de version",{"href":2002,"dataGaName":2003,"dataGaLocation":1909},"/fr-fr/topics/version-control/","version control",{"text":2005,"config":2006},"DevSecOps",{"href":2007,"dataGaName":2008,"dataGaLocation":1909},"/fr-fr/topics/devsecops/","devsecops",{"text":2010,"config":2011},"Cloud-native",{"href":2012,"dataGaName":2013,"dataGaLocation":1909},"/fr-fr/topics/cloud-native/","cloud native",{"text":2015,"config":2016},"IA pour la programmation",{"href":2017,"dataGaName":2018,"dataGaLocation":1909},"/fr-fr/topics/devops/ai-for-coding/","ai for coding",{"text":2020,"config":2021},"IA agentique",{"href":2022,"dataGaName":2023,"dataGaLocation":1909},"/fr-fr/topics/agentic-ai/","agentic ai",{"title":2025,"links":2026},"Solutions",[2027,2030,2032,2037,2040,2043,2046,2049,2051,2054,2057,2062],{"text":1556,"config":2028},{"href":1551,"dataGaName":2029,"dataGaLocation":1909},"Application Security Testing",{"text":1543,"config":2031},{"href":1527,"dataGaName":1528,"dataGaLocation":1909},{"text":2033,"config":2034},"Développement Agile",{"href":2035,"dataGaName":2036,"dataGaLocation":1909},"/fr-fr/solutions/agile-delivery/","agile delivery",{"text":1538,"config":2038},{"href":1540,"dataGaName":2039,"dataGaLocation":1909},"source code management",{"text":1531,"config":2041},{"href":1533,"dataGaName":2042,"dataGaLocation":1909},"continuous integration & delivery",{"text":1582,"config":2044},{"href":1584,"dataGaName":2045,"dataGaLocation":1909},"value stream management",{"text":1990,"config":2047},{"href":2048,"dataGaName":1993,"dataGaLocation":1909},"/fr-fr/solutions/gitops/",{"text":1595,"config":2050},{"href":1598,"dataGaName":1599,"dataGaLocation":1909},{"text":2052,"config":2053},"PME",{"href":1604,"dataGaName":1605,"dataGaLocation":1909},{"text":2055,"config":2056},"Secteur public",{"href":1610,"dataGaName":1611,"dataGaLocation":1909},{"text":2058,"config":2059},"Éducation",{"href":2060,"dataGaName":2061,"dataGaLocation":1909},"/fr-fr/solutions/education/","education",{"text":2063,"config":2064},"Services financiers",{"href":2065,"dataGaName":2066,"dataGaLocation":1909},"/fr-fr/solutions/finance/","financial services",{"title":1618,"links":2068},[2069,2071,2073,2075,2078,2080,2083,2085,2087,2089,2091,2093,2095,2097],{"text":1631,"config":2070},{"href":1633,"dataGaName":1634,"dataGaLocation":1909},{"text":1636,"config":2072},{"href":1638,"dataGaName":1639,"dataGaLocation":1909},{"text":1641,"config":2074},{"href":1643,"dataGaName":1644,"dataGaLocation":1909},{"text":1646,"config":2076},{"href":1648,"dataGaName":2077,"dataGaLocation":1909},"docs",{"text":1669,"config":2079},{"href":1671,"dataGaName":1672,"dataGaLocation":1909},{"text":2081,"config":2082},"Nouveautés",{"href":1728,"dataGaName":1729,"dataGaLocation":1909},{"text":1664,"config":2084},{"href":1666,"dataGaName":1667,"dataGaLocation":1909},{"text":1683,"config":2086},{"href":1685,"dataGaName":1686,"dataGaLocation":1909},{"text":1691,"config":2088},{"href":1693,"dataGaName":1694,"dataGaLocation":1909},{"text":1696,"config":2090},{"href":1698,"dataGaName":1699,"dataGaLocation":1909},{"text":1701,"config":2092},{"href":1703,"dataGaName":1453,"dataGaLocation":1909},{"text":1705,"config":2094},{"href":1707,"dataGaName":1708,"dataGaLocation":1909},{"text":1710,"config":2096},{"href":1712,"dataGaName":1713,"dataGaLocation":1909},{"text":1715,"config":2098},{"href":1717,"dataGaName":1718,"dataGaLocation":1909},{"title":1731,"links":2100},[2101,2103,2105,2107,2109,2111,2116,2121,2123,2125,2127],{"text":1739,"config":2102},{"href":1741,"dataGaName":1733,"dataGaLocation":1909},{"text":1744,"config":2104},{"href":1746,"dataGaName":1747,"dataGaLocation":1909},{"text":1752,"config":2106},{"href":1754,"dataGaName":1755,"dataGaLocation":1909},{"text":1757,"config":2108},{"href":1759,"dataGaName":1760,"dataGaLocation":1909},{"text":1762,"config":2110},{"href":1764,"dataGaName":1765,"dataGaLocation":1909},{"text":2112,"config":2113},"Développement durable",{"href":2114,"dataGaName":2115,"dataGaLocation":1909},"/sustainability/","Sustainability",{"text":2117,"config":2118},"Diversité, inclusion et appartenance (DIB)",{"href":2119,"dataGaName":2120,"dataGaLocation":1909},"/fr-fr/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1767,"config":2122},{"href":1769,"dataGaName":1770,"dataGaLocation":1909},{"text":1777,"config":2124},{"href":1779,"dataGaName":1780,"dataGaLocation":1909},{"text":1782,"config":2126},{"href":1784,"dataGaName":1785,"dataGaLocation":1909},{"text":2128,"config":2129},"Déclaration de transparence sur l'esclavage moderne",{"href":2130,"dataGaName":2131,"dataGaLocation":1909},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":2133},[2134,2136,2138],{"text":1957,"config":2135},{"href":1959,"dataGaName":1960,"dataGaLocation":1909},{"text":1967,"config":2137},{"dataGaName":1969,"dataGaLocation":1909,"id":1970,"isOneTrustButton":1444},{"text":1962,"config":2139},{"href":1964,"dataGaName":1965,"dataGaLocation":1909},[2141],{"id":2142,"title":7,"body":1440,"config":2143,"content":2145,"description":1440,"extension":2149,"meta":2150,"navigation":1444,"path":2151,"seo":2152,"stem":2153,"__hash__":2154},"blogAuthors/en-us/blog/authors/stan-hu.yml",{"template":2144},"BlogAuthor",{"name":7,"config":2146},{"headshot":2147,"ctfId":2148},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659504/Blog/Author%20Headshots/stanhu-headshot.jpg","stanhu","yml",{},"/en-us/blog/authors/stan-hu",{},"en-us/blog/authors/stan-hu","KmQVCb_7YcWghHApaS2EI3J2bQ0dRustgOz4wYyOnVk",[2156,2164,2172],{"title":2157,"description":2158,"heroImage":2159,"category":1436,"date":2160,"authors":2161,"slug":2163,"externalUrl":1440},"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",[2162],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":2165,"description":2166,"heroImage":2167,"category":1436,"date":2168,"authors":2169,"slug":2171,"externalUrl":1440},"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",[2170],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"title":2173,"description":2174,"heroImage":2175,"category":1436,"date":2176,"authors":2177,"slug":2179,"externalUrl":1440},"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",[2178],"Omid Khan","5-ways-gitlab-pipeline-logic-solves-real-engineering-problems",{"promotions":2181},[2182,2196,2208,2220],{"id":2183,"categories":2184,"header":2186,"text":2187,"button":2188,"image":2193},"ai-modernization",[2185],"ai","L'IA tient-elle ses promesses à grande échelle ?","Le questionnaire ne prendra pas plus de 5 minutes.",{"text":2189,"config":2190},"Obtenez votre score de maturité IA",{"href":2191,"dataGaName":2192,"dataGaLocation":1672},"/fr-fr/assessments/ai-modernization-assessment/","modernization assessment",{"config":2194},{"src":2195},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":2197,"categories":2198,"header":2200,"text":2187,"button":2201,"image":2205},"devops-modernization",[2199,2008],"product","Vous contentez-vous de gérer des outils ou de livrer des innovations ?",{"text":2202,"config":2203},"Obtenez votre score de maturité DevOps",{"href":2204,"dataGaName":2192,"dataGaLocation":1672},"/fr-fr/assessments/devops-modernization-assessment/",{"config":2206},{"src":2207},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":2209,"categories":2210,"header":2212,"text":2187,"button":2213,"image":2217},"security-modernization",[2211],"security","Faut-il sacrifier la rapidité pour garantir la sécurité ?",{"text":2214,"config":2215},"Obtenez votre score de maturité en matière de sécurité",{"href":2216,"dataGaName":2192,"dataGaLocation":1672},"/fr-fr/assessments/security-modernization-assessment/",{"config":2218},{"src":2219},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":2221,"paths":2222,"header":2225,"text":2226,"button":2227,"image":2232},"github-azure-migration",[2223,2224],"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":2228,"config":2229},"Découvrez les différences entre GitLab et GitHub",{"href":2230,"dataGaName":2231,"dataGaLocation":1672},"/fr-fr/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":2233},{"src":2207},{"header":2235,"blurb":2236,"button":2237,"secondaryButton":2241},"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":1466,"config":2238},{"href":2239,"dataGaName":1469,"dataGaLocation":2240},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/fr-fr/","feature",{"text":1794,"config":2242},{"href":1796,"dataGaName":1474,"dataGaLocation":2240},1786803747401]