{"title":"Comment publier Django","version":"5.2","locale":"fr","docname":"internals/howto-release-django","url":"/fr/5.2/internals/howto-release-django/","canonical":"https://djangodocs.dev/fr/5.2/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 publier Django<a class=\"heading-anchor\" href=\"#how-to-release-django\"><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>Changer les numéros de version and créer les artefacts de version.</p></li>\n<li><p>Créer la nouvelle <code class=\"docutils literal notranslate\"><span class=\"pre\">Release</span></code> dans l’admin de <code class=\"docutils literal notranslate\"><span class=\"pre\">djangoproject.com</span></code>.</p>\n<ol class=\"arabic simple\">\n<li><p>Définir la date prévue mais assurez-vous que le champ <code class=\"docutils literal notranslate\"><span class=\"pre\">is_active</span></code> est désactivé.</p></li>\n<li><p>Upload the artifacts (tarball, wheel, and checksums).</p></li>\n</ol>\n</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>Enable the <code class=\"docutils literal notranslate\"><span class=\"pre\">is_active</span></code> flag for each release in the admin on\n<code class=\"docutils literal notranslate\"><span class=\"pre\">djangoproject.com</span></code>.</p></li>\n<li><p>Publier l’article de blog et envoyer le courriel d’annonce.</p></li>\n<li><p>Update version numbers post-release in stable branch(es).</p></li>\n<li><p>Add stub release notes for the next patch release in <code class=\"docutils literal notranslate\"><span class=\"pre\">main</span></code> and backport.</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\"><span class=\"pre\">md5sum</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">sha1sum</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">sha256sum</span></code> sur Linux, ou <code class=\"docutils literal notranslate\"><span class=\"pre\">md5</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">shasum</span></code> sur macOS)</p></li>\n<li><p>python</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\">\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\"><span class=\"pre\">-u</span> <span class=\"pre\">vous&#64;example.com</span></code> à chaque commande de signature GPG affichée ci-dessous, où <code class=\"docutils literal notranslate\"><span class=\"pre\">vous&#64;example.com</span></code> est l’adresse de courriel associée à la clé que vous allez utiliser.</p>\n</aside>\n</li>\n<li><p>A clean Python virtual environment (Python 3.9+) to build artifacts, with\nthese required Python packages installed:</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=\"w\"> </span>python<span class=\"w\"> </span>-m<span class=\"w\"> </span>pip<span class=\"w\"> </span>install<span class=\"w\"> </span>build<span class=\"w\"> </span>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\"><span class=\"pre\">$HOME/.pypirc</span></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\"><span class=\"pre\">~/.pypirc</span></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=\"w\">  </span><span class=\"na\">index-servers</span><span class=\"w\"> </span><span class=\"o\">=</span>\n<span class=\"w\">    </span><span class=\"na\">pypi</span>\n<span class=\"w\">    </span><span class=\"na\">django</span>\n\n<span class=\"k\">[pypi]</span>\n<span class=\"w\">  </span><span class=\"na\">username</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">__token__</span>\n<span class=\"w\">  </span><span class=\"na\">password</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </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=\"w\">  </span><span class=\"na\">repository</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">https://upload.pypi.org/legacy/</span>\n<span class=\"w\">  </span><span class=\"na\">username</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">__token__</span>\n<span class=\"w\">  </span><span class=\"na\">password</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </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\"><span class=\"pre\">$HOME/.transifexrc</span></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\"><span class=\"pre\">~/.transifexrc</span></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=\"w\">  </span><span class=\"na\">rest_hostname</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">https://rest.api.transifex.com</span>\n<span class=\"w\">  </span><span class=\"na\">token</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"c1\"># API token</span>\n</code></pre></figure>\n</li>\n<li><p>Un accès à l’interface d’administration Django de <code class=\"docutils literal notranslate\"><span class=\"pre\">djangoproject.com</span></code> comme « mainteneur de site ».</p></li>\n<li><p>Access to create a post in the <a class=\"reference external\" href=\"https://forum.djangoproject.com/c/announcements/7\">Django Forum - Announcements category</a> and to send emails to\nthe <a class=\"reference external\" href=\"https://groups.google.com/g/django-announce/\">django-announce</a>\nmailing list.</p></li>\n<li><p>Un accès au dépôt <code class=\"docutils literal notranslate\"><span class=\"pre\">django-security</span></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<li><p>Access to the Django project on <a class=\"reference external\" href=\"https://readthedocs.org/projects/django/\">Read the Docs</a>.</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\"><span class=\"pre\">Vendor:</span> <span class=\"pre\">djangoproject</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">Product:</span> <span class=\"pre\">django</span></code>.</p></li>\n<li><p>Produisez le ou les correctifs appropriés (et privés) en utilisant <code class=\"docutils literal notranslate\"><span class=\"pre\">git</span> <span class=\"pre\">format-patch</span></code>, un pour la branche <code class=\"docutils literal notranslate\"><span class=\"pre\">main</span></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\"><span class=\"pre\">django-security</span></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\"><span class=\"pre\">main</span></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>$<span class=\"w\"> </span>gpg<span class=\"w\"> </span>--clearsign<span class=\"w\"> </span>--digest-algo<span class=\"w\"> </span>SHA256<span class=\"w\"> </span>prenotification-email.txt\n</code></pre></div>\n</li>\n<li><p><a class=\"reference internal\" href=\"/fr/5.2/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.2/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\"><span class=\"pre\">docs/releases/index.txt</span></code>.</p></li>\n<li><p>S’il s’agit d’une <a class=\"reference internal\" href=\"/fr/5.2/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\"><span class=\"pre\">PATH</span></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>$<span class=\"w\"> </span>python<span class=\"w\"> </span>scripts/manage_translations.py<span class=\"w\"> </span>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\"><span class=\"pre\">PO-Revision-Date</span></code> doivent être manuellement mises à jour pour être postérieures à <code class=\"docutils literal notranslate\"><span class=\"pre\">POT-Creation-Date</span></code>. Vous pouvez utiliser une commande telle que celle-ci pour mettre à jour en lot tous les fichiers <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></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>$<span class=\"w\"> </span>git<span class=\"w\"> </span>diff<span class=\"w\"> </span>--name-only<span class=\"w\"> </span>stable/5.0.x<span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span>grep<span class=\"w\"> </span><span class=\"s2\">&quot;\\.po&quot;</span><span class=\"w\">  </span><span class=\"p\">|</span><span class=\"w\"> </span>xargs<span class=\"w\"> </span>sed<span class=\"w\"> </span>-ri<span class=\"w\"> </span><span class=\"s2\">&quot;s/PO-Revision-Date: [0-9\\-]+ /PO-Revision-Date: </span><span class=\"k\">$(</span>date<span class=\"w\"> </span>-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\"><span class=\"pre\">.po</span></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\"><span class=\"pre\">.po</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">.mo</span></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.2/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=\"w\"> </span><span class=\"nb\">cd</span><span class=\"w\"> </span>docs\n$<span class=\"w\"> </span>make<span class=\"w\"> </span>man\n$<span class=\"w\"> </span>man<span class=\"w\"> </span>_build/man/django-admin.1<span class=\"w\">  </span><span class=\"c1\"># do a quick sanity check</span>\n$<span class=\"w\"> </span>cp<span class=\"w\"> </span>_build/man/django-admin.1<span class=\"w\"> </span>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 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>$<span class=\"w\"> </span>git<span class=\"w\"> </span>checkout<span class=\"w\"> </span>-b<span class=\"w\"> </span>stable/4.2.x<span class=\"w\"> </span>origin/stable/4.1.x\n$<span class=\"w\"> </span>git<span class=\"w\"> </span>push<span class=\"w\"> </span>origin<span class=\"w\"> </span>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 id=\"a-few-days-before-a-feature-freeze\">\n<h4>A few days before a feature freeze<a class=\"heading-anchor\" href=\"#a-few-days-before-a-feature-freeze\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>In preparation for the alpha release, the directory\n<code class=\"docutils literal notranslate\"><span class=\"pre\">/home/www/www/media/releases/A.B</span></code> must be created on the djangoproject\nserver.</p>\n<p>Before the feature freeze, a branch targeting <code class=\"docutils literal notranslate\"><span class=\"pre\">main</span></code> must be created to\nprepare for the next feature release. It should be reviewed and approved a few\ndays before the freeze, allowing it to be merged after the stable branch is\ncut. The following items should be addressed in this branch:</p>\n<ol class=\"arabic simple\">\n<li><p>Update the <code class=\"docutils literal notranslate\"><span class=\"pre\">VERSION</span></code> tuple in <code class=\"docutils literal notranslate\"><span class=\"pre\">django/__init__.py</span></code>, incrementing to the\nnext expected release (<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/96700c7b378c592f0b1732302c22af2fd2c87fc6\">example commit</a>).</p></li>\n<li><p>Create a stub release note for the next feature release. Use the stub from\nthe previous feature release or copy the contents from the current version\nand delete most of the contents leaving only the headings\n(<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/9b5ad4056ccf9ff7ea548f72d28eb66c1b4f84cc\">example commit</a>).</p></li>\n<li><p>Remove <code class=\"docutils literal notranslate\"><span class=\"pre\">..</span> <span class=\"pre\">versionadded::</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">..</span> <span class=\"pre\">versionchanged::</span></code> annotations in the\ndocumentation from two releases ago, as well as any remaining older\nannotations. For example, in Django 5.1, notes for 4.2 will be removed\n(<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/9edb7833b89e811eefd94974fb987f4605b0c0d7\">example commit</a>).</p></li>\n<li><p>Remove features that have reached the end of their deprecation cycle,\nincluding their docs and the <code class=\"docutils literal notranslate\"><span class=\"pre\">..</span> <span class=\"pre\">deprecated::</span></code> annotation. Each removal\nshould be done in a separate commit for clarity. In the commit message, add\na <code class=\"docutils literal notranslate\"><span class=\"pre\">Refs</span> <span class=\"pre\">#XXXXX</span> <span class=\"pre\">--</span></code> prefix linking to the original ticket where the\ndeprecation began if possible. Make sure this gets noted in the removed\nfeatures section in the release notes (<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/f2d9c76aa7096ef3eed675b9eb824858f9dd81e5\">example commit</a>).</p></li>\n<li><p>Increase the default PBKDF2 iterations in\n<code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.hashers.PBKDF2PasswordHasher</span></code> by about 20%\n(pick a round number). Run the tests, and update the 3 failing\nhasher tests with the new values. Make sure this gets noted in the\nrelease notes (<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/7288866da4dddf3705148c703421858ec19cdb78\">example commit</a>).</p></li>\n</ol>\n<p>Concrete examples for past feature release bootstrap branches: <a class=\"reference external\" href=\"https://github.com/django/django/pull/18127\">5.2 bootstrap</a>, <a class=\"reference external\" href=\"https://github.com/django/django/pull/17246\">5.1 bootstrap</a>, <a class=\"reference external\" href=\"https://github.com/django/django/pull/16432\">5.0 bootstrap</a>.</p>\n</section>\n</section>\n</section>\n<section id=\"feature-freeze-tasks\">\n<h2>Feature freeze tasks<a class=\"heading-anchor\" href=\"#feature-freeze-tasks\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<ol class=\"arabic\">\n<li><p>Remove empty sections from the release notes (<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/9e6e58bad237a80ddd5e3ab8b834cecdaad8455e\">example commit</a>).</p></li>\n<li><p>Build the release notes locally and read them. Make any necessary change\nto improve flow or fix grammar (<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/435bdab93889dae01e71c79598edab10627cc1f9\">example commit</a>).</p></li>\n<li><p>Create a new stable branch from <code class=\"docutils literal notranslate\"><span class=\"pre\">main</span></code>. For example, when feature freezing\nDjango 5.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>$<span class=\"w\"> </span>git<span class=\"w\"> </span>checkout<span class=\"w\"> </span>-b<span class=\"w\"> </span>stable/5.2.x<span class=\"w\"> </span>upstream/main\n$<span class=\"w\"> </span>git<span class=\"w\"> </span>push<span class=\"w\"> </span>upstream<span class=\"w\"> </span>-u<span class=\"w\"> </span>stable/5.2.x:stable/5.2.x\n</code></pre></div>\n<p>At the same time, update the <code class=\"docutils literal notranslate\"><span class=\"pre\">django_next_version</span></code> variable in\n<code class=\"docutils literal notranslate\"><span class=\"pre\">docs/conf.py</span></code> on the stable release branch to point to the new\ndevelopment version. For example, when creating <code class=\"docutils literal notranslate\"><span class=\"pre\">stable/5.2.x</span></code>, set\n<code class=\"docutils literal notranslate\"><span class=\"pre\">django_next_version</span></code> to <code class=\"docutils literal notranslate\"><span class=\"pre\">'6.0'</span></code> on the new stable branch\n(<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/1eb62e5b622ef7fd6e0123d8bbf6662d893d5d08\">example commit</a>).</p>\n</li>\n<li><p>Go to the <a class=\"reference external\" href=\"https://www.djangoproject.com/admin/releases/release/add/\">Add release page in the admin</a>, create a <code class=\"docutils literal notranslate\"><span class=\"pre\">Release</span></code> object for\nthe <em>final</em> release, ensuring that the <em>Release date</em> field is blank, thus\nmarking it as <em>unreleased</em>. For example, when creating <code class=\"docutils literal notranslate\"><span class=\"pre\">stable/5.2.x</span></code>,\ncreate <code class=\"docutils literal notranslate\"><span class=\"pre\">5.2</span></code> with the Release date field blank. If the release is part of\nan LTS branch, mark it so.</p>\n</li>\n<li><p>Go to the <a class=\"reference external\" href=\"https://www.djangoproject.com/admin/docs/documentrelease/add/\">Add document release page in the admin</a>, create a new\n<code class=\"docutils literal notranslate\"><span class=\"pre\">DocumentRelease</span></code> object for the English language for the newly created\n<code class=\"docutils literal notranslate\"><span class=\"pre\">Release</span></code> object. Do not mark this as default.</p>\n</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\">Request the new classifier on PyPI</a>. For example\n<code class=\"docutils literal notranslate\"><span class=\"pre\">Framework</span> <span class=\"pre\">::</span> <span class=\"pre\">Django</span> <span class=\"pre\">::</span> <span class=\"pre\">5.2</span></code>.</p></li>\n<li><p>Create a <a class=\"reference external\" href=\"https://code.djangoproject.com/wiki/Version6.0Roadmap\">roadmap page</a> for the next\nrelease on Trac. To create a new page on the Wiki, navigate to the URL of\nwhere you wish to create the page and a « Create this page » button will be\navailable.</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<li><p>Update the <code class=\"docutils literal notranslate\"><span class=\"pre\">docs/fixtures/doc_releases.json</span></code> JSON fixture for\ndjangoproject.com, so people without access to the production DB can still\nrun an up-to-date copy of the docs site\n(<a class=\"reference external\" href=\"https://github.com/django/djangoproject.com/pull/1446\">example PR</a>).\nThis will be merged after the final release.</p></li>\n</ol>\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\"><span class=\"pre\">main</span></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\"><span class=\"pre\">UNDER</span> <span class=\"pre\">DEVELOPMENT</span></code> au sommet des notes de publication, enlevez le préfixe <code class=\"docutils literal notranslate\"><span class=\"pre\">Expected</span></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\"><span class=\"pre\">Expected</span></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>$<span class=\"w\"> </span>git<span class=\"w\"> </span>checkout<span class=\"w\"> </span>stable/4.1.x\n$<span class=\"w\"> </span>git<span class=\"w\"> </span>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\"><span class=\"pre\">django-security</span></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\"><span class=\"pre\">--ff-only</span></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>$<span class=\"w\"> </span>git<span class=\"w\"> </span>checkout<span class=\"w\"> </span>stable/4.1.x\n$<span class=\"w\"> </span>git<span class=\"w\"> </span>merge<span class=\"w\"> </span>--ff-only<span class=\"w\"> </span>security/4.1.x\n</code></pre></div>\n<p>(Cela suppose que <code class=\"docutils literal notranslate\"><span class=\"pre\">security/4.1.x</span></code> est une branche du dépôt <code class=\"docutils literal notranslate\"><span class=\"pre\">django-security</span></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\"><span class=\"pre\">--ff-only</span></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\"><span class=\"pre\">git</span> <span class=\"pre\">checkout</span> <span class=\"pre\">security/4.1.x;</span> <span class=\"pre\">git</span> <span class=\"pre\">rebase</span> <span class=\"pre\">stable/4.1.x</span></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\"><span class=\"pre\">django/__init__.py</span></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\"><span class=\"pre\">VERSION</span></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\"><span class=\"pre\">pyproject.toml</span></code> to reflect this. An <code class=\"docutils literal notranslate\"><span class=\"pre\">rc</span></code>\npre-release should not change the trove classifier (<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/759921c8e9ad151932fc913ab429fef0a6112ef8\">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\"><span class=\"pre\">Development</span> <span class=\"pre\">Status</span> <span class=\"pre\">::</span> <span class=\"pre\">5</span> <span class=\"pre\">-</span> <span class=\"pre\">Production/Stable</span></code>.</p></li>\n</ol>\n</li>\n</ol>\n<section id=\"building-the-artifacts\">\n<h3>Building the artifacts<a class=\"heading-anchor\" href=\"#building-the-artifacts\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"admonition-optionally-use-helper-scripts admonition\">\n<p class=\"admonition-title\">Optionally use helper scripts</p>\n<p>You can streamline some of the steps below using helper scripts from the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">scripts</span></code> folder:</p>\n<ul class=\"simple\">\n<li><p>Release script example run:</p></li>\n</ul>\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=\"w\"> </span><span class=\"nv\">PGP_KEY_ID</span><span class=\"o\">=</span>&lt;key-id&gt;<span class=\"w\"> </span><span class=\"nv\">PGP_KEY_URL</span><span class=\"o\">=</span>&lt;key-url&gt;<span class=\"w\"> </span><span class=\"nv\">DEST_FOLDER</span><span class=\"o\">=</span>~/releases<span class=\"w\"> </span>scripts/do_django_release.py\n</code></pre></div>\n<ul class=\"simple\">\n<li><p>Verify the release (after artifacts were uploaded):</p></li>\n</ul>\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=\"w\"> </span><span class=\"nv\">VERSION</span><span class=\"o\">=</span><span class=\"m\">5</span>.2.1<span class=\"w\"> </span>scripts/verify_release.sh\n</code></pre></div>\n</aside>\n<ol class=\"arabic\">\n<li><p>Placez une étiquette sur la publication avec <code class=\"docutils literal notranslate\"><span class=\"pre\">git</span> <span class=\"pre\">tag</span></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>$<span class=\"w\"> </span>git<span class=\"w\"> </span>tag<span class=\"w\"> </span>--sign<span class=\"w\"> </span>--message<span class=\"o\">=</span><span class=\"s2\">&quot;Tag 4.1.1&quot;</span><span class=\"w\"> </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\"><span class=\"pre\">git</span> <span class=\"pre\">tag</span> <span class=\"pre\">--verify</span> <span class=\"pre\">&lt;tag&gt;</span></code>.</p>\n</li>\n<li><p>Assurez-vous d’avoir une arborescence parfaitement propre en exécutant <code class=\"docutils literal notranslate\"><span class=\"pre\">git</span> <span class=\"pre\">clean</span> <span class=\"pre\">-dfx</span></code>.</p></li>\n<li><p>Run <code class=\"docutils literal notranslate\"><span class=\"pre\">python</span> <span class=\"pre\">-m</span> <span class=\"pre\">build</span></code> to generate the release packages. This will create\nthe release artifacts (tarball and wheel) in a <code class=\"docutils literal notranslate\"><span class=\"pre\">dist/</span></code> directory. For\nDjango 5.0 or older, you need to run <code class=\"docutils literal notranslate\"><span class=\"pre\">make</span> <span class=\"pre\">-f</span> <span class=\"pre\">extras/Makefile</span></code> instead.</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=\"w\"> </span><span class=\"nb\">cd</span><span class=\"w\"> </span>dist\n$<span class=\"w\"> </span>md5sum<span class=\"w\"> </span>*\n$<span class=\"w\"> </span>sha1sum<span class=\"w\"> </span>*\n$<span class=\"w\"> </span>sha256sum<span class=\"w\"> </span>*\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\"><span class=\"pre\">gpg</span> <span class=\"pre\">--list-keys</span> <span class=\"pre\">--keyid-format</span> <span class=\"pre\">LONG</span></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 GitHub, for example,\nif using the open-source GNU Privacy Guard implementation of PGP:\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/download/&lt;&lt;VERSION&gt;&gt;/tarball/\nhttps://www.djangoproject.com/download/&lt;&lt;VERSION&gt;&gt;/wheel/\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\"><span class=\"pre\">gpg</span> <span class=\"pre\">--clearsign</span> <span class=\"pre\">--digest-algo</span> <span class=\"pre\">SHA256</span> <span class=\"pre\">Django-&lt;version&gt;.checksum.txt</span></code>). Cela produit un document signé, <code class=\"docutils literal notranslate\"><span class=\"pre\">Django-&lt;version&gt;.checksum.txt.asc</span></code> que vous pouvez ensuite vérifier avec <code class=\"docutils literal notranslate\"><span class=\"pre\">gpg</span> <span class=\"pre\">--verify</span> <span class=\"pre\">Django-&lt;version&gt;.checksum.txt.asc</span></code>.</p></li>\n</ol>\n</section>\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>Create a new <code class=\"docutils literal notranslate\"><span class=\"pre\">Release</span></code> entry in the <a class=\"reference external\" href=\"https://www.djangoproject.com/admin/releases/release/add/\">djangoproject.com’s admin</a>. If this is a\nsecurity release, this should be done 15 minutes before the announced\nrelease time, no sooner:</p>\n<dl class=\"simple\">\n<dt>Version</dt><dd><p>Must match the version number as defined in the tarball\n(<code class=\"docutils literal notranslate\"><span class=\"pre\">django-&lt;version&gt;.tar.gz</span></code>). For example: « 5.2 », « 4.1.1 », or « 4.2rc1 ».</p>\n</dd>\n<dt>Is active</dt><dd><p>Set to False until the release is fully published (last step).</p>\n</dd>\n<dt>LTS</dt><dd><p>Enable if the release is part of an <abbr title=\"Long Term Support\">LTS</abbr>\nbranch.</p>\n</dd>\n<dt>Dates</dt><dd><p>Set the release date to today. This release will not be published until\n<code class=\"docutils literal notranslate\"><span class=\"pre\">is_active</span></code> is enabled.</p>\n</dd>\n<dt>Artifacts</dt><dd><p>Upload the tarball (<code class=\"docutils literal notranslate\"><span class=\"pre\">django-&lt;version&gt;.tar.gz</span></code>), wheel\n(<code class=\"docutils literal notranslate\"><span class=\"pre\">django-&lt;version&gt;-py3-none-any.whl</span></code>), and checksum\n(<code class=\"docutils literal notranslate\"><span class=\"pre\">django-&lt;version&gt;.checksum.txt.asc</span></code>) files created earlier.</p>\n</dd>\n</dl>\n</li>\n<li><p>Test that the release packages install correctly using <code class=\"docutils literal notranslate\"><span class=\"pre\">pip</span></code>. Here’s one\nsimple method (this just tests that the binaries are available, that they\ninstall correctly, and that migrations and the development server start, but\nit’ll catch silly mistakes):\n<a class=\"reference external\" href=\"https://code.djangoproject.com/wiki/ReleaseTestNewVersion\">https://code.djangoproject.com/wiki/ReleaseTestNewVersion</a>.</p></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\"><span class=\"pre\">4.2rc1</span></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>$<span class=\"w\"> </span>twine<span class=\"w\"> </span>upload<span class=\"w\"> </span>--repository<span class=\"w\"> </span>django<span class=\"w\"> </span>dist/*\n</code></pre></div>\n</li>\n<li><p>Update the newly created <code class=\"docutils literal notranslate\"><span class=\"pre\">Release</span></code> in the admin in <code class=\"docutils literal notranslate\"><span class=\"pre\">djangoproject.com</span></code>\nand enable the <code class=\"docutils literal notranslate\"><span class=\"pre\">is_active</span></code> flag.</p></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>$<span class=\"w\"> </span>git<span class=\"w\"> </span>push\n$<span class=\"w\"> </span>git<span class=\"w\"> </span>push<span class=\"w\"> </span>--tags\n</code></pre></div>\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\"><span class=\"pre\">is_default</span></code> sur l’objet <code class=\"docutils literal notranslate\"><span class=\"pre\">DocumentRelease</span></code> approprié de la base de données <code class=\"docutils literal notranslate\"><span class=\"pre\">docs.djangoproject.com</span></code> (cela va automatiquement mettre à <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></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\"><span class=\"pre\">DocumentRelease</span></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\"><span class=\"pre\">manage_translations.py</span> <span class=\"pre\">robots_txt</span></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>$<span class=\"w\"> </span>git<span class=\"w\"> </span>checkout<span class=\"w\"> </span>stable/4.2.x\n$<span class=\"w\"> </span>git<span class=\"w\"> </span>pull\n$<span class=\"w\"> </span>python<span class=\"w\"> </span>manage_translations.py<span class=\"w\"> </span>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.2/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>If this is not a pre-release, update the <code class=\"docutils literal notranslate\"><span class=\"pre\">VERSION</span></code> tuple in\n<code class=\"docutils literal notranslate\"><span class=\"pre\">django/__init__.py</span></code> again, incrementing to whatever the next expected\nrelease will be. For example, after releasing 4.1.1, update <code class=\"docutils literal notranslate\"><span class=\"pre\">VERSION</span></code> to\n<code class=\"docutils literal notranslate\"><span class=\"pre\">VERSION</span> <span class=\"pre\">=</span> <span class=\"pre\">(4,</span> <span class=\"pre\">1,</span> <span class=\"pre\">2,</span> <span class=\"pre\">'alpha',</span> <span class=\"pre\">0)</span></code> (<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/a4d19953d46247ee1992b3427fe652e941524272\">example commit</a>).</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\"><span class=\"pre\">default_version</span></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\"><span class=\"pre\">.0</span></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.2/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<span class=\"w\"> </span>checkout<span class=\"w\"> </span>stable/A.B.x\ngit<span class=\"w\"> </span>checkout<span class=\"w\"> </span>-b<span class=\"w\"> </span>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=\"w\"> </span><span class=\"nb\">cd</span><span class=\"w\"> </span>django\n$<span class=\"w\"> </span>django-admin<span class=\"w\"> </span>makemessages<span class=\"w\"> </span>-l<span class=\"w\"> </span>en<span class=\"w\"> </span>--domain<span class=\"o\">=</span>djangojs<span class=\"w\"> </span>--domain<span class=\"o\">=</span>django\nprocessing<span class=\"w\"> </span>locale<span class=\"w\"> </span>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\"><span class=\"pre\">.po</span></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\"><span class=\"pre\">main</span></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\"><span class=\"pre\">rc</span></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=\"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\"><span class=\"pre\">VERSION</span></code> dans <code class=\"docutils literal notranslate\"><span class=\"pre\">django/__init__.py</span></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\"><span class=\"pre\">(4,</span> <span class=\"pre\">1,</span> <span class=\"pre\">1,</span> <span class=\"pre\">&quot;final&quot;,</span> <span class=\"pre\">0)</span></code> → « 4.1.1 »</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">(4,</span> <span class=\"pre\">2,</span> <span class=\"pre\">0,</span> <span class=\"pre\">&quot;alpha&quot;,</span> <span class=\"pre\">0)</span></code> → « 4.2 pre-alpha »</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">(4,</span> <span class=\"pre\">2,</span> <span class=\"pre\">0,</span> <span class=\"pre\">&quot;beta&quot;,</span> <span class=\"pre\">1)</span></code> → « 4.2 beta 1 »</p></li>\n</ul>\n</section>","rootId":"how-to-release-django","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":"A few days before a feature freeze","anchor":"a-few-days-before-a-feature-freeze","children":[]}]}]},{"title":"Feature freeze tasks","anchor":"feature-freeze-tasks","children":[]},{"title":"Production réelle de la nouvelle version","anchor":"actually-rolling-the-release","children":[{"title":"Building the artifacts","anchor":"building-the-artifacts","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":"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.2/internals/"}],"prev":{"docname":"internals/git","title":"Le dépôt de code source de Django","url":"/fr/5.2/internals/git/"},"next":null,"formats":{"html":"/fr/5.2/internals/howto-release-django/","markdown":"/fr/5.2/internals/howto-release-django.md","json":"/fr/5.2/internals/howto-release-django.json"},"source":"https://github.com/django/django/blob/stable/5.2.x/docs/internals/howto-release-django.txt","official":"https://docs.djangoproject.com/fr/5.2/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","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}