[{"data":1,"prerenderedAt":1971},["ShallowReactive",2],{"/fr-fr/blog/from-code-to-production-a-guide-to-continuous-deployment-with-gitlab":3,"navigation-fr-fr":1179,"banner-fr-fr":1612,"footer-fr-fr":1619,"blog-post-authors-fr-fr-Benjamin Skierlak|James Wormwell":1856,"blog-related-posts-fr-fr-from-code-to-production-a-guide-to-continuous-deployment-with-gitlab":1883,"blog-promotions-fr-fr":1909,"next-steps-fr-fr":1962},{"id":4,"title":5,"authors":6,"body":9,"category":1156,"date":1157,"description":1158,"extension":1159,"externalUrl":1160,"faq":1160,"featured":1161,"heroImage":1162,"meta":1163,"navigation":858,"path":1164,"seo":1165,"slug":1169,"stem":1170,"tags":1171,"template":1176,"updatedDate":1177,"__hash__":1178},"blogPosts/fr-fr/blog/from-code-to-production-a-guide-to-continuous-deployment-with-gitlab.md","Du code à la production : guide du déploiement continu avec GitLab",[7,8],"Benjamin Skierlak","James Wormwell",{"type":10,"value":11,"toc":1138},"minimark",[12,31,34,39,42,47,50,75,78,92,95,100,103,160,164,167,178,182,185,196,200,203,217,221,224,238,241,245,249,252,256,259,264,275,279,307,311,330,334,345,349,388,426,430,433,552,556,559,567,570,578,582,596,602,605,611,619,625,633,643,651,660,676,685,694,698,701,707,710,724,728,734,764,767,770,776,778,792,796,799,805,808,819,830,834,839,899,902,908,911,917,920,931,934,940,953,957,960,966,969,983,986,1000,1004,1007,1024,1028,1031,1035,1038,1055,1059,1062,1079,1083,1086,1103,1107,1117,1121,1124,1135],[13,14,15,16,23,24,30],"p",{},"Le déploiement continu est une pratique qui change la donne et qui permet aux équipes d'offrir de la valeur plus rapidement, avec une confiance accrue. Cependant, adopter des workflows de déploiement avancés, tels que ",[17,18,22],"a",{"href":19,"rel":20,"title":21},"https://about.gitlab.com/fr-fr/topics/gitops/",[],"Qu'est-ce que GitOps ? ","GitOps",", l'orchestration de conteneurs avec ",[17,25,29],{"href":26,"rel":27,"title":28},"https://about.gitlab.com/fr-fr/blog/kubernetes-the-container-orchestration-solution/",[],"Kubernetes, la solution d’orchestration des conteneurs","Kubernetes"," ou les environnements dynamiques, peut être intimidant pour les équipes non expérimentées.",[13,32,33],{},"Chez GitLab, nous nous engageons à ce que la livraison de logiciels soit sans accroc et évolutive. En permettant aux équipes de se concentrer sur les fondamentaux, nous leur donnons les moyens d'établir une base solide qui soutient la croissance et de mettre en place des stratégies plus complexes au fil du temps.\nDans ce guide, découvrez les étapes clés pour mettre en œuvre le déploiement continu avec GitLab et poser les bases d'une réussite à long terme.",[35,36,38],"h2",{"id":37},"commencez-par-planifier-votre-workflow","Commencez par planifier votre workflow",[13,40,41],{},"Avant de passer à la mise en œuvre technique, prenez le temps de planifier votre workflow de déploiement. Une planification minutieuse et une approche méthodique sont les clés du succès.",[43,44,46],"h3",{"id":45},"stratégie-de-gestion-des-artefacts","Stratégie de gestion des artefacts",[13,48,49],{},"Dans le contexte du déploiement continu, les artefacts désignent les fichiers empaquetés suite au processus de compilation, destinés à être stockés, déployés et dont vous devez gérer les versions.\nEn voici quelques exemples :",[51,52,53,57,60,63,66,69,72],"ul",{},[54,55,56],"li",{},"images de conteneurs pour vos applications",[54,58,59],{},"paquets",[54,61,62],{},"exécutables ou fichiers binaires compilés",[54,64,65],{},"bibliothèques",[54,67,68],{},"fichiers de configuration",[54,70,71],{},"packages de documentation",[54,73,74],{},"autres artefacts",[13,76,77],{},"Chaque type d'artefact joue un rôle spécifique dans votre processus de déploiement. Par exemple, une application web typique peut générer les artefacts suivants :",[51,79,80,83,86,89],{},[54,81,82],{},"une image de conteneur pour le service backend",[54,84,85],{},"une archive ZIP des ressources frontend compilées",[54,87,88],{},"des fichiers SQL pour les modifications de base de données",[54,90,91],{},"des fichiers de configuration propres à l'environnement",[13,93,94],{},"La gestion efficace de ces artefacts est cruciale pour la réussite des déploiements. Voici comment aborder la gestion des artefacts.",[96,97,99],"h4",{"id":98},"artefacts-et-stratégies-de-contrôle-des-versions","Artefacts et stratégies de contrôle des versions",[13,101,102],{},"Une bonne pratique permettant de démarrer avec une structure bien organisée consiste à établir une stratégie de gestion des versions claire pour vos artefacts.\nLors de la création de nouvelles versions :",[51,104,105,127,138,149],{},[54,106,107,108],{},"Utilisez la gestion sémantique de version (major.minor.patch) pour les tags de version\n",[51,109,110,118,121,124],{},[54,111,112,113,117],{},"Exemple : ",[114,115,116],"code",{},"myapp:1.2.3"," pour une version stable",[54,119,120],{},"Modifications de la version majeure (2.0.0) pour les changements cassants",[54,122,123],{},"Modifications de la version mineure (1.3.0) pour les nouvelles fonctionnalités",[54,125,126],{},"Modifications de la version des correctifs (1.2.4) pour les corrections de bugs",[54,128,129,130],{},"Conservez un tag 'latest' pour la version stable la plus récente\n",[51,131,132],{},[54,133,112,134,137],{},[114,135,136],{},"myapp:latest"," pour les déploiements automatisés",[54,139,140,141],{},"Incluez un SHA de validation pour un suivi précis des versions\n",[51,142,143],{},[54,144,112,145,148],{},[114,146,147],{},"myapp:1.2.3-abc123f"," pour le débogage",[54,150,151,152],{},"Utilisez des tags basés sur les branches pour les environnements de développement\n",[51,153,154],{},[54,155,112,156,159],{},[114,157,158],{},"myapp:feature-user-auth"," pour les tests de fonctionnalités",[96,161,163],{"id":162},"rétention-des-artefacts-de-compilation","Rétention des artefacts de compilation",[13,165,166],{},"Mettez en œuvre des règles de durée de rétention définies :",[51,168,169,172,175],{},[54,170,171],{},"Définissez des délais d'expiration explicites pour les artefacts temporaires",[54,173,174],{},"Définissez les artefacts nécessitant une durée de rétention permanente",[54,176,177],{},"Configurez des stratégies de nettoyage pour gérer le stockage",[96,179,181],{"id":180},"accès-au-registre-et-authentification","Accès au registre et authentification",[13,183,184],{},"Sécurisez vos artefacts avec des contrôles d'accès appropriés :",[51,186,187,190,193],{},[54,188,189],{},"Implémentez des jetons d'accès personnels (Personal Access Tokens) pour l'accès des développeurs",[54,191,192],{},"Configurez des variables CI/CD pour l'authentification du pipeline",[54,194,195],{},"Mettez en place des portées d'accès appropriées",[43,197,199],{"id":198},"stratégie-denvironnement-de-déploiement","Stratégie d’environnement de déploiement",[13,201,202],{},"Réfléchissez dès le départ à la configuration de vos environnements, car ils façonnent l'ensemble de votre pipeline de déploiement :",[51,204,205,208,211,214],{},[54,206,207],{},"Configurations de l'environnement de développement, de préproduction et de production",[54,209,210],{},"Variables et secrets propres à l'environnement",[54,212,213],{},"Contrôles d'accès et règles de protection",[54,215,216],{},"Approche de suivi et de surveillance du déploiement",[43,218,220],{"id":219},"cibles-de-déploiement","Cibles de déploiement",[13,222,223],{},"Il est important de réfléchir à la cible de déploiement et à l'approche choisie, tout en prenant en compte les avantages et les inconvénients de ces décisions :",[51,225,226,229,232,235],{},[54,227,228],{},"Besoins en infrastructure (machines virtuelles, conteneurs, services cloud)",[54,230,231],{},"Configurations de la sécurité et de l'accès au réseau",[54,233,234],{},"Mécanismes d'authentification (clés SSH, jetons d'accès)",[54,236,237],{},"Éléments à prendre en compte pour l'allocation des ressources et la mise à l'échelle",[13,239,240],{},"Lorsque vous avez défini votre stratégie et pris les décisions fondamentales, vous pouvez transformer cette planification en un pipeline fonctionnel. Nous allons créer un exemple concret qui démontre ces concepts, en commençant par une application simple à laquelle nous ajouterons progressivement des fonctionnalités de déploiement.",[35,242,244],{"id":243},"mettez-en-œuvre-votre-pipeline-cd","Mettez en œuvre votre pipeline CD",[43,246,248],{"id":247},"exemple-pas-à-pas","Exemple pas à pas",[13,250,251],{},"Examinons comment mettre en œuvre un pipeline de déploiement continu de base pour une application web. Nous utiliserons une application HTML simple à titre d'exemple, mais ces principes s'appliquent à tout type d'application. Nous allons également déployer notre application sous la forme d'une image Docker sur une simple machine virtuelle. Cela nous permettra de nous appuyer sur une image organisée avec un minimum de dépendances et de nous assurer qu'aucun prérequis propre à l'environnement n'est introduit involontairement. En travaillant sur une machine virtuelle, nous ne ferons pas appel aux intégrations natives de GitLab, ce qui nous permettra de travailler sur une configuration plus simple, quoique moins évolutive.",[96,253,255],{"id":254},"prérequis","Prérequis",[13,257,258],{},"Dans cet exemple, nous allons conteneuriser une application qui s'exécutera sur une machine virtuelle hébergée sur la plateforme d'un fournisseur de services cloud. Nous testerons également cette application localement sur notre machine. Cette liste de prérequis n'est nécessaire que pour notre scénario.",[260,261,263],"h5",{"id":262},"configuration-de-la-machine-virtuelle","Configuration de la machine virtuelle",[51,265,266,269,272],{},[54,267,268],{},"Provisionnez une machine virtuelle sur la plateforme de votre fournisseur de services cloud préféré (par exemple, GCP, AWS, Azure).",[54,270,271],{},"Configurez les règles du réseau pour autoriser l'accès sur les ports 22, 80 et 443.",[54,273,274],{},"Enregistrez l'adresse IP publique de la machine pour le déploiement.",[260,276,278],{"id":277},"configuration-de-lauthentification-ssh","Configuration de l'authentification SSH :",[51,280,281,284,292,298,301,304],{},[54,282,283],{},"Générez une paire de clés publique/privée pour la machine.",[54,285,286,287,291],{},"Dans GitLab, accédez à ",[288,289,290],"strong",{},"Paramètres > CI/CD > Variables",".",[54,293,294,295,291],{},"Créez une variable nommée ",[114,296,297],{},"GITLAB_KEY",[54,299,300],{},"Définissez le type sur « Fichier » (requis pour l'authentification SSH).",[54,302,303],{},"Collez la clé privée dans le champ Valeur.",[54,305,306],{},"Définissez une variable USER (utilisateur qui se connecte et exécute les scripts sur votre machine virtuelle).",[260,308,310],{"id":309},"configuration-des-variables-de-déploiement","Configuration des variables de déploiement",[51,312,313],{},[54,314,315,316],{},"Créez des variables pour vos cibles de déploiement :\n",[51,317,318,324],{},[54,319,320,323],{},[114,321,322],{},"STAGING_TARGET"," : l'adresse IP/le domaine de votre serveur de préproduction",[54,325,326,329],{},[114,327,328],{},"PRODUCTION_TARGET"," : l'adresse IP/le domaine de votre serveur de production",[260,331,333],{"id":332},"configuration-du-développement-local","Configuration du développement local",[51,335,336],{},[54,337,338,339,344],{},"Installez ",[17,340,343],{"href":341,"rel":342,"title":343},"https://about.gitlab.com/fr-fr/blog/what-is-docker-comprehensive-guide/",[],"Docker"," sur votre machine locale pour tester les déploiements.",[260,346,348],{"id":347},"accès-au-registre-de-conteneurs-gitlab","Accès au registre de conteneurs GitLab",[51,350,351,362,365,385],{},[54,352,353,354],{},"Localisez votre chemin d'accès au registre :\n",[51,355,356],{},[54,357,358,359,291],{},"Accédez à ",[288,360,361],{},"Déploiement > Registre de conteneurs",[54,363,364],{},"Copiez le chemin d'accès au registre (par exemple, registry.gitlab.com/group/project).",[54,366,367,368],{},"Configurez l'authentification :\n",[51,369,370,376,379,382],{},[54,371,372,373,291],{},"Accédez au menu ",[288,374,375],{},"Paramètres > Jetons d'accès",[54,377,378],{},"Créez un jeton avec un accès au registre.",[54,380,381],{},"Expiration du jeton : maximum 1 an.",[54,383,384],{},"Enregistrez le jeton de façon sécurisée.",[54,386,387],{},"Configurez l'accès au registre local :",[389,390,395],"pre",{"className":391,"code":392,"language":393,"meta":394,"style":394},"language-shell shiki shiki-themes github-light","docker login registry.gitlab.com\n# The username if you are using a PAT is gitlab-ci-token\n# Password: your-access-token\n","shell","",[114,396,397,413,420],{"__ignoreMap":394},[398,399,402,406,410],"span",{"class":400,"line":401},"line",1,[398,403,405],{"class":404},"s7eDp","docker",[398,407,409],{"class":408},"sYBdl"," login",[398,411,412],{"class":408}," registry.gitlab.com\n",[398,414,416],{"class":400,"line":415},2,[398,417,419],{"class":418},"sAwPA","# The username if you are using a PAT is gitlab-ci-token\n",[398,421,423],{"class":400,"line":422},3,[398,424,425],{"class":418},"# Password: your-access-token\n",[96,427,429],{"id":428},"_1-création-de-votre-application","1. Création de votre application",[13,431,432],{},"Commencez avec une application web de base. Dans notre exemple, nous utilisons une page HTML simple :",[389,434,438],{"className":435,"code":436,"language":437,"meta":394,"style":394},"language-xml shiki shiki-themes github-light","\u003C!|||UNTRANSLATED_CONTENT_START|||-- index.html -->\n\u003Chtml>\n  \u003Chead>\n    \u003Cstyle>\n      body {\n        background-color: #171321; /* GitLab dark */\n      }\n    \u003C/style>\n  \u003C/head>\n  \u003Cbody>\n    \u003C!|||UNTRANSLATED_CONTENT_END|||-- Your content here -->\n  \u003C/body>\n\u003C/html>\n","xml",[114,439,440,446,458,468,479,485,491,497,507,517,527,533,542],{"__ignoreMap":394},[398,441,442],{"class":400,"line":401},[398,443,445],{"class":444},"sgsFI","\u003C!|||UNTRANSLATED_CONTENT_START|||-- index.html -->\n",[398,447,448,451,455],{"class":400,"line":415},[398,449,450],{"class":444},"\u003C",[398,452,454],{"class":453},"shJU0","html",[398,456,457],{"class":444},">\n",[398,459,460,463,466],{"class":400,"line":422},[398,461,462],{"class":444},"  \u003C",[398,464,465],{"class":453},"head",[398,467,457],{"class":444},[398,469,471,474,477],{"class":400,"line":470},4,[398,472,473],{"class":444},"    \u003C",[398,475,476],{"class":453},"style",[398,478,457],{"class":444},[398,480,482],{"class":400,"line":481},5,[398,483,484],{"class":444},"      body {\n",[398,486,488],{"class":400,"line":487},6,[398,489,490],{"class":444},"        background-color: #171321; /* GitLab dark */\n",[398,492,494],{"class":400,"line":493},7,[398,495,496],{"class":444},"      }\n",[398,498,500,503,505],{"class":400,"line":499},8,[398,501,502],{"class":444},"    \u003C/",[398,504,476],{"class":453},[398,506,457],{"class":444},[398,508,510,513,515],{"class":400,"line":509},9,[398,511,512],{"class":444},"  \u003C/",[398,514,465],{"class":453},[398,516,457],{"class":444},[398,518,520,522,525],{"class":400,"line":519},10,[398,521,462],{"class":444},[398,523,524],{"class":453},"body",[398,526,457],{"class":444},[398,528,530],{"class":400,"line":529},11,[398,531,532],{"class":444},"    \u003C!|||UNTRANSLATED_CONTENT_END|||-- Your content here -->\n",[398,534,536,538,540],{"class":400,"line":535},12,[398,537,512],{"class":444},[398,539,524],{"class":453},[398,541,457],{"class":444},[398,543,545,548,550],{"class":400,"line":544},13,[398,546,547],{"class":444},"\u003C/",[398,549,454],{"class":453},[398,551,457],{"class":444},[96,553,555],{"id":554},"_2-conteneurisation-de-votre-application","2. Conteneurisation de votre application",[13,557,558],{},"Créez un Dockerfile pour empaqueter votre application :",[389,560,565],{"className":561,"code":563,"language":564,"meta":394},[562],"language-text","FROM nginx:1.26.2\nCOPY index.html /usr/share/nginx/html/index.html\n","text",[114,566,563],{"__ignoreMap":394},[13,568,569],{},"Ce Dockerfile :",[51,571,572,575],{},[54,573,574],{},"Utilise nginx comme image de base pour diffuser du contenu web",[54,576,577],{},"Copie votre fichier HTML au bon endroit dans la structure du répertoire nginx",[96,579,581],{"id":580},"_3-configuration-de-votre-pipeline-cicd","3. Configuration de votre pipeline CI/CD",[13,583,584,585,588,589,595],{},"Créez un fichier ",[114,586,587],{},".gitlab-ci.yml"," pour définir les étapes de votre ",[17,590,594],{"href":591,"rel":592,"title":593},"https://about.gitlab.com/fr-fr/topics/ci-cd/cicd-pipeline/",[],"Qu'est-ce qu'un pipeline CI/CD ?","pipeline CI/CD"," :",[389,597,600],{"className":598,"code":599,"language":564,"meta":394},[562],"variables:\n  TAG_LATEST: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:latest\n  TAG_COMMIT: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:$CI_COMMIT_SHA\n\nstages:\n  - publish\n  - deploy\n",[114,601,599],{"__ignoreMap":394},[13,603,604],{},"Décomposons ce code :",[13,606,607,610],{},[114,608,609],{},"TAG_LATEST"," est composé de trois parties :",[51,612,613],{},[54,614,615,618],{},[114,616,617],{},"$CI_REGISTRY_IMAGE"," est le chemin d'accès au registre des conteneurs de votre projet dans GitLab.",[13,620,621,622],{},"Par exemple : ",[114,623,624],{},"registry.gitlab.com/your-group/your-project",[51,626,627],{},[54,628,629,632],{},[114,630,631],{},"$CI_COMMIT_REF_NAME"," est le nom de votre branche ou tag.",[13,634,635,636,639,640],{},"Par exemple, si vous travaillez sur la branche principale : ",[114,637,638],{},"/main",", et si vous travaillez sur une branche de fonctionnalité : ",[114,641,642],{},"/feature-login",[51,644,645],{},[54,646,647,650],{},[114,648,649],{},":latest"," est un suffixe fixe.",[13,652,653,654,656,657,291],{},"Ainsi, si vous êtes sur la branche principale, ",[114,655,609],{}," devient ",[114,658,659],{},"registry.gitlab.com/your-group/your-project/main:latest",[13,661,662,665,666,668,669,672,673,291],{},[114,663,664],{},"TAG_COMMIT"," est presque identique, mais au lieu de ",[114,667,649],{},", il utilise : ",[114,670,671],{},"$CI_COMMIT_SHA",", qui est l'identifiant de commit, par exemple ",[114,674,675],{},":abc123def456",[13,677,678,679,681,682,291],{},"Ainsi, pour ce même commit sur la branche principale, ",[114,680,664],{}," devient :",[114,683,684],{}," registry.gitlab.com/your-group/your-project/main:abc123def456",[13,686,687,688,690,691,693],{},"La présence de ces deux variables s'explique par le fait que ",[114,689,609],{}," vous permet facilement de toujours obtenir la version la plus récente. ",[114,692,664],{}," vous fournit une version spécifique à laquelle vous pouvez revenir si nécessaire.",[96,695,697],{"id":696},"_4-publication-dans-le-registre-de-conteneurs","4. Publication dans le registre de conteneurs",[13,699,700],{},"Ajoutez le job de publication à votre pipeline :",[389,702,705],{"className":703,"code":704,"language":564,"meta":394},[562],"publish:\n  stage: publish\n  image: docker:latest\n  services:\n    - docker:dind\n  script:\n    - docker build -t $TAG_LATEST -t $TAG_COMMIT .\n    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY\n    - docker push $TAG_LATEST\n    - docker push $TAG_COMMIT\n",[114,706,704],{"__ignoreMap":394},[13,708,709],{},"Ce job :",[51,711,712,715,718,721],{},[54,713,714],{},"Utilise Docker-in-Docker pour compiler des images",[54,716,717],{},"Crée deux versions avec tag de votre image",[54,719,720],{},"S'authentifie auprès du registre GitLab",[54,722,723],{},"Effectue un push des deux versions vers le registre\nMaintenant que vos images sont stockées de façon sécurisée dans le registre, vous pouvez vous concentrer sur leur déploiement dans vos environnements cibles. Commençons par des tests locaux pour valider notre configuration avant de passer aux déploiements dans l'environnement de production.",[96,725,727],{"id":726},"_5-déploiement-dans-votre-environnement","5. Déploiement dans votre environnement",[13,729,730,731,733],{},"Avant le déploiement en production, vous pouvez effectuer un test localement. Nous venons de publier notre image dans le dépôt GitLab, pour lequel nous allons effectuer un pull localement. Si vous ne connaissez pas le chemin d'accès exact, accédez à ",[288,732,361],{},". Vous devriez voir une icône permettant de copier le chemin d'accès de votre image à la fin de la ligne pour l'image de conteneur que vous souhaitez tester.",[389,735,737],{"className":391,"code":736,"language":393,"meta":394,"style":394},"docker login registry.gitlab.com docker run -p 80:80 registry.gitlab.com/your-project-path/main:latest\n",[114,738,739],{"__ignoreMap":394},[398,740,741,743,745,748,751,754,758,761],{"class":400,"line":401},[398,742,405],{"class":404},[398,744,409],{"class":408},[398,746,747],{"class":408}," registry.gitlab.com",[398,749,750],{"class":408}," docker",[398,752,753],{"class":408}," run",[398,755,757],{"class":756},"sYu0t"," -p",[398,759,760],{"class":408}," 80:80",[398,762,763],{"class":408}," registry.gitlab.com/your-project-path/main:latest\n",[13,765,766],{},"Ce faisant, vous devriez être en mesure d'accéder à votre application localement sur votre adresse localhost via votre navigateur web.",[13,768,769],{},"Vous pouvez maintenant ajouter un job de déploiement à votre pipeline :",[389,771,774],{"className":772,"code":773,"language":564,"meta":394},[562],"deploy:\n  stage: deploy\n  image: alpine:latest\n  script:\n    - chmod 400 $GITLAB_KEY\n    - apk add openssh-client\n    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY\n    - ssh -i $GITLAB_KEY -o StrictHostKeyChecking=no $USER@$TARGET_SERVER       docker pull $TAG_COMMIT &&\n      docker rm -f myapp || true &&\n      docker run -d -p 80:80 --name myapp $TAG_COMMIT\n",[114,775,773],{"__ignoreMap":394},[13,777,709],{},[51,779,780,783,786,789],{},[54,781,782],{},"Configure l'accès SSH à votre cible de déploiement",[54,784,785],{},"Effectue un pull de l'image la plus récente",[54,787,788],{},"Supprime tout conteneur existant",[54,790,791],{},"Déploie la nouvelle version",[96,793,795],{"id":794},"_6-suivi-des-déploiements","6. Suivi des déploiements",[13,797,798],{},"Activez le suivi des déploiements en ajoutant la configuration de l'environnement :",[389,800,803],{"className":801,"code":802,"language":564,"meta":394},[562],"deploy:\n  environment:\n    name: production\n    url: https://your-application-url.com ```\n\nCela crée un objet environnement dans la section **Exploitation > Environnements** de GitLab et fournit :\n\n- L'historique de déploiement\n- Le statut de déploiement actuel\n- Un accès rapide à votre application\n\nBien qu'un pipeline d'environnement unique soit un bon point de départ, la plupart des équipes doivent gérer plusieurs environnements, dont des environnements de test et de préproduction. Étoffons notre pipeline pour gérer ce scénario plus réaliste.\n\n#### 7. Configuration de plusieurs environnements\n\nPour obtenir un pipeline plus robuste, configurez les déploiements de préproduction et de production :\n\n```text\nstages:\n  - publish\n  - staging\n  - release\n  - version\n  - production\n\nstaging:\n  stage: staging\n  rules:\n    - if: $CI_COMMIT_BRANCH == \"main\" && $CI_COMMIT_TAG == null\n  environment:\n    name: staging\n    url: https://staging.your-app.com\n  # deployment script here\n\nproduction:\n  stage: production\n  rules:\n    - if: $CI_COMMIT_TAG\n  environment:\n    name: production\n    url: https://your-app.com\n  # deployment script here\n",[114,804,802],{"__ignoreMap":394},[13,806,807],{},"Cette configuration :",[51,809,810,813,816],{},[54,811,812],{},"Effectue un déploiement vers l'environnement de préproduction à partir de votre branche principale",[54,814,815],{},"Utilise les tags GitLab pour déclencher les déploiements de production",[54,817,818],{},"Fournit un suivi distinct pour chaque environnement",[13,820,821,822,825,826,829],{},"Que ce soit à cette étape ou à l'étape suivante, nous tirons parti des tags, qui sont une fonctionnalité très utile de GitLab. En créant manuellement un tag dans la section ",[288,823,824],{},"Code > Tags",", ",[114,827,828],{},"$CI_COMMIT_TAG"," est créé, ce qui nous permet de déclencher des jobs en conséquence.",[96,831,833],{"id":832},"_8-création-de-notes-de-version-automatisées","8. Création de notes de version automatisées",[13,835,836,837,595],{},"Nous utiliserons les fonctionnalités de gestion des versions de GitLab depuis notre pipeline CI/CD. Commencez par mettre à jour les étapes de votre pipeline CI/CD dans ",[114,838,587],{},[389,840,844],{"className":841,"code":842,"language":843,"meta":394,"style":394},"language-yaml shiki shiki-themes github-light","stages:\n\n- publish\n- staging\n- release # New stage for releases\n- version\n- production\n","yaml",[114,845,846,854,860,868,875,885,892],{"__ignoreMap":394},[398,847,848,851],{"class":400,"line":401},[398,849,850],{"class":453},"stages",[398,852,853],{"class":444},":\n",[398,855,856],{"class":400,"line":415},[398,857,859],{"emptyLinePlaceholder":858},true,"\n",[398,861,862,865],{"class":400,"line":422},[398,863,864],{"class":444},"- ",[398,866,867],{"class":408},"publish\n",[398,869,870,872],{"class":400,"line":470},[398,871,864],{"class":444},[398,873,874],{"class":408},"staging\n",[398,876,877,879,882],{"class":400,"line":481},[398,878,864],{"class":444},[398,880,881],{"class":408},"release",[398,883,884],{"class":418}," # New stage for releases\n",[398,886,887,889],{"class":400,"line":487},[398,888,864],{"class":444},[398,890,891],{"class":408},"version\n",[398,893,894,896],{"class":400,"line":493},[398,895,864],{"class":444},[398,897,898],{"class":408},"production\n",[13,900,901],{},"Ensuite, ajoutez le job de release :",[389,903,906],{"className":904,"code":905,"language":564,"meta":394},[562],"release_job:\n  stage: release\n  image: registry.gitlab.com/gitlab-org/release-cli:latest\n  rules:\n    - if: $CI_COMMIT_TAG                  # Only run when a tag is created\n  script:\n    - echo \"Creating release for $CI_COMMIT_TAG\"\n  release:                                # Release configuration\n    name: 'Release $CI_COMMIT_TAG'\n    description: 'Release created from $CI_COMMIT_TAG'\n    tag_name: '$CI_COMMIT_TAG'           # The tag to create\n    ref: '$CI_COMMIT_TAG'                # The tag to base release on\n",[114,907,905],{"__ignoreMap":394},[13,909,910],{},"Vous pouvez l'améliorer en ajoutant des liens vers vos images de conteneurs :",[389,912,915],{"className":913,"code":914,"language":564,"meta":394},[562],"release:\n  name: 'Release $CI_COMMIT_TAG'\n  description: 'Release created from $CI_COMMIT_TAG'\n  tag_name: '$CI_COMMIT_TAG'\n  ref: '$CI_COMMIT_TAG'\n  assets:\n    links:\n      - name: 'Container Image'\n        url: '$CI_REGISTRY_IMAGE/main:$CI_COMMIT_TAG'\n        link_type: 'image'\n",[114,916,914],{"__ignoreMap":394},[13,918,919],{},"Pour générer des notes de version automatisées pertinentes :",[51,921,922,925,928],{},[54,923,924],{},"Utilisez des commits conventionnels (feat:, fix:, et autres commandes.).",[54,926,927],{},"Incluez les numéros de ticket (#123).",[54,929,930],{},"Séparez le sujet du corps par un saut de ligne.",[13,932,933],{},"Si vous souhaitez des notes de version personnalisées avec des informations de déploiement :",[389,935,938],{"className":936,"code":937,"language":564,"meta":394},[562],"release_job:\n  script:\n    - |\n      DEPLOY_TIME=$(date '+%Y-%m-%d %H:%M:%S')\n      CHANGES=$(git log $(git describe --tags --abbrev=0 @^)..@ --pretty=format:\"- %s\")\n      cat > release_notes.md \u003C\u003C EOF\n      ## Deployment Info\n      - Deployed on: $DEPLOY_TIME\n      - Environment: Production\n      - Version: $CI_COMMIT_TAG\n\n      ## Changes\n      $CHANGES\n\n      ## Artifacts\n      - Container Image: \\`$CI_REGISTRY_IMAGE/main:$CI_COMMIT_TAG\\`\n      EOF\n  release:\n    description: './release_notes.md'\n",[114,939,937],{"__ignoreMap":394},[13,941,942,943,949,950,291],{},"Une fois configurées, les versions sont créées automatiquement lorsque vous ajoutez un tag ",[17,944,948],{"href":945,"rel":946,"title":947},"https://about.gitlab.com/fr-fr/blog/what-is-git/",[],"Qu'est-ce que Git ? ","Git",". Vous pouvez les afficher dans GitLab sous ",[288,951,952],{},"Déploiement > Releases",[96,954,956],{"id":955},"_9-assemblage","9. Assemblage",[13,958,959],{},"Voici à quoi ressemble notre fichier YAML final :",[389,961,964],{"className":962,"code":963,"language":564,"meta":394},[562],"variables:\n  TAG_LATEST: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:latest\n  TAG_COMMIT: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:$CI_COMMIT_SHA\n  STAGING_TARGET: $STAGING_TARGET    # Set in CI/CD Variables\n  PRODUCTION_TARGET: $PRODUCTION_TARGET  # Set in CI/CD Variables\n\nstages:\n  - publish\n  - staging\n  - release\n  - version\n  - production\n\n# Build and publish to registry\npublish:\n  stage: publish\n  image: docker:latest\n  services:\n    - docker:dind\n  rules:\n    - if: $CI_COMMIT_BRANCH == \"main\" && $CI_COMMIT_TAG == null\n  script:\n    - docker build -t $TAG_LATEST -t $TAG_COMMIT .\n    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY\n    - docker push $TAG_LATEST\n    - docker push $TAG_COMMIT\n\n# Deploy to staging\nstaging:\n  stage: staging\n  image: alpine:latest\n  rules:\n    - if: $CI_COMMIT_BRANCH == \"main\" && $CI_COMMIT_TAG == null\n  script:\n    - chmod 400 $GITLAB_KEY\n    - apk add openssh-client\n    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY\n    - ssh -i $GITLAB_KEY -o StrictHostKeyChecking=no $USER@$STAGING_TARGET \"\n        docker pull $TAG_COMMIT &&\n        docker rm -f myapp || true &&\n        docker run -d -p 80:80 --name myapp $TAG_COMMIT\"\n  environment:\n    name: staging\n    url: http://$STAGING_TARGET\n\n# Create release\nrelease_job:\n  stage: release\n  image: registry.gitlab.com/gitlab-org/release-cli:latest\n  rules:\n    - if: $CI_COMMIT_TAG\n  script:\n    - |\n      DEPLOY_TIME=$(date '+%Y-%m-%d %H:%M:%S')\n      CHANGES=$(git log $(git describe --tags --abbrev=0 @^)..@ --pretty=format:\"- %s\")\n      cat > release_notes.md \u003C\u003C EOF\n      ## Deployment Info\n      - Deployed on: $DEPLOY_TIME\n      - Environment: Production\n      - Version: $CI_COMMIT_TAG\n\n      ## Changes\n      $CHANGES\n\n      ## Artifacts\n      - Container Image: \\`$CI_REGISTRY_IMAGE/main:$CI_COMMIT_TAG\\`\n      EOF\n  release:\n    name: 'Release $CI_COMMIT_TAG'\n    description: './release_notes.md'\n    tag_name: '$CI_COMMIT_TAG'\n    ref: '$CI_COMMIT_TAG'\n    assets:\n      links:\n        - name: 'Container Image'\n          url: '$CI_REGISTRY_IMAGE/main:$CI_COMMIT_TAG'\n          link_type: 'image'\n\n# Version the image with release tag\nversion_job:\n  stage: version\n  image: docker:latest\n  services:\n    - docker:dind\n  rules:\n    - if: $CI_COMMIT_TAG\n  script:\n    - docker pull $TAG_COMMIT\n    - docker tag $TAG_COMMIT $CI_REGISTRY_IMAGE/main:$CI_COMMIT_TAG\n    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY\n    - docker push $CI_REGISTRY_IMAGE/main:$CI_COMMIT_TAG\n\n# Deploy to production\nproduction:\n  stage: production\n  image: alpine:latest\n  rules:\n    - if: $CI_COMMIT_TAG\n  script:\n    - chmod 400 $GITLAB_KEY\n    - apk add openssh-client\n    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY\n    - ssh -i $GITLAB_KEY -o StrictHostKeyChecking=no $USER@$PRODUCTION_TARGET \"\n        docker pull $CI_REGISTRY_IMAGE/main:$CI_COMMIT_TAG &&\n        docker rm -f myapp || true &&\n        docker run -d -p 80:80 --name myapp $CI_REGISTRY_IMAGE/main:$CI_COMMIT_TAG\"\n  environment:\n    name: production\n    url: http://$PRODUCTION_TARGET\n",[114,965,963],{"__ignoreMap":394},[13,967,968],{},"Ce pipeline complet :",[51,970,971,974,977,980],{},[54,972,973],{},"Publie des images dans le registre (branche principale)",[54,975,976],{},"Déploie vers l'environnement de préproduction (branche principale)",[54,978,979],{},"Crée des versions (lorsqu'un tag est ajouté)",[54,981,982],{},"Crée des versions d'images avec des tags de version - Déploie dans l'environnement de production (lorsqu'un tag est créé)",[13,984,985],{},"Principaux avantages :",[51,987,988,991,994,997],{},[54,989,990],{},"Environnement de développement et de test local propre et reproductible",[54,992,993],{},"Chemin d'accès clair vers les environnements de production avec une structure qui renforce la confiance dans ce qui est déployé",[54,995,996],{},"Modèle pour se remettre de défaillances inattendues, entre autres",[54,998,999],{},"Possibilité de développement sur cette base et d'adoption de stratégies de déploiement plus complexes",[43,1001,1003],{"id":1002},"bonnes-pratiques","Bonnes pratiques",[13,1005,1006],{},"Tout au long de la mise en œuvre, respectez les principes suivants :",[51,1008,1009,1012,1015,1018,1021],{},[54,1010,1011],{},"Documentez tout, de l'utilisation des variables aux procédures de déploiement.",[54,1013,1014],{},"Utilisez les fonctionnalités intégrées de GitLab (environnements, releases, registre).",[54,1016,1017],{},"Mettez en œuvre des contrôles d'accès et des mesures de sécurité adaptés.",[54,1019,1020],{},"Pensez aux éventuelles défaillances en mettant en place des procédures de restauration robustes.",[54,1022,1023],{},"Évitez les redondances dans vos configurations de pipeline en suivant le principe DRY (Don't Repeat Yourself).",[35,1025,1027],{"id":1026},"mise-à-léchelle-de-votre-stratégie-de-déploiement","Mise à l'échelle de votre stratégie de déploiement",[13,1029,1030],{},"Pour terminer, voici quelques aspects à prendre en compte à mesure que votre stratégie de déploiement continu évolue.",[43,1032,1034],{"id":1033},"mesures-de-sécurité-avancées","Mesures de sécurité avancées",[13,1036,1037],{},"Améliorez la sécurité grâce aux fonctionnalités suivantes :",[51,1039,1040,1043,1046,1049,1052],{},[54,1041,1042],{},"Environnements protégés avec accès restreint",[54,1044,1045],{},"Approbations requises pour les déploiements en production",[54,1047,1048],{},"Scanning de sécurité intégré",[54,1050,1051],{},"Évaluations automatisées des vulnérabilités",[54,1053,1054],{},"Règles de protection des branches pour les modifications liées au déploiement",[43,1056,1058],{"id":1057},"stratégies-de-livraison-progressive","Stratégies de livraison progressive",[13,1060,1061],{},"Mettez en œuvre des stratégies de déploiement avancées :",[51,1063,1064,1067,1070,1073,1076],{},[54,1065,1066],{},"Feature flags pour les déploiements contrôlés",[54,1068,1069],{},"Déploiements canari pour l'atténuation des risques",[54,1071,1072],{},"Stratégies de déploiement bleu-vert",[54,1074,1075],{},"Capacités de test A/B",[54,1077,1078],{},"Gestion dynamique de l'environnement",[43,1080,1082],{"id":1081},"surveillance-et-optimisation","Surveillance et optimisation",[13,1084,1085],{},"Mettez en place des pratiques de surveillance robustes :",[51,1087,1088,1091,1094,1097,1100],{},[54,1089,1090],{},"Suivi des mesures de déploiement",[54,1092,1093],{},"Mise en place d'un suivi des performances",[54,1095,1096],{},"Configuration d'alertes de déploiement",[54,1098,1099],{},"Établissement d'objectifs de niveau de service (SLO) en matière de déploiement",[54,1101,1102],{},"Optimisation régulière du pipeline",[35,1104,1106],{"id":1105},"pourquoi-utiliser-gitlab","Pourquoi utiliser GitLab ?",[13,1108,1109,1110,1116],{},"La plateforme GitLab est idéale pour les workflows de déploiement modernes grâce à ses fonctionnalités de déploiement continu. Elle permet de simplifier les étapes menant du code à la production, en offrant un registre de conteneurs intégré, une gestion de l'environnement et le suivi des déploiements au sein d'une seule interface. Les variables propres à l'environnement, les portes d'approbation de déploiement et les fonctionnalités de restauration de GitLab fournissent la sécurité et le contrôle nécessaires aux déploiements en production, tandis que les fonctionnalités telles que les versions temporaires d'applications et les feature flags offrent des approches de livraison progressive. Ces fonctionnalités de déploiement continu font partie intégrante de la plateforme ",[17,1111,1115],{"href":1112,"rel":1113,"title":1114},"https://about.gitlab.com/fr-fr/topics/devsecops/",[],"Qu'est-ce que DevSecOps ?","DevSecOps"," complète de GitLab et s'intègrent parfaitement à l'ensemble du cycle de vie de vos logiciels.",[35,1118,1120],{"id":1119},"lancez-vous-dès-aujourdhui","Lancez-vous dès aujourd'hui",[13,1122,1123],{},"Opter pour un déploiement continu est une évolution, pas une révolution. Commencez par les fondamentaux, établissez une base solide et intégrez progressivement des fonctionnalités avancées lorsque les besoins de votre équipe augmentent. GitLab fournit les outils et la flexibilité nécessaires pour vous accompagner à chaque étape de ce parcours, de votre premier déploiement automatisé aux pipelines de livraison complexes et multi-environnements.",[1125,1126,1127],"blockquote",{},[13,1128,1129,1134],{},[17,1130,1133],{"href":1131,"rel":1132},"https://about.gitlab.com/fr-fr/free-trial/devsecops/",[],"Essayez GitLab Ultimate gratuitement"," et commencez votre déploiement continu dès aujourd'hui.",[476,1136,1137],{},"html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html .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 .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}",{"title":394,"searchDepth":415,"depth":415,"links":1139},[1140,1145,1149,1154,1155],{"id":37,"depth":415,"text":38,"children":1141},[1142,1143,1144],{"id":45,"depth":422,"text":46},{"id":198,"depth":422,"text":199},{"id":219,"depth":422,"text":220},{"id":243,"depth":415,"text":244,"children":1146},[1147,1148],{"id":247,"depth":422,"text":248},{"id":1002,"depth":422,"text":1003},{"id":1026,"depth":415,"text":1027,"children":1150},[1151,1152,1153],{"id":1033,"depth":422,"text":1034},{"id":1057,"depth":422,"text":1058},{"id":1081,"depth":422,"text":1082},{"id":1105,"depth":415,"text":1106},{"id":1119,"depth":415,"text":1120},"product","2025-01-28","Découvrez comment créer un pipeline de déploiement continu robuste dans GitLab.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659478/Blog/Hero%20Images/REFERENCE_-_Use_this_page_as_a_reference_for_thumbnail_sizes.png",{},"/fr-fr/blog/from-code-to-production-a-guide-to-continuous-deployment-with-gitlab",{"title":5,"description":1158,"ogTitle":5,"ogDescription":1158,"noIndex":1161,"ogImage":1162,"ogUrl":1166,"ogSiteName":1167,"ogType":1168,"canonicalUrls":1166},"https://about.gitlab.com/blog/from-code-to-production-a-guide-to-continuous-deployment-with-gitlab","https://about.gitlab.com","article","from-code-to-production-a-guide-to-continuous-deployment-with-gitlab","fr-fr/blog/from-code-to-production-a-guide-to-continuous-deployment-with-gitlab",[1172,1173,1174,1156,1175],"CD","CI/CD","features","tutorial","BlogPost","2025-03-24","GInY47IHELlvqmqpNeInp2McOd0jLqcpJulsgaG36cI",{"logo":1180,"freeTrial":1185,"sales":1190,"login":1195,"items":1200,"search":1528,"minimal":1563,"duo":1582,"switchNav":1591,"pricingDeployment":1602},{"config":1181},{"href":1182,"dataGaName":1183,"dataGaLocation":1184},"/fr-fr/","gitlab logo","header",{"text":1186,"config":1187},"Commencer un essai gratuit",{"href":1188,"dataGaName":1189,"dataGaLocation":1184},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr&glm_content=default-saas-trial/","free trial",{"text":1191,"config":1192},"Demander une démo",{"href":1193,"dataGaName":1194,"dataGaLocation":1184},"/fr-fr/sales/?contact-topic=request-demo","sales",{"text":1196,"config":1197},"Connexion",{"href":1198,"dataGaName":1199,"dataGaLocation":1184},"https://gitlab.com/users/sign_in/","sign in",[1201,1230,1331,1336,1450,1506],{"text":1202,"config":1203,"menu":1205},"Plateforme",{"dataNavLevelOne":1204},"platform",{"type":1206,"columns":1207},"cards",[1208,1214,1222],{"title":1202,"description":1209,"link":1210},"La plateforme d'orchestration intelligente pour le DevSecOps",{"text":1211,"config":1212},"Explorer notre plateforme",{"href":1213,"dataGaName":1204,"dataGaLocation":1184},"/fr-fr/platform/",{"title":1215,"description":1216,"link":1217},"GitLab Duo Agent Platform","L'IA agentique pour l'ensemble du cycle de développement logiciel",{"text":1218,"config":1219},"Découvrir GitLab Duo",{"href":1220,"dataGaName":1221,"dataGaLocation":1184},"/fr-fr/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1223,"description":1224,"link":1225},"Pourquoi GitLab ?","Découvrez les principales raisons pour lesquelles les entreprises choisissent GitLab",{"text":1226,"config":1227},"En savoir plus",{"href":1228,"dataGaName":1229,"dataGaLocation":1184},"/fr-fr/why-gitlab/","why gitlab",{"text":1231,"left":858,"config":1232,"menu":1234},"Produit",{"dataNavLevelOne":1233},"solutions",{"type":1235,"link":1236,"columns":1240,"feature":1310},"lists",{"text":1237,"config":1238},"Voir toutes les solutions",{"href":1239,"dataGaName":1233,"dataGaLocation":1184},"/fr-fr/solutions/",[1241,1265,1288],{"title":1242,"description":1243,"link":1244,"items":1249},"Automatisation","CI/CD et automatisation pour accélérer le déploiement",{"config":1245},{"icon":1246,"href":1247,"dataGaName":1248,"dataGaLocation":1184},"AutomatedCodeAlt","/fr-fr/solutions/delivery-automation/","automated software delivery",[1250,1253,1256,1261],{"text":1173,"config":1251},{"href":1252,"dataGaLocation":1184,"dataGaName":1173},"/fr-fr/solutions/continuous-integration/",{"text":1215,"config":1254},{"href":1220,"dataGaLocation":1184,"dataGaName":1255},"gitlab duo agent platform - product menu",{"text":1257,"config":1258},"Gestion du code source",{"href":1259,"dataGaLocation":1184,"dataGaName":1260},"/fr-fr/solutions/source-code-management/","Source Code Management",{"text":1262,"config":1263},"Livraison de logiciels automatisée",{"href":1247,"dataGaLocation":1184,"dataGaName":1264},"Automated software delivery",{"title":1266,"description":1267,"link":1268,"items":1273},"Sécurité","Livrez du code plus rapidement sans compromettre la sécurité",{"config":1269},{"href":1270,"dataGaName":1271,"dataGaLocation":1184,"icon":1272},"/fr-fr/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1274,1278,1283],{"text":1275,"config":1276},"Tests de sécurité des applications",{"href":1270,"dataGaName":1277,"dataGaLocation":1184},"Application security testing",{"text":1279,"config":1280},"Sécurité de la chaîne d'approvisionnement logicielle",{"href":1281,"dataGaLocation":1184,"dataGaName":1282},"/fr-fr/solutions/supply-chain/","Software supply chain security",{"text":1284,"config":1285},"Conformité logicielle",{"href":1286,"dataGaName":1287,"dataGaLocation":1184},"/fr-fr/solutions/software-compliance/","software compliance",{"title":1289,"link":1290,"items":1295},"Mesures",{"config":1291},{"icon":1292,"href":1293,"dataGaName":1294,"dataGaLocation":1184},"DigitalTransformation","/fr-fr/solutions/visibility-measurement/","visibility and measurement",[1296,1300,1305],{"text":1297,"config":1298},"Visibilité et mesures",{"href":1293,"dataGaLocation":1184,"dataGaName":1299},"Visibility and Measurement",{"text":1301,"config":1302},"Gestion de la chaîne de valeur",{"href":1303,"dataGaLocation":1184,"dataGaName":1304},"/fr-fr/solutions/value-stream-management/","Value Stream Management",{"text":1306,"config":1307},"Analyses et informations",{"href":1308,"dataGaLocation":1184,"dataGaName":1309},"/fr-fr/solutions/analytics-and-insights/","Analytics and insights",{"title":1311,"type":1235,"items":1312},"GitLab",[1313,1319,1325],{"text":1314,"config":1315},"Entreprises",{"icon":1316,"href":1317,"dataGaLocation":1184,"dataGaName":1318},"Building","/fr-fr/enterprise/","enterprise",{"text":1320,"config":1321},"Pour les PME",{"icon":1322,"href":1323,"dataGaLocation":1184,"dataGaName":1324},"Work","/fr-fr/small-business/","small business",{"text":1326,"config":1327},"Pour le secteur public",{"icon":1328,"href":1329,"dataGaLocation":1184,"dataGaName":1330},"Organization","/fr-fr/solutions/public-sector/","public sector",{"text":1332,"config":1333},"Tarifs",{"href":1334,"dataGaName":1335,"dataGaLocation":1184,"dataNavLevelOne":1335},"/fr-fr/pricing/","pricing",{"text":1337,"config":1338,"menu":1340},"Ressources",{"dataNavLevelOne":1339},"resources",{"type":1235,"link":1341,"columns":1345,"feature":1439},{"text":1342,"config":1343},"Afficher toutes les ressources",{"href":1344,"dataGaName":1339,"dataGaLocation":1184},"/fr-fr/resources/",[1346,1379,1406],{"title":1347,"items":1348},"Premiers pas",[1349,1354,1359,1364,1369,1374],{"text":1350,"config":1351},"Installation",{"href":1352,"dataGaName":1353,"dataGaLocation":1184},"/fr-fr/install/","install",{"text":1355,"config":1356},"Guides de démarrage",{"href":1357,"dataGaName":1358,"dataGaLocation":1184},"/fr-fr/get-started/","quick setup checklists",{"text":1360,"config":1361},"Apprentissage",{"href":1362,"dataGaLocation":1184,"dataGaName":1363},"https://university.gitlab.com/","learn",{"text":1365,"config":1366},"Documentation",{"href":1367,"dataGaName":1368,"dataGaLocation":1184},"https://docs.gitlab.com/","product documentation",{"text":1370,"config":1371},"Vidéos sur les bonnes pratiques",{"href":1372,"dataGaName":1373,"dataGaLocation":1184},"/fr-fr/getting-started-videos/","best practice videos",{"text":1375,"config":1376},"Intégrations",{"href":1377,"dataGaName":1378,"dataGaLocation":1184},"/fr-fr/integrations/","integrations",{"title":1380,"items":1381},"Découvrir",[1382,1387,1392,1397,1401],{"text":1383,"config":1384},"Témoignages clients",{"href":1385,"dataGaName":1386,"dataGaLocation":1184},"/fr-fr/customers/","customer success stories",{"text":1388,"config":1389},"Blog",{"href":1390,"dataGaName":1391,"dataGaLocation":1184},"/fr-fr/blog/","blog",{"text":1393,"config":1394},"Demo Hub",{"href":1395,"dataGaName":1396,"dataGaLocation":1184},"/fr-fr/demo-hub/","demo hub",{"text":1398,"config":1399},"The Source",{"href":1400,"dataGaName":1391,"dataGaLocation":1184},"/fr-fr/the-source/",{"text":1402,"config":1403},"Travail à distance",{"href":1404,"dataGaName":1405,"dataGaLocation":1184},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1407,"items":1408},"Connecter",[1409,1414,1419,1424,1429,1434],{"text":1410,"config":1411},"Services GitLab",{"href":1412,"dataGaName":1413,"dataGaLocation":1184},"/fr-fr/services/","services",{"text":1415,"config":1416},"Contribuer",{"href":1417,"dataGaName":1418,"dataGaLocation":1184},"https://contributors.gitlab.com","contribute",{"text":1420,"config":1421},"Communauté",{"href":1422,"dataGaName":1423,"dataGaLocation":1184},"/community/","community",{"text":1425,"config":1426},"Forum",{"href":1427,"dataGaName":1428,"dataGaLocation":1184},"https://forum.gitlab.com/","forum",{"text":1430,"config":1431},"Événements",{"href":1432,"dataGaName":1433,"dataGaLocation":1184},"/events/","events",{"text":1435,"config":1436},"Partenaires",{"href":1437,"dataGaName":1438,"dataGaLocation":1184},"/fr-fr/partners/","partners",{"config":1440,"title":1443,"text":1444,"link":1445},{"background":1441,"textColor":1442},"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":1446,"config":1447},"Lire les articles les plus récents",{"href":1448,"dataGaName":1449,"dataGaLocation":1184},"/fr-fr/whats-new/","whats new",{"text":1451,"config":1452,"menu":1454},"Société",{"dataNavLevelOne":1453},"company",{"type":1235,"columns":1455},[1456],{"items":1457},[1458,1463,1469,1471,1476,1481,1486,1491,1496,1501],{"text":1459,"config":1460},"À propos",{"href":1461,"dataGaName":1462,"dataGaLocation":1184},"/fr-fr/company/","about",{"text":1464,"config":1465,"footerGa":1468},"Carrières",{"href":1466,"dataGaName":1467,"dataGaLocation":1184},"/jobs/","jobs",{"dataGaName":1467},{"text":1430,"config":1470},{"href":1432,"dataGaName":1433,"dataGaLocation":1184},{"text":1472,"config":1473},"Leadership",{"href":1474,"dataGaName":1475,"dataGaLocation":1184},"/company/team/e-group/","leadership",{"text":1477,"config":1478},"Manuel",{"href":1479,"dataGaName":1480,"dataGaLocation":1184},"https://handbook.gitlab.com/","handbook",{"text":1482,"config":1483},"Relations avec les investisseurs",{"href":1484,"dataGaName":1485,"dataGaLocation":1184},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1487,"config":1488},"Trust Center",{"href":1489,"dataGaName":1490,"dataGaLocation":1184},"/fr-fr/security/","trust center",{"text":1492,"config":1493},"Centre pour la transparence de l'IA",{"href":1494,"dataGaName":1495,"dataGaLocation":1184},"/fr-fr/ai-transparency-center/","ai transparency center",{"text":1497,"config":1498},"Newsletter",{"href":1499,"dataGaName":1500,"dataGaLocation":1184},"/company/contact/#contact-forms","newsletter",{"text":1502,"config":1503},"Presse",{"href":1504,"dataGaName":1505,"dataGaLocation":1184},"/press/","press",{"text":1507,"config":1508,"menu":1509},"Nous contacter",{"dataNavLevelOne":1453},{"type":1235,"columns":1510},[1511],{"items":1512},[1513,1518,1523],{"text":1514,"config":1515},"Contacter l'équipe commerciale",{"href":1516,"dataGaName":1517,"dataGaLocation":1184},"/fr-fr/sales/","talk to sales",{"text":1519,"config":1520},"Assistance GitLab",{"href":1521,"dataGaName":1522,"dataGaLocation":1184},"https://support.gitlab.com/hc/en-us","support portal",{"text":1524,"config":1525},"Portail clients GitLab",{"href":1526,"dataGaName":1527,"dataGaLocation":1184},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1529,"login":1530,"suggestions":1537},"Fermer",{"text":1531,"link":1532},"Pour rechercher des dépôts et des projets, connectez-vous à",{"text":1533,"config":1534},"GitLab.com",{"href":1198,"dataGaName":1535,"dataGaLocation":1536},"search login","search",{"text":1538,"default":1539},"Suggestions",[1540,1543,1548,1550,1555,1560],{"text":1215,"config":1541},{"href":1220,"dataGaName":1542,"dataGaLocation":1536},"GitLab Duo Agent Platform",{"text":1544,"config":1545},"Suggestions de code (IA)",{"href":1546,"dataGaName":1547,"dataGaLocation":1536},"/fr-fr/solutions/code-suggestions/","Code Suggestions (AI)",{"text":1173,"config":1549},{"href":1252,"dataGaName":1173,"dataGaLocation":1536},{"text":1551,"config":1552},"GitLab sur AWS",{"href":1553,"dataGaName":1554,"dataGaLocation":1536},"/fr-fr/partners/technology-partners/aws/","GitLab on AWS",{"text":1556,"config":1557},"GitLab sur Google Cloud",{"href":1558,"dataGaName":1559,"dataGaLocation":1536},"/fr-fr/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":1106,"config":1561},{"href":1228,"dataGaName":1562,"dataGaLocation":1536},"Why GitLab?",{"freeTrial":1564,"mobileIcon":1569,"desktopIcon":1574,"secondaryButton":1577},{"text":1565,"config":1566},"Commencer votre essai gratuit",{"href":1567,"dataGaName":1189,"dataGaLocation":1568},"https://gitlab.com/-/trials/new/","nav",{"altText":1570,"config":1571},"Icône GitLab",{"src":1572,"dataGaName":1573,"dataGaLocation":1568},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1570,"config":1575},{"src":1576,"dataGaName":1573,"dataGaLocation":1568},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1578,"config":1579},"Commencer",{"href":1580,"dataGaName":1581,"dataGaLocation":1568},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr/get-started/","get started",{"freeTrial":1583,"mobileIcon":1587,"desktopIcon":1589},{"text":1584,"config":1585},"En savoir plus sur GitLab Duo",{"href":1220,"dataGaName":1586,"dataGaLocation":1568},"gitlab duo",{"altText":1570,"config":1588},{"src":1572,"dataGaName":1573,"dataGaLocation":1568},{"altText":1570,"config":1590},{"src":1576,"dataGaName":1573,"dataGaLocation":1568},{"button":1592,"mobileIcon":1597,"desktopIcon":1599},{"text":1593,"config":1594},"/switch",{"href":1595,"dataGaName":1596,"dataGaLocation":1568},"#contact","switch",{"altText":1570,"config":1598},{"src":1572,"dataGaName":1573,"dataGaLocation":1568},{"altText":1570,"config":1600},{"src":1601,"dataGaName":1573,"dataGaLocation":1568},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1603,"mobileIcon":1608,"desktopIcon":1610},{"text":1604,"config":1605},"Retour aux tarifs",{"href":1334,"dataGaName":1606,"dataGaLocation":1568,"icon":1607},"back to pricing","GoBack",{"altText":1570,"config":1609},{"src":1572,"dataGaName":1573,"dataGaLocation":1568},{"altText":1570,"config":1611},{"src":1576,"dataGaName":1573,"dataGaLocation":1568},{"title":1613,"button":1614,"config":1618},"GitLab Orbit est arrivé : la couche de contexte pour les agents d'IA.",{"text":1226,"config":1615},{"href":1616,"dataGaName":1617,"dataGaLocation":1184},"/fr-fr/gitlab-orbit/","orbit",{"layout":881,"disabled":1161},{"data":1620},{"text":1621,"source":1622,"edit":1628,"contribute":1633,"config":1637,"items":1642,"minimal":1848},"Git est une marque déposée de Software Freedom Conservancy et notre utilisation de « GitLab » est sous licence.",{"text":1623,"config":1624},"Afficher le code source de la page",{"href":1625,"dataGaName":1626,"dataGaLocation":1627},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1629,"config":1630},"Modifier cette page",{"href":1631,"dataGaName":1632,"dataGaLocation":1627},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1415,"config":1634},{"href":1635,"dataGaName":1636,"dataGaLocation":1627},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1638,"facebook":1639,"youtube":1640,"linkedin":1641},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1643,1689,1740,1783,1815],{"title":1332,"links":1644,"subMenu":1659},[1645,1649,1654],{"text":1646,"config":1647},"Voir les forfaits",{"href":1334,"dataGaName":1648,"dataGaLocation":1627},"view plans",{"text":1650,"config":1651},"GitLab Premium",{"href":1652,"dataGaName":1653,"dataGaLocation":1627},"/fr-fr/pricing/premium/","why premium",{"text":1655,"config":1656},"GitLab Ultimate",{"href":1657,"dataGaName":1658,"dataGaLocation":1627},"/fr-fr/pricing/ultimate/","why ultimate",[1660],{"title":1507,"links":1661},[1662,1664,1666,1669,1674,1679,1684],{"text":1514,"config":1663},{"href":1516,"dataGaName":1194,"dataGaLocation":1627},{"text":1519,"config":1665},{"href":1521,"dataGaName":1522,"dataGaLocation":1627},{"text":1667,"config":1668},"Portail clients",{"href":1526,"dataGaName":1527,"dataGaLocation":1627},{"text":1670,"config":1671},"Statut",{"href":1672,"dataGaName":1673,"dataGaLocation":1627},"https://status.gitlab.com/","status",{"text":1675,"config":1676},"Conditions d'utilisation",{"href":1677,"dataGaName":1678,"dataGaLocation":1627},"/terms/","terms of use",{"text":1680,"config":1681},"Politique de confidentialité",{"href":1682,"dataGaName":1683,"dataGaLocation":1627},"/fr-fr/privacy/","privacy statement",{"text":1685,"config":1686},"Gestion des cookies",{"dataGaName":1687,"dataGaLocation":1627,"id":1688,"isOneTrustButton":858},"cookie preferences","ot-sdk-btn",{"title":1231,"links":1690,"subMenu":1699},[1691,1695],{"text":1692,"config":1693},"Plateforme DevSecOps",{"href":1213,"dataGaName":1694,"dataGaLocation":1627},"devsecops platform",{"text":1696,"config":1697},"Développement assisté par l'IA",{"href":1220,"dataGaName":1698,"dataGaLocation":1627},"ai-assisted development",[1700],{"title":1701,"links":1702},"Thèmes",[1703,1707,1711,1716,1721,1725,1730,1735],{"text":1173,"config":1704},{"href":1705,"dataGaName":1706,"dataGaLocation":1627},"/fr-fr/topics/ci-cd/","cicd",{"text":22,"config":1708},{"href":1709,"dataGaName":1710,"dataGaLocation":1627},"/fr-fr/topics/gitops/","gitops",{"text":1712,"config":1713},"DevOps",{"href":1714,"dataGaName":1715,"dataGaLocation":1627},"/fr-fr/topics/devops/","devops",{"text":1717,"config":1718},"Contrôle de version",{"href":1719,"dataGaName":1720,"dataGaLocation":1627},"/fr-fr/topics/version-control/","version control",{"text":1115,"config":1722},{"href":1723,"dataGaName":1724,"dataGaLocation":1627},"/fr-fr/topics/devsecops/","devsecops",{"text":1726,"config":1727},"Cloud-native",{"href":1728,"dataGaName":1729,"dataGaLocation":1627},"/fr-fr/topics/cloud-native/","cloud native",{"text":1731,"config":1732},"IA pour la programmation",{"href":1733,"dataGaName":1734,"dataGaLocation":1627},"/fr-fr/topics/devops/ai-for-coding/","ai for coding",{"text":1736,"config":1737},"IA agentique",{"href":1738,"dataGaName":1739,"dataGaLocation":1627},"/fr-fr/topics/agentic-ai/","agentic ai",{"title":1741,"links":1742},"Solutions",[1743,1746,1748,1753,1756,1759,1762,1765,1767,1770,1773,1778],{"text":1275,"config":1744},{"href":1270,"dataGaName":1745,"dataGaLocation":1627},"Application Security Testing",{"text":1262,"config":1747},{"href":1247,"dataGaName":1248,"dataGaLocation":1627},{"text":1749,"config":1750},"Développement Agile",{"href":1751,"dataGaName":1752,"dataGaLocation":1627},"/fr-fr/solutions/agile-delivery/","agile delivery",{"text":1257,"config":1754},{"href":1259,"dataGaName":1755,"dataGaLocation":1627},"source code management",{"text":1173,"config":1757},{"href":1252,"dataGaName":1758,"dataGaLocation":1627},"continuous integration & delivery",{"text":1301,"config":1760},{"href":1303,"dataGaName":1761,"dataGaLocation":1627},"value stream management",{"text":22,"config":1763},{"href":1764,"dataGaName":1710,"dataGaLocation":1627},"/fr-fr/solutions/gitops/",{"text":1314,"config":1766},{"href":1317,"dataGaName":1318,"dataGaLocation":1627},{"text":1768,"config":1769},"PME",{"href":1323,"dataGaName":1324,"dataGaLocation":1627},{"text":1771,"config":1772},"Secteur public",{"href":1329,"dataGaName":1330,"dataGaLocation":1627},{"text":1774,"config":1775},"Éducation",{"href":1776,"dataGaName":1777,"dataGaLocation":1627},"/fr-fr/solutions/education/","education",{"text":1779,"config":1780},"Services financiers",{"href":1781,"dataGaName":1782,"dataGaLocation":1627},"/fr-fr/solutions/finance/","financial services",{"title":1337,"links":1784},[1785,1787,1789,1791,1794,1796,1799,1801,1803,1805,1807,1809,1811,1813],{"text":1350,"config":1786},{"href":1352,"dataGaName":1353,"dataGaLocation":1627},{"text":1355,"config":1788},{"href":1357,"dataGaName":1358,"dataGaLocation":1627},{"text":1360,"config":1790},{"href":1362,"dataGaName":1363,"dataGaLocation":1627},{"text":1365,"config":1792},{"href":1367,"dataGaName":1793,"dataGaLocation":1627},"docs",{"text":1388,"config":1795},{"href":1390,"dataGaName":1391,"dataGaLocation":1627},{"text":1797,"config":1798},"Nouveautés",{"href":1448,"dataGaName":1449,"dataGaLocation":1627},{"text":1383,"config":1800},{"href":1385,"dataGaName":1386,"dataGaLocation":1627},{"text":1402,"config":1802},{"href":1404,"dataGaName":1405,"dataGaLocation":1627},{"text":1410,"config":1804},{"href":1412,"dataGaName":1413,"dataGaLocation":1627},{"text":1415,"config":1806},{"href":1417,"dataGaName":1418,"dataGaLocation":1627},{"text":1420,"config":1808},{"href":1422,"dataGaName":1423,"dataGaLocation":1627},{"text":1425,"config":1810},{"href":1427,"dataGaName":1428,"dataGaLocation":1627},{"text":1430,"config":1812},{"href":1432,"dataGaName":1433,"dataGaLocation":1627},{"text":1435,"config":1814},{"href":1437,"dataGaName":1438,"dataGaLocation":1627},{"title":1451,"links":1816},[1817,1819,1821,1823,1825,1827,1832,1837,1839,1841,1843],{"text":1459,"config":1818},{"href":1461,"dataGaName":1453,"dataGaLocation":1627},{"text":1464,"config":1820},{"href":1466,"dataGaName":1467,"dataGaLocation":1627},{"text":1472,"config":1822},{"href":1474,"dataGaName":1475,"dataGaLocation":1627},{"text":1477,"config":1824},{"href":1479,"dataGaName":1480,"dataGaLocation":1627},{"text":1482,"config":1826},{"href":1484,"dataGaName":1485,"dataGaLocation":1627},{"text":1828,"config":1829},"Développement durable",{"href":1830,"dataGaName":1831,"dataGaLocation":1627},"/sustainability/","Sustainability",{"text":1833,"config":1834},"Diversité, inclusion et appartenance (DIB)",{"href":1835,"dataGaName":1836,"dataGaLocation":1627},"/fr-fr/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1487,"config":1838},{"href":1489,"dataGaName":1490,"dataGaLocation":1627},{"text":1497,"config":1840},{"href":1499,"dataGaName":1500,"dataGaLocation":1627},{"text":1502,"config":1842},{"href":1504,"dataGaName":1505,"dataGaLocation":1627},{"text":1844,"config":1845},"Déclaration de transparence sur l'esclavage moderne",{"href":1846,"dataGaName":1847,"dataGaLocation":1627},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1849},[1850,1852,1854],{"text":1675,"config":1851},{"href":1677,"dataGaName":1678,"dataGaLocation":1627},{"text":1685,"config":1853},{"dataGaName":1687,"dataGaLocation":1627,"id":1688,"isOneTrustButton":858},{"text":1680,"config":1855},{"href":1682,"dataGaName":1683,"dataGaLocation":1627},[1857,1871],{"id":1858,"title":7,"body":1160,"config":1859,"content":1861,"description":1160,"extension":1865,"meta":1866,"navigation":858,"path":1867,"seo":1868,"stem":1869,"__hash__":1870},"blogAuthors/en-us/blog/authors/benjamin-skierlak.yml",{"template":1860},"BlogAuthor",{"name":7,"config":1862},{"headshot":1863,"ctfId":1864},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659471/Blog/Author%20Headshots/Benjamin_Skierlak_headshot.png","Kzp6pkUjPORYYMoeLFPRf","yml",{},"/en-us/blog/authors/benjamin-skierlak",{},"en-us/blog/authors/benjamin-skierlak","RbLU9KGFtah9Juo58JyxfHHYNIU4fyzzOUb5p7-fubo",{"id":1872,"title":8,"body":1160,"config":1873,"content":1874,"description":1160,"extension":1865,"meta":1878,"navigation":858,"path":1879,"seo":1880,"stem":1881,"__hash__":1882},"blogAuthors/en-us/blog/authors/james-wormwell.yml",{"template":1860},{"name":8,"config":1875},{"headshot":1876,"ctfId":1877},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659474/Blog/Author%20Headshots/james_wormwell_headshot.png","CPPijHb0Op5C5aVcvsOEf",{},"/en-us/blog/authors/james-wormwell",{},"en-us/blog/authors/james-wormwell","n6G4XENUWxgqOdCgfG0ECu0Uqj7qOS9zr3Rl8ouF49M",[1884,1893,1901],{"title":1885,"description":1886,"heroImage":1887,"category":1156,"date":1888,"authors":1889,"slug":1892,"externalUrl":1160},"Maîtrisez vos sièges GitLab avec l'accès restreint","Découvrez comment la fonctionnalité d'accès restreint de GitLab permet d'éviter les dépassements de sièges, s'intègre à votre fournisseur d'identité et garantit des coûts de licence prévisibles.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1774375772/kpaaaiqhokevxxeoxvu0.png","2026-07-15",[1890,1891],"Magdalena Frankiewicz","Priyanka Palanikumar","gitlab-restricted-access-improvements",{"title":1894,"description":1895,"heroImage":1896,"category":1156,"date":1897,"authors":1898,"slug":1900,"externalUrl":1160},"Feature flags de GitLab en Python : guide de démarrage","Découvrez comment intégrer les feature flags de GitLab dans une application Flask en Python avec le SDK Unleash pour contrôler le déploiement progressif de fonctionnalités sans redéployer votre application.","https://res.cloudinary.com/about-gitlab-com/image/upload/f_auto,q_auto,c_lfill/v1774465167/n5hlvrsrheadeccyr1oz.png","2026-06-01",[1899],"Omid Khan","getting-started-with-gitlab-feature-flags-in-python",{"title":1902,"description":1903,"heroImage":1904,"category":1156,"date":1905,"authors":1906,"slug":1908,"externalUrl":1160},"Suivez l'utilisation des composants CI dans votre organisation","Avec GitLab 19.0, visualisez comment vos composants CI partagés sont utilisés dans votre organisation, afin de pouvoir prendre les mesures qui s'imposent en fonction de vos observations.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1779189265/iqzyhhiwagxzwywvjzow.png","2026-05-22",[1907],"Corinne Dent","track-ci-component-usage",{"promotions":1910},[1911,1925,1936,1948],{"id":1912,"categories":1913,"header":1915,"text":1916,"button":1917,"image":1922},"ai-modernization",[1914],"ai","L'IA tient-elle ses promesses à grande échelle ?","Le questionnaire ne prendra pas plus de 5 minutes.",{"text":1918,"config":1919},"Obtenez votre score de maturité IA",{"href":1920,"dataGaName":1921,"dataGaLocation":1391},"/fr-fr/assessments/ai-modernization-assessment/","modernization assessment",{"config":1923},{"src":1924},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1926,"categories":1927,"header":1928,"text":1916,"button":1929,"image":1933},"devops-modernization",[1156,1724],"Vous contentez-vous de gérer des outils ou de livrer des innovations ?",{"text":1930,"config":1931},"Obtenez votre score de maturité DevOps",{"href":1932,"dataGaName":1921,"dataGaLocation":1391},"/fr-fr/assessments/devops-modernization-assessment/",{"config":1934},{"src":1935},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1937,"categories":1938,"header":1940,"text":1916,"button":1941,"image":1945},"security-modernization",[1939],"security","Faut-il sacrifier la rapidité pour garantir la sécurité ?",{"text":1942,"config":1943},"Obtenez votre score de maturité en matière de sécurité",{"href":1944,"dataGaName":1921,"dataGaLocation":1391},"/fr-fr/assessments/security-modernization-assessment/",{"config":1946},{"src":1947},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1949,"paths":1950,"header":1953,"text":1954,"button":1955,"image":1960},"github-azure-migration",[1951,1952],"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":1956,"config":1957},"Découvrez les différences entre GitLab et GitHub",{"href":1958,"dataGaName":1959,"dataGaLocation":1391},"/fr-fr/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1961},{"src":1935},{"header":1963,"blurb":1964,"button":1965,"secondaryButton":1969},"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":1186,"config":1966},{"href":1967,"dataGaName":1189,"dataGaLocation":1968},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/fr-fr/","feature",{"text":1514,"config":1970},{"href":1516,"dataGaName":1194,"dataGaLocation":1968},1786803746595]