[{"data":1,"prerenderedAt":1987},["ShallowReactive",2],{"/fr-fr/blog/how-to-deploy-react-to-amazon-s3":3,"navigation-fr-fr":1204,"banner-fr-fr":1638,"footer-fr-fr":1646,"blog-post-authors-fr-fr-Jeremy Wagner":1884,"blog-related-posts-fr-fr-how-to-deploy-react-to-amazon-s3":1899,"blog-promotions-fr-fr":1924,"next-steps-fr-fr":1978},{"id":4,"title":5,"authors":6,"body":8,"category":1183,"date":1184,"description":1185,"extension":1186,"externalUrl":1187,"faq":1187,"featured":1188,"heroImage":1189,"meta":1190,"navigation":1191,"path":1192,"seo":1193,"slug":1197,"stem":1198,"tags":1199,"template":1201,"updatedDate":1202,"__hash__":1203},"blogPosts/fr-fr/blog/how-to-deploy-react-to-amazon-s3.md","Comment déployer une application React sur Amazon S3 avec GitLab CI/CD",[7],"Jeremy Wagner",{"type":9,"value":10,"toc":1164},"minimark",[11,15,18,36,46,51,54,89,98,109,118,122,125,130,133,136,144,147,154,157,163,167,170,176,183,189,193,196,199,205,208,214,217,347,353,356,362,366,369,372,391,398,401,407,410,413,419,422,428,432,440,444,453,456,462,465,475,489,492,496,499,505,656,659,663,666,669,672,680,686,689,692,698,702,711,727,730,734,741,749,752,756,759,772,810,815,934,945,950,1073,1092,1102,1108,1114,1118,1136,1142,1151,1160],[12,13,14],"p",{},"Amazon S3 dispose d'une fonctionnalité d'hébergement qui vous permet d'héberger un site Web statique directement à partir d'un bucket S3, également appelé compartiment. Lorsque vous hébergez votre site Web sur Amazon S3, son contenu est stocké dans un bucket S3 et servi directement à vos utilisateurs, sans besoin de ressources supplémentaires.",[12,16,17],{},"Combinez cela avec Amazon CloudFront et vous obtiendrez une solution rentable et évolutive pour l'hébergement de vos sites Web statiques. Une fonctionnalité particulièrement utile pour les applications à page unique.",[12,19,20,21,28,29,35],{},"Dans cet article, nous vous guidons dans la configuration de votre bucket Amazon S3, la configuration d'OpenID Connect (",[22,23,27],"a",{"href":24,"rel":25,"title":26},"https://openid.net/developers/how-connect-works/",[],"OpenID Connect","OIDC",") dans AWS et le déploiement de votre application sur Amazon S3 à l'aide d'un pipeline GitLab ",[22,30,34],{"href":31,"rel":32,"title":33},"https://about.gitlab.com/fr-fr/topics/ci-cd/",[],"Qu'est-ce que le CI/CD ?","CI/CD",".",[12,37,38,39,45],{},"À la fin de cet article, vous disposerez d'un ",[22,40,44],{"href":41,"rel":42,"title":43},"https://about.gitlab.com/fr-fr/topics/ci-cd/cicd-pipeline/",[],"Qu'est-ce qu'un pipeline CI/CD ?","pipeline CI/CD"," construit dans GitLab qui se déploie automatiquement dans votre bucket Amazon S3.",[47,48,50],"h2",{"id":49},"prérequis","Prérequis",[12,52,53],{},"Pour ce guide, vous aurez besoin des éléments suivants :",[55,56,57,66,74,82],"ul",{},[58,59,60,65],"li",{},[22,61,64],{"href":62,"rel":63},"https://nodejs.org/fr",[],"Node.js"," >= 14.0.0 et npm >= 5.6 installés sur votre système",[58,67,68,73],{},[22,69,72],{"href":70,"rel":71},"https://git-scm.com/",[],"Git"," installé sur votre système",[58,75,76,77],{},"Un ",[22,78,81],{"href":79,"rel":80},"https://gitlab.com/-/trials/new",[],"compte GitLab",[58,83,76,84],{},[22,85,88],{"href":86,"rel":87},"https://aws.amazon.com/fr/free/",[],"compte AWS",[12,90,91,92,97],{},"Dans un ",[22,93,96],{"href":94,"rel":95},"https://about.gitlab.com/blog/how-to-automate-testing-for-a-react-application-with-gitlab/",[],"précédent tutoriel"," nous vous avons expliqué comment :",[55,99,100,103,106],{},[58,101,102],{},"créer une nouvelle application React,",[58,104,105],{},"exécuter des tests unitaires dans le cadre du processus CI dans GitLab,",[58,107,108],{},"générer les résultats des tests ainsi que la couverture de code dans le pipeline.",[12,110,111,112,117],{},"Cet article constitue la ",[22,113,116],{"href":114,"rel":115},"https://gitlab.com/guided-explorations/engineering-tutorials/react-unit-testing",[],"suite de ce projet",". Libre à vous de le parcourir et de le dupliquer (fork).",[47,119,121],{"id":120},"configuration-de-votre-bucket-s3","Configuration de votre bucket S3",[12,123,124],{},"Pour commencer, vous devez configurer votre bucket Amazon S3.",[126,127,129],"h3",{"id":128},"créez-votre-compartiment","Créez votre compartiment",[12,131,132],{},"Après vous être connecté à votre compte AWS, recherchez « S3 » à l'aide de la barre de recherche et sélectionnez le service S3. Cela ouvrira la page d'accueil du service.",[12,134,135],{},"Vous devriez immédiatement voir l'option permettant de créer un bucket (compartiment). Ce compartiment est l'endroit où vous allez stocker votre application React une fois créée. Cliquez sur le bouton « Créer un compartiment » pour continuer.",[12,137,138,143],{},[139,140],"img",{"alt":141,"src":142},"Création d'un bucket S3","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397759/blog/Content%20Images/2023-02-10-how-to-deploy-react-to-amazon-s3/create_bucket.png","{: .shadow}",[12,145,146],{},"Donnez un nom à votre compartiment, sélectionnez votre région, laissez le reste des paramètres par défaut (nous y reviendrons plus tard) et continuez en cliquant sur le bouton « Créer un compartiment ».",[12,148,149,150,35],{},"Lorsque vous nommez votre compartiment, il est important de se rappeler que le nom doit être unique et suivre les règles de nommage des compartiments. Nous avons nommé le nôtre ",[151,152,153],"code",{},"jw-gl-react",[12,155,156],{},"Une fois votre compartiment créé, vous devriez être redirigé vers une liste de vos compartiments, comme montré ci-dessous.",[12,158,159,143],{},[139,160],{"alt":161,"src":162},"Liste bucket S3 AWS","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397758/blog/Content%20Images/2023-02-10-how-to-deploy-react-to-amazon-s3/bucket_list.png",[126,164,166],{"id":165},"configurez-lhébergement-de-site-web-statique","Configurez l'hébergement de site web statique",[12,168,169],{},"L'étape suivante consiste à configurer l'hébergement de site web statique. Ouvrez votre compartiment en cliquant sur son nom. Sélectionnez l'onglet « Propriétés »  et faites défiler vers le bas pour trouver l'option d'hébergement de site web statique.",[12,171,172,143],{},[139,173],{"alt":174,"src":175},"Configuration de l'hébergement de site web statique","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397760/blog/Content%20Images/2023-02-10-how-to-deploy-react-to-amazon-s3/static_hosting_1.png",[12,177,178,179,182],{},"Cliquez sur « Modifier », puis activez l'hébergement de site web statique. Pour les documents d’index et d’erreur, saisissez ",[151,180,181],{},"index.html",", puis cliquez sur « Enregistrer les modifications ».",[12,184,185,143],{},[139,186],{"alt":187,"src":188},"Activation de l'hébergement de site web statique sur Amazon S3","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397761/blog/Content%20Images/2023-02-10-how-to-deploy-react-to-amazon-s3/static_hosting_2.png",[126,190,192],{"id":191},"configurez-les-autorisations-de-votre-application-react","Configurez les autorisations de votre application React",[12,194,195],{},"Maintenant que vous avez activé l'hébergement de site web statique, vous devez mettre à jour vos autorisations afin que votre audience puisse accéder à votre site web. Revenez à votre compartiment et sélectionnez l'onglet « Autorisations ».",[12,197,198],{},"Sous « Bloquer l'accès public » (paramètres du compartiment), cliquez sur « Modifier », décochez « Bloquer tous les accès publics » et continuez en cliquant sur « Enregistrer les modifications ».",[12,200,201,143],{},[139,202],{"alt":203,"src":204},"Bloquer l'accès public","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397757/blog/Content%20Images/2023-02-10-how-to-deploy-react-to-amazon-s3/block_access_1.png",[12,206,207],{},"Votre page devrait maintenant ressembler à ceci :",[12,209,210,143],{},[139,211],{"alt":212,"src":213},"Configurer permission bucket S3 AWS","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397757/blog/Content%20Images/2023-02-10-how-to-deploy-react-to-amazon-s3/block_access_2.png",[12,215,216],{},"Maintenant, vous devez modifier la stratégie de compartiment. Pour cela, cliquez sur le bouton « Modifier » dans la section « Stratégie de compartiment » et collez le code suivant :",[218,219,224],"pre",{"className":220,"code":221,"language":222,"meta":223,"style":223},"language-javascript shiki shiki-themes github-light","{\n    \"Version\": \"2012-10-17\",\n    \"Statement\": [\n        {\n            \"Sid\": \"PublicReadGetObject\",\n            \"Effect\": \"Allow\",\n            \"Principal\": \"*\",\n            \"Action\": \"s3:GetObject\",\n            \"Resource\": \"arn:aws:s3:::jw-gl-react/*\"\n        }\n    ]\n}\n","javascript","",[151,225,226,235,251,260,266,279,292,305,318,329,335,341],{"__ignoreMap":223},[227,228,231],"span",{"class":229,"line":230},"line",1,[227,232,234],{"class":233},"sgsFI","{\n",[227,236,238,242,245,248],{"class":229,"line":237},2,[227,239,241],{"class":240},"sYBdl","    \"Version\"",[227,243,244],{"class":233},": ",[227,246,247],{"class":240},"\"2012-10-17\"",[227,249,250],{"class":233},",\n",[227,252,254,257],{"class":229,"line":253},3,[227,255,256],{"class":240},"    \"Statement\"",[227,258,259],{"class":233},": [\n",[227,261,263],{"class":229,"line":262},4,[227,264,265],{"class":233},"        {\n",[227,267,269,272,274,277],{"class":229,"line":268},5,[227,270,271],{"class":240},"            \"Sid\"",[227,273,244],{"class":233},[227,275,276],{"class":240},"\"PublicReadGetObject\"",[227,278,250],{"class":233},[227,280,282,285,287,290],{"class":229,"line":281},6,[227,283,284],{"class":240},"            \"Effect\"",[227,286,244],{"class":233},[227,288,289],{"class":240},"\"Allow\"",[227,291,250],{"class":233},[227,293,295,298,300,303],{"class":229,"line":294},7,[227,296,297],{"class":240},"            \"Principal\"",[227,299,244],{"class":233},[227,301,302],{"class":240},"\"*\"",[227,304,250],{"class":233},[227,306,308,311,313,316],{"class":229,"line":307},8,[227,309,310],{"class":240},"            \"Action\"",[227,312,244],{"class":233},[227,314,315],{"class":240},"\"s3:GetObject\"",[227,317,250],{"class":233},[227,319,321,324,326],{"class":229,"line":320},9,[227,322,323],{"class":240},"            \"Resource\"",[227,325,244],{"class":233},[227,327,328],{"class":240},"\"arn:aws:s3:::jw-gl-react/*\"\n",[227,330,332],{"class":229,"line":331},10,[227,333,334],{"class":233},"        }\n",[227,336,338],{"class":229,"line":337},11,[227,339,340],{"class":233},"    ]\n",[227,342,344],{"class":229,"line":343},12,[227,345,346],{"class":233},"}\n",[12,348,349,350,352],{},"À la ligne « Ressource », remplacez ",[151,351,153],{},"  par le nom de votre compartiment et enregistrez les modifications.",[12,354,355],{},"Votre compartiment devrait ressembler à ceci :",[12,357,358,143],{},[139,359],{"alt":360,"src":361},"Bucket S3 accès public","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397757/blog/Content%20Images/2023-02-10-how-to-deploy-react-to-amazon-s3/block_access_3.png",[47,363,365],{"id":364},"chargement-de-votre-application-react","Chargement de votre application React",[12,367,368],{},"Maintenant, créons votre application React et publions-la manuellement dans votre bucket S3.",[12,370,371],{},"Pour créer l'application, assurez-vous que votre projet soit cloné sur votre machine locale et exécutez la commande suivante dans votre terminal à l'intérieur du répertoire de votre dépôt :",[218,373,377],{"className":374,"code":375,"language":376,"meta":223,"style":223},"language-shell shiki shiki-themes github-light","npm run build\n","shell",[151,378,379],{"__ignoreMap":223},[227,380,381,385,388],{"class":229,"line":230},[227,382,384],{"class":383},"s7eDp","npm",[227,386,387],{"class":240}," run",[227,389,390],{"class":240}," build\n",[12,392,393,394,397],{},"Cela créera un dossier ",[151,395,396],{},"build"," à l'intérieur du répertoire de votre dépôt.",[12,399,400],{},"Dans votre compartiment, cliquez sur le bouton « Charger »",[12,402,403,143],{},[139,404],{"alt":405,"src":406},"Chargement de l'application React","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397762/blog/Content%20Images/2023-02-10-how-to-deploy-react-to-amazon-s3/upload_1.png",[12,408,409],{},"Faites glisser le contenu de votre dossier nouvellement créé (et non le dossier lui-même) dans la zone de chargement. Cela chargera le contenu de votre application React dans votre compartiment. Assurez-vous de cliquer sur « Charger » en bas de la page pour démarrer le chargement.",[12,411,412],{},"Revenez maintenant à l'onglet « Propriétés » de votre compartiment et faites défiler vers le bas pour trouver l'URL de votre site web statique.",[12,414,415,143],{},[139,416],{"alt":417,"src":418},"URL du site web statique","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397762/blog/Content%20Images/2023-02-10-how-to-deploy-react-to-amazon-s3/upload_2.png",[12,420,421],{},"Cliquez sur le lien et vous devriez voir votre application React nouvellement créée s'ouvrir dans votre navigateur.",[12,423,424,143],{},[139,425],{"alt":426,"src":427},"Application React déployée","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397760/blog/Content%20Images/2023-02-10-how-to-deploy-react-to-amazon-s3/manual_deploy.png",[47,429,431],{"id":430},"configuration-dopenid-connect-dans-aws","Configuration d’OpenID Connect dans AWS",[12,433,434,435,35],{},"Pour déployer sur votre bucket S3 depuis GitLab, nous allons utiliser un job GitLab CI/CD pour  recevoir des informations d'identification temporaires d'AWS sans avoir besoin de stocker des secrets. Pour ce faire, nous allons configurer OpenID Connect pour la fédération d'identité entre GitLab et AWS. Nous suivrons la ",[22,436,439],{"href":437,"rel":438},"https://docs.gitlab.com/ci/cloud_services/aws/",[],"documentation de GitLab associée",[126,441,443],{"id":442},"ajoutez-un-fournisseur-didentité","Ajoutez un fournisseur d'identité",[12,445,446,447,452],{},"La première étape consiste à ajouter GitLab en tant que fournisseur d’identité OpenID Connect (OIDC) dans IAM. AWS fournit des ",[22,448,451],{"href":449,"rel":450},"https://docs.aws.amazon.com/fr_fr/IAM/latest/UserGuide/id_roles_providers_create_oidc.html",[],"instructions",", mais nous allons les parcourir étape par étape dans ce guide.",[12,454,455],{},"Ouvrez tout d'abord la console IAM dans AWS.",[12,457,458,143],{},[139,459],{"alt":460,"src":461},"Console IAM dans AWS","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397759/blog/Content%20Images/2023-02-10-how-to-deploy-react-to-amazon-s3/iam_1.png",[12,463,464],{},"Dans le volet de navigation de gauche, sous « Gestion des accès », choisissez « Fournisseurs d'identité », puis « Ajouter un fournisseur ». Pour le type de fournisseur, sélectionnez « OpenID Connect ».",[12,466,467,468,471,472,35],{},"Pour l'URL du fournisseur, saisissez l'adresse de votre instance GitLab, telle que ",[151,469,470],{},"https://gitlab.com"," ou ",[151,473,474],{},"https://gitlab.example.com",[12,476,477,478,481,482,485,486,35],{},"Pour « Audience », saisissez quelque chose de générique mais spécifique à votre application React. Dans notre cas, nous allons utiliser ",[151,479,480],{},"react_s3_gl",". Veillez à choisir quelque chose qui ne soit pas facile à deviner et prenez note de cette valeur, car vous l'utiliserez pour définir l'",[151,483,484],{},"ID_TOKEN"," dans votre fichier ",[151,487,488],{},".gitLab-ci.yml",[12,490,491],{},"Après avoir saisi l'URL du fournisseur, cliquez sur « Obtenir une empreinte numérique »  pour vérifier le certificat du serveur de votre fournisseur d'identité. Ensuite, continuez et cliquez sur « Ajouter un fournisseur » pour terminer.",[126,493,495],{"id":494},"créez-une-politique-dautorisations","Créez une politique d’autorisations",[12,497,498],{},"Après avoir créé le fournisseur d'identité, vous devez créer une politique d’autorisations.",[12,500,501,502,504],{},"Depuis le tableau de bord IAM, sous « Gestion des accès », sélectionnez « Politiques » puis « Créer une politique ». Sélectionnez l'onglet JSON et collez le code suivant en remplaçant ",[151,503,153],{}," par le nom de votre compartiment à la ligne « Ressource ».",[218,506,508],{"className":220,"code":507,"language":222,"meta":223,"style":223},"{\n  \"Version\": \"2012-10-17\",\n  \"Statement\": [\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\"s3:ListBucket\"],\n      \"Resource\": [\"arn:aws:s3:::jw-gl-react\"]\n    },\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\n        \"s3:PutObject\",\n        \"s3:GetObject\",\n        \"s3:DeleteObject\"\n      ],\n      \"Resource\": [\"arn:aws:s3:::jw-gl-react/*\"]\n    }\n  ]\n}\n",[151,509,510,514,525,532,537,548,562,575,580,584,594,600,607,615,621,627,639,645,651],{"__ignoreMap":223},[227,511,512],{"class":229,"line":230},[227,513,234],{"class":233},[227,515,516,519,521,523],{"class":229,"line":237},[227,517,518],{"class":240},"  \"Version\"",[227,520,244],{"class":233},[227,522,247],{"class":240},[227,524,250],{"class":233},[227,526,527,530],{"class":229,"line":253},[227,528,529],{"class":240},"  \"Statement\"",[227,531,259],{"class":233},[227,533,534],{"class":229,"line":262},[227,535,536],{"class":233},"    {\n",[227,538,539,542,544,546],{"class":229,"line":268},[227,540,541],{"class":240},"      \"Effect\"",[227,543,244],{"class":233},[227,545,289],{"class":240},[227,547,250],{"class":233},[227,549,550,553,556,559],{"class":229,"line":281},[227,551,552],{"class":240},"      \"Action\"",[227,554,555],{"class":233},": [",[227,557,558],{"class":240},"\"s3:ListBucket\"",[227,560,561],{"class":233},"],\n",[227,563,564,567,569,572],{"class":229,"line":294},[227,565,566],{"class":240},"      \"Resource\"",[227,568,555],{"class":233},[227,570,571],{"class":240},"\"arn:aws:s3:::jw-gl-react\"",[227,573,574],{"class":233},"]\n",[227,576,577],{"class":229,"line":307},[227,578,579],{"class":233},"    },\n",[227,581,582],{"class":229,"line":320},[227,583,536],{"class":233},[227,585,586,588,590,592],{"class":229,"line":331},[227,587,541],{"class":240},[227,589,244],{"class":233},[227,591,289],{"class":240},[227,593,250],{"class":233},[227,595,596,598],{"class":229,"line":337},[227,597,552],{"class":240},[227,599,259],{"class":233},[227,601,602,605],{"class":229,"line":343},[227,603,604],{"class":240},"        \"s3:PutObject\"",[227,606,250],{"class":233},[227,608,610,613],{"class":229,"line":609},13,[227,611,612],{"class":240},"        \"s3:GetObject\"",[227,614,250],{"class":233},[227,616,618],{"class":229,"line":617},14,[227,619,620],{"class":240},"        \"s3:DeleteObject\"\n",[227,622,624],{"class":229,"line":623},15,[227,625,626],{"class":233},"      ],\n",[227,628,630,632,634,637],{"class":229,"line":629},16,[227,631,566],{"class":240},[227,633,555],{"class":233},[227,635,636],{"class":240},"\"arn:aws:s3:::jw-gl-react/*\"",[227,638,574],{"class":233},[227,640,642],{"class":229,"line":641},17,[227,643,644],{"class":233},"    }\n",[227,646,648],{"class":229,"line":647},18,[227,649,650],{"class":233},"  ]\n",[227,652,654],{"class":229,"line":653},19,[227,655,346],{"class":233},[12,657,658],{},"Sélectionnez le bouton « Suivant : Balises » , ajoutez les balises souhaitées, puis sélectionnez le bouton « Suivant : Confirmer ». Entrez un nom pour votre politique avant de terminer sa création.",[126,660,662],{"id":661},"configurez-le-rôle","Configurez le rôle",[12,664,665],{},"Il est maintenant temps d'ajouter le rôle. Depuis le tableau de bord IAM, sous « Gestion des accès  », sélectionnez « Rôles », puis cliquez sur « Créer un rôle » et choisissez « Identité Web ».",[12,667,668],{},"Dans la section « Identité Web », sélectionnez le fournisseur d'identité que vous avez créé précédemment. Pour l'audience, sélectionnez également l'audience que vous avez créée précédemment. Cliquez sur le bouton « Suivant » pour continuer.",[12,670,671],{},"Si vous souhaitez limiter l'autorisation à un groupe, un projet, une branche ou une balise spécifique, vous pouvez créer une « Politique d’approbation personnalisée » (Custom Trust Policy) au lieu d'une « Identité Web ».",[12,673,674,675,35],{},"Pour une liste complète des types de filtres qu'il est possible d'appliquer, ",[22,676,679],{"href":677,"rel":678},"https://docs.gitlab.com/ci/cloud_services/#configure-a-conditional-role-with-oidc-claims",[],"consultez notre documentation",[12,681,682,143],{},[139,683],{"alt":684,"src":685},"Configuration du rôle dans l'IAM","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397760/blog/Content%20Images/2023-02-10-how-to-deploy-react-to-amazon-s3/iam_2.png",[12,687,688],{},"Au cours de l'étape « Ajout des autorisations », sélectionnez la politique que vous avez créée, puis cliquez sur « Suivant » pour continuer. Donnez un nom à votre rôle et cliquez sur « Créer un rôle ».",[12,690,691],{},"Ouvrez le rôle que vous venez de créer. Dans la section « Récapitulatif », recherchez le nom de ressource Amazon (ARN) et enregistrez-le dans un endroit sécurisé. Vous l'utiliserez dans votre pipeline.",[12,693,694,143],{},[139,695],{"alt":696,"src":697},"Déployer le rôle dans l'IAM","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397760/blog/Content%20Images/2023-02-10-how-to-deploy-react-to-amazon-s3/iam_3.png",[47,699,701],{"id":700},"déploiement-sur-votre-compartiment-amazon-s3-à-laide-dun-pipeline-gitlab-cicd","Déploiement sur votre compartiment Amazon S3 à l'aide d'un pipeline GitLab CI/CD",[12,703,704,705,710],{},"Dans votre projet, créez deux ",[22,706,709],{"href":707,"rel":708},"https://docs.gitlab.com/ci/variables/#define-a-cicd-variable-in-the-ui",[],"variables CI/CD"," :",[55,712,713,720],{},[58,714,715,716,719],{},"La première variable doit être nommée ",[151,717,718],{},"ROLE_ARN",". Pour la valeur, collez l'ARN du rôle que vous venez de créer.",[58,721,722,723,726],{},"La deuxième variable doit être nommée ",[151,724,725],{},"S3_BUCKET",". Pour la valeur, collez le nom du compartiment que vous avez créé plus tôt.",[12,728,729],{},"Pour des raisons de sécurité, dans cet article nous avons choisi de masquer nos variables.",[126,731,733],{"id":732},"récupérez-vos-identifiants-temporaires","Récupérez vos identifiants temporaires",[12,735,736,737,740],{},"Dans votre fichier ",[151,738,739],{},".gitlab-ci.yml",", collez le code suivant :",[218,742,747],{"className":743,"code":745,"language":746,"meta":223},[744],"language-text",".assume_role: &assume_role\n    - >\n      STS=($(aws sts assume-role-with-web-identity\n      --role-arn ${ROLE_ARN}\n      --role-session-name \"GitLabRunner-${CI_PROJECT_ID}-${CI_PIPELINE_ID}\"\n      --web-identity-token $ID_TOKEN\n      --duration-seconds 3600\n      --query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]'\n      --output text))\n    - export AWS_ACCESS_KEY_ID=\"${STS[0]}\"\n    - export AWS_SECRET_ACCESS_KEY=\"${STS[1]}\"\n    - export AWS_SESSION_TOKEN=\"${STS[2]}\"\n\n","text",[151,748,745],{"__ignoreMap":223},[12,750,751],{},"Cela va utiliser le service de jeton de sécurité AWS (AWS Security Token Service) pour générer des identifiants temporaires (3 600 secondes) en utilisant le rôle OpenID Connect que vous avez créé précédemment.",[126,753,755],{"id":754},"créez-le-job-de-déploiement-pour-votre-application-react","Créez le job de déploiement pour votre application React",[12,757,758],{},"Maintenant, ajoutons un job de compilation et de déploiement pour créer votre application et la déployer sur votre bucket S3.",[12,760,761,762,764,765,767,768,771],{},"Tout d'abord, mettez à jour les étapes dans votre fichier ",[151,763,739],{}," pour inclure une étape ",[151,766,396],{}," et ",[151,769,770],{},"deploy",", comme indiqué ci-dessous :",[218,773,777],{"className":774,"code":775,"language":776,"meta":223,"style":223},"language-yaml shiki shiki-themes github-light","stages:\n  - build\n  - test\n  - deploy\n\n","yaml",[151,778,779,788,796,803],{"__ignoreMap":223},[227,780,781,785],{"class":229,"line":230},[227,782,784],{"class":783},"shJU0","stages",[227,786,787],{"class":233},":\n",[227,789,790,793],{"class":229,"line":237},[227,791,792],{"class":233},"  - ",[227,794,795],{"class":240},"build\n",[227,797,798,800],{"class":229,"line":253},[227,799,792],{"class":233},[227,801,802],{"class":240},"test\n",[227,804,805,807],{"class":229,"line":262},[227,806,792],{"class":233},[227,808,809],{"class":240},"deploy\n",[12,811,812,813,710],{},"Ensuite, ajoutons un job pour créer votre application. Collez le code suivant dans votre fichier ",[151,814,488],{},[218,816,818],{"className":774,"code":817,"language":776,"meta":223,"style":223},"build artifact:\n  stage: build\n  image: node:latest\n  before_script:\n    - npm install\n  script:\n    - npm run build\n  artifacts:\n    paths:\n      - build/\n    when: always\n  rules:\n    - if: '$CI_COMMIT_REF_NAME == \"main\"'\n      when: always\n\n",[151,819,820,827,836,846,853,861,868,874,881,888,896,906,913,925],{"__ignoreMap":223},[227,821,822,825],{"class":229,"line":230},[227,823,824],{"class":783},"build artifact",[227,826,787],{"class":233},[227,828,829,832,834],{"class":229,"line":237},[227,830,831],{"class":783},"  stage",[227,833,244],{"class":233},[227,835,795],{"class":240},[227,837,838,841,843],{"class":229,"line":253},[227,839,840],{"class":783},"  image",[227,842,244],{"class":233},[227,844,845],{"class":240},"node:latest\n",[227,847,848,851],{"class":229,"line":262},[227,849,850],{"class":783},"  before_script",[227,852,787],{"class":233},[227,854,855,858],{"class":229,"line":268},[227,856,857],{"class":233},"    - ",[227,859,860],{"class":240},"npm install\n",[227,862,863,866],{"class":229,"line":281},[227,864,865],{"class":783},"  script",[227,867,787],{"class":233},[227,869,870,872],{"class":229,"line":294},[227,871,857],{"class":233},[227,873,375],{"class":240},[227,875,876,879],{"class":229,"line":307},[227,877,878],{"class":783},"  artifacts",[227,880,787],{"class":233},[227,882,883,886],{"class":229,"line":320},[227,884,885],{"class":783},"    paths",[227,887,787],{"class":233},[227,889,890,893],{"class":229,"line":331},[227,891,892],{"class":233},"      - ",[227,894,895],{"class":240},"build/\n",[227,897,898,901,903],{"class":229,"line":337},[227,899,900],{"class":783},"    when",[227,902,244],{"class":233},[227,904,905],{"class":240},"always\n",[227,907,908,911],{"class":229,"line":343},[227,909,910],{"class":783},"  rules",[227,912,787],{"class":233},[227,914,915,917,920,922],{"class":229,"line":609},[227,916,857],{"class":233},[227,918,919],{"class":783},"if",[227,921,244],{"class":233},[227,923,924],{"class":240},"'$CI_COMMIT_REF_NAME == \"main\"'\n",[227,926,927,930,932],{"class":229,"line":617},[227,928,929],{"class":783},"      when",[227,931,244],{"class":233},[227,933,905],{"class":240},[12,935,936,937,940,941,944],{},"Cela va exécuter ",[151,938,939],{},"npm run build"," si le changement se produit sur la branche ",[151,942,943],{},"main"," et télécharger le répertoire de compilation (build directory) en tant qu'artefact à utiliser lors de l'étape suivante.",[12,946,947,948,710],{},"Ensuite, ajoutons un job qui sera réellement déployé sur votre bucket S3. Collez le code suivant dans votre fichier ",[151,949,488],{},[218,951,953],{"className":774,"code":952,"language":776,"meta":223,"style":223},"deploy s3:\n  stage: deploy\n  image:\n    name: amazon/aws-cli:latest\n    entrypoint: \n      - '/usr/bin/env'\n  id_tokens:\n      ID_TOKEN:\n        aud: react_s3_gl\n  script:\n    - *assume_role\n    - aws s3 sync build/ s3://$S3_BUCKET\n  rules:\n    - if: '$CI_COMMIT_REF_NAME == \"main\"'\n      when: always\n\n",[151,954,955,962,970,976,986,994,1001,1008,1015,1025,1031,1042,1049,1055,1065],{"__ignoreMap":223},[227,956,957,960],{"class":229,"line":230},[227,958,959],{"class":783},"deploy s3",[227,961,787],{"class":233},[227,963,964,966,968],{"class":229,"line":237},[227,965,831],{"class":783},[227,967,244],{"class":233},[227,969,809],{"class":240},[227,971,972,974],{"class":229,"line":253},[227,973,840],{"class":783},[227,975,787],{"class":233},[227,977,978,981,983],{"class":229,"line":262},[227,979,980],{"class":783},"    name",[227,982,244],{"class":233},[227,984,985],{"class":240},"amazon/aws-cli:latest\n",[227,987,988,991],{"class":229,"line":268},[227,989,990],{"class":783},"    entrypoint",[227,992,993],{"class":233},": \n",[227,995,996,998],{"class":229,"line":281},[227,997,892],{"class":233},[227,999,1000],{"class":240},"'/usr/bin/env'\n",[227,1002,1003,1006],{"class":229,"line":294},[227,1004,1005],{"class":783},"  id_tokens",[227,1007,787],{"class":233},[227,1009,1010,1013],{"class":229,"line":307},[227,1011,1012],{"class":783},"      ID_TOKEN",[227,1014,787],{"class":233},[227,1016,1017,1020,1022],{"class":229,"line":320},[227,1018,1019],{"class":783},"        aud",[227,1021,244],{"class":233},[227,1023,1024],{"class":240},"react_s3_gl\n",[227,1026,1027,1029],{"class":229,"line":331},[227,1028,865],{"class":783},[227,1030,787],{"class":233},[227,1032,1033,1035,1039],{"class":229,"line":337},[227,1034,857],{"class":233},[227,1036,1038],{"class":1037},"sD7c4","*",[227,1040,1041],{"class":233},"assume_role\n",[227,1043,1044,1046],{"class":229,"line":343},[227,1045,857],{"class":233},[227,1047,1048],{"class":240},"aws s3 sync build/ s3://$S3_BUCKET\n",[227,1050,1051,1053],{"class":229,"line":609},[227,1052,910],{"class":783},[227,1054,787],{"class":233},[227,1056,1057,1059,1061,1063],{"class":229,"line":617},[227,1058,857],{"class":233},[227,1060,919],{"class":783},[227,1062,244],{"class":233},[227,1064,924],{"class":240},[227,1066,1067,1069,1071],{"class":229,"line":623},[227,1068,929],{"class":783},[227,1070,244],{"class":233},[227,1072,905],{"class":240},[12,1074,1075,1076,1081,1082,1085,1086,1089,1090,35],{},"Cela utilise les ",[22,1077,1080],{"href":1078,"rel":1079},"https://docs.gitlab.com/ci/yaml/yaml_optimization/#yaml-anchors-for-scripts",[],"ancres YAML"," pour exécuter le script ",[151,1083,1084],{},"assume_role",", puis utilise ",[151,1087,1088],{},"aws cli"," pour télécharger votre artefact de compilation dans le compartiment que vous avez défini en tant que variable. Ce job ne s'exécute que si le changement se produit sur la branche ",[151,1091,943],{},[12,1093,1094,1095,1098,1099,35],{},"Assurez-vous que la valeur ",[151,1096,1097],{},"aud"," correspond à celle que vous avez saisie pour votre audience au moment de la configuration du fournisseur d'identité. Dans notre cas, nous avons saisi ",[151,1100,1101],{},"react-s3_gl",[12,1103,1104,1105,1107],{},"Votre fichier ",[151,1106,488],{}," complet devrait ressembler à ceci :",[218,1109,1112],{"className":1110,"code":1111,"language":746,"meta":223},[744],"stages:\n  - build\n  - test\n  - deploy\n\n.assume_role: &assume_role\n    - >\n      STS=($(aws sts assume-role-with-web-identity\n      --role-arn ${ROLE_ARN}\n      --role-session-name \"GitLabRunner-${CI_PROJECT_ID}-${CI_PIPELINE_ID}\"\n      --web-identity-token $ID_TOKEN\n      --duration-seconds 3600\n      --query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]'\n      --output text))\n    - export AWS_ACCESS_KEY_ID=\"${STS[0]}\"\n    - export AWS_SECRET_ACCESS_KEY=\"${STS[1]}\"\n    - export AWS_SESSION_TOKEN=\"${STS[2]}\"\n\nunit test:\n  image: node:latest\n  stage: test\n  before_script:\n    - npm install\n  script:\n    - npm run test:ci\n  coverage: /All files[^|]*\\|[^|]*\\s+([\\d\\.]+)/\n  artifacts:\n    paths:\n      - coverage/\n    when: always\n    reports:\n      junit:\n        - junit.xml\n\nbuild artifact:\n  stage: build\n  image: node:latest\n  before_script:\n    - npm install\n  script:\n    - npm run build\n  artifacts:\n    paths:\n      - build/\n    when: always\n  rules:\n    - if: '$CI_COMMIT_REF_NAME == \"main\"'\n      when: always\n\ndeploy s3:\n  stage: deploy\n  image:\n    name: amazon/aws-cli:latest\n    entrypoint: \n      - '/usr/bin/env'\n  id_tokens:\n      ID_TOKEN:\n        aud: react_s3_gl\n  script:\n    - *assume_role\n    - aws s3 sync build/ s3://$S3_BUCKET\n  rules:\n    - if: '$CI_COMMIT_REF_NAME == \"main\"'\n      when: always\n\n",[151,1113,1111],{"__ignoreMap":223},[126,1115,1117],{"id":1116},"testez-votre-pipeline","Testez votre pipeline",[12,1119,1120,1121,1124,1125,1128,1129,1132,1133,1135],{},"Pour tester votre pipeline, dans ",[151,1122,1123],{},"App.js",", modifiez cette ligne ",[151,1126,1127],{},"Edit \u003Ccode>src/App.js\u003C/code> and save to reload."," par ceci :  ",[151,1130,1131],{},"This was deployed from GitLab",". Maintenant, validez vos modifications dans la branche ",[151,1134,943],{},". Le pipeline devrait se lancer et une fois terminé avec succès, vous devriez voir votre application mise à jour avec l'URL de votre site web statique.",[12,1137,1138,143],{},[139,1139],{"alt":1140,"src":1141},"Application React mise à jour","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397756/blog/Content%20Images/2023-02-10-how-to-deploy-react-to-amazon-s3/auto_deploy.png",[12,1143,1144,1145,1150],{},"Vous disposez désormais d'un pipeline CI/CD construit dans GitLab qui reçoit des informations d'identification temporaires d'AWS à l'aide d'OpenID Connect et qui se déploie automatiquement dans votre compartiment Amazon S3. Pour aller plus loin, vous pouvez ",[22,1146,1149],{"href":1147,"rel":1148},"https://docs.gitlab.com/user/application_security/secure_your_application/",[],"sécuriser votre application"," avec les outils de sécurité intégrés de GitLab.",[12,1152,1153,1154,1159],{},"Découvrez ",[22,1155,1158],{"href":1156,"rel":1157},"https://gitlab.com/guided-explorations/engineering-tutorials/react-s3",[],"tout le code"," de ce projet.",[1161,1162,1163],"style",{},"html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}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 .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}",{"title":223,"searchDepth":237,"depth":237,"links":1165},[1166,1167,1172,1173,1178],{"id":49,"depth":237,"text":50},{"id":120,"depth":237,"text":121,"children":1168},[1169,1170,1171],{"id":128,"depth":253,"text":129},{"id":165,"depth":253,"text":166},{"id":191,"depth":253,"text":192},{"id":364,"depth":237,"text":365},{"id":430,"depth":237,"text":431,"children":1174},[1175,1176,1177],{"id":442,"depth":253,"text":443},{"id":494,"depth":253,"text":495},{"id":661,"depth":253,"text":662},{"id":700,"depth":237,"text":701,"children":1179},[1180,1181,1182],{"id":732,"depth":253,"text":733},{"id":754,"depth":253,"text":755},{"id":1116,"depth":253,"text":1117},"engineering","2023-03-01","Vous souhaitez déployer une application React sur Amazon S3 avec GitLab CI/CD ? Suivez notre guide étape par étape.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663291/Blog/Hero%20Images/cover1.jpg",{},true,"/fr-fr/blog/how-to-deploy-react-to-amazon-s3",{"title":5,"description":1185,"ogTitle":5,"ogDescription":1185,"noIndex":1188,"ogImage":1189,"ogUrl":1194,"ogSiteName":1195,"ogType":1196,"canonicalUrls":1194},"https://about.gitlab.com/blog/how-to-deploy-react-to-amazon-s3","https://about.gitlab.com","article","how-to-deploy-react-to-amazon-s3","fr-fr/blog/how-to-deploy-react-to-amazon-s3",[1200,34],"DevOps","BlogPost","2025-03-27","qND3-48d519iGHQOTtRiywcMPDrDQCo7JnHMT-QWvCM",{"logo":1205,"freeTrial":1210,"sales":1215,"login":1220,"items":1225,"search":1553,"minimal":1589,"duo":1608,"switchNav":1617,"pricingDeployment":1628},{"config":1206},{"href":1207,"dataGaName":1208,"dataGaLocation":1209},"/fr-fr/","gitlab logo","header",{"text":1211,"config":1212},"Commencer un essai gratuit",{"href":1213,"dataGaName":1214,"dataGaLocation":1209},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr&glm_content=default-saas-trial/","free trial",{"text":1216,"config":1217},"Demander une démo",{"href":1218,"dataGaName":1219,"dataGaLocation":1209},"/fr-fr/sales/?contact-topic=request-demo","sales",{"text":1221,"config":1222},"Connexion",{"href":1223,"dataGaName":1224,"dataGaLocation":1209},"https://gitlab.com/users/sign_in/","sign in",[1226,1255,1356,1361,1475,1531],{"text":1227,"config":1228,"menu":1230},"Plateforme",{"dataNavLevelOne":1229},"platform",{"type":1231,"columns":1232},"cards",[1233,1239,1247],{"title":1227,"description":1234,"link":1235},"La plateforme d'orchestration intelligente pour le DevSecOps",{"text":1236,"config":1237},"Explorer notre plateforme",{"href":1238,"dataGaName":1229,"dataGaLocation":1209},"/fr-fr/platform/",{"title":1240,"description":1241,"link":1242},"GitLab Duo Agent Platform","L'IA agentique pour l'ensemble du cycle de développement logiciel",{"text":1243,"config":1244},"Découvrir GitLab Duo",{"href":1245,"dataGaName":1246,"dataGaLocation":1209},"/fr-fr/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1248,"description":1249,"link":1250},"Pourquoi GitLab ?","Découvrez les principales raisons pour lesquelles les entreprises choisissent GitLab",{"text":1251,"config":1252},"En savoir plus",{"href":1253,"dataGaName":1254,"dataGaLocation":1209},"/fr-fr/why-gitlab/","why gitlab",{"text":1256,"left":1191,"config":1257,"menu":1259},"Produit",{"dataNavLevelOne":1258},"solutions",{"type":1260,"link":1261,"columns":1265,"feature":1335},"lists",{"text":1262,"config":1263},"Voir toutes les solutions",{"href":1264,"dataGaName":1258,"dataGaLocation":1209},"/fr-fr/solutions/",[1266,1290,1313],{"title":1267,"description":1268,"link":1269,"items":1274},"Automatisation","CI/CD et automatisation pour accélérer le déploiement",{"config":1270},{"icon":1271,"href":1272,"dataGaName":1273,"dataGaLocation":1209},"AutomatedCodeAlt","/fr-fr/solutions/delivery-automation/","automated software delivery",[1275,1278,1281,1286],{"text":34,"config":1276},{"href":1277,"dataGaLocation":1209,"dataGaName":34},"/fr-fr/solutions/continuous-integration/",{"text":1240,"config":1279},{"href":1245,"dataGaLocation":1209,"dataGaName":1280},"gitlab duo agent platform - product menu",{"text":1282,"config":1283},"Gestion du code source",{"href":1284,"dataGaLocation":1209,"dataGaName":1285},"/fr-fr/solutions/source-code-management/","Source Code Management",{"text":1287,"config":1288},"Livraison de logiciels automatisée",{"href":1272,"dataGaLocation":1209,"dataGaName":1289},"Automated software delivery",{"title":1291,"description":1292,"link":1293,"items":1298},"Sécurité","Livrez du code plus rapidement sans compromettre la sécurité",{"config":1294},{"href":1295,"dataGaName":1296,"dataGaLocation":1209,"icon":1297},"/fr-fr/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1299,1303,1308],{"text":1300,"config":1301},"Tests de sécurité des applications",{"href":1295,"dataGaName":1302,"dataGaLocation":1209},"Application security testing",{"text":1304,"config":1305},"Sécurité de la chaîne d'approvisionnement logicielle",{"href":1306,"dataGaLocation":1209,"dataGaName":1307},"/fr-fr/solutions/supply-chain/","Software supply chain security",{"text":1309,"config":1310},"Conformité logicielle",{"href":1311,"dataGaName":1312,"dataGaLocation":1209},"/fr-fr/solutions/software-compliance/","software compliance",{"title":1314,"link":1315,"items":1320},"Mesures",{"config":1316},{"icon":1317,"href":1318,"dataGaName":1319,"dataGaLocation":1209},"DigitalTransformation","/fr-fr/solutions/visibility-measurement/","visibility and measurement",[1321,1325,1330],{"text":1322,"config":1323},"Visibilité et mesures",{"href":1318,"dataGaLocation":1209,"dataGaName":1324},"Visibility and Measurement",{"text":1326,"config":1327},"Gestion de la chaîne de valeur",{"href":1328,"dataGaLocation":1209,"dataGaName":1329},"/fr-fr/solutions/value-stream-management/","Value Stream Management",{"text":1331,"config":1332},"Analyses et informations",{"href":1333,"dataGaLocation":1209,"dataGaName":1334},"/fr-fr/solutions/analytics-and-insights/","Analytics and insights",{"title":1336,"type":1260,"items":1337},"GitLab",[1338,1344,1350],{"text":1339,"config":1340},"Entreprises",{"icon":1341,"href":1342,"dataGaLocation":1209,"dataGaName":1343},"Building","/fr-fr/enterprise/","enterprise",{"text":1345,"config":1346},"Pour les PME",{"icon":1347,"href":1348,"dataGaLocation":1209,"dataGaName":1349},"Work","/fr-fr/small-business/","small business",{"text":1351,"config":1352},"Pour le secteur public",{"icon":1353,"href":1354,"dataGaLocation":1209,"dataGaName":1355},"Organization","/fr-fr/solutions/public-sector/","public sector",{"text":1357,"config":1358},"Tarifs",{"href":1359,"dataGaName":1360,"dataGaLocation":1209,"dataNavLevelOne":1360},"/fr-fr/pricing/","pricing",{"text":1362,"config":1363,"menu":1365},"Ressources",{"dataNavLevelOne":1364},"resources",{"type":1260,"link":1366,"columns":1370,"feature":1464},{"text":1367,"config":1368},"Afficher toutes les ressources",{"href":1369,"dataGaName":1364,"dataGaLocation":1209},"/fr-fr/resources/",[1371,1404,1431],{"title":1372,"items":1373},"Premiers pas",[1374,1379,1384,1389,1394,1399],{"text":1375,"config":1376},"Installation",{"href":1377,"dataGaName":1378,"dataGaLocation":1209},"/fr-fr/install/","install",{"text":1380,"config":1381},"Guides de démarrage",{"href":1382,"dataGaName":1383,"dataGaLocation":1209},"/fr-fr/get-started/","quick setup checklists",{"text":1385,"config":1386},"Apprentissage",{"href":1387,"dataGaLocation":1209,"dataGaName":1388},"https://university.gitlab.com/","learn",{"text":1390,"config":1391},"Documentation",{"href":1392,"dataGaName":1393,"dataGaLocation":1209},"https://docs.gitlab.com/","product documentation",{"text":1395,"config":1396},"Vidéos sur les bonnes pratiques",{"href":1397,"dataGaName":1398,"dataGaLocation":1209},"/fr-fr/getting-started-videos/","best practice videos",{"text":1400,"config":1401},"Intégrations",{"href":1402,"dataGaName":1403,"dataGaLocation":1209},"/fr-fr/integrations/","integrations",{"title":1405,"items":1406},"Découvrir",[1407,1412,1417,1422,1426],{"text":1408,"config":1409},"Témoignages clients",{"href":1410,"dataGaName":1411,"dataGaLocation":1209},"/fr-fr/customers/","customer success stories",{"text":1413,"config":1414},"Blog",{"href":1415,"dataGaName":1416,"dataGaLocation":1209},"/fr-fr/blog/","blog",{"text":1418,"config":1419},"Demo Hub",{"href":1420,"dataGaName":1421,"dataGaLocation":1209},"/fr-fr/demo-hub/","demo hub",{"text":1423,"config":1424},"The Source",{"href":1425,"dataGaName":1416,"dataGaLocation":1209},"/fr-fr/the-source/",{"text":1427,"config":1428},"Travail à distance",{"href":1429,"dataGaName":1430,"dataGaLocation":1209},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1432,"items":1433},"Connecter",[1434,1439,1444,1449,1454,1459],{"text":1435,"config":1436},"Services GitLab",{"href":1437,"dataGaName":1438,"dataGaLocation":1209},"/fr-fr/services/","services",{"text":1440,"config":1441},"Contribuer",{"href":1442,"dataGaName":1443,"dataGaLocation":1209},"https://contributors.gitlab.com","contribute",{"text":1445,"config":1446},"Communauté",{"href":1447,"dataGaName":1448,"dataGaLocation":1209},"/community/","community",{"text":1450,"config":1451},"Forum",{"href":1452,"dataGaName":1453,"dataGaLocation":1209},"https://forum.gitlab.com/","forum",{"text":1455,"config":1456},"Événements",{"href":1457,"dataGaName":1458,"dataGaLocation":1209},"/events/","events",{"text":1460,"config":1461},"Partenaires",{"href":1462,"dataGaName":1463,"dataGaLocation":1209},"/fr-fr/partners/","partners",{"config":1465,"title":1468,"text":1469,"link":1470},{"background":1466,"textColor":1467},"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":1471,"config":1472},"Lire les articles les plus récents",{"href":1473,"dataGaName":1474,"dataGaLocation":1209},"/fr-fr/whats-new/","whats new",{"text":1476,"config":1477,"menu":1479},"Société",{"dataNavLevelOne":1478},"company",{"type":1260,"columns":1480},[1481],{"items":1482},[1483,1488,1494,1496,1501,1506,1511,1516,1521,1526],{"text":1484,"config":1485},"À propos",{"href":1486,"dataGaName":1487,"dataGaLocation":1209},"/fr-fr/company/","about",{"text":1489,"config":1490,"footerGa":1493},"Carrières",{"href":1491,"dataGaName":1492,"dataGaLocation":1209},"/jobs/","jobs",{"dataGaName":1492},{"text":1455,"config":1495},{"href":1457,"dataGaName":1458,"dataGaLocation":1209},{"text":1497,"config":1498},"Leadership",{"href":1499,"dataGaName":1500,"dataGaLocation":1209},"/company/team/e-group/","leadership",{"text":1502,"config":1503},"Manuel",{"href":1504,"dataGaName":1505,"dataGaLocation":1209},"https://handbook.gitlab.com/","handbook",{"text":1507,"config":1508},"Relations avec les investisseurs",{"href":1509,"dataGaName":1510,"dataGaLocation":1209},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1512,"config":1513},"Trust Center",{"href":1514,"dataGaName":1515,"dataGaLocation":1209},"/fr-fr/security/","trust center",{"text":1517,"config":1518},"Centre pour la transparence de l'IA",{"href":1519,"dataGaName":1520,"dataGaLocation":1209},"/fr-fr/ai-transparency-center/","ai transparency center",{"text":1522,"config":1523},"Newsletter",{"href":1524,"dataGaName":1525,"dataGaLocation":1209},"/company/contact/#contact-forms","newsletter",{"text":1527,"config":1528},"Presse",{"href":1529,"dataGaName":1530,"dataGaLocation":1209},"/press/","press",{"text":1532,"config":1533,"menu":1534},"Nous contacter",{"dataNavLevelOne":1478},{"type":1260,"columns":1535},[1536],{"items":1537},[1538,1543,1548],{"text":1539,"config":1540},"Contacter l'équipe commerciale",{"href":1541,"dataGaName":1542,"dataGaLocation":1209},"/fr-fr/sales/","talk to sales",{"text":1544,"config":1545},"Assistance GitLab",{"href":1546,"dataGaName":1547,"dataGaLocation":1209},"https://support.gitlab.com/hc/en-us","support portal",{"text":1549,"config":1550},"Portail clients GitLab",{"href":1551,"dataGaName":1552,"dataGaLocation":1209},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1554,"login":1555,"suggestions":1562},"Fermer",{"text":1556,"link":1557},"Pour rechercher des dépôts et des projets, connectez-vous à",{"text":1558,"config":1559},"GitLab.com",{"href":1223,"dataGaName":1560,"dataGaLocation":1561},"search login","search",{"text":1563,"default":1564},"Suggestions",[1565,1568,1573,1575,1580,1585],{"text":1240,"config":1566},{"href":1245,"dataGaName":1567,"dataGaLocation":1561},"GitLab Duo Agent Platform",{"text":1569,"config":1570},"Suggestions de code (IA)",{"href":1571,"dataGaName":1572,"dataGaLocation":1561},"/fr-fr/solutions/code-suggestions/","Code Suggestions (AI)",{"text":34,"config":1574},{"href":1277,"dataGaName":34,"dataGaLocation":1561},{"text":1576,"config":1577},"GitLab sur AWS",{"href":1578,"dataGaName":1579,"dataGaLocation":1561},"/fr-fr/partners/technology-partners/aws/","GitLab on AWS",{"text":1581,"config":1582},"GitLab sur Google Cloud",{"href":1583,"dataGaName":1584,"dataGaLocation":1561},"/fr-fr/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":1586,"config":1587},"Pourquoi utiliser GitLab ?",{"href":1253,"dataGaName":1588,"dataGaLocation":1561},"Why GitLab?",{"freeTrial":1590,"mobileIcon":1595,"desktopIcon":1600,"secondaryButton":1603},{"text":1591,"config":1592},"Commencer votre essai gratuit",{"href":1593,"dataGaName":1214,"dataGaLocation":1594},"https://gitlab.com/-/trials/new/","nav",{"altText":1596,"config":1597},"Icône GitLab",{"src":1598,"dataGaName":1599,"dataGaLocation":1594},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1596,"config":1601},{"src":1602,"dataGaName":1599,"dataGaLocation":1594},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1604,"config":1605},"Commencer",{"href":1606,"dataGaName":1607,"dataGaLocation":1594},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr/get-started/","get started",{"freeTrial":1609,"mobileIcon":1613,"desktopIcon":1615},{"text":1610,"config":1611},"En savoir plus sur GitLab Duo",{"href":1245,"dataGaName":1612,"dataGaLocation":1594},"gitlab duo",{"altText":1596,"config":1614},{"src":1598,"dataGaName":1599,"dataGaLocation":1594},{"altText":1596,"config":1616},{"src":1602,"dataGaName":1599,"dataGaLocation":1594},{"button":1618,"mobileIcon":1623,"desktopIcon":1625},{"text":1619,"config":1620},"/switch",{"href":1621,"dataGaName":1622,"dataGaLocation":1594},"#contact","switch",{"altText":1596,"config":1624},{"src":1598,"dataGaName":1599,"dataGaLocation":1594},{"altText":1596,"config":1626},{"src":1627,"dataGaName":1599,"dataGaLocation":1594},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1629,"mobileIcon":1634,"desktopIcon":1636},{"text":1630,"config":1631},"Retour aux tarifs",{"href":1359,"dataGaName":1632,"dataGaLocation":1594,"icon":1633},"back to pricing","GoBack",{"altText":1596,"config":1635},{"src":1598,"dataGaName":1599,"dataGaLocation":1594},{"altText":1596,"config":1637},{"src":1602,"dataGaName":1599,"dataGaLocation":1594},{"title":1639,"button":1640,"config":1644},"GitLab Orbit est arrivé : la couche de contexte pour les agents d'IA.",{"text":1251,"config":1641},{"href":1642,"dataGaName":1643,"dataGaLocation":1209},"/fr-fr/gitlab-orbit/","orbit",{"layout":1645,"disabled":1188},"release",{"data":1647},{"text":1648,"source":1649,"edit":1655,"contribute":1660,"config":1664,"items":1669,"minimal":1876},"Git est une marque déposée de Software Freedom Conservancy et notre utilisation de « GitLab » est sous licence.",{"text":1650,"config":1651},"Afficher le code source de la page",{"href":1652,"dataGaName":1653,"dataGaLocation":1654},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1656,"config":1657},"Modifier cette page",{"href":1658,"dataGaName":1659,"dataGaLocation":1654},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1440,"config":1661},{"href":1662,"dataGaName":1663,"dataGaLocation":1654},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1665,"facebook":1666,"youtube":1667,"linkedin":1668},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1670,1716,1768,1811,1843],{"title":1357,"links":1671,"subMenu":1686},[1672,1676,1681],{"text":1673,"config":1674},"Voir les forfaits",{"href":1359,"dataGaName":1675,"dataGaLocation":1654},"view plans",{"text":1677,"config":1678},"GitLab Premium",{"href":1679,"dataGaName":1680,"dataGaLocation":1654},"/fr-fr/pricing/premium/","why premium",{"text":1682,"config":1683},"GitLab Ultimate",{"href":1684,"dataGaName":1685,"dataGaLocation":1654},"/fr-fr/pricing/ultimate/","why ultimate",[1687],{"title":1532,"links":1688},[1689,1691,1693,1696,1701,1706,1711],{"text":1539,"config":1690},{"href":1541,"dataGaName":1219,"dataGaLocation":1654},{"text":1544,"config":1692},{"href":1546,"dataGaName":1547,"dataGaLocation":1654},{"text":1694,"config":1695},"Portail clients",{"href":1551,"dataGaName":1552,"dataGaLocation":1654},{"text":1697,"config":1698},"Statut",{"href":1699,"dataGaName":1700,"dataGaLocation":1654},"https://status.gitlab.com/","status",{"text":1702,"config":1703},"Conditions d'utilisation",{"href":1704,"dataGaName":1705,"dataGaLocation":1654},"/terms/","terms of use",{"text":1707,"config":1708},"Politique de confidentialité",{"href":1709,"dataGaName":1710,"dataGaLocation":1654},"/fr-fr/privacy/","privacy statement",{"text":1712,"config":1713},"Gestion des cookies",{"dataGaName":1714,"dataGaLocation":1654,"id":1715,"isOneTrustButton":1191},"cookie preferences","ot-sdk-btn",{"title":1256,"links":1717,"subMenu":1726},[1718,1722],{"text":1719,"config":1720},"Plateforme DevSecOps",{"href":1238,"dataGaName":1721,"dataGaLocation":1654},"devsecops platform",{"text":1723,"config":1724},"Développement assisté par l'IA",{"href":1245,"dataGaName":1725,"dataGaLocation":1654},"ai-assisted development",[1727],{"title":1728,"links":1729},"Thèmes",[1730,1734,1739,1743,1748,1753,1758,1763],{"text":34,"config":1731},{"href":1732,"dataGaName":1733,"dataGaLocation":1654},"/fr-fr/topics/ci-cd/","cicd",{"text":1735,"config":1736},"GitOps",{"href":1737,"dataGaName":1738,"dataGaLocation":1654},"/fr-fr/topics/gitops/","gitops",{"text":1200,"config":1740},{"href":1741,"dataGaName":1742,"dataGaLocation":1654},"/fr-fr/topics/devops/","devops",{"text":1744,"config":1745},"Contrôle de version",{"href":1746,"dataGaName":1747,"dataGaLocation":1654},"/fr-fr/topics/version-control/","version control",{"text":1749,"config":1750},"DevSecOps",{"href":1751,"dataGaName":1752,"dataGaLocation":1654},"/fr-fr/topics/devsecops/","devsecops",{"text":1754,"config":1755},"Cloud-native",{"href":1756,"dataGaName":1757,"dataGaLocation":1654},"/fr-fr/topics/cloud-native/","cloud native",{"text":1759,"config":1760},"IA pour la programmation",{"href":1761,"dataGaName":1762,"dataGaLocation":1654},"/fr-fr/topics/devops/ai-for-coding/","ai for coding",{"text":1764,"config":1765},"IA agentique",{"href":1766,"dataGaName":1767,"dataGaLocation":1654},"/fr-fr/topics/agentic-ai/","agentic ai",{"title":1769,"links":1770},"Solutions",[1771,1774,1776,1781,1784,1787,1790,1793,1795,1798,1801,1806],{"text":1300,"config":1772},{"href":1295,"dataGaName":1773,"dataGaLocation":1654},"Application Security Testing",{"text":1287,"config":1775},{"href":1272,"dataGaName":1273,"dataGaLocation":1654},{"text":1777,"config":1778},"Développement Agile",{"href":1779,"dataGaName":1780,"dataGaLocation":1654},"/fr-fr/solutions/agile-delivery/","agile delivery",{"text":1282,"config":1782},{"href":1284,"dataGaName":1783,"dataGaLocation":1654},"source code management",{"text":34,"config":1785},{"href":1277,"dataGaName":1786,"dataGaLocation":1654},"continuous integration & delivery",{"text":1326,"config":1788},{"href":1328,"dataGaName":1789,"dataGaLocation":1654},"value stream management",{"text":1735,"config":1791},{"href":1792,"dataGaName":1738,"dataGaLocation":1654},"/fr-fr/solutions/gitops/",{"text":1339,"config":1794},{"href":1342,"dataGaName":1343,"dataGaLocation":1654},{"text":1796,"config":1797},"PME",{"href":1348,"dataGaName":1349,"dataGaLocation":1654},{"text":1799,"config":1800},"Secteur public",{"href":1354,"dataGaName":1355,"dataGaLocation":1654},{"text":1802,"config":1803},"Éducation",{"href":1804,"dataGaName":1805,"dataGaLocation":1654},"/fr-fr/solutions/education/","education",{"text":1807,"config":1808},"Services financiers",{"href":1809,"dataGaName":1810,"dataGaLocation":1654},"/fr-fr/solutions/finance/","financial services",{"title":1362,"links":1812},[1813,1815,1817,1819,1822,1824,1827,1829,1831,1833,1835,1837,1839,1841],{"text":1375,"config":1814},{"href":1377,"dataGaName":1378,"dataGaLocation":1654},{"text":1380,"config":1816},{"href":1382,"dataGaName":1383,"dataGaLocation":1654},{"text":1385,"config":1818},{"href":1387,"dataGaName":1388,"dataGaLocation":1654},{"text":1390,"config":1820},{"href":1392,"dataGaName":1821,"dataGaLocation":1654},"docs",{"text":1413,"config":1823},{"href":1415,"dataGaName":1416,"dataGaLocation":1654},{"text":1825,"config":1826},"Nouveautés",{"href":1473,"dataGaName":1474,"dataGaLocation":1654},{"text":1408,"config":1828},{"href":1410,"dataGaName":1411,"dataGaLocation":1654},{"text":1427,"config":1830},{"href":1429,"dataGaName":1430,"dataGaLocation":1654},{"text":1435,"config":1832},{"href":1437,"dataGaName":1438,"dataGaLocation":1654},{"text":1440,"config":1834},{"href":1442,"dataGaName":1443,"dataGaLocation":1654},{"text":1445,"config":1836},{"href":1447,"dataGaName":1448,"dataGaLocation":1654},{"text":1450,"config":1838},{"href":1452,"dataGaName":1453,"dataGaLocation":1654},{"text":1455,"config":1840},{"href":1457,"dataGaName":1458,"dataGaLocation":1654},{"text":1460,"config":1842},{"href":1462,"dataGaName":1463,"dataGaLocation":1654},{"title":1476,"links":1844},[1845,1847,1849,1851,1853,1855,1860,1865,1867,1869,1871],{"text":1484,"config":1846},{"href":1486,"dataGaName":1478,"dataGaLocation":1654},{"text":1489,"config":1848},{"href":1491,"dataGaName":1492,"dataGaLocation":1654},{"text":1497,"config":1850},{"href":1499,"dataGaName":1500,"dataGaLocation":1654},{"text":1502,"config":1852},{"href":1504,"dataGaName":1505,"dataGaLocation":1654},{"text":1507,"config":1854},{"href":1509,"dataGaName":1510,"dataGaLocation":1654},{"text":1856,"config":1857},"Développement durable",{"href":1858,"dataGaName":1859,"dataGaLocation":1654},"/sustainability/","Sustainability",{"text":1861,"config":1862},"Diversité, inclusion et appartenance (DIB)",{"href":1863,"dataGaName":1864,"dataGaLocation":1654},"/fr-fr/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1512,"config":1866},{"href":1514,"dataGaName":1515,"dataGaLocation":1654},{"text":1522,"config":1868},{"href":1524,"dataGaName":1525,"dataGaLocation":1654},{"text":1527,"config":1870},{"href":1529,"dataGaName":1530,"dataGaLocation":1654},{"text":1872,"config":1873},"Déclaration de transparence sur l'esclavage moderne",{"href":1874,"dataGaName":1875,"dataGaLocation":1654},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1877},[1878,1880,1882],{"text":1702,"config":1879},{"href":1704,"dataGaName":1705,"dataGaLocation":1654},{"text":1712,"config":1881},{"dataGaName":1714,"dataGaLocation":1654,"id":1715,"isOneTrustButton":1191},{"text":1707,"config":1883},{"href":1709,"dataGaName":1710,"dataGaLocation":1654},[1885],{"id":1886,"title":7,"body":1187,"config":1887,"content":1889,"description":1187,"extension":1893,"meta":1894,"navigation":1191,"path":1895,"seo":1896,"stem":1897,"__hash__":1898},"blogAuthors/en-us/blog/authors/jeremy-wagner.yml",{"template":1888},"BlogAuthor",{"name":7,"config":1890},{"headshot":1891,"ctfId":1892},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663285/Blog/Author%20Headshots/jeremywagner-headshot.jpg","jeremywagner","yml",{},"/en-us/blog/authors/jeremy-wagner",{},"en-us/blog/authors/jeremy-wagner","qVGFwwZ8NjcAgNoHIzoSozJkDFQZ4I1sbboOxEvREG8",[1900,1908,1916],{"title":1901,"description":1902,"heroImage":1903,"category":1183,"date":1904,"authors":1905,"slug":1907,"externalUrl":1187},"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",[1906],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1909,"description":1910,"heroImage":1911,"category":1183,"date":1912,"authors":1913,"slug":1915,"externalUrl":1187},"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",[1914],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"title":1917,"description":1918,"heroImage":1919,"category":1183,"date":1920,"authors":1921,"slug":1923,"externalUrl":1187},"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",[1922],"Omid Khan","5-ways-gitlab-pipeline-logic-solves-real-engineering-problems",{"promotions":1925},[1926,1940,1952,1964],{"id":1927,"categories":1928,"header":1930,"text":1931,"button":1932,"image":1937},"ai-modernization",[1929],"ai","L'IA tient-elle ses promesses à grande échelle ?","Le questionnaire ne prendra pas plus de 5 minutes.",{"text":1933,"config":1934},"Obtenez votre score de maturité IA",{"href":1935,"dataGaName":1936,"dataGaLocation":1416},"/fr-fr/assessments/ai-modernization-assessment/","modernization assessment",{"config":1938},{"src":1939},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1941,"categories":1942,"header":1944,"text":1931,"button":1945,"image":1949},"devops-modernization",[1943,1752],"product","Vous contentez-vous de gérer des outils ou de livrer des innovations ?",{"text":1946,"config":1947},"Obtenez votre score de maturité DevOps",{"href":1948,"dataGaName":1936,"dataGaLocation":1416},"/fr-fr/assessments/devops-modernization-assessment/",{"config":1950},{"src":1951},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1953,"categories":1954,"header":1956,"text":1931,"button":1957,"image":1961},"security-modernization",[1955],"security","Faut-il sacrifier la rapidité pour garantir la sécurité ?",{"text":1958,"config":1959},"Obtenez votre score de maturité en matière de sécurité",{"href":1960,"dataGaName":1936,"dataGaLocation":1416},"/fr-fr/assessments/security-modernization-assessment/",{"config":1962},{"src":1963},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1965,"paths":1966,"header":1969,"text":1970,"button":1971,"image":1976},"github-azure-migration",[1967,1968],"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":1972,"config":1973},"Découvrez les différences entre GitLab et GitHub",{"href":1974,"dataGaName":1975,"dataGaLocation":1416},"/fr-fr/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1977},{"src":1951},{"header":1979,"blurb":1980,"button":1981,"secondaryButton":1985},"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":1211,"config":1982},{"href":1983,"dataGaName":1214,"dataGaLocation":1984},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/fr-fr/","feature",{"text":1539,"config":1986},{"href":1541,"dataGaName":1219,"dataGaLocation":1984},1786803784675]