[{"data":1,"prerenderedAt":2074},["ShallowReactive",2],{"/fr-fr/blog/getting-started-with-gitlab-feature-flags-in-python":3,"navigation-fr-fr":1299,"banner-fr-fr":1721,"footer-fr-fr":1730,"blog-post-authors-fr-fr-Omid Khan":1971,"blog-related-posts-fr-fr-getting-started-with-gitlab-feature-flags-in-python":1986,"blog-promotions-fr-fr":2012,"next-steps-fr-fr":2065},{"id":4,"title":5,"authors":6,"body":8,"category":1281,"date":1282,"description":1283,"extension":1284,"externalUrl":1285,"featured":1286,"heroImage":1287,"meta":1288,"navigation":704,"path":1289,"seo":1290,"slug":1293,"stem":1294,"tags":1295,"template":1297,"updatedDate":1285,"__hash__":1298},"blogPosts/fr-fr/blog/getting-started-with-gitlab-feature-flags-in-python.md","Feature flags de GitLab en Python : guide de démarrage",[7],"Omid Khan",{"type":9,"value":10,"toc":1259},"minimark",[11,15,18,28,31,36,60,64,73,81,84,88,91,99,104,118,170,174,182,186,205,231,246,252,256,259,295,298,302,309,325,328,338,342,345,364,367,372,379,395,402,408,411,445,450,493,516,519,593,599,603,610,615,712,715,720,744,750,755,758,844,859,866,871,877,914,917,921,934,940,950,954,969,972,982,991,995,998,1079,1083,1138,1142,1145,1149,1199,1203,1206,1215,1222,1226,1255],[12,13,14],"p",{},"Imaginez le scénario suivant : vous avez passé des semaines à développer une nouvelle fonctionnalité. Elle passe tous les tests, la revue de code est terminée, et elle est prête à être mise en production. Vous la déployez et, en moins d'une heure, votre boîte mail est inondée de rapports de bogues. La fonctionnalité fonctionne parfaitement pour la plupart des utilisateurs, mais un comportement du trafic de production que vous n'aviez pas anticipé provoque des erreurs pour une partie d'entre eux. Vous voilà maintenant à effectuer un retour à la version précédente en urgence, à rédiger des rapports d'incident et à gérer les retombées en termes de relations publiques.",[12,16,17],{},"Les feature flags permettent justement d'éviter ce genre de scénarios. Ils vous permettent de dissocier le déploiement de la release : vous effectuez un push de votre code en production dès qu'il est prêt, puis contrôlez qui voit réellement la nouvelle fonctionnalité en l'activant ou en la désactivant dans GitLab. Commencez par votre équipe QA à l'aide d'une stratégie par « identifiant utilisateur », passez ensuite à un « déploiement progressif à 10 % », puis basculez sur « tous les utilisateurs » lorsque vous êtes sûr de vous. Si quelque chose ne se déroule pas comme prévu à un moment donné, il vous suffit de désactiver la fonctionnalité en quelques secondes. Aucun redéploiement, aucun correctif d'urgence, aucun impact sur votre image.",[12,19,20,21,27],{},"Ce tutoriel vous guide à travers une application Flask fonctionnelle qui lit les feature flags de GitLab via le SDK Python Unleash. Une version complète et exécutable du code est disponible sur ",[22,23,26],"a",{"href":24,"rel":25},"https://gitlab.com/omid-blogs/gitlab-feature-flags-demo",[],"gitlab.com/omid-blogs/gitlab-feature-flags-demo",". Clonez-la dans votre propre groupe ou workspace pour disposer d'un contrôle en temps réel des feature flags en quelques minutes.",[12,29,30],{},"À la fin de ce tutoriel, vous comprendrez le fonctionnement de l'intégration et disposerez d'un template que vous pourrez ajouter directement à vos propres projets.",[32,33,35],"h2",{"id":34},"ce-dont-vous-aurez-besoin","Ce dont vous aurez besoin",[37,38,39,52],"ul",{},[40,41,42,43,47,48,51],"li",{},"Un projet GitLab (offre gratuite, GitLab Premium ou GitLab Ultimate) avec les feature flags activés. C'est ici que vous créerez et gérerez vos feature flags. Pour les activer, accédez à votre projet et naviguez vers ",[44,45,46],"strong",{},"Paramètres > Général > Visibilité, fonctionnalités du projet, autorisations",", puis vérifiez que l'option ",[44,49,50],{},"Feature flags"," est activée.",[40,53,54,55,59],{},"Le ",[22,56,58],{"href":24,"rel":57},[],"dépôt de démonstration"," dupliqué dans votre propre espace de nommage GitLab, puis cloné en local.",[32,61,63],{"id":62},"fonctionnement-des-feature-flags-gitlab-en-coulisses","Fonctionnement des feature flags GitLab en coulisses",[12,65,66,67,72],{},"GitLab expose une API compatible avec ",[22,68,71],{"href":69,"rel":70},"https://github.com/Unleash/unleash",[],"Unleash"," pour chaque projet. Cela signifie que n'importe quel SDK client Unleash (Go, Ruby, Python, JavaScript, et bien d'autres) peut se connecter directement à GitLab sans avoir besoin d'un serveur Unleash séparé.",[12,74,75,76,80],{},"Au démarrage, le SDK récupère toutes les définitions des feature flags, puis les actualise selon un intervalle configurable (15 secondes dans la démo). Chaque appel à ",[77,78,79],"code",{},"is_enabled()"," s'évalue localement à partir de la configuration mise en cache, sans appel réseau par vérification de feature flag. L'évaluation des feature flags est donc quasi instantanée et résiliente face aux problèmes réseau transitoires.",[12,82,83],{},"Voici les étapes à suivre pour intégrer les feature flags de GitLab dans une application Flask en Python à l'aide du SDK Unleash.",[32,85,87],{"id":86},"_1-configurer-votre-projet-gitlab-et-cloner-la-démo","1. Configurer votre projet GitLab et cloner la démo",[12,89,90],{},"Vous aurez besoin des éléments suivants :",[37,92,93,96],{},[40,94,95],{},"Votre propre projet GitLab pour héberger les feature flags",[40,97,98],{},"Le dépôt de démonstration cloné en local pour exécuter l'application",[100,101,103],"h3",{"id":102},"dupliquer-ou-cloner-le-dépôt-de-démonstration","Dupliquer ou cloner le dépôt de démonstration",[12,105,106,107,110,111,117],{},"Accédez à ",[22,108,26],{"href":24,"rel":109},[]," et dupliquez-le dans votre propre espace de nommage GitLab. Vous obtiendrez ainsi une copie personnelle du projet où vous pourrez gérer vos propres feature flags. Clonez-le ensuite en local et ouvrez-le dans votre ",[22,112,116],{"href":113,"rel":114,"title":115},"https://about.gitlab.com/fr-fr/blog/what-is-an-ide/",[],"Qu'est-ce qu'un IDE ?","IDE"," préféré :",[119,120,125],"pre",{"className":121,"code":122,"language":123,"meta":124,"style":124},"language-shell shiki shiki-themes github-light","git clone https://gitlab.com/\u003Cyour-namespace>/gitlab-feature-flags-demo.git\ncd gitlab-feature-flags-demo\n","shell","",[77,126,127,160],{"__ignoreMap":124},[128,129,132,136,140,143,147,150,154,157],"span",{"class":130,"line":131},"line",1,[128,133,135],{"class":134},"s7eDp","git",[128,137,139],{"class":138},"sYBdl"," clone",[128,141,142],{"class":138}," https://gitlab.com/",[128,144,146],{"class":145},"sD7c4","\u003C",[128,148,149],{"class":138},"your-namespac",[128,151,153],{"class":152},"sgsFI","e",[128,155,156],{"class":145},">",[128,158,159],{"class":138},"/gitlab-feature-flags-demo.git\n",[128,161,163,167],{"class":130,"line":162},2,[128,164,166],{"class":165},"sYu0t","cd",[128,168,169],{"class":138}," gitlab-feature-flags-demo\n",[100,171,173],{"id":172},"contenu-du-dépôt","Contenu du dépôt",[119,175,180],{"className":176,"code":178,"language":179},[177],"language-text",".\n├── app.py                # Flask app + Unleash SDK integration\n├── requirements.txt      # Python dependencies\n├── .env.example          # Template for required environment variables\n├── .gitignore\n├── templates/\n│   └── index.html        # Web UI template\n└── static/\n    └── styles.css        # Styling\n","text",[77,181,178],{"__ignoreMap":124},[32,183,185],{"id":184},"_2-créer-vos-feature-flags-dans-gitlab","2. Créer vos feature flags dans GitLab",[12,187,188,189,192,193,196,197,200,201,204],{},"Ouvrez votre propre projet GitLab et naviguez vers ",[44,190,191],{},"Déploiement > Feature flags",", puis cliquez sur ",[44,194,195],{},"Nouveau feature flag",". Créez les quatre feature flags suivants, en définissant le statut de chacun sur ",[44,198,199],{},"Actif"," avec une stratégie ",[44,202,203],{},"Tous les utilisateurs",".",[37,206,207,213,219,225],{},[40,208,209,212],{},[44,210,211],{},"dark_mode :"," bascule la page vers un thème de couleurs sombre.",[40,214,215,218],{},[44,216,217],{},"holiday_banner :"," affiche une bannière festive en haut de la page.",[40,220,221,224],{},[44,222,223],{},"new_layout :"," bascule la grille de cartes vers une disposition en une seule colonne.",[40,226,227,230],{},[44,228,229],{},"fun_fonts :"," remplace la police du corps de texte par un style manuscrit ludique.",[232,233,234,239],"figure",{},[235,236],"img",{"src":237,"alt":238},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1774466322/pifymwd6senqz3nzcyxa.png","Les quatre feature flags dans l'interface GitLab",[240,241,242],"figcaption",{},[243,244,245],"em",{},"Les quatre feature flags dans l'interface de GitLab",[12,247,248,251],{},[44,249,250],{},"Conseil :"," un feature flag doit être actif et disposer d'au moins une stratégie pour être considéré comme activé. Sans stratégie, le SDK considère le feature flag comme désactivé même s'il est marqué comme « Actif ».",[100,253,255],{"id":254},"comprendre-les-stratégies","Comprendre les stratégies",[12,257,258],{},"« Tous les utilisateurs » est un simple bouton d'activation et de désactivation, mais GitLab prend en charge plusieurs autres stratégies prêtes à l'emploi :",[37,260,261,271,277,283,289],{},[40,262,263,266,267,270],{},[44,264,265],{},"Pourcentage de déploiement"," ",[243,268,269],{},"(recommandé)"," : déploiement progressif vers un pourcentage d'utilisateurs, en fonction de l'identifiant de l'utilisateur, de l'identifiant de session ou de manière aléatoire. C'est l'option la plus flexible et celle à privilégier en premier.",[40,272,273,276],{},[44,274,275],{},"Pourcentage d'utilisateurs :"," activation pour un pourcentage d'utilisateurs authentifiés. Moins flexible que le déploiement progressif, car elle ne fonctionne qu'avec les utilisateurs connectés.",[40,278,279,282],{},[44,280,281],{},"ID utilisateurs :"," activation uniquement pour des identifiants utilisateurs spécifiques, idéale pour les tests internes avec un groupe nommé.",[40,284,285,288],{},[44,286,287],{},"Listes d'utilisateurs :"," activation pour une liste prédéfinie d'utilisateurs.",[40,290,291,294],{},[44,292,293],{},"Tous les utilisateurs :"," activation pour tout le monde.",[12,296,297],{},"Les stratégies font la force des feature flags. Commencez par votre équipe QA avec une stratégie basée sur les ID utilisateurs, passez à un déploiement progressif à 10 %, puis basculez sur tous les utilisateurs lorsque vous êtes sûr de vous. Tout est paramétrable depuis l'interface utilisateur de GitLab, sans aucune modification de code.",[32,299,301],{"id":300},"_3-obtenir-vos-identifiants-unleash","3. Obtenir vos identifiants Unleash",[12,303,304,305,308],{},"Sur la page Feature flags, cliquez sur ",[44,306,307],{},"Configurer"," dans le coin supérieur droit. Vous verrez deux valeurs :",[37,310,311,319],{},[40,312,313,266,316],{},[44,314,315],{},"URL de l'API :",[77,317,318],{},"https://gitlab.com/api/v4/feature_flags/unleash/\u003Cyour-project-id>",[40,320,321,324],{},[44,322,323],{},"Identifiant d'instance :"," un jeton unique associé à votre projet",[12,326,327],{},"Copiez ces deux valeurs. Vous les transmettrez à l'application en tant que variables d'environnement. Notez que l'identifiant d'instance est en lecture seule. Il ne peut que récupérer l'état des feature flags, sans rien modifier, mais traitez tout de même l'identifiant d'instance comme un secret afin d'éviter toute divulgation d'informations.",[232,329,330,334],{},[235,331],{"src":332,"alt":333},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1774466322/bxkn0xkpe4xude0es4zx.png","Le panneau Configurer affichant l'URL de l'API et votre identifiant d'instance",[240,335,336],{},[243,337,333],{},[32,339,341],{"id":340},"_4-configurer-le-projet-en-local","4. Configurer le projet en local",[12,343,344],{},"Le README contient le guide de configuration complet, mais en résumé :",[119,346,348],{"className":121,"code":347,"language":123,"meta":124,"style":124},"pip install -r requirements.txt\n",[77,349,350],{"__ignoreMap":124},[128,351,352,355,358,361],{"class":130,"line":131},[128,353,354],{"class":134},"pip",[128,356,357],{"class":138}," install",[128,359,360],{"class":165}," -r",[128,362,363],{"class":138}," requirements.txt\n",[12,365,366],{},"Définissez ensuite vos identifiants. Deux options s'offrent à vous :",[12,368,369],{},[44,370,371],{},"Option A : utiliser le fichier .env (recommandé)",[12,373,374,375,378],{},"Le dépôt inclut un fichier ",[77,376,377],{},".env.example",". Copiez-le et renseignez vos valeurs :",[119,380,382],{"className":121,"code":381,"language":123,"meta":124,"style":124},"cp .env.example .env\n",[77,383,384],{"__ignoreMap":124},[128,385,386,389,392],{"class":130,"line":131},[128,387,388],{"class":134},"cp",[128,390,391],{"class":138}," .env.example",[128,393,394],{"class":138}," .env\n",[12,396,397,398,401],{},"Ouvrez le fichier ",[77,399,400],{},".env"," dans votre éditeur et remplacez les valeurs par défaut par vos identifiants de l'étape 3 :",[119,403,406],{"className":404,"code":405,"language":179},[177],"UNLEASH_URL=https://gitlab.com/api/v4/feature_flags/unleash/\u003Cyour-project-id>\nUNLEASH_INSTANCE_ID=\u003Cyour-instance-id>\nUNLEASH_APP_NAME=production\n",[77,407,405],{"__ignoreMap":124},[12,409,410],{},"Ensuite, exportez-les :",[119,412,414],{"className":121,"code":413,"language":123,"meta":124,"style":124},"export $(grep -v '^#' .env | xargs)\n",[77,415,416],{"__ignoreMap":124},[128,417,418,421,424,427,430,433,436,439,442],{"class":130,"line":131},[128,419,420],{"class":145},"export",[128,422,423],{"class":152}," $(",[128,425,426],{"class":134},"grep",[128,428,429],{"class":165}," -v",[128,431,432],{"class":138}," '^#'",[128,434,435],{"class":138}," .env",[128,437,438],{"class":145}," |",[128,440,441],{"class":134}," xargs",[128,443,444],{"class":152},")\n",[12,446,447],{},[44,448,449],{},"Option B : exporter directement dans votre terminal",[119,451,453],{"className":121,"code":452,"language":123,"meta":124,"style":124},"export UNLEASH_URL=\"https://gitlab.com/api/v4/feature_flags/unleash/\u003Cyour-project-id>\"\nexport UNLEASH_INSTANCE_ID=\"\u003Cyour-instance-id>\"\nexport UNLEASH_APP_NAME=\"production\"\n",[77,454,455,468,480],{"__ignoreMap":124},[128,456,457,459,462,465],{"class":130,"line":131},[128,458,420],{"class":145},[128,460,461],{"class":152}," UNLEASH_URL",[128,463,464],{"class":145},"=",[128,466,467],{"class":138},"\"https://gitlab.com/api/v4/feature_flags/unleash/\u003Cyour-project-id>\"\n",[128,469,470,472,475,477],{"class":130,"line":162},[128,471,420],{"class":145},[128,473,474],{"class":152}," UNLEASH_INSTANCE_ID",[128,476,464],{"class":145},[128,478,479],{"class":138},"\"\u003Cyour-instance-id>\"\n",[128,481,483,485,488,490],{"class":130,"line":482},3,[128,484,420],{"class":145},[128,486,487],{"class":152}," UNLEASH_APP_NAME",[128,489,464],{"class":145},[128,491,492],{"class":138},"\"production\"\n",[12,494,495,496,498,499,505,506,509,510,204],{},"N'effectuez jamais un commit de votre fichier ",[77,497,400],{}," dans le ",[22,500,504],{"href":501,"rel":502,"title":503},"https://about.gitlab.com/fr-fr/topics/version-control/",[],"Qu'est-ce que le contrôle de version ?","contrôle de version",". Le ",[77,507,508],{},".gitignore"," du dépôt l'exclut déjà, mais il est utile de savoir pourquoi : votre identifiant d'instance est un secret et ne doit pas figurer dans l'historique ",[22,511,515],{"href":512,"rel":513,"title":514},"https://about.gitlab.com/fr-fr/blog/what-is-git/",[],"Qu'est-ce que Git ?","Git",[12,517,518],{},"Trois variables d'environnement pilotent l'ensemble de l'intégration :",[520,521,522,541],"table",{},[523,524,525],"thead",{},[526,527,528,532,535,538],"tr",{},[529,530,531],"th",{},"Variable",[529,533,534],{},"Requise",[529,536,537],{},"Description",[529,539,540],{},"Valeur par défaut",[542,543,544,561,575],"tbody",{},[526,545,546,552,555,558],{},[547,548,549],"td",{},[77,550,551],{},"UNLEASH_URL",[547,553,554],{},"Oui",[547,556,557],{},"URL de l'API Unleash GitLab pour votre projet",[547,559,560],{},"—",[526,562,563,568,570,573],{},[547,564,565],{},[77,566,567],{},"UNLEASH_INSTANCE_ID",[547,569,554],{},[547,571,572],{},"Identifiant d'instance du panneau Configurer",[547,574,560],{},[526,576,577,582,585,588],{},[547,578,579],{},[77,580,581],{},"UNLEASH_APP_NAME",[547,583,584],{},"Non",[547,586,587],{},"Nom de l'environnement, correspond aux stratégies de feature flags",[547,589,590],{},[77,591,592],{},"production",[12,594,595,598],{},[77,596,597],{},"UnleashClient"," est la dépendance clé. Il s'agit du SDK Python officiel d'Unleash qui gère l'interrogation périodique, la mise en cache et l'évaluation locale des feature flags afin que vous n'ayez pas à développer tout cela vous-même.",[32,600,602],{"id":601},"_5-comprendre-lapplication","5. Comprendre l'application",[12,604,605,606,609],{},"Avant de l'exécuter, parcourez ",[77,607,608],{},"app.py",". Voici les modèles clés à comprendre pour les reproduire dans vos propres projets.",[12,611,612],{},[44,613,614],{},"Initialisation du SDK",[119,616,620],{"className":617,"code":618,"language":619,"meta":124,"style":124},"language-py shiki shiki-themes github-light","unleash_client = UnleashClient(\n    url=UNLEASH_URL,\n    app_name=UNLEASH_APP_NAME,\n    instance_id=UNLEASH_INSTANCE_ID,\n    refresh_interval=15,\n    metrics_interval=60,\n)\n\nunleash_client.initialize_client()\n","py",[77,621,622,632,645,656,668,681,694,699,706],{"__ignoreMap":124},[128,623,624,627,629],{"class":130,"line":131},[128,625,626],{"class":152},"unleash_client ",[128,628,464],{"class":145},[128,630,631],{"class":152}," UnleashClient(\n",[128,633,634,638,640,642],{"class":130,"line":162},[128,635,637],{"class":636},"sqxcx","    url",[128,639,464],{"class":145},[128,641,551],{"class":165},[128,643,644],{"class":152},",\n",[128,646,647,650,652,654],{"class":130,"line":482},[128,648,649],{"class":636},"    app_name",[128,651,464],{"class":145},[128,653,581],{"class":165},[128,655,644],{"class":152},[128,657,659,662,664,666],{"class":130,"line":658},4,[128,660,661],{"class":636},"    instance_id",[128,663,464],{"class":145},[128,665,567],{"class":165},[128,667,644],{"class":152},[128,669,671,674,676,679],{"class":130,"line":670},5,[128,672,673],{"class":636},"    refresh_interval",[128,675,464],{"class":145},[128,677,678],{"class":165},"15",[128,680,644],{"class":152},[128,682,684,687,689,692],{"class":130,"line":683},6,[128,685,686],{"class":636},"    metrics_interval",[128,688,464],{"class":145},[128,690,691],{"class":165},"60",[128,693,644],{"class":152},[128,695,697],{"class":130,"line":696},7,[128,698,444],{"class":152},[128,700,702],{"class":130,"line":701},8,[128,703,705],{"emptyLinePlaceholder":704},true,"\n",[128,707,709],{"class":130,"line":708},9,[128,710,711],{"class":152},"unleash_client.initialize_client()\n",[12,713,714],{},"Aucun jeton d'accès personnel, aucune information d'identification codée en dur dans le code source. L'application se ferme immédiatement avec un message d'erreur clair si l'une des deux variables requises est manquante.",[12,716,717],{},[44,718,719],{},"Vérification d'un feature flag",[119,721,723],{"className":617,"code":722,"language":619,"meta":124,"style":124},"def is_flag_enabled(flag_name):\n    return unleash_client.is_enabled(flag_name)\n",[77,724,725,736],{"__ignoreMap":124},[128,726,727,730,733],{"class":130,"line":131},[128,728,729],{"class":145},"def",[128,731,732],{"class":134}," is_flag_enabled",[128,734,735],{"class":152},"(flag_name):\n",[128,737,738,741],{"class":130,"line":162},[128,739,740],{"class":145},"    return",[128,742,743],{"class":152}," unleash_client.is_enabled(flag_name)\n",[12,745,746,747,749],{},"Étant donné que le SDK met en cache les définitions des feature flags en mémoire, ",[77,748,79],{}," renvoie un résultat instantanément, sans aller-retour réseau.",[12,751,752],{},[44,753,754],{},"Contrôler le comportement réel derrière les feature flags",[12,756,757],{},"La route index construit un dictionnaire de fonctionnalités, évalue chaque feature flag et transmet les résultats au template :",[119,759,761],{"className":617,"code":760,"language":619,"meta":124,"style":124},"features = {}\nfor flag_name, config in feature_configs.items():\n    features[flag_name] = {\n        **config,\n        'enabled': is_flag_enabled(flag_name)\n    }\n\nreturn render_template('index.html', features=features)\n",[77,762,763,773,787,797,805,813,818,822],{"__ignoreMap":124},[128,764,765,768,770],{"class":130,"line":131},[128,766,767],{"class":152},"features ",[128,769,464],{"class":145},[128,771,772],{"class":152}," {}\n",[128,774,775,778,781,784],{"class":130,"line":162},[128,776,777],{"class":145},"for",[128,779,780],{"class":152}," flag_name, config ",[128,782,783],{"class":145},"in",[128,785,786],{"class":152}," feature_configs.items():\n",[128,788,789,792,794],{"class":130,"line":482},[128,790,791],{"class":152},"    features[flag_name] ",[128,793,464],{"class":145},[128,795,796],{"class":152}," {\n",[128,798,799,802],{"class":130,"line":658},[128,800,801],{"class":145},"        **",[128,803,804],{"class":152},"config,\n",[128,806,807,810],{"class":130,"line":670},[128,808,809],{"class":138},"        'enabled'",[128,811,812],{"class":152},": is_flag_enabled(flag_name)\n",[128,814,815],{"class":130,"line":683},[128,816,817],{"class":152},"    }\n",[128,819,820],{"class":130,"line":696},[128,821,705],{"emptyLinePlaceholder":704},[128,823,824,827,830,833,836,839,841],{"class":130,"line":701},[128,825,826],{"class":145},"return",[128,828,829],{"class":152}," render_template(",[128,831,832],{"class":138},"'index.html'",[128,834,835],{"class":152},", ",[128,837,838],{"class":636},"features",[128,840,464],{"class":145},[128,842,843],{"class":152},"features)\n",[12,845,846,847,850,851,854,855,858],{},"Le template utilise ces valeurs pour appliquer conditionnellement des classes CSS et afficher des éléments d'interface. ",[77,848,849],{},"dark_mode"," bascule une classe sur le corps, ",[77,852,853],{},"holiday_banner"," affiche ou masque entièrement un élément de bannière. Ouvrez ",[77,856,857],{},"templates/index.html"," pour voir comment le tout est connecté.",[12,860,861,862,865],{},"Veuillez noter que ",[77,863,864],{},"index.html"," se rafraîchit également automatiquement toutes les 30 secondes via un petit extrait JavaScript, ce qui vous permet d'observer les changements de feature flags sans recharger manuellement la page.",[12,867,868],{},[44,869,870],{},"Transmettre le contexte utilisateur pour les stratégies ciblées",[12,872,873,874,876],{},"Lorsque vous souhaitez aller au-delà de la stratégie Tous les utilisateurs et utiliser des déploiements progressifs ou le ciblage par utilisateur, transmettez un objet de contexte à ",[77,875,79],{}," :",[119,878,880],{"className":617,"code":879,"language":619,"meta":124,"style":124},"unleash_client.is_enabled(\n    'new_layout',\n    context={'userId': current_user.id}\n)\n",[77,881,882,887,894,910],{"__ignoreMap":124},[128,883,884],{"class":130,"line":131},[128,885,886],{"class":152},"unleash_client.is_enabled(\n",[128,888,889,892],{"class":130,"line":162},[128,890,891],{"class":138},"    'new_layout'",[128,893,644],{"class":152},[128,895,896,899,901,904,907],{"class":130,"line":482},[128,897,898],{"class":636},"    context",[128,900,464],{"class":145},[128,902,903],{"class":152},"{",[128,905,906],{"class":138},"'userId'",[128,908,909],{"class":152},": current_user.id}\n",[128,911,912],{"class":130,"line":658},[128,913,444],{"class":152},[12,915,916],{},"Le SDK gère automatiquement le hachage cohérent pour les déploiements progressifs, sans calcul requis de votre côté.",[32,918,920],{"id":919},"_6-exécuter-lapplication","6. Exécuter l'application",[119,922,924],{"className":121,"code":923,"language":123,"meta":124,"style":124},"python3 app.py\n",[77,925,926],{"__ignoreMap":124},[128,927,928,931],{"class":130,"line":131},[128,929,930],{"class":134},"python3",[128,932,933],{"class":138}," app.py\n",[12,935,106,936,939],{},[77,937,938],{},"http://localhost:8080",". Vous devriez voir les quatre cartes de fonctionnalités affichant leur état actuel (activé/désactivé).",[232,941,942,946],{},[235,943],{"src":944,"alt":945},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1774466322/bjc0rp7h43wetefny8cw.png","Application de démonstration avec les quatre feature flags désactivés",[240,947,948],{},[243,949,945],{},[32,951,953],{"id":952},"_7-activer-les-feature-flags-en-temps-réel","7. Activer les feature flags en temps réel",[12,955,956,957,959,960,962,963,965,966,968],{},"Retournez dans ",[44,958,191],{}," dans GitLab et activez l'un des feature flags. Essayez ",[77,961,849],{}," ou ",[77,964,853],{}," pour tester l'effet le plus visible. Attendez environ 15 secondes, puis rechargez la page. La carte se met à jour pour refléter le nouvel état, et si vous avez activé ",[77,967,849],{},", l'ensemble de la page passe en thème sombre. Désactivez la fonctionnalité, attendez, rechargez, et tout revient instantanément à son état initial.",[12,970,971],{},"C'est le principal atout des feature flags : vous contrôlez le comportement de l'application depuis GitLab sans toucher au code ni effectuer de redéploiement.",[232,973,974,978],{},[235,975],{"src":976,"alt":977},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1774466321/kfbvvazflpta4pt8vtoj.png","Application de démonstration avec deux feature flags désactivés",[240,979,980],{},[243,981,977],{},[232,983,984,987],{},[235,985],{"src":986,"alt":977},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1774466321/rslzfdcpronixcfokfbk.png",[240,988,989],{},[243,990,977],{},[32,992,994],{"id":993},"pourquoi-utiliser-le-sdk-unleash-plutôt-que-lapi-rest-de-gitlab","Pourquoi utiliser le SDK Unleash plutôt que l'API REST de GitLab ?",[12,996,997],{},"Pour une application qui évalue les feature flags à chaque requête, le SDK est le choix évident. Il est plus rapide, plus simple, et l'identifiant d'instance qu'il utilise ne dispose d'aucune autorisation au-delà de la lecture de l'état des feature flags. La surface d'exposition est bien plus réduite qu'avec un jeton d'accès personnel.",[520,999,1000,1012],{},[523,1001,1002],{},[526,1003,1004,1006,1009],{},[529,1005],{},[529,1007,1008],{},"API REST",[529,1010,1011],{},"SDK Unleash",[542,1013,1014,1027,1040,1053,1066],{},[526,1015,1016,1021,1024],{},[547,1017,1018],{},[44,1019,1020],{},"Authentification",[547,1022,1023],{},"Nécessite un jeton d'accès personnel avec des autorisations étendues dans le projet",[547,1025,1026],{},"Utilise uniquement l'identifiant d'instance, en lecture seule, limité à l'état des feature flags, aucun jeton d'accès personnel requis",[526,1028,1029,1034,1037],{},[547,1030,1031],{},[44,1032,1033],{},"Évaluation des feature flags",[547,1035,1036],{},"Appel réseau par vérification",[547,1038,1039],{},"Évaluation locale à partir de la configuration en cache",[526,1041,1042,1047,1050],{},[547,1043,1044],{},[44,1045,1046],{},"Latence par vérification",[547,1048,1049],{},"Aller-retour réseau",[547,1051,1052],{},"Quasi nulle (en mémoire)",[526,1054,1055,1060,1063],{},[547,1056,1057],{},[44,1058,1059],{},"Prise en charge des stratégies",[547,1061,1062],{},"Analyse syntaxique manuelle requise",[547,1064,1065],{},"Prise en charge intégrée des déploiements progressifs et du ciblage par identifiant d'utilisateur",[526,1067,1068,1073,1076],{},[547,1069,1070],{},[44,1071,1072],{},"Limites de débit",[547,1074,1075],{},"Limites de débit de l'API GitLab.com",[547,1077,1078],{},"Connexion d'interrogation unique par instance d'application",[32,1080,1082],{"id":1081},"dépannage","Dépannage",[520,1084,1085,1095],{},[523,1086,1087],{},[526,1088,1089,1092],{},[529,1090,1091],{},"Problème",[529,1093,1094],{},"Solution",[542,1096,1097,1110,1118,1126],{},[526,1098,1099,1105],{},[547,1100,1101,1102],{},"L'application se ferme avec ",[77,1103,1104],{},"ERROR: UNLEASH_URL and UNLEASH_INSTANCE_ID...",[547,1106,1107,1108,204],{},"Définissez les deux variables d'environnement. Consultez ",[77,1109,377],{},[526,1111,1112,1115],{},[547,1113,1114],{},"Tous les feature flags apparaissent comme désactivés",[547,1116,1117],{},"Vérifiez que les feature flags existent dans GitLab et disposent d'une stratégie active. Attendez ensuite 15 secondes que le SDK se rafraîchisse.",[526,1119,1120,1123],{},[547,1121,1122],{},"Les modifications dans GitLab n'apparaissent pas",[547,1124,1125],{},"Le SDK interroge le serveur toutes les 15 secondes. Rechargez la page après un court instant.",[526,1127,1128,1131],{},[547,1129,1130],{},"Une adresse IP locale ne fonctionne pas",[547,1132,1133,1134,1137],{},"Le pare-feu de votre système d'exploitation bloque peut-être le port 8080. Utilisez ",[77,1135,1136],{},"localhost:8080"," à la place.",[32,1139,1141],{"id":1140},"note-sur-les-limites-de-débit-en-production","Note sur les limites de débit en production",[12,1143,1144],{},"L'intervalle d'interrogation de 15 secondes convient parfaitement au développement et aux petits déploiements. Lorsque tous les clients interrogent depuis la même adresse IP, GitLab.com peut prendre en charge environ 125 clients à un intervalle de 15 secondes avant d'atteindre les limites de débit. Si vous développez une application de production à plus grande échelle, envisagez de placer un proxy Unleash en amont de vos clients. Ce dernier regroupe les requêtes vers GitLab pour l'ensemble de vos instances et réduit considérablement le trafic en amont.",[32,1146,1148],{"id":1147},"considérations-de-sécurité","Considérations de sécurité",[1150,1151,1152,1161,1184,1193],"ol",{},[40,1153,1154,1160],{},[44,1155,1156,1159],{},[77,1157,1158],{},"debug=False"," est déjà défini dans la démo :"," conservez ce paramètre. Le mode de débogage de Flask expose un débogueur interactif qui permet l'exécution de code à distance.",[40,1162,1163,1166,1167,1170,1171,1176,1177,1183],{},[44,1164,1165],{},"Maintenez vos dépendances à jour :"," le fichier ",[77,1168,1169],{},"requirements.txt"," fixe des versions spécifiques. Activez l'",[22,1172,1175],{"href":1173,"rel":1174},"https://docs.gitlab.com/user/application_security/dependency_scanning/",[],"analyse des dépendances"," de GitLab dans votre ",[22,1178,1182],{"href":1179,"rel":1180,"title":1181},"https://about.gitlab.com/fr-fr/topics/ci-cd/cicd-pipeline/",[],"Qu'est-ce qu'un pipeline CI/CD ?","pipeline CI/CD"," pour surveiller les vulnérabilités.",[40,1185,1186,1189,1190,1192],{},[44,1187,1188],{},"Utilisez des variables d'environnement pour les identifiants :"," ne codez jamais en dur l'identifiant d'instance ni aucun jeton dans le code source. Le fichier ",[77,1191,377],{}," de la démo illustre cette bonne pratique.",[40,1194,1195,1198],{},[44,1196,1197],{},"L'identifiant d'instance est en lecture seule :"," il peut uniquement récupérer l'état des feature flags, sans le modifier. Traitez-le néanmoins comme un secret.",[32,1200,1202],{"id":1201},"synthèse","Synthèse",[12,1204,1205],{},"Ce tutoriel a couvert le cycle complet d'intégration des feature flags de GitLab dans une application Python : création des feature flags avec les bonnes stratégies, récupération des identifiants Unleash, initialisation du SDK, évaluation locale des feature flags dans Flask et activation du comportement en temps réel sans redéploiement.",[12,1207,1208,1209,1211,1212,1214],{},"L'ensemble de l'intégration nécessite une seule dépendance (",[77,1210,597],{},"), trois variables d'environnement et un unique appel de méthode (",[77,1213,79],{},"). Aucun serveur Unleash séparé, aucun jeton d'accès personnel, aucune infrastructure complexe.",[12,1216,1217,1218,1221],{},"Les feature flags comptent parmi les outils les plus pratiques pour réduire les risques liés au déploiement. La possibilité de désactiver instantanément une fonctionnalité en échec, ou de la déployer progressivement d'un groupe d'utilisateurs ciblé à un pourcentage puis à l'ensemble des utilisateurs, sans toucher au pipeline de déploiement, offre une valeur considérable avec une configuration minimale. Le ",[22,1219,58],{"href":24,"rel":1220},[]," fournit une base fonctionnelle à dupliquer et adapter pour n'importe quel projet.",[32,1223,1225],{"id":1224},"ressources","Ressources",[37,1227,1228,1234,1241,1248],{},[40,1229,1230],{},[22,1231,1233],{"href":24,"rel":1232},[],"Projet de démonstration sur GitLab",[40,1235,1236],{},[22,1237,1240],{"href":1238,"rel":1239},"https://docs.gitlab.com/operations/feature_flags/",[],"Documentation sur les feature flags de GitLab",[40,1242,1243],{},[22,1244,1247],{"href":1245,"rel":1246},"https://github.com/Unleash/unleash-python-sdk",[],"SDK Python Unleash sur GitHub",[40,1249,1250],{},[22,1251,1254],{"href":1252,"rel":1253},"https://github.com/Unleash/unleash#unleash-sdks",[],"SDK Unleash (tous les langages)",[1256,1257,1258],"style",{},"html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sqxcx, html code.shiki .sqxcx{--shiki-default:#E36209}",{"title":124,"searchDepth":162,"depth":162,"links":1260},[1261,1262,1263,1267,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280],{"id":34,"depth":162,"text":35},{"id":62,"depth":162,"text":63},{"id":86,"depth":162,"text":87,"children":1264},[1265,1266],{"id":102,"depth":482,"text":103},{"id":172,"depth":482,"text":173},{"id":184,"depth":162,"text":185,"children":1268},[1269],{"id":254,"depth":482,"text":255},{"id":300,"depth":162,"text":301},{"id":340,"depth":162,"text":341},{"id":601,"depth":162,"text":602},{"id":919,"depth":162,"text":920},{"id":952,"depth":162,"text":953},{"id":993,"depth":162,"text":994},{"id":1081,"depth":162,"text":1082},{"id":1140,"depth":162,"text":1141},{"id":1147,"depth":162,"text":1148},{"id":1201,"depth":162,"text":1202},{"id":1224,"depth":162,"text":1225},"product","2026-06-01","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.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/f_auto,q_auto,c_lfill/v1774465167/n5hlvrsrheadeccyr1oz.png",{},"/fr-fr/blog/getting-started-with-gitlab-feature-flags-in-python",{"config":1291,"title":5,"description":1292},{"noIndex":1286},"Intégrez les feature flags de GitLab dans une application Flask en Python avec le SDK Unleash.","getting-started-with-gitlab-feature-flags-in-python","fr-fr/blog/getting-started-with-gitlab-feature-flags-in-python",[838,1296,1281],"tutorial","BlogPost","tm_XrohOvgTgEUOz6IA9hhRJEcRW0-x9nrtI8iMptu8",{"logo":1300,"freeTrial":1305,"sales":1310,"login":1315,"items":1320,"search":1636,"minimal":1672,"duo":1691,"switchNav":1700,"pricingDeployment":1711},{"config":1301},{"href":1302,"dataGaName":1303,"dataGaLocation":1304},"/fr-fr/","gitlab logo","header",{"text":1306,"config":1307},"Commencer un essai gratuit",{"href":1308,"dataGaName":1309,"dataGaLocation":1304},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr&glm_content=default-saas-trial/","free trial",{"text":1311,"config":1312},"Contacter l’équipe commerciale",{"href":1313,"dataGaName":1314,"dataGaLocation":1304},"/fr-fr/sales/","sales",{"text":1316,"config":1317},"Connexion",{"href":1318,"dataGaName":1319,"dataGaLocation":1304},"https://gitlab.com/users/sign_in/","sign in",[1321,1350,1452,1457,1560,1616],{"text":1322,"config":1323,"menu":1325},"Plateforme",{"dataNavLevelOne":1324},"platform",{"type":1326,"columns":1327},"cards",[1328,1334,1342],{"title":1322,"description":1329,"link":1330},"La plateforme d’orchestration intelligente pour le DevSecOps",{"text":1331,"config":1332},"Explorer notre plateforme",{"href":1333,"dataGaName":1324,"dataGaLocation":1304},"/fr-fr/platform/",{"title":1335,"description":1336,"link":1337},"GitLab Duo Agent Platform","L’IA agentique pour l’ensemble du cycle de développement logiciel",{"text":1338,"config":1339},"Découvrir GitLab Duo",{"href":1340,"dataGaName":1341,"dataGaLocation":1304},"/fr-fr/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1343,"description":1344,"link":1345},"Pourquoi GitLab ?","Découvrez les principales raisons pour lesquelles les entreprises choisissent GitLab",{"text":1346,"config":1347},"En savoir plus",{"href":1348,"dataGaName":1349,"dataGaLocation":1304},"/fr-fr/why-gitlab/","why gitlab",{"text":1351,"left":704,"config":1352,"menu":1354},"Produit",{"dataNavLevelOne":1353},"solutions",{"type":1355,"link":1356,"columns":1360,"feature":1431},"lists",{"text":1357,"config":1358},"Voir toutes les solutions",{"href":1359,"dataGaName":1353,"dataGaLocation":1304},"/fr-fr/solutions/",[1361,1386,1409],{"title":1362,"description":1363,"link":1364,"items":1369},"Automatisation","CI/CD et automatisation pour accélérer le déploiement",{"config":1365},{"icon":1366,"href":1367,"dataGaName":1368,"dataGaLocation":1304},"AutomatedCodeAlt","/fr-fr/solutions/delivery-automation/","automated software delivery",[1370,1374,1377,1382],{"text":1371,"config":1372},"CI/CD",{"href":1373,"dataGaLocation":1304,"dataGaName":1371},"/fr-fr/solutions/continuous-integration/",{"text":1335,"config":1375},{"href":1340,"dataGaLocation":1304,"dataGaName":1376},"gitlab duo agent platform - product menu",{"text":1378,"config":1379},"Gestion du code source",{"href":1380,"dataGaLocation":1304,"dataGaName":1381},"/fr-fr/solutions/source-code-management/","Source Code Management",{"text":1383,"config":1384},"Livraison de logiciels automatisée",{"href":1367,"dataGaLocation":1304,"dataGaName":1385},"Automated software delivery",{"title":1387,"description":1388,"link":1389,"items":1394},"Sécurité","Livrez du code plus rapidement sans compromettre la sécurité",{"config":1390},{"href":1391,"dataGaName":1392,"dataGaLocation":1304,"icon":1393},"/fr-fr/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1395,1399,1404],{"text":1396,"config":1397},"Tests de sécurité des applications",{"href":1391,"dataGaName":1398,"dataGaLocation":1304},"Application security testing",{"text":1400,"config":1401},"Sécurité de la chaîne d’approvisionnement logicielle",{"href":1402,"dataGaLocation":1304,"dataGaName":1403},"/fr-fr/solutions/supply-chain/","Software supply chain security",{"text":1405,"config":1406},"Conformité logicielle",{"href":1407,"dataGaName":1408,"dataGaLocation":1304},"/fr-fr/solutions/software-compliance/","software compliance",{"title":1410,"link":1411,"items":1416},"Mesures",{"config":1412},{"icon":1413,"href":1414,"dataGaName":1415,"dataGaLocation":1304},"DigitalTransformation","/fr-fr/solutions/visibility-measurement/","visibility and measurement",[1417,1421,1426],{"text":1418,"config":1419},"Visibilité et mesures",{"href":1414,"dataGaLocation":1304,"dataGaName":1420},"Visibility and Measurement",{"text":1422,"config":1423},"Gestion de la chaîne de valeur",{"href":1424,"dataGaLocation":1304,"dataGaName":1425},"/fr-fr/solutions/value-stream-management/","Value Stream Management",{"text":1427,"config":1428},"Analyses et informations",{"href":1429,"dataGaLocation":1304,"dataGaName":1430},"/fr-fr/solutions/analytics-and-insights/","Analytics and insights",{"title":1432,"type":1355,"items":1433},"GitLab",[1434,1440,1446],{"text":1435,"config":1436},"Pour les entreprises",{"icon":1437,"href":1438,"dataGaLocation":1304,"dataGaName":1439},"Building","/fr-fr/enterprise/","enterprise",{"text":1441,"config":1442},"Pour les PME",{"icon":1443,"href":1444,"dataGaLocation":1304,"dataGaName":1445},"Work","/fr-fr/small-business/","small business",{"text":1447,"config":1448},"Pour le secteur public",{"icon":1449,"href":1450,"dataGaLocation":1304,"dataGaName":1451},"Organization","/fr-fr/solutions/public-sector/","public sector",{"text":1453,"config":1454},"Tarifs",{"href":1455,"dataGaName":1456,"dataGaLocation":1304,"dataNavLevelOne":1456},"/fr-fr/pricing/","pricing",{"text":1225,"config":1458,"menu":1460},{"dataNavLevelOne":1459},"resources",{"type":1355,"link":1461,"columns":1465,"feature":1549},{"text":1462,"config":1463},"Afficher toutes les ressources",{"href":1464,"dataGaName":1459,"dataGaLocation":1304},"/fr-fr/resources/",[1466,1499,1521],{"title":1467,"items":1468},"Premiers pas",[1469,1474,1479,1484,1489,1494],{"text":1470,"config":1471},"Installation",{"href":1472,"dataGaName":1473,"dataGaLocation":1304},"/fr-fr/install/","install",{"text":1475,"config":1476},"Guides de démarrage",{"href":1477,"dataGaName":1478,"dataGaLocation":1304},"/fr-fr/get-started/","quick setup checklists",{"text":1480,"config":1481},"Apprentissage",{"href":1482,"dataGaLocation":1304,"dataGaName":1483},"https://university.gitlab.com/","learn",{"text":1485,"config":1486},"Documentation",{"href":1487,"dataGaName":1488,"dataGaLocation":1304},"https://docs.gitlab.com/","product documentation",{"text":1490,"config":1491},"Vidéos sur les bonnes pratiques",{"href":1492,"dataGaName":1493,"dataGaLocation":1304},"/fr-fr/getting-started-videos/","best practice videos",{"text":1495,"config":1496},"Intégrations",{"href":1497,"dataGaName":1498,"dataGaLocation":1304},"/fr-fr/integrations/","integrations",{"title":1500,"items":1501},"Découvrir",[1502,1507,1512,1516],{"text":1503,"config":1504},"Témoignages clients",{"href":1505,"dataGaName":1506,"dataGaLocation":1304},"/fr-fr/customers/","customer success stories",{"text":1508,"config":1509},"Blog",{"href":1510,"dataGaName":1511,"dataGaLocation":1304},"/fr-fr/blog/","blog",{"text":1513,"config":1514},"The Source",{"href":1515,"dataGaName":1511,"dataGaLocation":1304},"/fr-fr/the-source/",{"text":1517,"config":1518},"Travail à distance",{"href":1519,"dataGaName":1520,"dataGaLocation":1304},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1522,"items":1523},"Connecter",[1524,1529,1534,1539,1544],{"text":1525,"config":1526},"Services GitLab",{"href":1527,"dataGaName":1528,"dataGaLocation":1304},"/fr-fr/services/","services",{"text":1530,"config":1531},"Communauté",{"href":1532,"dataGaName":1533,"dataGaLocation":1304},"/community/","community",{"text":1535,"config":1536},"Forum",{"href":1537,"dataGaName":1538,"dataGaLocation":1304},"https://forum.gitlab.com/","forum",{"text":1540,"config":1541},"Événements",{"href":1542,"dataGaName":1543,"dataGaLocation":1304},"/events/","events",{"text":1545,"config":1546},"Partenaires",{"href":1547,"dataGaName":1548,"dataGaLocation":1304},"/fr-fr/partners/","partners",{"config":1550,"title":1553,"text":1554,"link":1555},{"background":1551,"textColor":1552},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","Nouveautés de GitLab","Restez informé des dernières fonctionnalités et améliorations.",{"text":1556,"config":1557},"Lire les articles les plus récents",{"href":1558,"dataGaName":1559,"dataGaLocation":1304},"/fr-fr/whats-new/","whats new",{"text":1561,"config":1562,"menu":1564},"Société",{"dataNavLevelOne":1563},"company",{"type":1355,"columns":1565},[1566],{"items":1567},[1568,1573,1579,1581,1586,1591,1596,1601,1606,1611],{"text":1569,"config":1570},"À propos",{"href":1571,"dataGaName":1572,"dataGaLocation":1304},"/fr-fr/company/","about",{"text":1574,"config":1575,"footerGa":1578},"Carrières",{"href":1576,"dataGaName":1577,"dataGaLocation":1304},"/jobs/","jobs",{"dataGaName":1577},{"text":1540,"config":1580},{"href":1542,"dataGaName":1543,"dataGaLocation":1304},{"text":1582,"config":1583},"Leadership",{"href":1584,"dataGaName":1585,"dataGaLocation":1304},"/company/team/e-group/","leadership",{"text":1587,"config":1588},"Manuel",{"href":1589,"dataGaName":1590,"dataGaLocation":1304},"https://handbook.gitlab.com/","handbook",{"text":1592,"config":1593},"Relations avec les investisseurs",{"href":1594,"dataGaName":1595,"dataGaLocation":1304},"https://ir.gitlab.com/","investor relations",{"text":1597,"config":1598},"Trust Center",{"href":1599,"dataGaName":1600,"dataGaLocation":1304},"/fr-fr/security/","trust center",{"text":1602,"config":1603},"Centre pour la transparence de l’IA",{"href":1604,"dataGaName":1605,"dataGaLocation":1304},"/fr-fr/ai-transparency-center/","ai transparency center",{"text":1607,"config":1608},"Newsletter",{"href":1609,"dataGaName":1610,"dataGaLocation":1304},"/company/contact/#contact-forms","newsletter",{"text":1612,"config":1613},"Presse",{"href":1614,"dataGaName":1615,"dataGaLocation":1304},"/press/","press",{"text":1617,"config":1618,"menu":1619},"Nous contacter",{"dataNavLevelOne":1563},{"type":1355,"columns":1620},[1621],{"items":1622},[1623,1626,1631],{"text":1311,"config":1624},{"href":1313,"dataGaName":1625,"dataGaLocation":1304},"talk to sales",{"text":1627,"config":1628},"Portail d'assistance",{"href":1629,"dataGaName":1630,"dataGaLocation":1304},"https://support.gitlab.com","support portal",{"text":1632,"config":1633},"Portail clients GitLab",{"href":1634,"dataGaName":1635,"dataGaLocation":1304},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1637,"login":1638,"suggestions":1645},"Fermer",{"text":1639,"link":1640},"Pour rechercher des dépôts et des projets, connectez-vous à",{"text":1641,"config":1642},"GitLab.com",{"href":1318,"dataGaName":1643,"dataGaLocation":1644},"search login","search",{"text":1646,"default":1647},"Suggestions",[1648,1651,1656,1658,1663,1668],{"text":1335,"config":1649},{"href":1340,"dataGaName":1650,"dataGaLocation":1644},"GitLab Duo Agent Platform",{"text":1652,"config":1653},"Suggestions de code (IA)",{"href":1654,"dataGaName":1655,"dataGaLocation":1644},"/fr-fr/solutions/code-suggestions/","Code Suggestions (AI)",{"text":1371,"config":1657},{"href":1373,"dataGaName":1371,"dataGaLocation":1644},{"text":1659,"config":1660},"GitLab sur AWS",{"href":1661,"dataGaName":1662,"dataGaLocation":1644},"/fr-fr/partners/technology-partners/aws/","GitLab on AWS",{"text":1664,"config":1665},"GitLab sur Google Cloud",{"href":1666,"dataGaName":1667,"dataGaLocation":1644},"/fr-fr/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":1669,"config":1670},"Pourquoi utiliser GitLab ?",{"href":1348,"dataGaName":1671,"dataGaLocation":1644},"Why GitLab?",{"freeTrial":1673,"mobileIcon":1678,"desktopIcon":1683,"secondaryButton":1686},{"text":1674,"config":1675},"Commencer votre essai gratuit",{"href":1676,"dataGaName":1309,"dataGaLocation":1677},"https://gitlab.com/-/trials/new/","nav",{"altText":1679,"config":1680},"Icône GitLab",{"src":1681,"dataGaName":1682,"dataGaLocation":1677},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1679,"config":1684},{"src":1685,"dataGaName":1682,"dataGaLocation":1677},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1687,"config":1688},"Commencer",{"href":1689,"dataGaName":1690,"dataGaLocation":1677},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr/get-started/","get started",{"freeTrial":1692,"mobileIcon":1696,"desktopIcon":1698},{"text":1693,"config":1694},"En savoir plus sur GitLab Duo",{"href":1340,"dataGaName":1695,"dataGaLocation":1677},"gitlab duo",{"altText":1679,"config":1697},{"src":1681,"dataGaName":1682,"dataGaLocation":1677},{"altText":1679,"config":1699},{"src":1685,"dataGaName":1682,"dataGaLocation":1677},{"button":1701,"mobileIcon":1706,"desktopIcon":1708},{"text":1702,"config":1703},"/switch",{"href":1704,"dataGaName":1705,"dataGaLocation":1677},"#contact","switch",{"altText":1679,"config":1707},{"src":1681,"dataGaName":1682,"dataGaLocation":1677},{"altText":1679,"config":1709},{"src":1710,"dataGaName":1682,"dataGaLocation":1677},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1712,"mobileIcon":1717,"desktopIcon":1719},{"text":1713,"config":1714},"Retour aux tarifs",{"href":1455,"dataGaName":1715,"dataGaLocation":1677,"icon":1716},"back to pricing","GoBack",{"altText":1679,"config":1718},{"src":1681,"dataGaName":1682,"dataGaLocation":1677},{"altText":1679,"config":1720},{"src":1685,"dataGaName":1682,"dataGaLocation":1677},{"title":1722,"button":1723,"config":1728},"Découvrez comment l'IA agentique transforme la livraison logicielle",{"text":1724,"config":1725},"Rejoindre GitLab Transcend en direct le 10 juin",{"href":1726,"dataGaName":1727,"dataGaLocation":1304},"/fr-fr/events/transcend/virtual/","transcend event",{"layout":1729,"disabled":1286},"release",{"data":1731},{"text":1732,"source":1733,"edit":1739,"contribute":1744,"config":1749,"items":1754,"minimal":1962},"Git est une marque déposée de Software Freedom Conservancy et notre utilisation de « GitLab » est sous licence.",{"text":1734,"config":1735},"Afficher le code source de la page",{"href":1736,"dataGaName":1737,"dataGaLocation":1738},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1740,"config":1741},"Modifier cette page",{"href":1742,"dataGaName":1743,"dataGaLocation":1738},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1745,"config":1746},"Veuillez contribuer",{"href":1747,"dataGaName":1748,"dataGaLocation":1738},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1750,"facebook":1751,"youtube":1752,"linkedin":1753},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1755,1802,1855,1899,1929],{"title":1453,"links":1756,"subMenu":1771},[1757,1761,1766],{"text":1758,"config":1759},"Voir les forfaits",{"href":1455,"dataGaName":1760,"dataGaLocation":1738},"view plans",{"text":1762,"config":1763},"GitLab Premium",{"href":1764,"dataGaName":1765,"dataGaLocation":1738},"/fr-fr/pricing/premium/","why premium",{"text":1767,"config":1768},"GitLab Ultimate",{"href":1769,"dataGaName":1770,"dataGaLocation":1738},"/fr-fr/pricing/ultimate/","why ultimate",[1772],{"title":1617,"links":1773},[1774,1777,1780,1782,1787,1792,1797],{"text":1775,"config":1776},"Contacter l'équipe commerciale",{"href":1313,"dataGaName":1314,"dataGaLocation":1738},{"text":1778,"config":1779},"Assistance GitLab",{"href":1629,"dataGaName":1630,"dataGaLocation":1738},{"text":1632,"config":1781},{"href":1634,"dataGaName":1635,"dataGaLocation":1738},{"text":1783,"config":1784},"Statut",{"href":1785,"dataGaName":1786,"dataGaLocation":1738},"https://status.gitlab.com/","status",{"text":1788,"config":1789},"Conditions d'utilisation",{"href":1790,"dataGaName":1791,"dataGaLocation":1738},"/terms/","terms of use",{"text":1793,"config":1794},"Politique de confidentialité",{"href":1795,"dataGaName":1796,"dataGaLocation":1738},"/fr-fr/privacy/","privacy statement",{"text":1798,"config":1799},"Gérer vos cookies",{"dataGaName":1800,"dataGaLocation":1738,"id":1801,"isOneTrustButton":704},"cookie preferences","ot-sdk-btn",{"title":1351,"links":1803,"subMenu":1812},[1804,1808],{"text":1805,"config":1806},"Plateforme DevSecOps",{"href":1333,"dataGaName":1807,"dataGaLocation":1738},"devsecops platform",{"text":1809,"config":1810},"Développement assisté par l'IA",{"href":1340,"dataGaName":1811,"dataGaLocation":1738},"ai-assisted development",[1813],{"title":1814,"links":1815},"Thèmes",[1816,1820,1825,1830,1835,1840,1845,1850],{"text":1371,"config":1817},{"href":1818,"dataGaName":1819,"dataGaLocation":1738},"/fr-fr/topics/ci-cd/","cicd",{"text":1821,"config":1822},"GitOps",{"href":1823,"dataGaName":1824,"dataGaLocation":1738},"/fr-fr/topics/gitops/","gitops",{"text":1826,"config":1827},"DevOps",{"href":1828,"dataGaName":1829,"dataGaLocation":1738},"/fr-fr/topics/devops/","devops",{"text":1831,"config":1832},"Contrôle de version",{"href":1833,"dataGaName":1834,"dataGaLocation":1738},"/fr-fr/topics/version-control/","version control",{"text":1836,"config":1837},"DevSecOps",{"href":1838,"dataGaName":1839,"dataGaLocation":1738},"/fr-fr/topics/devsecops/","devsecops",{"text":1841,"config":1842},"Cloud-native",{"href":1843,"dataGaName":1844,"dataGaLocation":1738},"/fr-fr/topics/cloud-native/","cloud native",{"text":1846,"config":1847},"IA pour la programmation",{"href":1848,"dataGaName":1849,"dataGaLocation":1738},"/fr-fr/topics/devops/ai-for-coding/","ai for coding",{"text":1851,"config":1852},"IA agentique",{"href":1853,"dataGaName":1854,"dataGaLocation":1738},"/fr-fr/topics/agentic-ai/","agentic ai",{"title":1856,"links":1857},"Solutions",[1858,1861,1863,1868,1871,1874,1877,1880,1883,1886,1889,1894],{"text":1396,"config":1859},{"href":1391,"dataGaName":1860,"dataGaLocation":1738},"Application Security Testing",{"text":1383,"config":1862},{"href":1367,"dataGaName":1368,"dataGaLocation":1738},{"text":1864,"config":1865},"Développement Agile",{"href":1866,"dataGaName":1867,"dataGaLocation":1738},"/fr-fr/solutions/agile-delivery/","agile delivery",{"text":1378,"config":1869},{"href":1380,"dataGaName":1870,"dataGaLocation":1738},"source code management",{"text":1371,"config":1872},{"href":1373,"dataGaName":1873,"dataGaLocation":1738},"continuous integration & delivery",{"text":1422,"config":1875},{"href":1424,"dataGaName":1876,"dataGaLocation":1738},"value stream management",{"text":1821,"config":1878},{"href":1879,"dataGaName":1824,"dataGaLocation":1738},"/fr-fr/solutions/gitops/",{"text":1881,"config":1882},"Entreprises",{"href":1438,"dataGaName":1439,"dataGaLocation":1738},{"text":1884,"config":1885},"PME",{"href":1444,"dataGaName":1445,"dataGaLocation":1738},{"text":1887,"config":1888},"Secteur public",{"href":1450,"dataGaName":1451,"dataGaLocation":1738},{"text":1890,"config":1891},"Éducation",{"href":1892,"dataGaName":1893,"dataGaLocation":1738},"/fr-fr/solutions/education/","education",{"text":1895,"config":1896},"Services financiers",{"href":1897,"dataGaName":1898,"dataGaLocation":1738},"/fr-fr/solutions/finance/","financial services",{"title":1225,"links":1900},[1901,1903,1905,1907,1910,1912,1915,1917,1919,1921,1923,1925,1927],{"text":1470,"config":1902},{"href":1472,"dataGaName":1473,"dataGaLocation":1738},{"text":1475,"config":1904},{"href":1477,"dataGaName":1478,"dataGaLocation":1738},{"text":1480,"config":1906},{"href":1482,"dataGaName":1483,"dataGaLocation":1738},{"text":1485,"config":1908},{"href":1487,"dataGaName":1909,"dataGaLocation":1738},"docs",{"text":1508,"config":1911},{"href":1510,"dataGaName":1511,"dataGaLocation":1738},{"text":1913,"config":1914},"Quoi de neuf",{"href":1558,"dataGaName":1559,"dataGaLocation":1738},{"text":1503,"config":1916},{"href":1505,"dataGaName":1506,"dataGaLocation":1738},{"text":1517,"config":1918},{"href":1519,"dataGaName":1520,"dataGaLocation":1738},{"text":1525,"config":1920},{"href":1527,"dataGaName":1528,"dataGaLocation":1738},{"text":1530,"config":1922},{"href":1532,"dataGaName":1533,"dataGaLocation":1738},{"text":1535,"config":1924},{"href":1537,"dataGaName":1538,"dataGaLocation":1738},{"text":1540,"config":1926},{"href":1542,"dataGaName":1543,"dataGaLocation":1738},{"text":1545,"config":1928},{"href":1547,"dataGaName":1548,"dataGaLocation":1738},{"title":1561,"links":1930},[1931,1933,1935,1937,1939,1941,1946,1951,1953,1955,1957],{"text":1569,"config":1932},{"href":1571,"dataGaName":1563,"dataGaLocation":1738},{"text":1574,"config":1934},{"href":1576,"dataGaName":1577,"dataGaLocation":1738},{"text":1582,"config":1936},{"href":1584,"dataGaName":1585,"dataGaLocation":1738},{"text":1587,"config":1938},{"href":1589,"dataGaName":1590,"dataGaLocation":1738},{"text":1592,"config":1940},{"href":1594,"dataGaName":1595,"dataGaLocation":1738},{"text":1942,"config":1943},"Développement durable",{"href":1944,"dataGaName":1945,"dataGaLocation":1738},"/sustainability/","Sustainability",{"text":1947,"config":1948},"Diversité, inclusion et appartenance (DIB)",{"href":1949,"dataGaName":1950,"dataGaLocation":1738},"/fr-fr/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1597,"config":1952},{"href":1599,"dataGaName":1600,"dataGaLocation":1738},{"text":1607,"config":1954},{"href":1609,"dataGaName":1610,"dataGaLocation":1738},{"text":1612,"config":1956},{"href":1614,"dataGaName":1615,"dataGaLocation":1738},{"text":1958,"config":1959},"Déclaration de transparence sur l'esclavage moderne",{"href":1960,"dataGaName":1961,"dataGaLocation":1738},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1963},[1964,1966,1969],{"text":1788,"config":1965},{"href":1790,"dataGaName":1791,"dataGaLocation":1738},{"text":1967,"config":1968},"Gestion des cookies",{"dataGaName":1800,"dataGaLocation":1738,"id":1801,"isOneTrustButton":704},{"text":1793,"config":1970},{"href":1795,"dataGaName":1796,"dataGaLocation":1738},[1972],{"id":1973,"title":7,"body":1285,"config":1974,"content":1977,"description":1285,"extension":1980,"meta":1981,"navigation":704,"path":1982,"seo":1983,"stem":1984,"__hash__":1985},"blogAuthors/en-us/blog/authors/omid-khan.yml",{"template":1975,"gitlabHandle":1976},"BlogAuthor","OmidKhan",{"name":7,"config":1978,"role":124},{"headshot":1979},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1769090536/q4p3qwthtken8fpokgzu.jpg","yml",{},"/en-us/blog/authors/omid-khan",{},"en-us/blog/authors/omid-khan","4ZHOi5nEiZLdJm1phW-47SM0x-BGo8jNbg_Zt0oSzEQ",[1987,1995,2003],{"title":1988,"description":1989,"heroImage":1990,"category":1281,"date":1991,"authors":1992,"slug":1994,"externalUrl":1285},"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",[1993],"Corinne Dent","track-ci-component-usage",{"title":1996,"description":1997,"heroImage":1998,"category":1281,"date":1999,"authors":2000,"slug":2002,"externalUrl":1285},"Changements majeurs dans GitLab 19.0 : guide complet","GitLab 19.0 supprime plusieurs fonctionnalités dépréciées. Découvrez les impacts sur votre déploiement et comment vous préparer avant la mise à niveau.","https://res.cloudinary.com/about-gitlab-com/image/upload/f_auto,q_auto,c_lfill/v1775561395/bhe1as7ttjvzltxwgo5m.png","2026-04-24",[2001],"Martin Brümmer","a-guide-to-the-breaking-changes-in-gitlab-19-0",{"title":2004,"description":2005,"heroImage":2006,"category":1281,"date":2007,"authors":2008,"slug":2011,"externalUrl":1285},"GitLab + Amazon : l'orchestration de plateforme portée par une IA fiable","Associez GitLab Duo Agent Platform à Amazon Bedrock pour un développement logiciel agentique et une orchestration sécurisée.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1776362275/ozbwn9tk0dditpnfddlz.png","2026-04-22",[2009,2010],"Joe Mann","Mark Kriaf","gitlab-amazon-platform-orchestration-on-a-trusted-ai-foundation",{"promotions":2013},[2014,2028,2039,2051],{"id":2015,"categories":2016,"header":2018,"text":2019,"button":2020,"image":2025},"ai-modernization",[2017],"ai","L'IA tient-elle ses promesses à grande échelle ?","Le questionnaire ne prendra pas plus de 5 minutes.",{"text":2021,"config":2022},"Obtenez votre score de maturité IA",{"href":2023,"dataGaName":2024,"dataGaLocation":1511},"/fr-fr/assessments/ai-modernization-assessment/","modernization assessment",{"config":2026},{"src":2027},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":2029,"categories":2030,"header":2031,"text":2019,"button":2032,"image":2036},"devops-modernization",[1281,1839],"Vous contentez-vous de gérer des outils ou de livrer des innovations ?",{"text":2033,"config":2034},"Obtenez votre score de maturité DevOps",{"href":2035,"dataGaName":2024,"dataGaLocation":1511},"/fr-fr/assessments/devops-modernization-assessment/",{"config":2037},{"src":2038},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":2040,"categories":2041,"header":2043,"text":2019,"button":2044,"image":2048},"security-modernization",[2042],"security","Faut-il sacrifier la rapidité pour garantir la sécurité ?",{"text":2045,"config":2046},"Obtenez votre score de maturité en matière de sécurité",{"href":2047,"dataGaName":2024,"dataGaLocation":1511},"/fr-fr/assessments/security-modernization-assessment/",{"config":2049},{"src":2050},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":2052,"paths":2053,"header":2056,"text":2057,"button":2058,"image":2063},"github-azure-migration",[2054,2055],"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":2059,"config":2060},"Découvrez les différences entre GitLab et GitHub",{"href":2061,"dataGaName":2062,"dataGaLocation":1511},"/fr-fr/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":2064},{"src":2038},{"header":2066,"blurb":2067,"button":2068,"secondaryButton":2072},"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":1306,"config":2069},{"href":2070,"dataGaName":1309,"dataGaLocation":2071},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/fr-fr/","feature",{"text":1775,"config":2073},{"href":1313,"dataGaName":1314,"dataGaLocation":2071},1781392776831]