{"title":"Comment est constitué Django ?","version":"5.1","locale":"fr","docname":"internals/howto-release-django","url":"/fr/5.1/internals/howto-release-django/","canonical":"https://djangodocs.dev/fr/5.1/internals/howto-release-django/","summary":"Ce document explique comment est réalisée une publication de Django. Veuillez s’il-vous-plaît garder ces instructions à jour si vous procédez à des modifications !…","html":"<h1>Comment est constitué Django ?<a class=\"heading-anchor\" href=\"#how-is-django-formed\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Ce document explique comment est réalisée une publication de Django.</p>\n<p><strong>Veuillez s’il-vous-plaît garder ces instructions à jour si vous procédez à des modifications !</strong> La clé ici est d’être descriptif et non pas normatif, sentez-vous donc libre de simplifier ou de faire d’autres changements dans la procédure, mais alors <strong>mettez à jour ce document en fonction !</strong></p>\n<section id=\"overview\">\n<h2>Aperçu<a class=\"heading-anchor\" href=\"#overview\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Il peut être nécessaire d’effectuer trois différents types de publications :</p>\n<ul class=\"simple\">\n<li><p>Publications de sécurité : annonce et résolution d’une vulnérabilité. Cela implique généralement deux ou trois publications simultanées – par ex. 3.2.x, 4.0.x et selon le timing, peut-être une 4.1.x.</p></li>\n<li><p>Publications de version normale : soit une publication finale (par ex. 4.1) ou une mise à jour corrective (par ex. 4.1.1).</p></li>\n<li><p>Prépublications : par ex. 4.2 alpha, bêta ou rc.</p></li>\n</ul>\n<p>La version courte des étapes à suivre est :</p>\n<ol class=\"arabic simple\">\n<li><p>S’il s’agit d’une publication de sécurité, prénotifier la liste de distribution de sécurité une semaine avant la publication effective.</p></li>\n<li><p>Relire les notes de publication, particulièrement en ce qui concerne leur organisation et leur formulation. Écrire un brouillon d’article de blog et de courriel d’annonce.</p></li>\n<li><p>Mettre à jour les numéros de version et créer le ou les paquets de la publication.</p></li>\n<li><p>Envoyer le ou les paquets sur le serveur <code class=\"docutils literal notranslate\">djangoproject.com</code>.</p></li>\n<li><p>Vérifier les signatures du ou des paquets, contrôler s’ils peuvent être installés et s’assurer de leur fonctionnement minimal.</p></li>\n<li><p>Envoyer la ou les nouvelles versions au serveur PyPI.</p></li>\n<li><p>Déclarer la nouvelle version dans l’interface d’administration de <code class=\"docutils literal notranslate\">djangoproject.com</code>.</p></li>\n<li><p>Publier l’article de blog et envoyer le courriel d’annonce.</p></li>\n<li><p>Mettre à jour les numéros de version après la publication.</p></li>\n</ol>\n<p>Il y a beaucoup de détails, accrochez-vous !</p>\n</section>\n<section id=\"prerequisites\">\n<h2>Prérequis<a class=\"heading-anchor\" href=\"#prerequisites\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Certains prérequis sont nécessaires avant de commencer. S’il s’agit de votre première publication, vous devriez vous coordonner avec un autre publicateur afin de régler ces différentes exigences et écrire à la liste de diffusion des opérateurs pour demander l’accès et les permissions requises.</p>\n<ul>\n<li><p>Un environnement Unix avec les outils suivants installés (par ordre alphabétique) :</p>\n<ul class=\"simple\">\n<li><p>bash</p></li>\n<li><p>git</p></li>\n<li><p>GPG</p></li>\n<li><p>make</p></li>\n<li><p>man</p></li>\n<li><p>des outils de hachage (typiquement <code class=\"docutils literal notranslate\">md5sum</code>, <code class=\"docutils literal notranslate\">sha1sum</code> et <code class=\"docutils literal notranslate\">sha256sum</code> sur Linux, ou <code class=\"docutils literal notranslate\">md5</code> et <code class=\"docutils literal notranslate\">shasum</code> sur macOS)</p></li>\n<li><p>python</p></li>\n<li><p>ssh</p></li>\n</ul>\n</li>\n<li><p>Une paire de clé GPG. Assurez-vous de garder confidentielle la partie privée de la clé, dans un endroit sécurisé. La partie publique doit être envoyée sur votre compte GitHub ainsi que sur le serveur Jenkins exécutant la tâche «confirm release».</p>\n<aside class=\"admonition-more-than-one-gpg-key admonition\" role=\"note\">\n<p class=\"admonition-title\">Plus d’une clé GPG</p>\n<p>Si la clé que vous souhaitez utiliser n’est pas votre clé de signature par défaut, vous devrez ajouter <code class=\"docutils literal notranslate\">-u vous&#64;example.com</code> à chaque commande de signature GPG affichée ci-dessous, où <code class=\"docutils literal notranslate\">vous&#64;example.com</code> est l’adresse de courriel associée à la clé que vous allez utiliser.</p>\n</aside>\n</li>\n<li><p>Un environnement virtuel Python propre par version de Django à publier, avec ces paquets Python obligatoirement installés :</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>$ python -m pip install build twine\n</code></pre></div>\n</li>\n<li><p>Un accès au <a class=\"reference external\" href=\"https://pypi.org/project/Django/\">projet Django sur PyPI</a> pour envoyer les fichiers binaires, idéalement avec la permission d’annulation de publication &lt;<a class=\"reference external\" href=\"https://pypi.org/help/#yanked\">https://pypi.org/help/#yanked</a>&gt;`_ au cas où cela serait nécessaire. Créez un jeton de portée de projet en suivant la <a class=\"reference external\" href=\"https://pypi.org/help/#apitoken\">documentation officielle</a> et configurez votre fichier <code class=\"docutils literal notranslate\">$HOME/.pypirc</code> comme ceci :</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"ini\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">~/.pypirc</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Ini</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Ini code\"><code><span class=\"k\">[distutils]</span>\n  <span class=\"na\">index-servers</span> <span class=\"o\">=</span>\n    <span class=\"na\">pypi</span>\n    <span class=\"na\">django</span>\n\n<span class=\"k\">[pypi]</span>\n  <span class=\"na\">username</span> <span class=\"o\">=</span> <span class=\"s\">__token__</span>\n  <span class=\"na\">password</span> <span class=\"o\">=</span> <span class=\"c1\"># User-scoped or project-scoped token, to set as the default.</span>\n\n<span class=\"k\">[django]</span>\n  <span class=\"na\">repository</span> <span class=\"o\">=</span> <span class=\"s\">https://upload.pypi.org/legacy/</span>\n  <span class=\"na\">username</span> <span class=\"o\">=</span> <span class=\"s\">__token__</span>\n  <span class=\"na\">password</span> <span class=\"o\">=</span> <span class=\"c1\"># A project token.</span>\n</code></pre></figure>\n</li>\n<li><p>Un accès au <a class=\"reference external\" href=\"https://app.transifex.com/django/django/\">projet Django sur Transifex</a>, avec rôle de gestionnaire. Générez un jeton d’API dans la <a class=\"reference external\" href=\"https://app.transifex.com/user/settings/api/\">section des réglages d’utilisation</a> et configurez votre fichier <code class=\"docutils literal notranslate\">$HOME/.transifexrc</code> comme ceci :</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"ini\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">~/.transifexrc</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Ini</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Ini code\"><code><span class=\"k\">[https://www.transifex.com]</span>\n  <span class=\"na\">rest_hostname</span> <span class=\"o\">=</span> <span class=\"s\">https://rest.api.transifex.com</span>\n  <span class=\"na\">token</span> <span class=\"o\">=</span> <span class=\"c1\"># API token</span>\n</code></pre></figure>\n</li>\n<li><p>Un accès au serveur <code class=\"docutils literal notranslate\">djangoproject.com</code> pour y envoyer des fichiers (en utilisant <code class=\"docutils literal notranslate\">scp</code>).</p></li>\n<li><p>Un accès à l’interface d’administration Django de <code class=\"docutils literal notranslate\">djangoproject.com</code> comme « mainteneur de site ».</p></li>\n<li><p>Un accès pour écrire un article sur le <a class=\"reference external\" href=\"https://forum.djangoproject.com/c/announcements/7\">forum Django - catégorie des annonces</a> et pour envoyer des courriels aux listes de diffusion suivantes :</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference external\" href=\"https://groups.google.com/g/django-announce/\">django-announce</a></p></li>\n</ul>\n</li>\n<li><p>Un accès au dépôt <code class=\"docutils literal notranslate\">django-security</code> sur GitHub. Parmi d’autres choses, cela donne accès à la liste de distribution de prénotification (nécessaire pour les tâches de préparation des publications de sécurité).</p></li>\n</ul>\n</section>\n<section id=\"pre-release-tasks\">\n<h2>Tâches de pré-publication<a class=\"heading-anchor\" href=\"#pre-release-tasks\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Il faut s’occuper de quelques tâches avant même de commencer le processus de publication en tant que tel. Celles-ci commencent environ une semaine avant la publication ; la plupart peuvent être réalisées à n’importe quel moment précédant la publication réelle.</p>\n<section id=\"or-more-days-before-a-security-release\">\n<h3>10 jours (ou plus) avant une publication de sécurité<a class=\"heading-anchor\" href=\"#or-more-days-before-a-security-release\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<ol class=\"arabic simple\">\n<li><p>Faites la demande d’un <a class=\"reference external\" href=\"https://cveform.mitre.org/\">ID CVE</a>  pour la correction du problème de sécurité qui sera publiée. Un identifiant par problème, demandé avec <code class=\"docutils literal notranslate\">Vendor: djangoproject</code> et <code class=\"docutils literal notranslate\">Product: django</code>.</p></li>\n<li><p>Produisez le ou les correctifs appropriés (et privés) en utilisant <code class=\"docutils literal notranslate\">git format-patch</code>, un pour la branche <code class=\"docutils literal notranslate\">main</code> et un pour chaque branche stable soumise à cette correction.</p></li>\n</ol>\n</section>\n<section id=\"a-week-before-a-security-release\">\n<h3>Une semaine avant une publication de sécurité<a class=\"heading-anchor\" href=\"#a-week-before-a-security-release\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<ol class=\"arabic\">\n<li><p>Envoyez une notification préalable exactement <strong>une semaine</strong> avant la publication de sécurité. Le modèle de ce message ainsi qu’une liste de destinataires se trouvent dans le wiki GitHub privé <code class=\"docutils literal notranslate\">django-security</code>. Placer les destinataires en copie cachée en prenant soin d’y inclure les identifiants CVE adéquats. Joignez tous les correctifs des vulnérabilités corrigées (concernant les branches <code class=\"docutils literal notranslate\">main</code> et stables) et signez le texte du courriel avec la clé qui sera utilisée pour la publication, avec une commande telle que :</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>$ gpg --clearsign --digest-algo SHA256 prenotification-email.txt\n</code></pre></div>\n</li>\n<li><p><a class=\"reference internal\" href=\"/fr/5.1/internals/security/#security-disclosure\"><span class=\"std std-ref\">Notifiez django-announce</span></a> au sujet de la mise à jour de sécurité à venir avec un message général du genre :</p>\n<div class=\"code-block\" data-language=\"text\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Text code\"><code>Notice of upcoming Django security releases (3.2.24, 4.2.10 and 5.0.2)\n\nDjango versions 5.0.2, 4.2.10, and 3.2.24 will be released on Tuesday,\nFebruary 6th, 2024 around 1500 UTC. They will fix one security defect\nwith severity &quot;moderate&quot;.\n\nFor details of severity levels, see:\nhttps://docs.djangoproject.com/en/dev/internals/security/#how-django-discloses-security-issues\n</code></pre></div>\n</li>\n</ol>\n</section>\n<section id=\"a-few-days-before-any-release\">\n<h3>Quelques jours avant toute publication<a class=\"heading-anchor\" href=\"#a-few-days-before-any-release\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<ol class=\"arabic\">\n<li><p>À l’approche de la publication, surveillez Trac pour vous assurer qu’aucun ticket bloquant ne reste pour la prochaine publication. Dans des circonstances exceptionnelles, comme par exemple le respect d’une date de publication de sécurité prédéterminée, une publication peut tout de même avoir lieu avec des tickets bloquants ouverts. Le publicateur est responsable de la décision de publier même si des tickets bloquants sont encore ouverts ou de différer la date de publication si nécessaire, quand celle-ci n’est pas liée à la sécurité.</p></li>\n<li><p>Se coordonner avec les autres fusionneurs pour être sûr qu’ils n’ont pas de commits en attente pour cette publication.</p></li>\n<li><p>Relire les notes de publication, y compris la version en ligne pour <a class=\"reference internal\" href=\"/fr/5.1/internals/contributing/writing-documentation/#documentation-link-check\"><span class=\"std std-ref\">détecter tout lien cassé</span></a> ou erreur reST, et s’assurer que les notes de publication contiennent la bonne date.</p></li>\n<li><p>Revérifier que les notes de publication mentionnent la planification d’obsolescence pour toute API signalée comme obsolète et qu’elles mentionnent tout changement dans la prise en charge des versions de Python.</p></li>\n<li><p>Revérifier que le sommaire des notes de publication contienne un lien vers les notes de la nouvelle publication ; le fichier concerné est <code class=\"docutils literal notranslate\">docs/releases/index.txt</code>.</p></li>\n<li><p>S’il s’agit d’une <a class=\"reference internal\" href=\"/fr/5.1/internals/release-process/#term-Feature-release\"><span class=\"xref std std-term\">publication principale</span></a>, s’assurer que les traductions en provenance de Transifex ont été intégrées. Cette opération est parfois réalisée par un gestionnaire des traductions autre que le publicateur, mais voici les étapes à suivre. Ce processus est un peu long donc assurez-vous d’avoir 4-10 heures à y consacrer et idéalement planifiez cette tâche un ou deux jours avant le jour de la publication.</p>\n<p>En plus de posséder un compte Transifex configuré, la commande <a class=\"reference external\" href=\"https://developers.transifex.com/docs/cli\">tx CLI</a> doit être disponible dans votre chemin <code class=\"docutils literal notranslate\">PATH</code>. Vous pouvez alors récupérer toutes les traductions en lançant :</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>$ python scripts/manage_translations.py fetch\n</code></pre></div>\n<p>Cette commande prend du temps à s’exécuter. Lorsqu’elle a terminé, inspectez soigneusement le résultat au cas où des erreurs ou avertissements y figureraient. S’il y en a, vous devrez explorer pour résoudre ces problèmes au cas par cas.</p>\n<p>Les traductions récemment récupérées ont besoin d’ajustement manuel. Tout d’abord, les valeurs <code class=\"docutils literal notranslate\">PO-Revision-Date</code> doivent être manuellement mises à jour pour être postérieures à <code class=\"docutils literal notranslate\">POT-Creation-Date</code>. Vous pouvez utiliser une commande telle que celle-ci pour mettre à jour en lot tous les fichiers <code class=\"docutils literal notranslate\">.po</code> (comparez le diff avec la branche stable concernée) :</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>$ git diff --name-only stable/5.0.x <span class=\"p\">|</span> grep <span class=\"s2\">&quot;\\.po&quot;</span>  <span class=\"p\">|</span> xargs sed -ri <span class=\"s2\">&quot;s/PO-Revision-Date: [0-9\\-]+ /PO-Revision-Date: </span><span class=\"k\">$(</span>date -I<span class=\"k\">)</span><span class=\"s2\"> /g&quot;</span>\n</code></pre></div>\n<p>All the new <code class=\"docutils literal notranslate\">.po</code> files should be manually and carefully inspected to\navoid committing a change in a file without any new translations. Also,\nthere shouldn’t be any changes in the « plural forms »: if there are any\n(usually Spanish and French report changes for this) those will need\nreverting.</p>\n<p>Lastly, commit the changed/added files (both <code class=\"docutils literal notranslate\">.po</code> and <code class=\"docutils literal notranslate\">.mo</code>) and create\na new PR targeting the stable branch of the corresponding release (example\n<a class=\"reference external\" href=\"https://github.com/django/django/pull/16715\">PR updating translations for 4.2</a>).</p>\n</li>\n<li><p><a class=\"reference internal\" href=\"/fr/5.1/internals/contributing/writing-documentation/#django-admin-manpage\"><span class=\"std std-ref\">Mettez à jour la page de manuel de django-admin</span></a>:</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>$ <span class=\"nb\">cd</span> docs\n$ make man\n$ man _build/man/django-admin.1  <span class=\"c1\"># do a quick sanity check</span>\n$ cp _build/man/django-admin.1 man/django-admin.1\n</code></pre></div>\n<p>puis faites le commit de la page de manuel modifiée.</p>\n</li>\n<li><p>S’il s’agit de la version alpha d’une nouvelle série, créez une nouvelle branche stable à partir de <code class=\"docutils literal notranslate\">main</code>. Par exemple, lors de la publication de Django 4.2 :</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>$ git checkout -b stable/4.2.x origin/main\n$ git push origin -u stable/4.2.x:stable/4.2.x\n</code></pre></div>\n<p>En même temps, mettez à jour la variable <code class=\"docutils literal notranslate\">django_next_version</code> dans <code class=\"docutils literal notranslate\">docs/conf.py</code> de la branche de publication stable pour qu’elle pointe vers la nouvelle version de développement. Par exemple, lors de la création de <code class=\"docutils literal notranslate\">stable/4.2.x</code>, définissez <code class=\"docutils literal notranslate\">django_next_version</code> à <code class=\"docutils literal notranslate\">'5.0'</code> dans la nouvelle branche.</p>\n</li>\n<li><p>S’il s’agit de la publication « .0 » d’une nouvelle série, créez une nouvelle branche à partir de la branche stable actuelle dans le dépôt <a class=\"reference external\" href=\"https://github.com/django/django-docs-translations\">django-docs-translations</a>. Par exemple, lors de la publication de Django 4.2 :</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>$ git checkout -b stable/4.2.x origin/stable/4.1.x\n$ git push origin stable/4.2.x:stable/4.2.x\n</code></pre></div>\n</li>\n<li><p>Écrivez l’article de blog d’annonce de la publication. Vous pouvez l’écrire dans le site d’administration tout en le marquant comme inactif. Voici quelque exemples : <a class=\"reference external\" href=\"https://www.djangoproject.com/weblog/2013/feb/19/security/\">exemple d’annonce de publication de sécurité</a>, <a class=\"reference external\" href=\"https://www.djangoproject.com/weblog/2012/mar/23/14/\">exemple d’annonce de publication normale</a>, <a class=\"reference external\" href=\"https://www.djangoproject.com/weblog/2012/nov/27/15-beta-1/\">exemple d’annonce de pré-publication</a>.</p></li>\n</ol>\n</section>\n</section>\n<section id=\"actually-rolling-the-release\">\n<h2>Production réelle de la nouvelle version<a class=\"heading-anchor\" href=\"#actually-rolling-the-release\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Voilà, il s’agit maintenant de la partie sympa où nous allons effectivement produire la publication ! Si vous produisez <strong>plusieurs publications</strong>, répétez ces étapes pour chaque publication.</p>\n<ol class=\"arabic\">\n<li><p>Vérifiez que <a class=\"reference external\" href=\"https://djangoci.com\">Jenkins</a> est vert pour la ou les versions que vous allez produire. Vous ne devriez probablement pas produire de version tant que ce n’est pas vert, et vous devez vous assurer que la dernière exécution en vert inclue les modifications que vous allez publier.</p>\n</li>\n<li><p>Nettoyez les notes de cette publication. Faites les modifications dans <code class=\"docutils literal notranslate\">main</code> et rétroportez-les dans toutes les branches où les notes de publication de cette version apparaissent.</p>\n<ol class=\"arabic simple\">\n<li><p>Pour une publication majeure, enlevez l’en-tête <code class=\"docutils literal notranslate\">UNDER DEVELOPMENT</code> au sommet des notes de publication, enlevez le préfixe <code class=\"docutils literal notranslate\">Expected</code> et mettez à jour la date de publication si nécessaire (<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/1994a2643881a9e3f9fa8d3e0794c1a9933a1831\">commit d’exemple</a>).</p></li>\n<li><p>Pour une publication corrective, enlevez le préfixe <code class=\"docutils literal notranslate\">Expected</code> et mettez à jour la date de publication de toutes les publications, si nécessaire (<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/34a503162fe222033a1cd3249bccad014fcd1d20\">commit d’exemple</a>).</p></li>\n</ol>\n</li>\n<li><p>Une nouvelle version se base toujours sur une branche de publication, vous devriez donc vérifier que vous vous trouvez sur une branche stable et à jour. De plus, vous devriez avoir sous la main un environnement virtuel dédié pour chaque version à publier. Par exemple :</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>$ git checkout stable/4.1.x\n$ git pull\n</code></pre></div>\n</li>\n<li><p>S’il s’agit d’une mise à jour de sécurité, fusionnez les correctifs appropriés à partir de <code class=\"docutils literal notranslate\">django-security</code>. Rebasez ces correctifs si nécessaire pour que chacun d’entre eux soit un commit simple sur la branche de publication plutôt qu’un commit de fusion. Pour s’assurer de cela, fusionnez-les avec le drapeau <code class=\"docutils literal notranslate\">--ff-only</code>; par exemple :</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>$ git checkout stable/4.1.x\n$ git merge --ff-only security/4.1.x\n</code></pre></div>\n<p>(Cela suppose que <code class=\"docutils literal notranslate\">security/4.1.x</code> est une branche du dépôt <code class=\"docutils literal notranslate\">django-security</code> contenant les correctifs de sécurité nécessaires pour la prochaine publication de la série 4.1).</p>\n<p>Si Git refuse de fusionner avec <code class=\"docutils literal notranslate\">--ff-only</code>, revenez dans la branche des correctifs de sécurité et rebasez-la sur la branche dans laquelle vous allez effectuer la fusion (<code class=\"docutils literal notranslate\">git checkout security/4.1.x; git rebase stable/4.1.x</code>), puis retournez dans la branche initiale et effectuez la fusion. Vérifiez que le message de commit de chaque correction de sécurité explique qu’il s’agit bien d’un correctif de sécurité et qu’une annonce va suivre (<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/bf39978a53f117ca02e9a0c78b76664a41a54745\">exemple de commit de sécurité</a>).</p>\n</li>\n<li><p>Mettez à jour le numéro de version dans <code class=\"docutils literal notranslate\">django/__init__.py</code> pour la publication. Veuillez lire les <a class=\"reference internal\" href=\"#notes-on-setting-the-version-tuple\">notes sur la définition du tuple VERSION</a> ci-dessous pour plus de détails sur le format de <code class=\"docutils literal notranslate\">VERSION</code> (<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/2719a7f8c161233f45d34b624a9df9392c86cc1b\">commit d’exemple</a>).</p>\n<ol class=\"arabic simple\">\n<li><p>If this is a pre-release package also update the « Development Status »\ntrove classifier in <code class=\"docutils literal notranslate\">pyproject.toml</code> to reflect this. An <code class=\"docutils literal notranslate\">rc</code>\npre-release should not change the trove classifier (<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/eeeacc52a967234e920c001b7908c4acdfd7a848\">example\ncommit for alpha release</a>,\n<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/25fec8940b24107e21314ab6616e18ce8dec1c1c\">example commit for beta release</a>).</p></li>\n<li><p>Sinon, assurez-vous que le classificateur est défini à <code class=\"docutils literal notranslate\">Development Status :: 5 - Production/Stable</code>.</p></li>\n</ol>\n</li>\n<li><p>Placez une étiquette sur la publication avec <code class=\"docutils literal notranslate\">git tag</code>. Par exemple :</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>$ git tag --sign --message<span class=\"o\">=</span><span class=\"s2\">&quot;Tag 4.1.1&quot;</span> <span class=\"m\">4</span>.1.1\n</code></pre></div>\n<p>Vous pouvez contrôler votre travail en exécutant <code class=\"docutils literal notranslate\">git tag --verify &lt;tag&gt;</code>.</p>\n</li>\n<li><p>Poussez votre travail et la nouvelle étiquette :</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>$ git push\n$ git push --tags\n</code></pre></div>\n</li>\n<li><p>Assurez-vous d’avoir une arborescence parfaitement propre en exécutant <code class=\"docutils literal notranslate\">git clean -dfx</code>.</p></li>\n<li><p>Lancez python -m build` pour générer les paquets à publier. Ces paquets seront créés dans un répertoire <code class=\"docutils literal notranslate\">dist/</code>.</p></li>\n<li><p>Générez les empreintes des paquets à publier :</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>$ <span class=\"nb\">cd</span> dist\n$ md5sum *\n$ sha1sum *\n$ sha256sum *\n</code></pre></div>\n</li>\n<li><p>Créez un fichier « checksums », Django-&lt;&lt;VERSION&gt;&gt;.checksum.txt` contenant les empreintes et les informations de publication. Commencez avec ce modèle et insérez la version correcte, la date, l’identifiant de clé GPG (provenant de <code class=\"docutils literal notranslate\">gpg --list-keys --keyid-format LONG</code>), le nom d’utilisateur de responsable de version GitHub, l’URL de publication et les sommes de contrôle :</p>\n<div class=\"code-block\" data-language=\"text\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Text code\"><code>This file contains MD5, SHA1, and SHA256 checksums for the source-code\ntarball and wheel files of Django &lt;&lt;VERSION&gt;&gt;, released &lt;&lt;DATE&gt;&gt;.\n\nTo use this file, you will need a working install of PGP or other\ncompatible public-key encryption software. You will also need to have\nthe Django release manager&#39;s public key in your keyring. This key has\nthe ID ``XXXXXXXXXXXXXXXX`` and can be imported from the MIT\nkeyserver, for example, if using the open-source GNU Privacy Guard\nimplementation of PGP:\n\n    gpg --keyserver pgp.mit.edu --recv-key XXXXXXXXXXXXXXXX\n\nor via the GitHub API:\n\n    curl https://github.com/&lt;&lt;RELEASE MANAGER GITHUB USERNAME&gt;&gt;.gpg | gpg --import -\n\nOnce the key is imported, verify this file:\n\n    gpg --verify &lt;&lt;THIS FILENAME&gt;&gt;\n\nOnce you have verified this file, you can use normal MD5, SHA1, or SHA256\nchecksumming applications to generate the checksums of the Django\npackage and compare them to the checksums listed below.\n\nRelease packages\n================\n\nhttps://www.djangoproject.com/m/releases/&lt;&lt;MAJOR VERSION&gt;&gt;/&lt;&lt;RELEASE TAR.GZ FILENAME&gt;&gt;\nhttps://www.djangoproject.com/m/releases/&lt;&lt;MAJOR VERSION&gt;&gt;/&lt;&lt;RELEASE WHL FILENAME&gt;&gt;\n\nMD5 checksums\n=============\n\n&lt;&lt;MD5SUM&gt;&gt;  &lt;&lt;RELEASE TAR.GZ FILENAME&gt;&gt;\n&lt;&lt;MD5SUM&gt;&gt;  &lt;&lt;RELEASE WHL FILENAME&gt;&gt;\n\nSHA1 checksums\n==============\n\n&lt;&lt;SHA1SUM&gt;&gt;  &lt;&lt;RELEASE TAR.GZ FILENAME&gt;&gt;\n&lt;&lt;SHA1SUM&gt;&gt;  &lt;&lt;RELEASE WHL FILENAME&gt;&gt;\n\nSHA256 checksums\n================\n\n&lt;&lt;SHA256SUM&gt;&gt;  &lt;&lt;RELEASE TAR.GZ FILENAME&gt;&gt;\n&lt;&lt;SHA256SUM&gt;&gt;  &lt;&lt;RELEASE WHL FILENAME&gt;&gt;\n</code></pre></div>\n</li>\n<li><p>Signez le fichier de sommes de contrôle (<code class=\"docutils literal notranslate\">gpg --clearsign --digest-algo SHA256 Django-&lt;version&gt;.checksum.txt</code>). Cela produit un document signé, <code class=\"docutils literal notranslate\">Django-&lt;version&gt;.checksum.txt.asc</code> que vous pouvez ensuite vérifier avec <code class=\"docutils literal notranslate\">gpg --verify Django-&lt;version&gt;.checksum.txt.asc</code>.</p></li>\n</ol>\n</section>\n<section id=\"making-the-release-s-available-to-the-public\">\n<h2>Rendre la ou les publications publique(s)<a class=\"heading-anchor\" href=\"#making-the-release-s-available-to-the-public\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Vous êtes maintenant prêt à publier les nouveaux paquets. Pour cela :</p>\n<ol class=\"arabic\">\n<li><p>Téléversez les fichiers de sommes de contrôle :</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>$ scp Django-A.B.C.checksum.txt.asc djangoproject.com:/home/www/www/media/pgp/Django-A.B.C.checksum.txt\n</code></pre></div>\n<p>(S’il s’agit d’une publication de sécurité, ce qui suit doit être effectué 15 minutes avant le moment annoncé pour la publication, pas avant.)</p>\n</li>\n<li><p>Téléversez les paquets à publier sur le serveur djangoproject, en remplaçant A.B. par le numéro de version approprié, par ex. 4.1 pour une publication 4.1.x :</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>$ scp Django-* djangoproject.com:/home/www/www/media/releases/A.B\n</code></pre></div>\n<p>S’il s’agit de la publication alpha d’une nouvelle série, vous devrez créer <strong>d’abord</strong> le répertoire A.B.</p>\n</li>\n<li><p>Testez que les paquets à distribuer s’installent correctement avec <code class=\"docutils literal notranslate\">pip</code>. En voici une méthode simple (cela ne fait que tester que les binaires sont disponibles, qu’ils s’installent correctement, que les migrations fonctionnent et que le serveur de développement démarre, mais cela révélera les erreurs évidentes) :</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>$ <span class=\"nv\">RELEASE_VERSION</span><span class=\"o\">=</span><span class=\"s1\">&#39;4.1.1&#39;</span>\n$ <span class=\"nv\">MAJOR_VERSION</span><span class=\"o\">=</span><span class=\"sb\">`</span><span class=\"nb\">echo</span> <span class=\"nv\">$RELEASE_VERSION</span><span class=\"p\">|</span> cut -c <span class=\"m\">1</span>-3<span class=\"sb\">`</span>\n\n$ python -m venv django-pip-tarball\n$ . django-pip-tarball/bin/activate\n$ python -m pip install https://www.djangoproject.com/m/releases/<span class=\"nv\">$MAJOR_VERSION</span>/Django-<span class=\"nv\">$RELEASE_VERSION</span>.tar.gz\n$ django-admin startproject test_tarball\n$ <span class=\"nb\">cd</span> test_tarball\n$ ./manage.py --help  <span class=\"c1\"># Ensure executable bits</span>\n$ python manage.py migrate\n$ python manage.py runserver\n&lt;CTRL+C&gt;\n$ deactivate\n$ <span class=\"nb\">cd</span> .. <span class=\"o\">&amp;&amp;</span> rm -rf test_tarball <span class=\"o\">&amp;&amp;</span> rm -rf django-pip-tarball\n\n$ python -m venv django-pip-wheel\n$ . django-pip-wheel/bin/activate\n$ python -m pip install https://www.djangoproject.com/m/releases/<span class=\"nv\">$MAJOR_VERSION</span>/Django-<span class=\"nv\">$RELEASE_VERSION</span>-py3-none-any.whl\n$ django-admin startproject test_wheel\n$ <span class=\"nb\">cd</span> test_wheel\n$ ./manage.py --help  <span class=\"c1\"># Ensure executable bits</span>\n$ python manage.py migrate\n$ python manage.py runserver\n&lt;CTRL+C&gt;\n$ deactivate\n$ <span class=\"nb\">cd</span> .. <span class=\"o\">&amp;&amp;</span> rm -rf test_wheel <span class=\"o\">&amp;&amp;</span> rm -rf django-pip-wheel\n</code></pre></div>\n</li>\n<li><p>Lancez la construction <a class=\"reference external\" href=\"https://djangoci.com/job/confirm-release/\">confirm-release</a> sur Jenkins pour vérifier les fichiers de sommes de contrôle (par ex. utilisez <code class=\"docutils literal notranslate\">4.2rc1</code> pour <a class=\"reference external\" href=\"https://media.djangoproject.com/pgp/Django-4.2rc1.checksum.txt\">https://media.djangoproject.com/pgp/Django-4.2rc1.checksum.txt</a>).</p>\n</li>\n<li><p>Envoyez les paquets à publier vers PyPI (pour les prépublications, n’envoyez que le fichier wheel) :</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>$ twine upload --repository django dist/*\n</code></pre></div>\n</li>\n<li><p>Allez à la page <a class=\"reference external\" href=\"https://www.djangoproject.com/admin/releases/release/add/\">d’ajout de publication dans le site d’administration</a>, saisissez le nouveau numéro de version exactement tel qu’il apparaît dans le nom du fichier à publier (<code class=\"docutils literal notranslate\">Django-&lt;version&gt;.tar.gz</code>). Entrez donc par exemple « 4.1.1 » ou « 4.2rc1 », etc. Si la publication fait partie d’une branche LTS, indiquez-le.</p>\n<p>S’il s’agit de la version alpha d’une nouvelle série, créez aussi un objet Release pour la publication <em>finale</em>, en prenant soin de laisser vide le champ <em>Release date</em>, le marquant ainsi comme non publié. Par exemple, en créant l’objet Release pour <code class=\"docutils literal notranslate\">4.2a1</code>, créez aussi <code class=\"docutils literal notranslate\">4.2</code> en laissant vide son champ de date de publication.</p>\n</li>\n<li><p>Écrivez l’article de blog annonçant que la publication est en ligne.</p></li>\n<li><p>Pour une publication majeure (par ex. 4.1, 4.2), mettez à jour la version stable par défaut de la documentation en activant le drapeau <code class=\"docutils literal notranslate\">is_default</code> sur l’objet <code class=\"docutils literal notranslate\">DocumentRelease</code> approprié de la base de données <code class=\"docutils literal notranslate\">docs.djangoproject.com</code> (cela va automatiquement mettre à <code class=\"docutils literal notranslate\">False</code> ce drapeau pour toutes les autres instances) ; vous pouvez faire cela par le moyen du site d’administration.</p>\n<p>Créez des objets <code class=\"docutils literal notranslate\">DocumentRelease</code> pour chaque langue ayant déjà un tel objet pour une version précédente. Mettez à jour le fichier <a class=\"reference external\" href=\"https://github.com/django/djangoproject.com/blob/main/djangoproject/static/robots.docs.txt\">robots.docs.txt</a> de djangoproject.com en copiant le résultat obtenu en lançant la commande <code class=\"docutils literal notranslate\">manage_translations.py robots_txt</code> de la branche stable actuelle dans le <a class=\"reference external\" href=\"https://github.com/django/django-docs-translations\">dépôt  django-docs-translations</a>. Par exemple, lors de la publication de Django 4.2 :</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>$ git checkout stable/4.2.x\n$ git pull\n$ python manage_translations.py robots_txt\n</code></pre></div>\n</li>\n<li><p>Publiez l’annonce de publication sur la liste de diffusion <a class=\"reference internal\" href=\"/fr/5.1/internals/mailing-lists/#django-announce-mailing-list\"><span class=\"std std-ref\">django-announce</span></a> ainsi que sur le forum Django. Cette annonce doit contenir un lien vers l’article de blog de l’annonce.</p></li>\n<li><p>S’il s’agit d’une mise à jour de sécurité, envoyez un message séparé à <a class=\"reference external\" href=\"mailto:oss-security&#37;&#52;&#48;lists&#46;openwall&#46;com\">oss-security<span>&#64;</span>lists<span>&#46;</span>openwall<span>&#46;</span>com</a>. Indiquez un sujet descriptif tel que par exemple « Django » suivi du titre du problème provenant des notes de publication (y compris l’ID CVE). Le corps du message doit inclure les détails de la vulnérabilité, par exemple le texte de l’article de blog de l’annonce. Incluez un lien vers cet article de blog d’annonce.</p></li>\n</ol>\n</section>\n<section id=\"post-release\">\n<h2>Après la publication<a class=\"heading-anchor\" href=\"#post-release\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Vous êtes presque au bout ! Tout ce qui reste à faire est :</p>\n<ol class=\"arabic\">\n<li><p>Mettez à jour à nouveau le tuple <code class=\"docutils literal notranslate\">VERSION</code> dans <code class=\"docutils literal notranslate\">django/__init__.py</code>, en l’incrémentant à ce que la prochaine version devra donner. Par exemple, après la publication de 4.1.1, mettez à jour <code class=\"docutils literal notranslate\">VERSION</code> à <code class=\"docutils literal notranslate\">VERSION = (4, 1, 2, 'alpha', 0)</code>.</p></li>\n<li><p>Ajoutez la version dans la <a class=\"reference external\" href=\"https://code.djangoproject.com/admin/ticket/versions\">liste des versions de Trac</a> si nécessaire (et, s’il s’agit d’une version finale, mettez-la comme version par défaut en modifiant le réglage <code class=\"docutils literal notranslate\">default_version</code> dans le fichier <a class=\"reference external\" href=\"https://github.com/django/code.djangoproject.com/blob/main/trac-env/conf/trac.ini\">trac.ini</a> de code.djangoproject.com). La nouvelle version X.Y doit être ajoutée après la publication alpha et la version par défaut doit être mise à jour après la publication <code class=\"docutils literal notranslate\">.0</code>.</p>\n</li>\n<li><p>S’il s’agit d’une nouvelle version majeure :</p>\n<ol class=\"arabic simple\">\n<li><p>Mettez à jour la branche stable actuelle et enlevez les branches de pré-publication dans le <a class=\"reference external\" href=\"https://code.djangoproject.com/#Djangoreleaseprocess\">processus de publication de Django</a> sur Trac.</p></li>\n<li><p>Mettez à jour la page de téléchargement de djangoproject.com (<a class=\"reference external\" href=\"https://github.com/django/djangoproject.com/pull/1444\">PR d’exemple</a>).</p></li>\n</ol>\n</li>\n<li><p>S’il s’est agi d’une publication de sécurité, mettez à jour <a class=\"reference internal\" href=\"/fr/5.1/releases/security/\"><span class=\"doc\">Archive des issues de sécurité</span></a> avec les détails sur les problèmes corrigés.</p></li>\n<li><p>S’il s’agit d’une prépublication, les catalogues de traduction doivent être mis à jour :</p>\n<ol class=\"arabic\">\n<li><p>Make a new branch from the recently released stable branch:</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>git checkout stable/A.B.x\ngit checkout -b update-translations-catalog-A.B.x\n</code></pre></div>\n</li>\n<li><p>Ensure that the release’s dedicated virtual environment is enabled and\nrun the following:</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>$ <span class=\"nb\">cd</span> django\n$ django-admin makemessages -l en --domain<span class=\"o\">=</span>djangojs --domain<span class=\"o\">=</span>django\nprocessing locale en\n</code></pre></div>\n</li>\n<li><p>Review the diff before pushing and avoid committing changes to the\n<code class=\"docutils literal notranslate\">.po</code> files without any new translations (<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/d2b1ec551567c208abfdd21b27ff6d08ae1a6371\">example commit</a>).</p></li>\n<li><p>Make a pull request against the corresponding stable branch and merge\nonce approved.</p></li>\n<li><p>Forward port the updated source translations to the <code class=\"docutils literal notranslate\">main</code> branch\n(<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/aed303aff57ac990894b6354af001b0e8ea55f71\">example commit</a>).</p></li>\n</ol>\n</li>\n<li><p>If this was an <code class=\"docutils literal notranslate\">rc</code> pre-release, call for translations for the upcoming\nrelease in the <a class=\"reference external\" href=\"https://forum.djangoproject.com/c/internals/i18n/14\">Django Forum - Internationalization category</a>.</p></li>\n</ol>\n</section>\n<section id=\"new-stable-branch-tasks\">\n<h2>Tâches pour les nouvelles versions stables<a class=\"heading-anchor\" href=\"#new-stable-branch-tasks\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Il y a plusieurs choses à faire à la suite de la création d’une nouvelle branche stable (suivant en général une publication alpha). Certaines de ces tâches n’ont pas besoin d’être réalisées par le publicateur.</p>\n<ol class=\"arabic simple\">\n<li><p>Créez un nouvel objet <code class=\"docutils literal notranslate\">DocumentRelease</code> dans la base de données <code class=\"docutils literal notranslate\">docs.djangoproject.com</code> pour la documentation de la nouvelle version et mettez à jour l’instantané JSON <code class=\"docutils literal notranslate\">docs/fixtures/doc_releases.json</code> afin que les personnes sans accès à la base de données de production puissent tout de même faire fonctionner une copie à jour du site de documentation (<a class=\"reference external\" href=\"https://github.com/django/djangoproject.com/pull/1446\">exemple de PR</a>).</p></li>\n<li><p>Créez un squelette de notes de publication pour la nouvelle version majeure. Utilisez le modèle de l’ancienne version majeure ou copiez le contenu d’une précédente version majeure en supprimant la plupart de son contenu excepté les en-têtes.</p></li>\n<li><p>Augmentez le nombre d’itérations PBKDF2 par défaut dans <code class=\"docutils literal notranslate\">django.contrib.auth.hashers.PBKDF2PasswordHasher</code> d’environ 20% (en choisissant un chiffre rond). Lancez les tests et mettez à jour les 3 tests en échec liés aux empreintes avec les nouvelles valeurs. Assurez-vous que les notes de publication mentionnent cette augmentation (voir par exemple les notes de publication de la version 4.1).</p></li>\n<li><p>Enlevez les fonctionnalités qui ont atteint la fin de leur cycle d’obsolescence. Chaque suppression doit être appliquée dans un commit séparé pour plus de clarté. Dans le message de commit, ajoutez si possible la mention « refs #XXXX » pointant vers le ticket d’origine qui a provoqué l’obsolescence.</p></li>\n<li><p>Supprimez les annotations <code class=\"docutils literal notranslate\">.. versionadded::</code>, <code class=\"docutils literal notranslate\">.. versionchanged::</code> et <code class=\"docutils literal notranslate\">.. deprecated::</code> dans la documentation concernant l’avant-dernière publication. Par exemple, dans Django 4.2, les notes pour 4.0 seront supprimées.</p></li>\n<li><p>Ajoutez la nouvelle branche sur <a class=\"reference external\" href=\"https://readthedocs.org/projects/django/\">Read the Docs</a>. Comme les noms de versions automatiquement générés («stable-A.B.x») diffèrent des noms de versions utilisés dans Read the Docs («A.B.x»), <a class=\"reference external\" href=\"https://github.com/readthedocs/readthedocs.org/issues/5537\">créez un ticket</a> demandant la nouvelle version.</p></li>\n<li><p><a class=\"reference external\" href=\"https://github.com/pypa/trove-classifiers/issues/29\">Demandez la nouvelle classification sur PyPI</a>. Par exemple, <code class=\"docutils literal notranslate\">Framework :: Django :: 3.1</code>.</p></li>\n<li><p>Mettez à jour la version de développement active à la branche actuelle et ajoutez la branche de pré-publication dans le <a class=\"reference external\" href=\"https://code.djangoproject.com/#Djangoreleaseprocess\">processus de publication de Django</a> sur Trac.</p></li>\n</ol>\n</section>\n<section id=\"notes-on-setting-the-version-tuple\">\n<h2>Notes sur la définition du tuple VERSION<a class=\"heading-anchor\" href=\"#notes-on-setting-the-version-tuple\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>La version de Django est contrôlée par le tuple <code class=\"docutils literal notranslate\">VERSION</code> dans <code class=\"docutils literal notranslate\">django/__init__.py</code>. C’est un tuple à cinq éléments, contenant :</p>\n<ol class=\"arabic simple\">\n<li><p>La version majeure.</p></li>\n<li><p>La version mineure.</p></li>\n<li><p>La version micro.</p></li>\n<li><p>Le statut, qui peut-être « alpha », « beta », « rc » ou « final ».</p></li>\n<li><p>Le numéro de série, dans le cas des versions alpha/beta/RC qui se font suite (autorisant, par exemple, « beta 1 », « beta 2 », etc.).</p></li>\n</ol>\n<p>Pour une version finale, le statut est toujours « final » et le numéro de série 0. Un numéro de série à 0 avec le statut « alpha » est signalé comme une « pre-alpha ».</p>\n<p>Quelques exemples :</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">(4, 1, 1, &quot;final&quot;, 0)</code> → « 4.1.1 »</p></li>\n<li><p><code class=\"docutils literal notranslate\">(4, 2, 0, &quot;alpha&quot;, 0)</code> → « 4.2 pre-alpha »</p></li>\n<li><p><code class=\"docutils literal notranslate\">(4, 2, 0, &quot;beta&quot;, 1)</code> → « 4.2 beta 1 »</p></li>\n</ul>\n</section>","rootId":"how-is-django-formed","toc":[{"title":"Aperçu","anchor":"overview","children":[]},{"title":"Prérequis","anchor":"prerequisites","children":[]},{"title":"Tâches de pré-publication","anchor":"pre-release-tasks","children":[{"title":"10 jours (ou plus) avant une publication de sécurité","anchor":"or-more-days-before-a-security-release","children":[]},{"title":"Une semaine avant une publication de sécurité","anchor":"a-week-before-a-security-release","children":[]},{"title":"Quelques jours avant toute publication","anchor":"a-few-days-before-any-release","children":[]}]},{"title":"Production réelle de la nouvelle version","anchor":"actually-rolling-the-release","children":[]},{"title":"Rendre la ou les publications publique(s)","anchor":"making-the-release-s-available-to-the-public","children":[]},{"title":"Après la publication","anchor":"post-release","children":[]},{"title":"Tâches pour les nouvelles versions stables","anchor":"new-stable-branch-tasks","children":[]},{"title":"Notes sur la définition du tuple VERSION","anchor":"notes-on-setting-the-version-tuple","children":[]}],"breadcrumbs":[{"docname":"internals/index","title":"Fonctionnement interne du projet Django","url":"/fr/5.1/internals/"}],"prev":{"docname":"internals/git","title":"Le dépôt de code source de Django","url":"/fr/5.1/internals/git/"},"next":null,"formats":{"html":"/fr/5.1/internals/howto-release-django/","markdown":"/fr/5.1/internals/howto-release-django.md","json":"/fr/5.1/internals/howto-release-django.json"},"source":"https://github.com/django/django/blob/stable/5.1.x/docs/internals/howto-release-django.txt","official":"https://docs.djangoproject.com/fr/5.1/internals/howto-release-django/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}