[{"data":1,"prerenderedAt":1616},["ShallowReactive",2],{"/fr-fr/blog/tutorial-automated-release-and-release-notes-with-gitlab":3,"navigation-fr-fr":835,"banner-fr-fr":1269,"footer-fr-fr":1276,"blog-post-authors-fr-fr-Ben Ridley":1513,"blog-related-posts-fr-fr-tutorial-automated-release-and-release-notes-with-gitlab":1528,"blog-promotions-fr-fr":1554,"next-steps-fr-fr":1607},{"id":4,"title":5,"authors":6,"body":8,"category":813,"date":814,"description":815,"extension":635,"externalUrl":816,"faq":816,"featured":817,"heroImage":818,"meta":819,"navigation":351,"path":820,"seo":821,"slug":825,"stem":826,"tags":827,"template":832,"updatedDate":833,"__hash__":834},"blogPosts/fr-fr/blog/tutorial-automated-release-and-release-notes-with-gitlab.md","Automatisez vos sorties et notes de version avec GitLab",[7],"Ben Ridley",{"type":9,"value":10,"toc":804},"minimark",[11,25,28,38,48,53,63,71,74,78,103,110,113,117,120,127,131,134,148,155,161,164,171,177,188,199,203,222,229,539,556,559,614,618,625,628,631,729,732,739,743,750,757,769,783,789,800],[12,13,14,18,19],"p",{},[15,16,17],"strong",{},"Mise à jour 2025"," : l'API Changelog de GitLab continue d'évoluer et offre désormais de nouvelles fonctionnalités avancées, telles que la génération de changelogs personnalisés basés sur l'historique de vos commits. Ces nouveautés ne sont pas détaillées dans cet article, mais vous pouvez les consulter dans notre",[20,21,24],"a",{"href":22,"rel":23},"https://docs.gitlab.com/user/project/changelogs/",[]," documentation officielle dédiée aux changelogs.",[12,26,27],{},"Lorsque vous développez un logiciel dont les utilisateurs se servent au quotidien, il est essentiel de les informer des modifications apportées à chaque nouvelle version (nouvelles fonctionnalités, modifications ou suppressions). Ils peuvent ainsi tirer pleinement parti du logiciel et éviter les mauvaises surprises lors des mises à niveau.",[12,29,30,31,37],{},"Mais historiquement, rédiger les notes de version et maintenir un changelog ont toujours été des tâches laborieuses qui obligent les équipes et les Release Managers à passer au crible les modifications et l'historique des merge requests. Désormais, avec l'API Changelog de GitLab, vous pouvez tirer parti de l'historique détaillé des modifications enregistrées dans votre dépôt ",[20,32,36],{"href":33,"rel":34,"title":35},"https://about.gitlab.com/fr-fr/blog/what-is-git/",[],"Qu'est-ce que Git ?","Git"," pour créer automatiquement des notes de version et tenir à jour votre changelog.",[12,39,40,41,47],{},"Découvrez dans ce tutoriel comment intégrer cette automatisation dans vos ",[20,42,46],{"href":43,"rel":44,"title":45},"https://about.gitlab.com/fr-fr/topics/ci-cd/cicd-pipeline/",[],"Qu'est-ce qu'un pipeline CI/CD ?","pipelines CI/CD",".",[49,50,52],"h2",{"id":51},"sorties-de-nouvelles-versions-dans-gitlab","Sorties de nouvelles versions dans GitLab",[12,54,55,56,62],{},"Dans GitLab, une nouvelle version correspond à une version spécifique de votre code, identifiée par un tag git. Elle regroupe les modifications apportées depuis la dernière version, les notes de version associées, ainsi que tous les artefacts générés à partir de cette version du code, tels que les images ",[20,57,61],{"href":58,"rel":59,"title":60},"https://about.gitlab.com/fr-fr/blog/what-is-docker-comprehensive-guide/",[],"Qu'est-ce que Docker ?","Docker",", les paquets d'installation et la documentation.",[12,64,65,66,70],{},"Vous pouvez créer et suivre les sorties de ces nouvelles versions dans GitLab à l'aide de l'interface utilisateur en appelant notre API Release ou en définissant un job de ",[67,68,69],"code",{},"release"," dans un pipeline CI. Nous utiliserons ce dernier dans ce tutoriel afin de bénéficier de l'automatisation déjà en place pour les tests, les scans du code et les autres étapes de validation, et d'automatiser également les sorties de nouvelles versions.",[12,72,73],{},"Nous devons d'abord disposer d'un historique clair de toutes les modifications apportées. C'est ce que fournit précisément le dépôt Git via les messages de commit et le suivi des merge requests. Ce dernier garantit une génération automatisée et fiable des notes de version et du changelog.",[49,75,77],{"id":76},"lignes-terminales-dans-un-commit","Lignes terminales dans un commit",[12,79,80,81,86,87,90,91,94,95,98,99,102],{},"Les ",[20,82,85],{"href":83,"rel":84},"https://git-scm.com/docs/git-interpret-trailers/fr",[],"lignes terminales dans un commit Git"," sont des métadonnées structurées ajoutées en fin de vos messages de commit, sous la forme simple ",[67,88,89],{},"\u003CHEADER>:\u003CBODY>",". L'interface de ligne de commande ",[67,92,93],{},"git"," peut ensuite les analyser et les extraire pour les utiliser dans d'autres systèmes, par exemple via la commande ",[67,96,97],{},"git commit --sign-off"," qui permet de confirmer un commit en y ajoutant une ligne terminale ",[67,100,101],{},"Signed-off-by: \u003CVotre nom>",". Vous pouvez y ajouter n'importe quelle information structurée. Il s'agit donc d'un emplacement idéal pour stocker des métadonnées, et dans notre exemple, pour générer automatiquement notre changelog.",[12,104,105,106,109],{},"En ajoutant la ligne terminale ",[67,107,108],{},"Changelog: \u003Cadded/changed/removed>"," à la fin de nos messages de commit, l'API Changelog de GitLab l'analysera et créera automatiquement un changelog.",[12,111,112],{},"Nous allons illustrer ce mécanisme en apportant quelques modifications à un code source existant afin de sortir une nouvelle version et de générer automatiquement ses notes de version et les entrées du changelog correspondant.",[49,114,116],{"id":115},"exemple-concret-avec-une-application-python","Exemple concret avec une application Python",[12,118,119],{},"Partons d'un dépôt contenant une application web simple écrite en Python. Supposons que la version 1.0.0 de cette application vient de sortir et représente l'état actuel du code, et qu'elle a été créée manuellement dans GitLab, sans pipeline de sortie de nouvelle version automatisé :",[12,121,122],{},[123,124],"img",{"alt":125,"src":126},"Capture d'écran de l'interface utilisateur de GitLab montrant la sortie de la nouvelle version 1.0.0","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397825/blog/Content%20Images/2023-08-22-automated-release-and-release-notes-with-gitlab/1-0-release.png",[49,128,130],{"id":129},"modifications-en-vue-de-la-version-200","Modifications en vue de la version 2.0.0",[12,132,133],{},"Comme nous sommes en mode de développement rapide, nous allons travailler sur la sortie de la version 2.0.0 de notre application dès aujourd'hui. Celle-ci introduira une fonctionnalité de chatbot et supprimera la fonctionnalité de blockchain quantique, qui servait uniquement à impressionner les investisseurs lors de notre premier cycle de financement par capital-risque. Nous allons également ajouter un job de sortie de nouvelle version automatisé à notre pipeline CI/CD.",[12,135,136,137,140,141,147],{},"Tout d'abord, nous devons supprimer les fonctionnalités obsolètes à l'aide d'une merge request qui contient les suppressions nécessaires en veillant à ce que le message de commit inclue la ligne terminale ",[67,138,139],{},"Changelog: removed",". Pour cela, nous pouvons par exemple l'inclure directement dans un commit, ou effectuer un ",[20,142,146],{"href":143,"rel":144,"title":145},"https://about.gitlab.com/fr-fr/blog/keep-git-history-clean-with-interactive-rebase/",[],"Qu'est-ce que le rebasage interactif ?","rebasage interactif"," et l'ajouter à l'aide de l'interface de ligne de commande (CLI).",[12,149,150,151,154],{},"Mais dans notre exemple, nous traiterons cette étape en dernier, et utiliserons plutôt le bouton ",[67,152,153],{},"Modifier le message de commit"," dans GitLab pour ajouter la ligne terminale au commit comme suit :",[12,156,157],{},[123,158],{"alt":159,"src":160},"Capture d'écran de l'interface utilisateur de GitLab montrant une merge request supprimant les fonctionnalités inutilisées","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397834/blog/Content%20Images/2023-08-22-automated-release-and-release-notes-with-gitlab/remove-unused-features-mr.png",[12,162,163],{},"Vous pouvez également modifier le titre du commit pour qu'il soit plus concis. Nous allons donc renommer notre commit « Supprimer les fonctionnalités inutilisées », pour que ce titre apparaisse dans le changelog.",[12,165,166,167,170],{},"Ensuite, ajoutons de nouvelles fonctionnalités pour la version 2.0.0. Là encore, il suffit d'ouvrir une autre merge request qui inclut nos nouvelles fonctionnalités, de modifier le commit pour inclure la ligne terminale ",[67,168,169],{},"Changelog: added",", puis de modifier son titre pour qu'il soit plus concis :",[12,172,173],{},[123,174],{"alt":175,"src":176},"Capture d'écran de l'interface utilisateur de GitLab montrant une merge request servant à ajouter de nouvelles fonctionnalités","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397834/blog/Content%20Images/2023-08-22-automated-release-and-release-notes-with-gitlab/add-chatbot-mr.png",[12,178,179,180,183,184,187],{},"Nous sommes maintenant prêts à publier la version 2.0.0. Mais cette fois-ci, au lieu de la créer manuellement, nous allons ajouter les jobs nécessaires à notre fichier ",[67,181,182],{},".gitlab-ci.yml"," : ils gèreront automatiquement la sortie de la nouvelle version à notre place et généreront les notes de version et les entrées du changelog lorsque nous ajouterons à notre code le tag ",[67,185,186],{},"2.0.0"," en référence à la nouvelle version.",[12,189,190,193,194,47],{},[15,191,192],{},"Remarque :"," pour ajouter facilement des lignes terminales de changelog, utilisez un outil comme ",[20,195,198],{"href":196,"rel":197},"https://docs.gitlab.com/development/dangerbot/",[],"Danger, qui permet de vérifier automatiquement le respect des conventions dans les merge requests",[49,200,202],{"id":201},"création-dun-pipeline-automatisé-de-sortie-de-nouvelle-version","Création d'un pipeline automatisé de sortie de nouvelle version",[12,204,205,206,211,212,217,218,221],{},"La première étape consiste à créer un token d'accès au projet qui nous permettra d'appeler l'API de GitLab afin de générer les entrées de notre changelog. ",[20,207,210],{"href":208,"rel":209},"https://docs.gitlab.com/user/project/settings/project_access_tokens/#create-a-project-access-token",[],"Créons un token d'accès au projet avec la portée de l'API",", puis ",[20,213,216],{"href":214,"rel":215},"https://docs.gitlab.com/ci/variables/#define-a-cicd-variable-in-the-ui",[],"stockons-le dans les variables CI/CD"," du projet sous le nom ",[67,219,220],{},"CI_API_JETON",". Nous référencerons cette variable à des fins d'authentification auprès de l'API.",[12,223,224,225,228],{},"Ensuite, ajoutons deux nouveaux jobs à notre fichier ",[67,226,227],{},"gitlab-ci.yml"," :",[230,231,236],"pre",{"className":232,"code":233,"language":234,"meta":235,"style":235},"language-yaml shiki shiki-themes github-light","prepare_job:\n  stage: prepare\n  image: alpine:latest\n  rules:\n  - if: '$CI_COMMIT_TAG =~ /^v?\\d+\\.\\d+\\.\\d+$/'\n  script:\n    - apk add curl jq\n    - 'curl -H \"PRIVATE-TOKEN: $CI_API_TOKEN\" \"$CI_API_V4_URL/projects/$CI_PROJECT_ID/repository/changelog?version=$CI_COMMIT_TAG\" | jq -r .notes > release_notes.md'\n  artifacts:\n    paths:\n    - release_notes.md\n\nrelease_job:\n  stage: release\n  image: registry.gitlab.com/gitlab-org/release-cli:latest\n  needs:\n    - job: prepare_job\n      artifacts: true\n  rules:\n  - if: '$CI_COMMIT_TAG =~ /^v?\\d+\\.\\d+\\.\\d+$/'\n  script:\n    - echo \"Creating release\"\n  release:\n    name: 'Release $CI_COMMIT_TAG'\n    description: release_notes.md\n    tag_name: '$CI_COMMIT_TAG'\n    ref: '$CI_COMMIT_SHA'\n    assets:\n      links:\n        - name: 'Container Image $CI_COMMIT_TAG'\n          url: \"https://$CI_REGISTRE_IMAGE/$CI_COMMIT_REF_SLUG:$CI_COMMIT_SHA\"\n\n","yaml","",[67,237,238,251,264,275,283,297,305,314,322,330,338,346,353,361,371,381,389,402,414,421,432,439,447,455,466,476,487,498,506,514,528],{"__ignoreMap":235},[239,240,243,247],"span",{"class":241,"line":242},"line",1,[239,244,246],{"class":245},"shJU0","prepare_job",[239,248,250],{"class":249},"sgsFI",":\n",[239,252,254,257,260],{"class":241,"line":253},2,[239,255,256],{"class":245},"  stage",[239,258,259],{"class":249},": ",[239,261,263],{"class":262},"sYBdl","prepare\n",[239,265,267,270,272],{"class":241,"line":266},3,[239,268,269],{"class":245},"  image",[239,271,259],{"class":249},[239,273,274],{"class":262},"alpine:latest\n",[239,276,278,281],{"class":241,"line":277},4,[239,279,280],{"class":245},"  rules",[239,282,250],{"class":249},[239,284,286,289,292,294],{"class":241,"line":285},5,[239,287,288],{"class":249},"  - ",[239,290,291],{"class":245},"if",[239,293,259],{"class":249},[239,295,296],{"class":262},"'$CI_COMMIT_TAG =~ /^v?\\d+\\.\\d+\\.\\d+$/'\n",[239,298,300,303],{"class":241,"line":299},6,[239,301,302],{"class":245},"  script",[239,304,250],{"class":249},[239,306,308,311],{"class":241,"line":307},7,[239,309,310],{"class":249},"    - ",[239,312,313],{"class":262},"apk add curl jq\n",[239,315,317,319],{"class":241,"line":316},8,[239,318,310],{"class":249},[239,320,321],{"class":262},"'curl -H \"PRIVATE-TOKEN: $CI_API_TOKEN\" \"$CI_API_V4_URL/projects/$CI_PROJECT_ID/repository/changelog?version=$CI_COMMIT_TAG\" | jq -r .notes > release_notes.md'\n",[239,323,325,328],{"class":241,"line":324},9,[239,326,327],{"class":245},"  artifacts",[239,329,250],{"class":249},[239,331,333,336],{"class":241,"line":332},10,[239,334,335],{"class":245},"    paths",[239,337,250],{"class":249},[239,339,341,343],{"class":241,"line":340},11,[239,342,310],{"class":249},[239,344,345],{"class":262},"release_notes.md\n",[239,347,349],{"class":241,"line":348},12,[239,350,352],{"emptyLinePlaceholder":351},true,"\n",[239,354,356,359],{"class":241,"line":355},13,[239,357,358],{"class":245},"release_job",[239,360,250],{"class":249},[239,362,364,366,368],{"class":241,"line":363},14,[239,365,256],{"class":245},[239,367,259],{"class":249},[239,369,370],{"class":262},"release\n",[239,372,374,376,378],{"class":241,"line":373},15,[239,375,269],{"class":245},[239,377,259],{"class":249},[239,379,380],{"class":262},"registry.gitlab.com/gitlab-org/release-cli:latest\n",[239,382,384,387],{"class":241,"line":383},16,[239,385,386],{"class":245},"  needs",[239,388,250],{"class":249},[239,390,392,394,397,399],{"class":241,"line":391},17,[239,393,310],{"class":249},[239,395,396],{"class":245},"job",[239,398,259],{"class":249},[239,400,401],{"class":262},"prepare_job\n",[239,403,405,408,410],{"class":241,"line":404},18,[239,406,407],{"class":245},"      artifacts",[239,409,259],{"class":249},[239,411,413],{"class":412},"sYu0t","true\n",[239,415,417,419],{"class":241,"line":416},19,[239,418,280],{"class":245},[239,420,250],{"class":249},[239,422,424,426,428,430],{"class":241,"line":423},20,[239,425,288],{"class":249},[239,427,291],{"class":245},[239,429,259],{"class":249},[239,431,296],{"class":262},[239,433,435,437],{"class":241,"line":434},21,[239,436,302],{"class":245},[239,438,250],{"class":249},[239,440,442,444],{"class":241,"line":441},22,[239,443,310],{"class":249},[239,445,446],{"class":262},"echo \"Creating release\"\n",[239,448,450,453],{"class":241,"line":449},23,[239,451,452],{"class":245},"  release",[239,454,250],{"class":249},[239,456,458,461,463],{"class":241,"line":457},24,[239,459,460],{"class":245},"    name",[239,462,259],{"class":249},[239,464,465],{"class":262},"'Release $CI_COMMIT_TAG'\n",[239,467,469,472,474],{"class":241,"line":468},25,[239,470,471],{"class":245},"    description",[239,473,259],{"class":249},[239,475,345],{"class":262},[239,477,479,482,484],{"class":241,"line":478},26,[239,480,481],{"class":245},"    tag_name",[239,483,259],{"class":249},[239,485,486],{"class":262},"'$CI_COMMIT_TAG'\n",[239,488,490,493,495],{"class":241,"line":489},27,[239,491,492],{"class":245},"    ref",[239,494,259],{"class":249},[239,496,497],{"class":262},"'$CI_COMMIT_SHA'\n",[239,499,501,504],{"class":241,"line":500},28,[239,502,503],{"class":245},"    assets",[239,505,250],{"class":249},[239,507,509,512],{"class":241,"line":508},29,[239,510,511],{"class":245},"      links",[239,513,250],{"class":249},[239,515,517,520,523,525],{"class":241,"line":516},30,[239,518,519],{"class":249},"        - ",[239,521,522],{"class":245},"name",[239,524,259],{"class":249},[239,526,527],{"class":262},"'Container Image $CI_COMMIT_TAG'\n",[239,529,531,534,536],{"class":241,"line":530},31,[239,532,533],{"class":245},"          url",[239,535,259],{"class":249},[239,537,538],{"class":262},"\"https://$CI_REGISTRE_IMAGE/$CI_COMMIT_REF_SLUG:$CI_COMMIT_SHA\"\n",[12,540,541,542,544,545,548,549,552,553,555],{},"Dans notre configuration, le job ",[67,543,246],{}," utilise ",[67,546,547],{},"curl"," et ",[67,550,551],{},"jq"," pour appeler le point de terminaison de l'API Changelog de GitLab, puis transmet le résultat à notre job ",[67,554,358],{}," chargé de créer automatiquement la nouvelle version.",[12,557,558],{},"Voici les principaux éléments à retenir :",[560,561,562,566,585,595,601,611],"ul",{},[563,564,565],"li",{},"Nous utilisons le token d'accès au projet créé précédemment pour appeler l'API Changelog de GitLab, qui génère les notes de version que nous stockons en tant qu'artefact.",[563,567,568,569,572,573,575,576,579,580],{},"Nous utilisons la variable ",[67,570,571],{},"$CI_COMMIT_TAG"," pour identifier la version. Pour que l'API Changelog fonctionne correctement, nous devons utiliser la gestion sémantique de version pour nos tags (par exemple, ",[67,574,186],{},"). Nous avons également restreint le job de sortie de nouvelle version à l'aide d'une règle spécifique dans la section ",[67,577,578],{},"rules",", qui vérifie la présence d'un tag de version sémantique.",[560,581,582],{},[563,583,584],{},"La gestion sémantique de version est nécessaire pour que l'API Changelog de GitLab déclenche le job. Elle utilise ce format pour trouver la version la plus récente à comparer à notre version actuelle.",[563,586,587,588,591,592,594],{},"Nous utilisons l'image ",[67,589,590],{},"release-cli"," officielle de GitLab, indispensable pour exploiter le terme ",[67,593,69],{}," dans un job.",[563,596,597,598,600],{},"Nous utilisons le terme ",[67,599,69],{}," pour créer une sortie de nouvelle version dans GitLab et pour le remplissage des champs obligatoires.",[563,602,603,604,607,608,610],{},"Nous pouvons transmettre un fichier en tant qu'argument pour la ",[67,605,606],{},"description"," de la nouvelle version. Dans notre exemple, il s'agit du fichier que nous avons généré lors du job ",[67,609,246],{},", puis transmis à ce job sous forme d'artefact.",[563,612,613],{},"Nous avons également inclus notre image de conteneur, qui a été compilée plus tôt dans le pipeline, en tant que ressource associée à la nouvelle version. Vous pouvez également y joindre les ressources de votre choix, générées lors de votre processus de compilation, telles que des binaires ou de la documentation, à condition de fournir l'URL redirigeant vers l'endroit où vous les avez chargés plus tôt dans le pipeline.",[49,615,617],{"id":616},"automatisation-dune-sortie-de-nouvelle-version","Automatisation d'une sortie de nouvelle version",[12,619,620,621],{},"Avec cette configuration, il suffit d'effectuer le push d'un tag respectant notre schéma de gestion des versions vers notre dépôt à l'aide de la CLI ou comme dans notre exemple, directement depuis l'interface utilisateur de GitLab, sur la branche principale, en sélectionnant Code -> Tags -> Nouveau tag dans la barre latérale :\n",[123,622],{"alt":623,"src":624},"Capture d'écran de l'interface utilisateur de GitLab montrant comment créer un tag","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397835/blog/Content%20Images/2023-08-22-automated-release-and-release-notes-with-gitlab/create-2-tag.png",[12,626,627],{},"Dès la création du tag, nos pipelines commenceront à s'exécuter automatiquement. L'API Changelog de GitLab génère alors des notes de version au format markdown contenant toutes les modifications apportées entre cette version et la version précédente.",[12,629,630],{},"Voici un extrait du markdown généré dans notre exemple :",[230,632,636],{"className":633,"code":634,"language":635,"meta":235,"style":235},"language-md shiki shiki-themes github-light","## 2.0.0 (2023-08-25)\n\n### added (1 change)\n\n- [Add ChatBot](gl-demo-ultimate-bridley/super-devsecops-incorporated/simply-notes-release-demo@0c3601a45af617c5481322bfce4d71db1f911b02) ([merge request](gl-demo-ultimate-bridley/super-devsecops-incorporated/simply-notes-release-demo!4))\n\n### removed (1 change)\n\n- [Remove Unused Features](gl-demo-ultimate-bridley/super-devsecops-incorporated/simply-notes-release-demo@463d453c5ae0f4fc611ea969e5442e3298bf0d8a) ([merge request](gl-demo-ultimate-bridley/super-devsecops-incorporated/simply-notes-release-demo!3))\n","md",[67,637,638,644,648,653,657,691,695,700,704],{"__ignoreMap":235},[239,639,640],{"class":241,"line":242},[239,641,643],{"class":642},"surfw","## 2.0.0 (2023-08-25)\n",[239,645,646],{"class":241,"line":253},[239,647,352],{"emptyLinePlaceholder":351},[239,649,650],{"class":241,"line":266},[239,651,652],{"class":642},"### added (1 change)\n",[239,654,655],{"class":241,"line":277},[239,656,352],{"emptyLinePlaceholder":351},[239,658,659,663,666,670,673,677,680,683,685,688],{"class":241,"line":285},[239,660,662],{"class":661},"sqxcx","-",[239,664,665],{"class":249}," [",[239,667,669],{"class":668},"sEuWB","Add ChatBot",[239,671,672],{"class":249},"](",[239,674,676],{"class":675},"se9n6","gl-demo-ultimate-bridley/super-devsecops-incorporated/simply-notes-release-demo@0c3601a45af617c5481322bfce4d71db1f911b02",[239,678,679],{"class":249},") ([",[239,681,682],{"class":668},"merge request",[239,684,672],{"class":249},[239,686,687],{"class":675},"gl-demo-ultimate-bridley/super-devsecops-incorporated/simply-notes-release-demo!4",[239,689,690],{"class":249},"))\n",[239,692,693],{"class":241,"line":299},[239,694,352],{"emptyLinePlaceholder":351},[239,696,697],{"class":241,"line":307},[239,698,699],{"class":642},"### removed (1 change)\n",[239,701,702],{"class":241,"line":316},[239,703,352],{"emptyLinePlaceholder":351},[239,705,706,708,710,713,715,718,720,722,724,727],{"class":241,"line":324},[239,707,662],{"class":661},[239,709,665],{"class":249},[239,711,712],{"class":668},"Remove Unused Features",[239,714,672],{"class":249},[239,716,717],{"class":675},"gl-demo-ultimate-bridley/super-devsecops-incorporated/simply-notes-release-demo@463d453c5ae0f4fc611ea969e5442e3298bf0d8a",[239,719,679],{"class":249},[239,721,682],{"class":668},[239,723,672],{"class":249},[239,725,726],{"class":675},"gl-demo-ultimate-bridley/super-devsecops-incorporated/simply-notes-release-demo!3",[239,728,690],{"class":249},[12,730,731],{},"Comme vous pouvez le constater, GitLab a extrait automatiquement les entrées de nos notes de version à l'aide des lignes terminales que nous avons intégrées dans nos messages de commit Git. De plus, des notes incluent des liens vers la merge request associée pour accéder rapidement aux compléments d'information et discussions relatifs aux modifications.",[12,733,734,735],{},"Voici notre nouvelle version 2.0.0 :\n",[123,736],{"alt":737,"src":738},"Interface utilisateur de la nouvelle version de GitLab montrant la nouvelle version 2.0.0","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397834/blog/Content%20Images/2023-08-22-automated-release-and-release-notes-with-gitlab/2-0-release.png",[49,740,742],{"id":741},"automatisation-de-la-mise-à-jour-du-changelog","Automatisation de la mise à jour du changelog",[12,744,745,746,749],{},"Pour maintenir à jour votre changelog (soit l'historique rassemblant toutes vos notes de version), vous pouvez effectuer une requête ",[67,747,748],{},"POST"," vers le point de terminaison de l'API Changelog utilisé précédemment.",[12,751,752,753,756],{},"Si vous effectuez cette opération dans le cadre de votre pipeline de nouvelle version, intégrez cette étape en ajoutant ce qui suit à la section ",[67,754,755],{},"script"," de votre job de préparation :",[230,758,762],{"className":759,"code":760,"language":761,"meta":235,"style":235},"language-sh shiki shiki-themes github-light","'curl -H \"PRIVATE-TOKEN: $CI_API_TOKEN\" -X POST \"$CI_API_V4_URL/projects/$CI_PROJECT_ID/repository/changelog?version=$CI_COMMIT_TAG\"\n","sh",[67,763,764],{"__ignoreMap":235},[239,765,766],{"class":241,"line":242},[239,767,760],{"class":768},"s7eDp",[12,770,771,774,775,778,779],{},[15,772,773],{},"Notez que cette opération modifie le dépôt"," en créant un commit qui ajoute les notes de la nouvelle version à un fichier ",[67,776,777],{},"CHANGELOG.md"," :\n",[123,780],{"alt":781,"src":782},"Capture d'écran du dépôt montrant une validation mettant à jour le fichier changelog","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397834/blog/Content%20Images/2023-08-22-automated-release-and-release-notes-with-gitlab/changelog-api-commit.png",[12,784,785,786,788],{},"Et voilà, nous avons terminé ! En utilisant l'historique détaillé fourni par ",[67,787,93],{}," avec quelques lignes terminales de commit pratiques, nous pouvons tirer parti de la puissante de l'API et des pipelines CI/CD de GitLab pour automatiser notre processus de sortie de nouvelle version et de génération de notes de version.",[790,791,792],"blockquote",{},[12,793,794,795,47],{},"Pour découvrir le projet utilisé dans ce tutoriel, ",[20,796,799],{"href":797,"rel":798},"https://gitlab.com/gitlab-learn-labs/sample-projects/release-automation-demo",[],"consultez ce lien",[801,802,803],"style",{},"html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html 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 .surfw, html code.shiki .surfw{--shiki-default:#005CC5;--shiki-default-font-weight:bold}html pre.shiki code .sqxcx, html code.shiki .sqxcx{--shiki-default:#E36209}html pre.shiki code .sEuWB, html code.shiki .sEuWB{--shiki-default:#032F62;--shiki-default-text-decoration:underline}html pre.shiki code .se9n6, html code.shiki .se9n6{--shiki-default:#24292E;--shiki-default-text-decoration:underline}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}",{"title":235,"searchDepth":253,"depth":253,"links":805},[806,807,808,809,810,811,812],{"id":51,"depth":253,"text":52},{"id":76,"depth":253,"text":77},{"id":115,"depth":253,"text":116},{"id":129,"depth":253,"text":130},{"id":201,"depth":253,"text":202},{"id":616,"depth":253,"text":617},{"id":741,"depth":253,"text":742},"product","2023-11-01","Découvrez comment automatiser vos livraisons de logiciels avec l'API Changelog de GitLab : créez des artefacts, changelogs complets et notes de version clairs.",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659978/Blog/Hero%20Images/automation.png",{},"/fr-fr/blog/tutorial-automated-release-and-release-notes-with-gitlab",{"ogTitle":5,"ogImage":818,"ogDescription":815,"ogSiteName":822,"noIndex":817,"ogType":823,"ogUrl":824,"title":5,"canonicalUrls":824,"description":815},"https://about.gitlab.com","article","https://about.gitlab.com/blog/tutorial-automated-release-and-release-notes-with-gitlab","tutorial-automated-release-and-release-notes-with-gitlab","fr-fr/blog/tutorial-automated-release-and-release-notes-with-gitlab",[828,829,830,831,93],"CI","CI/CD","DevOps","DevSecOps","BlogPost","2025-07-09","sZUytL8_DY1sxwCQyTszjr9ua5BqejaslgFaMui5Ndc",{"logo":836,"freeTrial":841,"sales":846,"login":851,"items":856,"search":1184,"minimal":1220,"duo":1239,"switchNav":1248,"pricingDeployment":1259},{"config":837},{"href":838,"dataGaName":839,"dataGaLocation":840},"/fr-fr/","gitlab logo","header",{"text":842,"config":843},"Commencer un essai gratuit",{"href":844,"dataGaName":845,"dataGaLocation":840},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr&glm_content=default-saas-trial/","free trial",{"text":847,"config":848},"Demander une démo",{"href":849,"dataGaName":850,"dataGaLocation":840},"/fr-fr/sales/?contact-topic=request-demo","sales",{"text":852,"config":853},"Connexion",{"href":854,"dataGaName":855,"dataGaLocation":840},"https://gitlab.com/users/sign_in/","sign in",[857,886,987,992,1106,1162],{"text":858,"config":859,"menu":861},"Plateforme",{"dataNavLevelOne":860},"platform",{"type":862,"columns":863},"cards",[864,870,878],{"title":858,"description":865,"link":866},"La plateforme d'orchestration intelligente pour le DevSecOps",{"text":867,"config":868},"Explorer notre plateforme",{"href":869,"dataGaName":860,"dataGaLocation":840},"/fr-fr/platform/",{"title":871,"description":872,"link":873},"GitLab Duo Agent Platform","L'IA agentique pour l'ensemble du cycle de développement logiciel",{"text":874,"config":875},"Découvrir GitLab Duo",{"href":876,"dataGaName":877,"dataGaLocation":840},"/fr-fr/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":879,"description":880,"link":881},"Pourquoi GitLab ?","Découvrez les principales raisons pour lesquelles les entreprises choisissent GitLab",{"text":882,"config":883},"En savoir plus",{"href":884,"dataGaName":885,"dataGaLocation":840},"/fr-fr/why-gitlab/","why gitlab",{"text":887,"left":351,"config":888,"menu":890},"Produit",{"dataNavLevelOne":889},"solutions",{"type":891,"link":892,"columns":896,"feature":966},"lists",{"text":893,"config":894},"Voir toutes les solutions",{"href":895,"dataGaName":889,"dataGaLocation":840},"/fr-fr/solutions/",[897,921,944],{"title":898,"description":899,"link":900,"items":905},"Automatisation","CI/CD et automatisation pour accélérer le déploiement",{"config":901},{"icon":902,"href":903,"dataGaName":904,"dataGaLocation":840},"AutomatedCodeAlt","/fr-fr/solutions/delivery-automation/","automated software delivery",[906,909,912,917],{"text":829,"config":907},{"href":908,"dataGaLocation":840,"dataGaName":829},"/fr-fr/solutions/continuous-integration/",{"text":871,"config":910},{"href":876,"dataGaLocation":840,"dataGaName":911},"gitlab duo agent platform - product menu",{"text":913,"config":914},"Gestion du code source",{"href":915,"dataGaLocation":840,"dataGaName":916},"/fr-fr/solutions/source-code-management/","Source Code Management",{"text":918,"config":919},"Livraison de logiciels automatisée",{"href":903,"dataGaLocation":840,"dataGaName":920},"Automated software delivery",{"title":922,"description":923,"link":924,"items":929},"Sécurité","Livrez du code plus rapidement sans compromettre la sécurité",{"config":925},{"href":926,"dataGaName":927,"dataGaLocation":840,"icon":928},"/fr-fr/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[930,934,939],{"text":931,"config":932},"Tests de sécurité des applications",{"href":926,"dataGaName":933,"dataGaLocation":840},"Application security testing",{"text":935,"config":936},"Sécurité de la chaîne d'approvisionnement logicielle",{"href":937,"dataGaLocation":840,"dataGaName":938},"/fr-fr/solutions/supply-chain/","Software supply chain security",{"text":940,"config":941},"Conformité logicielle",{"href":942,"dataGaName":943,"dataGaLocation":840},"/fr-fr/solutions/software-compliance/","software compliance",{"title":945,"link":946,"items":951},"Mesures",{"config":947},{"icon":948,"href":949,"dataGaName":950,"dataGaLocation":840},"DigitalTransformation","/fr-fr/solutions/visibility-measurement/","visibility and measurement",[952,956,961],{"text":953,"config":954},"Visibilité et mesures",{"href":949,"dataGaLocation":840,"dataGaName":955},"Visibility and Measurement",{"text":957,"config":958},"Gestion de la chaîne de valeur",{"href":959,"dataGaLocation":840,"dataGaName":960},"/fr-fr/solutions/value-stream-management/","Value Stream Management",{"text":962,"config":963},"Analyses et informations",{"href":964,"dataGaLocation":840,"dataGaName":965},"/fr-fr/solutions/analytics-and-insights/","Analytics and insights",{"title":967,"type":891,"items":968},"GitLab",[969,975,981],{"text":970,"config":971},"Entreprises",{"icon":972,"href":973,"dataGaLocation":840,"dataGaName":974},"Building","/fr-fr/enterprise/","enterprise",{"text":976,"config":977},"Pour les PME",{"icon":978,"href":979,"dataGaLocation":840,"dataGaName":980},"Work","/fr-fr/small-business/","small business",{"text":982,"config":983},"Pour le secteur public",{"icon":984,"href":985,"dataGaLocation":840,"dataGaName":986},"Organization","/fr-fr/solutions/public-sector/","public sector",{"text":988,"config":989},"Tarifs",{"href":990,"dataGaName":991,"dataGaLocation":840,"dataNavLevelOne":991},"/fr-fr/pricing/","pricing",{"text":993,"config":994,"menu":996},"Ressources",{"dataNavLevelOne":995},"resources",{"type":891,"link":997,"columns":1001,"feature":1095},{"text":998,"config":999},"Afficher toutes les ressources",{"href":1000,"dataGaName":995,"dataGaLocation":840},"/fr-fr/resources/",[1002,1035,1062],{"title":1003,"items":1004},"Premiers pas",[1005,1010,1015,1020,1025,1030],{"text":1006,"config":1007},"Installation",{"href":1008,"dataGaName":1009,"dataGaLocation":840},"/fr-fr/install/","install",{"text":1011,"config":1012},"Guides de démarrage",{"href":1013,"dataGaName":1014,"dataGaLocation":840},"/fr-fr/get-started/","quick setup checklists",{"text":1016,"config":1017},"Apprentissage",{"href":1018,"dataGaLocation":840,"dataGaName":1019},"https://university.gitlab.com/","learn",{"text":1021,"config":1022},"Documentation",{"href":1023,"dataGaName":1024,"dataGaLocation":840},"https://docs.gitlab.com/","product documentation",{"text":1026,"config":1027},"Vidéos sur les bonnes pratiques",{"href":1028,"dataGaName":1029,"dataGaLocation":840},"/fr-fr/getting-started-videos/","best practice videos",{"text":1031,"config":1032},"Intégrations",{"href":1033,"dataGaName":1034,"dataGaLocation":840},"/fr-fr/integrations/","integrations",{"title":1036,"items":1037},"Découvrir",[1038,1043,1048,1053,1057],{"text":1039,"config":1040},"Témoignages clients",{"href":1041,"dataGaName":1042,"dataGaLocation":840},"/fr-fr/customers/","customer success stories",{"text":1044,"config":1045},"Blog",{"href":1046,"dataGaName":1047,"dataGaLocation":840},"/fr-fr/blog/","blog",{"text":1049,"config":1050},"Demo Hub",{"href":1051,"dataGaName":1052,"dataGaLocation":840},"/fr-fr/demo-hub/","demo hub",{"text":1054,"config":1055},"The Source",{"href":1056,"dataGaName":1047,"dataGaLocation":840},"/fr-fr/the-source/",{"text":1058,"config":1059},"Travail à distance",{"href":1060,"dataGaName":1061,"dataGaLocation":840},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1063,"items":1064},"Connecter",[1065,1070,1075,1080,1085,1090],{"text":1066,"config":1067},"Services GitLab",{"href":1068,"dataGaName":1069,"dataGaLocation":840},"/fr-fr/services/","services",{"text":1071,"config":1072},"Contribuer",{"href":1073,"dataGaName":1074,"dataGaLocation":840},"https://contributors.gitlab.com","contribute",{"text":1076,"config":1077},"Communauté",{"href":1078,"dataGaName":1079,"dataGaLocation":840},"/community/","community",{"text":1081,"config":1082},"Forum",{"href":1083,"dataGaName":1084,"dataGaLocation":840},"https://forum.gitlab.com/","forum",{"text":1086,"config":1087},"Événements",{"href":1088,"dataGaName":1089,"dataGaLocation":840},"/events/","events",{"text":1091,"config":1092},"Partenaires",{"href":1093,"dataGaName":1094,"dataGaLocation":840},"/fr-fr/partners/","partners",{"config":1096,"title":1099,"text":1100,"link":1101},{"background":1097,"textColor":1098},"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":1102,"config":1103},"Lire les articles les plus récents",{"href":1104,"dataGaName":1105,"dataGaLocation":840},"/fr-fr/whats-new/","whats new",{"text":1107,"config":1108,"menu":1110},"Société",{"dataNavLevelOne":1109},"company",{"type":891,"columns":1111},[1112],{"items":1113},[1114,1119,1125,1127,1132,1137,1142,1147,1152,1157],{"text":1115,"config":1116},"À propos",{"href":1117,"dataGaName":1118,"dataGaLocation":840},"/fr-fr/company/","about",{"text":1120,"config":1121,"footerGa":1124},"Carrières",{"href":1122,"dataGaName":1123,"dataGaLocation":840},"/jobs/","jobs",{"dataGaName":1123},{"text":1086,"config":1126},{"href":1088,"dataGaName":1089,"dataGaLocation":840},{"text":1128,"config":1129},"Leadership",{"href":1130,"dataGaName":1131,"dataGaLocation":840},"/company/team/e-group/","leadership",{"text":1133,"config":1134},"Manuel",{"href":1135,"dataGaName":1136,"dataGaLocation":840},"https://handbook.gitlab.com/","handbook",{"text":1138,"config":1139},"Relations avec les investisseurs",{"href":1140,"dataGaName":1141,"dataGaLocation":840},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1143,"config":1144},"Trust Center",{"href":1145,"dataGaName":1146,"dataGaLocation":840},"/fr-fr/security/","trust center",{"text":1148,"config":1149},"Centre pour la transparence de l'IA",{"href":1150,"dataGaName":1151,"dataGaLocation":840},"/fr-fr/ai-transparency-center/","ai transparency center",{"text":1153,"config":1154},"Newsletter",{"href":1155,"dataGaName":1156,"dataGaLocation":840},"/company/contact/#contact-forms","newsletter",{"text":1158,"config":1159},"Presse",{"href":1160,"dataGaName":1161,"dataGaLocation":840},"/press/","press",{"text":1163,"config":1164,"menu":1165},"Nous contacter",{"dataNavLevelOne":1109},{"type":891,"columns":1166},[1167],{"items":1168},[1169,1174,1179],{"text":1170,"config":1171},"Contacter l'équipe commerciale",{"href":1172,"dataGaName":1173,"dataGaLocation":840},"/fr-fr/sales/","talk to sales",{"text":1175,"config":1176},"Assistance GitLab",{"href":1177,"dataGaName":1178,"dataGaLocation":840},"https://support.gitlab.com/hc/en-us","support portal",{"text":1180,"config":1181},"Portail clients GitLab",{"href":1182,"dataGaName":1183,"dataGaLocation":840},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1185,"login":1186,"suggestions":1193},"Fermer",{"text":1187,"link":1188},"Pour rechercher des dépôts et des projets, connectez-vous à",{"text":1189,"config":1190},"GitLab.com",{"href":854,"dataGaName":1191,"dataGaLocation":1192},"search login","search",{"text":1194,"default":1195},"Suggestions",[1196,1199,1204,1206,1211,1216],{"text":871,"config":1197},{"href":876,"dataGaName":1198,"dataGaLocation":1192},"GitLab Duo Agent Platform",{"text":1200,"config":1201},"Suggestions de code (IA)",{"href":1202,"dataGaName":1203,"dataGaLocation":1192},"/fr-fr/solutions/code-suggestions/","Code Suggestions (AI)",{"text":829,"config":1205},{"href":908,"dataGaName":829,"dataGaLocation":1192},{"text":1207,"config":1208},"GitLab sur AWS",{"href":1209,"dataGaName":1210,"dataGaLocation":1192},"/fr-fr/partners/technology-partners/aws/","GitLab on AWS",{"text":1212,"config":1213},"GitLab sur Google Cloud",{"href":1214,"dataGaName":1215,"dataGaLocation":1192},"/fr-fr/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":1217,"config":1218},"Pourquoi utiliser GitLab ?",{"href":884,"dataGaName":1219,"dataGaLocation":1192},"Why GitLab?",{"freeTrial":1221,"mobileIcon":1226,"desktopIcon":1231,"secondaryButton":1234},{"text":1222,"config":1223},"Commencer votre essai gratuit",{"href":1224,"dataGaName":845,"dataGaLocation":1225},"https://gitlab.com/-/trials/new/","nav",{"altText":1227,"config":1228},"Icône GitLab",{"src":1229,"dataGaName":1230,"dataGaLocation":1225},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1227,"config":1232},{"src":1233,"dataGaName":1230,"dataGaLocation":1225},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1235,"config":1236},"Commencer",{"href":1237,"dataGaName":1238,"dataGaLocation":1225},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr/get-started/","get started",{"freeTrial":1240,"mobileIcon":1244,"desktopIcon":1246},{"text":1241,"config":1242},"En savoir plus sur GitLab Duo",{"href":876,"dataGaName":1243,"dataGaLocation":1225},"gitlab duo",{"altText":1227,"config":1245},{"src":1229,"dataGaName":1230,"dataGaLocation":1225},{"altText":1227,"config":1247},{"src":1233,"dataGaName":1230,"dataGaLocation":1225},{"button":1249,"mobileIcon":1254,"desktopIcon":1256},{"text":1250,"config":1251},"/switch",{"href":1252,"dataGaName":1253,"dataGaLocation":1225},"#contact","switch",{"altText":1227,"config":1255},{"src":1229,"dataGaName":1230,"dataGaLocation":1225},{"altText":1227,"config":1257},{"src":1258,"dataGaName":1230,"dataGaLocation":1225},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1260,"mobileIcon":1265,"desktopIcon":1267},{"text":1261,"config":1262},"Retour aux tarifs",{"href":990,"dataGaName":1263,"dataGaLocation":1225,"icon":1264},"back to pricing","GoBack",{"altText":1227,"config":1266},{"src":1229,"dataGaName":1230,"dataGaLocation":1225},{"altText":1227,"config":1268},{"src":1233,"dataGaName":1230,"dataGaLocation":1225},{"title":1270,"button":1271,"config":1275},"GitLab Orbit est arrivé : la couche de contexte pour les agents d'IA.",{"text":882,"config":1272},{"href":1273,"dataGaName":1274,"dataGaLocation":840},"/fr-fr/gitlab-orbit/","orbit",{"layout":69,"disabled":817},{"data":1277},{"text":1278,"source":1279,"edit":1285,"contribute":1290,"config":1294,"items":1299,"minimal":1505},"Git est une marque déposée de Software Freedom Conservancy et notre utilisation de « GitLab » est sous licence.",{"text":1280,"config":1281},"Afficher le code source de la page",{"href":1282,"dataGaName":1283,"dataGaLocation":1284},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1286,"config":1287},"Modifier cette page",{"href":1288,"dataGaName":1289,"dataGaLocation":1284},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1071,"config":1291},{"href":1292,"dataGaName":1293,"dataGaLocation":1284},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1295,"facebook":1296,"youtube":1297,"linkedin":1298},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1300,1346,1397,1440,1472],{"title":988,"links":1301,"subMenu":1316},[1302,1306,1311],{"text":1303,"config":1304},"Voir les forfaits",{"href":990,"dataGaName":1305,"dataGaLocation":1284},"view plans",{"text":1307,"config":1308},"GitLab Premium",{"href":1309,"dataGaName":1310,"dataGaLocation":1284},"/fr-fr/pricing/premium/","why premium",{"text":1312,"config":1313},"GitLab Ultimate",{"href":1314,"dataGaName":1315,"dataGaLocation":1284},"/fr-fr/pricing/ultimate/","why ultimate",[1317],{"title":1163,"links":1318},[1319,1321,1323,1326,1331,1336,1341],{"text":1170,"config":1320},{"href":1172,"dataGaName":850,"dataGaLocation":1284},{"text":1175,"config":1322},{"href":1177,"dataGaName":1178,"dataGaLocation":1284},{"text":1324,"config":1325},"Portail clients",{"href":1182,"dataGaName":1183,"dataGaLocation":1284},{"text":1327,"config":1328},"Statut",{"href":1329,"dataGaName":1330,"dataGaLocation":1284},"https://status.gitlab.com/","status",{"text":1332,"config":1333},"Conditions d'utilisation",{"href":1334,"dataGaName":1335,"dataGaLocation":1284},"/terms/","terms of use",{"text":1337,"config":1338},"Politique de confidentialité",{"href":1339,"dataGaName":1340,"dataGaLocation":1284},"/fr-fr/privacy/","privacy statement",{"text":1342,"config":1343},"Gestion des cookies",{"dataGaName":1344,"dataGaLocation":1284,"id":1345,"isOneTrustButton":351},"cookie preferences","ot-sdk-btn",{"title":887,"links":1347,"subMenu":1356},[1348,1352],{"text":1349,"config":1350},"Plateforme DevSecOps",{"href":869,"dataGaName":1351,"dataGaLocation":1284},"devsecops platform",{"text":1353,"config":1354},"Développement assisté par l'IA",{"href":876,"dataGaName":1355,"dataGaLocation":1284},"ai-assisted development",[1357],{"title":1358,"links":1359},"Thèmes",[1360,1364,1369,1373,1378,1382,1387,1392],{"text":829,"config":1361},{"href":1362,"dataGaName":1363,"dataGaLocation":1284},"/fr-fr/topics/ci-cd/","cicd",{"text":1365,"config":1366},"GitOps",{"href":1367,"dataGaName":1368,"dataGaLocation":1284},"/fr-fr/topics/gitops/","gitops",{"text":830,"config":1370},{"href":1371,"dataGaName":1372,"dataGaLocation":1284},"/fr-fr/topics/devops/","devops",{"text":1374,"config":1375},"Contrôle de version",{"href":1376,"dataGaName":1377,"dataGaLocation":1284},"/fr-fr/topics/version-control/","version control",{"text":831,"config":1379},{"href":1380,"dataGaName":1381,"dataGaLocation":1284},"/fr-fr/topics/devsecops/","devsecops",{"text":1383,"config":1384},"Cloud-native",{"href":1385,"dataGaName":1386,"dataGaLocation":1284},"/fr-fr/topics/cloud-native/","cloud native",{"text":1388,"config":1389},"IA pour la programmation",{"href":1390,"dataGaName":1391,"dataGaLocation":1284},"/fr-fr/topics/devops/ai-for-coding/","ai for coding",{"text":1393,"config":1394},"IA agentique",{"href":1395,"dataGaName":1396,"dataGaLocation":1284},"/fr-fr/topics/agentic-ai/","agentic ai",{"title":1398,"links":1399},"Solutions",[1400,1403,1405,1410,1413,1416,1419,1422,1424,1427,1430,1435],{"text":931,"config":1401},{"href":926,"dataGaName":1402,"dataGaLocation":1284},"Application Security Testing",{"text":918,"config":1404},{"href":903,"dataGaName":904,"dataGaLocation":1284},{"text":1406,"config":1407},"Développement Agile",{"href":1408,"dataGaName":1409,"dataGaLocation":1284},"/fr-fr/solutions/agile-delivery/","agile delivery",{"text":913,"config":1411},{"href":915,"dataGaName":1412,"dataGaLocation":1284},"source code management",{"text":829,"config":1414},{"href":908,"dataGaName":1415,"dataGaLocation":1284},"continuous integration & delivery",{"text":957,"config":1417},{"href":959,"dataGaName":1418,"dataGaLocation":1284},"value stream management",{"text":1365,"config":1420},{"href":1421,"dataGaName":1368,"dataGaLocation":1284},"/fr-fr/solutions/gitops/",{"text":970,"config":1423},{"href":973,"dataGaName":974,"dataGaLocation":1284},{"text":1425,"config":1426},"PME",{"href":979,"dataGaName":980,"dataGaLocation":1284},{"text":1428,"config":1429},"Secteur public",{"href":985,"dataGaName":986,"dataGaLocation":1284},{"text":1431,"config":1432},"Éducation",{"href":1433,"dataGaName":1434,"dataGaLocation":1284},"/fr-fr/solutions/education/","education",{"text":1436,"config":1437},"Services financiers",{"href":1438,"dataGaName":1439,"dataGaLocation":1284},"/fr-fr/solutions/finance/","financial services",{"title":993,"links":1441},[1442,1444,1446,1448,1451,1453,1456,1458,1460,1462,1464,1466,1468,1470],{"text":1006,"config":1443},{"href":1008,"dataGaName":1009,"dataGaLocation":1284},{"text":1011,"config":1445},{"href":1013,"dataGaName":1014,"dataGaLocation":1284},{"text":1016,"config":1447},{"href":1018,"dataGaName":1019,"dataGaLocation":1284},{"text":1021,"config":1449},{"href":1023,"dataGaName":1450,"dataGaLocation":1284},"docs",{"text":1044,"config":1452},{"href":1046,"dataGaName":1047,"dataGaLocation":1284},{"text":1454,"config":1455},"Nouveautés",{"href":1104,"dataGaName":1105,"dataGaLocation":1284},{"text":1039,"config":1457},{"href":1041,"dataGaName":1042,"dataGaLocation":1284},{"text":1058,"config":1459},{"href":1060,"dataGaName":1061,"dataGaLocation":1284},{"text":1066,"config":1461},{"href":1068,"dataGaName":1069,"dataGaLocation":1284},{"text":1071,"config":1463},{"href":1073,"dataGaName":1074,"dataGaLocation":1284},{"text":1076,"config":1465},{"href":1078,"dataGaName":1079,"dataGaLocation":1284},{"text":1081,"config":1467},{"href":1083,"dataGaName":1084,"dataGaLocation":1284},{"text":1086,"config":1469},{"href":1088,"dataGaName":1089,"dataGaLocation":1284},{"text":1091,"config":1471},{"href":1093,"dataGaName":1094,"dataGaLocation":1284},{"title":1107,"links":1473},[1474,1476,1478,1480,1482,1484,1489,1494,1496,1498,1500],{"text":1115,"config":1475},{"href":1117,"dataGaName":1109,"dataGaLocation":1284},{"text":1120,"config":1477},{"href":1122,"dataGaName":1123,"dataGaLocation":1284},{"text":1128,"config":1479},{"href":1130,"dataGaName":1131,"dataGaLocation":1284},{"text":1133,"config":1481},{"href":1135,"dataGaName":1136,"dataGaLocation":1284},{"text":1138,"config":1483},{"href":1140,"dataGaName":1141,"dataGaLocation":1284},{"text":1485,"config":1486},"Développement durable",{"href":1487,"dataGaName":1488,"dataGaLocation":1284},"/sustainability/","Sustainability",{"text":1490,"config":1491},"Diversité, inclusion et appartenance (DIB)",{"href":1492,"dataGaName":1493,"dataGaLocation":1284},"/fr-fr/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1143,"config":1495},{"href":1145,"dataGaName":1146,"dataGaLocation":1284},{"text":1153,"config":1497},{"href":1155,"dataGaName":1156,"dataGaLocation":1284},{"text":1158,"config":1499},{"href":1160,"dataGaName":1161,"dataGaLocation":1284},{"text":1501,"config":1502},"Déclaration de transparence sur l'esclavage moderne",{"href":1503,"dataGaName":1504,"dataGaLocation":1284},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1506},[1507,1509,1511],{"text":1332,"config":1508},{"href":1334,"dataGaName":1335,"dataGaLocation":1284},{"text":1342,"config":1510},{"dataGaName":1344,"dataGaLocation":1284,"id":1345,"isOneTrustButton":351},{"text":1337,"config":1512},{"href":1339,"dataGaName":1340,"dataGaLocation":1284},[1514],{"id":1515,"title":7,"body":816,"config":1516,"content":1518,"description":816,"extension":1522,"meta":1523,"navigation":351,"path":1524,"seo":1525,"stem":1526,"__hash__":1527},"blogAuthors/en-us/blog/authors/ben-ridley.yml",{"template":1517},"BlogAuthor",{"name":7,"config":1519},{"headshot":1520,"ctfId":1521},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659973/Blog/Author%20Headshots/bridley-headshot.jpg","bridley","yml",{},"/en-us/blog/authors/ben-ridley",{},"en-us/blog/authors/ben-ridley","jzbrM-xtuSS5JZxX-wev-ipXW7XmcYogOOxnbq1GSrs",[1529,1538,1546],{"title":1530,"description":1531,"heroImage":1532,"category":813,"date":1533,"authors":1534,"slug":1537,"externalUrl":816},"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",[1535,1536],"Magdalena Frankiewicz","Priyanka Palanikumar","gitlab-restricted-access-improvements",{"title":1539,"description":1540,"heroImage":1541,"category":813,"date":1542,"authors":1543,"slug":1545,"externalUrl":816},"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",[1544],"Omid Khan","getting-started-with-gitlab-feature-flags-in-python",{"title":1547,"description":1548,"heroImage":1549,"category":813,"date":1550,"authors":1551,"slug":1553,"externalUrl":816},"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",[1552],"Corinne Dent","track-ci-component-usage",{"promotions":1555},[1556,1570,1581,1593],{"id":1557,"categories":1558,"header":1560,"text":1561,"button":1562,"image":1567},"ai-modernization",[1559],"ai","L'IA tient-elle ses promesses à grande échelle ?","Le questionnaire ne prendra pas plus de 5 minutes.",{"text":1563,"config":1564},"Obtenez votre score de maturité IA",{"href":1565,"dataGaName":1566,"dataGaLocation":1047},"/fr-fr/assessments/ai-modernization-assessment/","modernization assessment",{"config":1568},{"src":1569},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1571,"categories":1572,"header":1573,"text":1561,"button":1574,"image":1578},"devops-modernization",[813,1381],"Vous contentez-vous de gérer des outils ou de livrer des innovations ?",{"text":1575,"config":1576},"Obtenez votre score de maturité DevOps",{"href":1577,"dataGaName":1566,"dataGaLocation":1047},"/fr-fr/assessments/devops-modernization-assessment/",{"config":1579},{"src":1580},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1582,"categories":1583,"header":1585,"text":1561,"button":1586,"image":1590},"security-modernization",[1584],"security","Faut-il sacrifier la rapidité pour garantir la sécurité ?",{"text":1587,"config":1588},"Obtenez votre score de maturité en matière de sécurité",{"href":1589,"dataGaName":1566,"dataGaLocation":1047},"/fr-fr/assessments/security-modernization-assessment/",{"config":1591},{"src":1592},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1594,"paths":1595,"header":1598,"text":1599,"button":1600,"image":1605},"github-azure-migration",[1596,1597],"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":1601,"config":1602},"Découvrez les différences entre GitLab et GitHub",{"href":1603,"dataGaName":1604,"dataGaLocation":1047},"/fr-fr/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1606},{"src":1580},{"header":1608,"blurb":1609,"button":1610,"secondaryButton":1614},"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":842,"config":1611},{"href":1612,"dataGaName":845,"dataGaLocation":1613},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/fr-fr/","feature",{"text":1170,"config":1615},{"href":1172,"dataGaName":850,"dataGaLocation":1613},1786803785125]