{"title":"Comment est constitué Django ?","version":"4.1","locale":"fr","docname":"internals/howto-release-django","url":"/fr/4.1/internals/howto-release-django/","canonical":"https://djangodocs.dev/fr/4.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. 1.5.x, 1.6.x et selon le timing, peut-être une 1.7 alpha/beta/rc.</p></li>\n<li><p>Publications de version normale : soit une publication finale (par ex. 1.5) ou une mise à jour corrective (par ex. 1.5.1).</p></li>\n<li><p>Prépublications : par ex. 1.6 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>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>Vous avez besoin d’un certain nombre de choses avant de commencer :</p>\n<ul>\n<li><p>Une clé GPG. 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 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></li>\n<li><p>Une installation de quelques paquets Python indispensables</p>\n<div class=\"code-block\" data-language=\"console\"><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=\"gp\">$ </span>python -m pip install wheel twine\n</code></pre></div>\n</li>\n<li><p>Un accès au compte Django sur PyPI. Créez un fichier avec vos informations d’authentification :</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\">[pypi]</span>\n<span class=\"na\">username</span><span class=\"o\">:</span><span class=\"s\">YourUsername</span>\n<span class=\"na\">password</span><span class=\"o\">:</span><span class=\"s\">YourPassword</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.</p></li>\n<li><p>Un accès à l’interface d’administration de <code class=\"docutils literal notranslate\">djangoproject.com</code> comme « mainteneur de site ».</p></li>\n<li><p>Un droit de publication sur <code class=\"docutils literal notranslate\">django-announce</code>.</p></li>\n<li><p>S’il s’agit d’une publication de sécurité, un accès à la liste de distribution de prénotification.</p></li>\n</ul>\n<p>S’il s’agit de votre première publication, vous devrez vous coordonner avec un autre publicateur pour que tous ces éléments soient au point.</p>\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<ol class=\"arabic\">\n<li><p>If this is a security release, send out pre-notification <strong>one week</strong> before\nthe release. The template for that email and a list of the recipients are in\nthe private <code class=\"docutils literal notranslate\">django-security</code> GitHub wiki. BCC the pre-notification\nrecipients. Sign the email with the key you’ll use for the release and\ninclude <a class=\"reference external\" href=\"https://cveform.mitre.org/\">CVE IDs</a> (requested with Vendor:\ndjangoproject, Product: django) and patches for each issue being fixed.\nAlso, <a class=\"reference internal\" href=\"/fr/4.1/internals/security/#security-disclosure\"><span class=\"std std-ref\">notify django-announce</span></a> of the upcoming\nsecurity release.</p></li>\n<li><p>As the release approaches, watch Trac to make sure no release blockers\nare left for the upcoming release.</p></li>\n<li><p>Check with the other mergers to make sure they don’t have any uncommitted\nchanges for the release.</p></li>\n<li><p>Proofread the release notes, including looking at the online version to\n<a class=\"reference internal\" href=\"/fr/4.1/internals/contributing/writing-documentation/#documentation-link-check\"><span class=\"std std-ref\">catch any broken links</span></a> or reST errors, and\nmake sure the release notes contain the correct date.</p></li>\n<li><p>Double-check that the release notes mention deprecation timelines\nfor any APIs noted as deprecated, and that they mention any changes\nin Python version support.</p></li>\n<li><p>Double-check that the release notes index has a link to the notes\nfor the new release; this will be in <code class=\"docutils literal notranslate\">docs/releases/index.txt</code>.</p></li>\n<li><p>If this is a feature release, ensure translations from Transifex have been\nintegrated. This is typically done by a separate translation’s manager\nrather than the releaser, but here are the steps. Provided you have an\naccount on Transifex:</p>\n<div class=\"code-block\" data-language=\"console\"><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=\"gp\">$ </span>python scripts/manage_translations.py fetch\n</code></pre></div>\n<p>and then commit the changed/added files (both <code class=\"docutils literal notranslate\">.po</code> and <code class=\"docutils literal notranslate\">.mo</code>).\nSometimes there are validation errors which need to be debugged, so avoid\ndoing this task immediately before a release is needed.</p>\n</li>\n<li><p><a class=\"reference internal\" href=\"/fr/4.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=\"console\"><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=\"gp\">$ </span><span class=\"nb\">cd</span> docs\n<span class=\"gp\">$ </span>make man\n<span class=\"gp\">$ </span>man _build/man/django-admin.1  <span class=\"c1\"># do a quick sanity check</span>\n<span class=\"gp\">$ </span>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 3.1</p>\n<div class=\"code-block\" data-language=\"console\"><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=\"gp\">$ </span>git checkout -b stable/3.1.x origin/main\n<span class=\"gp\">$ </span>git push origin -u stable/3.1.x:stable/3.1.x\n</code></pre></div>\n<p>At the same time, update the <code class=\"docutils literal notranslate\">django_next_version</code> variable in\n<code class=\"docutils literal notranslate\">docs/conf.py</code> on the stable release branch to point to the new\ndevelopment version. For example, when creating <code class=\"docutils literal notranslate\">stable/4.2.x</code>, set\n<code class=\"docutils literal notranslate\">django_next_version</code> to <code class=\"docutils literal notranslate\">'5.0'</code> on the new branch.</p>\n</li>\n<li><p>If this is the « dot zero » release of a new series, create a new branch from\nthe current stable branch in the <a class=\"reference external\" href=\"https://github.com/django/django-docs-translations\">django-docs-translations</a> repository. For\nexample, when releasing Django 2.2:</p>\n<div class=\"code-block\" data-language=\"console\"><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=\"gp\">$ </span>git checkout -b stable/2.2.x origin/stable/2.1.x\n<span class=\"gp\">$ </span>git push origin stable/2.2.x:stable/2.2.x\n</code></pre></div>\n</li>\n</ol>\n</section>\n<section id=\"preparing-for-release\">\n<h2>Préparation de la publication<a class=\"heading-anchor\" href=\"#preparing-for-release\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<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>\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>OK, voilà donc la partie amusante où nous allons réellement produire une nouvelle version !</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.</p>\n</li>\n<li><p>Une nouvelle version se base toujours sur une branche de versions, vous devriez donc vérifier que vous vous trouvez sur une branche stable et à jour. Par exemple</p>\n<div class=\"code-block\" data-language=\"console\"><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=\"gp\">$ </span>git checkout stable/1.5.x\n<span class=\"gp\">$ </span>git pull\n</code></pre></div>\n</li>\n<li><p>If this is a security release, merge the appropriate patches from\n<code class=\"docutils literal notranslate\">django-security</code>. Rebase these patches as necessary to make each one a\nplain commit on the release branch rather than a merge commit. To ensure\nthis, merge them with the <code class=\"docutils literal notranslate\">--ff-only</code> flag; for example:</p>\n<div class=\"code-block\" data-language=\"console\"><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=\"gp\">$ </span>git checkout stable/1.5.x\n<span class=\"gp\">$ </span>git merge --ff-only security/1.5.x\n</code></pre></div>\n<p>(Cela suppose que <code class=\"docutils literal notranslate\">security/1.5.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 1.5).</p>\n<p>If git refuses to merge with <code class=\"docutils literal notranslate\">--ff-only</code>, switch to the security-patch\nbranch and rebase it on the branch you are about to merge it into (<code class=\"docutils literal notranslate\">git\ncheckout security/1.5.x; git rebase stable/1.5.x</code>) and then switch back and\ndo the merge. Make sure the commit message for each security fix explains\nthat the commit is a security fix and that an announcement will follow\n(<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/bf39978a53f117ca02e9a0c78b76664a41a54745\">example security commit</a>).</p>\n</li>\n<li><p>For a feature release, remove the <code class=\"docutils literal notranslate\">UNDER DEVELOPMENT</code> header at the\ntop of the release notes and add the release date on the next line. For a\npatch release, replace <code class=\"docutils literal notranslate\">*Under Development*</code> with the release date. Make\nthis change on all branches where the release notes for a particular version\nare located.</p></li>\n<li><p>Update the version number in <code class=\"docutils literal notranslate\">django/__init__.py</code> for the release.\nPlease see <a class=\"reference internal\" href=\"#notes-on-setting-the-version-tuple\">notes on setting the VERSION tuple</a> below for details\non <code class=\"docutils literal notranslate\">VERSION</code>.</p></li>\n<li><p>If this is a pre-release package, update the « Development Status » trove\nclassifier in <code class=\"docutils literal notranslate\">setup.cfg</code> to reflect this. Otherwise, make sure the\nclassifier is set to <code class=\"docutils literal notranslate\">Development Status :: 5 - Production/Stable</code>.</p></li>\n<li><p>Tag the release using <code class=\"docutils literal notranslate\">git tag</code>. For example:</p>\n<div class=\"code-block\" data-language=\"console\"><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=\"gp\">$ </span>git tag --sign --message<span class=\"o\">=</span><span class=\"s2\">&quot;Tag 1.5.1&quot;</span> <span class=\"m\">1</span>.5.1\n</code></pre></div>\n<p>You can check your work by running <code class=\"docutils literal notranslate\">git tag --verify &lt;tag&gt;</code>.</p>\n</li>\n<li><p>Push your work, including the tag: <code class=\"docutils literal notranslate\">git push --tags</code>.</p></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 <code class=\"docutils literal notranslate\">make -f extras/Makefile</code> 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=\"console\"><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=\"gp\">$ </span><span class=\"nb\">cd</span> dist\n<span class=\"gp\">$ </span>md5sum *\n<span class=\"gp\">$ </span>sha1sum *\n<span class=\"gp\">$ </span>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;RELEASE TAR.GZ FILENAME&gt;&gt;\nhttps://www.djangoproject.com/m/releases/&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<p>Si vous produisez plusieurs publications, répétez ces étapes pour chaque publication.</p>\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 paquets à publier sur le serveur djangoproject, en remplaçant A.B. par le numéro de version approprié, par ex. 1.5 pour une publication 1.5.x</p>\n<div class=\"code-block\" data-language=\"console\"><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=\"gp\">$ </span>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 le répertoire A.B.</p>\n</li>\n<li><p>Téléversez les fichiers de sommes de contrôle</p>\n<div class=\"code-block\" data-language=\"console\"><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=\"gp\">$ </span>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</li>\n<li><p>Test that the release packages install correctly using <code class=\"docutils literal notranslate\">pip</code>. Here’s one\nmethod:</p>\n<div class=\"code-block\" data-language=\"console\"><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=\"gp\">$ </span><span class=\"nv\">RELEASE_VERSION</span><span class=\"o\">=</span><span class=\"s1\">&#39;1.7.2&#39;</span>\n<span class=\"gp\">$ </span><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<span class=\"gp\">$ </span>python -m venv django-pip\n<span class=\"gp\">$ </span>. django-pip/bin/activate\n<span class=\"gp\">$ </span>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<span class=\"gp\">$ </span>deactivate\n<span class=\"gp\">$ </span>python -m venv django-pip-wheel\n<span class=\"gp\">$ </span>. django-pip-wheel/bin/activate\n<span class=\"gp\">$ </span>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<span class=\"gp\">$ </span>deactivate\n</code></pre></div>\n<p>This just tests that the tarballs are available (i.e. redirects are up) and\nthat they install correctly, but it’ll catch silly mistakes.</p>\n</li>\n<li><p>Ask a few people on IRC to verify the checksums by visiting the checksums\nfile (e.g. <a class=\"reference external\" href=\"https://media.djangoproject.com/pgp/Django-1.5b1.checksum.txt\">https://media.djangoproject.com/pgp/Django-1.5b1.checksum.txt</a>)\nand following the instructions in it. For bonus points, they can also unpack\nthe downloaded release tarball and verify that its contents appear to be\ncorrect (proper version numbers, no stray <code class=\"docutils literal notranslate\">.pyc</code> or other undesirable\nfiles).</p></li>\n<li><p>Upload the release packages to PyPI (for pre-releases, only upload the wheel\nfile):</p>\n<div class=\"code-block\" data-language=\"console\"><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=\"gp\">$ </span>twine upload -s dist/*\n</code></pre></div>\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>, enter the new release number\nexactly as it appears in the name of the tarball\n(<code class=\"docutils literal notranslate\">Django-&lt;version&gt;.tar.gz</code>). So for example enter « 1.5.1 » or « 1.4c2 », etc.\nIf the release is part of an LTS branch, mark it so.</p>\n<p>If this is the alpha release of a new series, also create a Release object\nfor the <em>final</em> release, ensuring that the <em>Release date</em> field is blank,\nthus marking it as <em>unreleased</em>. For example, when creating the Release\nobject for <code class=\"docutils literal notranslate\">3.1a1</code>, also create <code class=\"docutils literal notranslate\">3.1</code> with the Release date field blank.</p>\n</li>\n<li><p>Make the blog post announcing the release live.</p></li>\n<li><p>For a new version release (e.g. 1.5, 1.6), update the default stable version\nof the docs by flipping the <code class=\"docutils literal notranslate\">is_default</code> flag to <code class=\"docutils literal notranslate\">True</code> on the\nappropriate <code class=\"docutils literal notranslate\">DocumentRelease</code> object in the <code class=\"docutils literal notranslate\">docs.djangoproject.com</code>\ndatabase (this will automatically flip it to <code class=\"docutils literal notranslate\">False</code> for all\nothers); you can do this using the site’s admin.</p>\n<p>Create new <code class=\"docutils literal notranslate\">DocumentRelease</code> objects for each language that has an entry\nfor the previous release. Update djangoproject.com’s <a class=\"reference external\" href=\"https://github.com/django/djangoproject.com/blob/main/djangoproject/static/robots.docs.txt\">robots.docs.txt</a>\nfile by copying entries from <code class=\"docutils literal notranslate\">manage_translations.py robots_txt</code> from the\ncurrent stable branch in the <code class=\"docutils literal notranslate\">django-docs-translations</code> repository. For\nexample, when releasing Django 2.2:</p>\n<div class=\"code-block\" data-language=\"console\"><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=\"gp\">$ </span>git checkout stable/2.2.x\n<span class=\"gp\">$ </span>git pull\n<span class=\"gp\">$ </span>python manage_translations.py robots_txt\n</code></pre></div>\n</li>\n<li><p>Post the release announcement to the <a class=\"reference internal\" href=\"/fr/4.1/internals/mailing-lists/#django-announce-mailing-list\"><span class=\"std std-ref\">django-announce</span></a>, <a class=\"reference internal\" href=\"/fr/4.1/internals/mailing-lists/#django-developers-mailing-list\"><span class=\"std std-ref\">django-developers</span></a>,\nand <a class=\"reference internal\" href=\"/fr/4.1/internals/mailing-lists/#django-users-mailing-list\"><span class=\"std std-ref\">django-users</span></a> mailing lists. This should include a link to the\nannouncement blog post.</p></li>\n<li><p>If this is a security release, send a separate email to\n<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>. Provide a descriptive subject, for example,\n« Django » plus the issue title from the release notes (including CVE ID). The\nmessage body should include the vulnerability details, for example, the\nannouncement blog post text. Include a link to the announcement blog post.</p></li>\n<li><p>Add a link to the blog post in the topic of the <code class=\"docutils literal notranslate\">#django</code> IRC channel:\n<code class=\"docutils literal notranslate\">/msg chanserv TOPIC #django new topic goes here</code>.</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 simple\">\n<li><p>Mettre à 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 1.5.1, mettez à jour <code class=\"docutils literal notranslate\">VERSION</code> à <code class=\"docutils literal notranslate\">VERSION = (1, 5, 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’est agi d’une publication de sécurité, mettez à jour <a class=\"reference internal\" href=\"/fr/4.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</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.</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 1.8).</p></li>\n<li><p>Remove features that have reached the end of their deprecation cycle. Each\nremoval should be done in a separate commit for clarity. In the commit\nmessage, add a « refs #XXXX » to the original ticket where the deprecation\nbegan if possible.</p></li>\n<li><p>Supprimez les annotations <code class=\"docutils literal notranslate\">.. versionadded::</code>, <code class=\"docutils literal notranslate\">.. versionadded::</code> et <code class=\"docutils literal notranslate\">.. deprecated::</code> dans la documentation concernant l’avant-dernière publication. Par exemple, dans Django 1.9, les notes pour 1.7 seront supprimées.</p></li>\n<li><p>Add the new branch to <a class=\"reference external\" href=\"https://readthedocs.org/projects/django/\">Read the Docs</a>. Since the automatically\ngenerated version names (« stable-A.B.x ») differ from the version names\nused in Read the Docs (« A.B.x »), <a class=\"reference external\" href=\"https://github.com/readthedocs/readthedocs.org/issues/5537\">create a ticket</a> requesting\nthe new 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</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\">(1, 2, 1, 'final', 0)</code> → « 1.2.1 »</p></li>\n<li><p><code class=\"docutils literal notranslate\">(1, 3, 0, 'alpha', 0)</code> → « 1.3 pre-alpha »</p></li>\n<li><p><code class=\"docutils literal notranslate\">(1, 3, 0, 'beta', 2)</code> → « 1.3 beta 2 »</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":"Préparation de la publication","anchor":"preparing-for-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/4.1/internals/"}],"prev":{"docname":"internals/git","title":"Le dépôt de code source de Django","url":"/fr/4.1/internals/git/"},"next":null,"formats":{"html":"/fr/4.1/internals/howto-release-django/","markdown":"/fr/4.1/internals/howto-release-django.md","json":"/fr/4.1/internals/howto-release-django.json"},"source":"https://github.com/django/django/blob/stable/4.1.x/docs/internals/howto-release-django.txt","official":"https://docs.djangoproject.com/fr/4.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"]}