{"title":"Django 릴리스하는 방법","version":"6.1","locale":"ko","docname":"internals/howto-release-django","url":"/ko/6.1/internals/howto-release-django/","canonical":"https://djangodocs.dev/ko/6.1/internals/howto-release-django/","summary":"이 문서는 Django 릴리스 방법을 설명합니다. 변경 사항을 적용할 때는 이 지침을 최신 상태로 유지하세요! 이 문서의 목적은 규정하기보다는 설명하는 데 있으므로, 필요에 따라 자유롭게 간소화하거나 변경해도 됩니다. 다만, 변경 사항이 있다면 이 문서에도 반드시 반영하세요! 개요 Link…","html":"<h1>Django 릴리스하는 방법<a class=\"heading-anchor\" href=\"#how-to-release-django\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>이 문서는 Django 릴리스 방법을 설명합니다.</p>\n<p><strong>변경 사항을 적용할 때는 이 지침을 최신 상태로 유지하세요!</strong> 이 문서의 목적은 규정하기보다는 설명하는 데 있으므로, 필요에 따라 자유롭게 간소화하거나 변경해도 됩니다. 다만, 변경 사항이 있다면 <strong>이 문서에도 반드시 반영하세요!</strong></p>\n<section id=\"overview\">\n<h2>개요<a class=\"heading-anchor\" href=\"#overview\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>필요할 수 있는 릴리스 유형은 세 가지입니다.</p>\n<ul class=\"simple\">\n<li><p>보안 릴리스: 취약점을 공개하고 수정합니다. 일반적으로 두세 개의 릴리스를 동시에 진행하게 됩니다. 예를 들어 3.2.x, 4.0.x, 그리고 시점에 따라 4.1.x가 포함될 수 있습니다.</p></li>\n<li><p>일반 버전 릴리스: 최종 릴리스(예: 4.1) 또는 버그 수정 업데이트(예: 4.1.1)</p></li>\n<li><p>사전 릴리스: 예를 들어 4.2 alpha, beta, 또는 rc</p></li>\n</ul>\n<p>전체 과정을 간단히 정리하면 다음과 같습니다.</p>\n<ol class=\"arabic simple\">\n<li><p>보안 릴리스인 경우, 실제 릴리스 일주일 전에 보안 배포 목록에 미리 알립니다.</p></li>\n<li><p>릴리스 노트를 검토하면서 구성과 문서상의 오류를 점검합니다. 블로그 게시물과 이메일 공지 초안을 작성합니다.</p></li>\n<li><p>버전 번호를 업데이트하고 릴리스 산출물을 생성합니다.</p></li>\n<li><p><a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>djangoproject.com``의 관리자에서 새 <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>Release``를 생성합니다.</p>\n<ol class=\"arabic simple\">\n<li><p>올바른 날짜를 설정하되 <code class=\"docutils literal notranslate\"><span class=\"pre\">is_active</span></code> 플래그는 비활성화해야 합니다.</p></li>\n<li><p>릴리스 산출물(tarball, wheel, checksums)을 업로드합니다.</p></li>\n</ol>\n</li>\n<li><p>패키지 서명을 검증하고, 설치할 수 있는지 확인하며, 최소한의 기능이 정상적으로 동작하는지 확인합니다.</p></li>\n<li><p>PyPI에 새 버전을 업로드합니다.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">djangoproject.com</span></code> 관리자에서 각 릴리스의 <code class=\"docutils literal notranslate\"><span class=\"pre\">is_active</span></code> 플래그를 활성화합니다.</p></li>\n<li><p>블로그 글을 게시하고 이메일 공지를 보냅니다.</p></li>\n<li><p>릴리스 이후, 안정 브랜치에서 버전 번호를 업데이트합니다.</p></li>\n<li><p>다음 패치 릴리스용 기본 릴리스 노트를 <code class=\"docutils literal notranslate\"><span class=\"pre\">main</span></code> 브랜치에 추가한 뒤 백포트합니다.</p></li>\n</ol>\n<p>세부 사항이 많으니 계속 읽어보세요.</p>\n<aside class=\"admonition-use-the-checklists-app admonition\" id=\"checklist-generator\">\n<p class=\"admonition-title\">Use the checklists app</p>\n<p>To generate a checklist compiling the tasks described below as relevant to\nthe specific release(s) you are issuing, use the checklists app in the\n<a class=\"reference external\" href=\"https://www.djangoproject.com/admin/checklists/\">project admin</a>. This\npopulates a lot of boilerplate you will need for announcements, CVE\npublication, and hashes for commit messages. By using this app for preparing\nsecurity issue metadata, your peer releasers can check your entries and\nconsult them again in the future. See <a class=\"reference external\" href=\"https://www.djangoproject.com/checklists/release/5.2.4/\">example checklist</a>.</p>\n</aside>\n</section>\n<section id=\"prerequisites\">\n<h2>사전 요구 사항<a class=\"heading-anchor\" href=\"#prerequisites\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>시작하기 전에 몇 가지 준비가 필요합니다. 이번이 첫 번째 릴리스라면, 다른 릴리서와 협력하여 필요한 사항을 모두 준비하고 필요한 접근 권한을 요청하기 위해 Ops 메일링 리스트에 메일을 보내야 합니다.</p>\n<ul>\n<li><p>다음 도구가 설치된 Unix 환경이 필요합니다(알파벳 순).</p>\n<ul class=\"simple\">\n<li><p>bash (version 4.0+)</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>해싱 도구(일반적으로 Linux에서는 <code class=\"docutils literal notranslate\"><span class=\"pre\">md5sum</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">sha1sum</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">sha256sum</span></code>, macOS에서는 <code class=\"docutils literal notranslate\"><span class=\"pre\">md5</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">shasum</span></code>)</p></li>\n<li><p>python</p></li>\n</ul>\n</li>\n<li><p>A GPG key pair. Securely store the private part, and protect it with a\npassphrase. The public part needs to be uploaded to your GitHub account.</p>\n<aside class=\"admonition-more-than-one-gpg-key admonition\">\n<p class=\"admonition-title\">하나 이상의 GPG 키</p>\n<p>사용하려는 키가 기본 서명 키가 아니라면, 아래에 표시된 모든 GPG 서명 명령에 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>-u <a class=\"reference external\" href=\"mailto:you&#37;&#52;&#48;example\">you<span>&#64;</span>example</a>.com``을 추가해야 합니다. 이때 <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a><a class=\"reference external\" href=\"mailto:you&#37;&#52;&#48;example\">you<span>&#64;</span>example</a>.com``은 사용하려는 키에 연결된 이메일 주소입니다.</p>\n</aside>\n</li>\n<li><p>A clean Python virtual environment (Python 3.10+, pip 26.1+) to build\nartifacts.</p></li>\n<li><p>Access to <a class=\"reference external\" href=\"https://pypi.org/project/Django/\">Django’s project on PyPI</a> to\nupload binaries, ideally with extra permissions to <a class=\"reference external\" href=\"https://pypi.org/help/#yanked\">yank a release</a> if necessary. Ensure your PyPI account\nonly uses WebAuthn-based authentication factors, not TOTP (one-time codes).\nCreate an API token following the <a class=\"reference external\" href=\"https://pypi.org/help/#apitoken\">official documentation</a>, and set up your <code class=\"docutils literal notranslate\"><span class=\"pre\">$HOME/.pypirc</span></code> file\nlike this:</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>Access to <a class=\"reference external\" href=\"https://app.transifex.com/django/django/\">Django’s project on Transifex</a>, with a Manager role. Generate\nan API Token in the <a class=\"reference external\" href=\"https://app.transifex.com/user/settings/api/\">user setting section</a> and set up your\n<code class=\"docutils literal notranslate\"><span class=\"pre\">$HOME/.transifexrc</span></code> file like this:</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>“Site maintainer” 권한으로 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>djangoproject.com``의 Django 관리자에 접근할 수 있어야 합니다.</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>GitHub의 <code class=\"docutils literal notranslate\"><span class=\"pre\">django-security</span></code> 저장소에 접근할 수 있어야 합니다. 이를 통해 무엇보다도 사전 공지 메일링 리스트(보안 릴리스 준비 작업에 필요함)에 접근할 수 있습니다.</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>사전 릴리스 작업<a class=\"heading-anchor\" href=\"#pre-release-tasks\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>릴리스 과정을 시작하기 전에 몇 가지 항목을 미리 처리해야 합니다. 이러한 작업은 릴리스 약 일주일 전부터 시작되며, 대부분은 실제 릴리스 전까지 언제든지 완료할 수 있습니다.</p>\n<section id=\"or-more-days-before-a-security-release\">\n<h3>보안 릴리스 10일 전(또는 그 이상)<a class=\"heading-anchor\" href=\"#or-more-days-before-a-security-release\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<ol class=\"arabic\">\n<li><p>Reserve one <a class=\"reference external\" href=\"https://www.cve.org/About/Overview/\">CVE ID</a> per security\nissue as follows. (Or, if you lack CNA credentials, email\n<code class=\"docutils literal notranslate\"><span class=\"pre\">cna&#64;djangoproject.com</span></code> with a request.)</p>\n<ul>\n<li><p>Enable virtual environment with <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/cvelib/\">cvelib</a> installed.</p></li>\n<li><p>Export user information:</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\">export</span><span class=\"w\"> </span><span class=\"nv\">CVE_USER</span><span class=\"o\">=</span>&lt;user-email&gt;@djangoproject.com<span class=\"w\"> </span><span class=\"nv\">CVE_ORG</span><span class=\"o\">=</span>DSF\n</code></pre></div>\n</li>\n<li><p>Reserve:</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>cve<span class=\"w\"> </span>--interactive<span class=\"w\"> </span>reserve<span class=\"w\"> </span>&lt;quantity&gt;\n</code></pre></div>\n</li>\n</ul>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">git</span> <span class=\"pre\">format-patch``를</span> <span class=\"pre\">사용하여</span> <span class=\"pre\">관련</span> <span class=\"pre\">비공개</span> <span class=\"pre\">패치를</span> <span class=\"pre\">생성합니다.</span> <span class=\"pre\">``main</span></code> 브랜치용 패치 하나와 각 안정 브랜치용 패치 하나씩 생성합니다.</p></li>\n</ol>\n</section>\n<section id=\"a-week-before-a-security-release\">\n<h3>보안 릴리스 일주일 전<a class=\"heading-anchor\" href=\"#a-week-before-a-security-release\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<ol class=\"arabic\">\n<li><p>Send out pre-notification exactly <strong>one week</strong> before the security release.\nThe template for that email and a list of the recipients are in the private\n<code class=\"docutils literal notranslate\"><span class=\"pre\">django-security</span></code> GitHub wiki. BCC the pre-notification recipients, and be\nsure to include the relevant CVE IDs. Attach all the relevant patches\n(targeting <code class=\"docutils literal notranslate\"><span class=\"pre\">main</span></code> and the stable branches), and sign the email text with\nthe key you’ll use for the release, with a command like:</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=\"/ko/6.1/internals/security/#security-disclosure\"><span class=\"std std-ref\">django-announce에 공지하세요</span></a>.</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<li><p>Prepare issue metadata:\n* Severity\n* Short description\n* Reporter\n* Remediator\n* Reported at\n* Confirmed at (usually date CVE reserved)\n* CWE Problem Type\n* CAPEC Impact Type\n* CVSS (4.0) Score &amp; Vector</p></li>\n</ol>\n</section>\n<section id=\"a-few-days-before-any-release\">\n<h3>릴리스 며칠 전<a class=\"heading-anchor\" href=\"#a-few-days-before-any-release\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<ol class=\"arabic\">\n<li><p>릴리스가 가까워지면 Trac을 확인하여 예정된 릴리스에 릴리스 차단 이슈가 남아 있지 않은지 점검하세요. 사전에 정해진 보안 릴리스 날짜를 맞추는 등의 예외적인 상황에서는 릴리스 차단 이슈가 남아 있더라도 릴리스를 진행할 수 있습니다. 릴리스 차단 이슈가 남은 상태에서 릴리스를 진행할지, 또는 필요한 경우 비보안 릴리스의 날짜를 연기할지는 릴리서가 판단하여 결정합니다.</p></li>\n<li><p>다른 머저들에게 이번 릴리스에 아직 커밋되지 않은 변경 사항은 없는지 확인하세요.</p></li>\n<li><p>릴리스 노트를 검토하고, 온라인 버전도 확인하여 :ref:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>catch any broken links &lt;documentation-link-check&gt;`나 reST 오류가 없는지 확인하세요. 릴리스 노트에 올바른 날짜가 포함되어 있는지도 확인하세요.</p></li>\n<li><p>릴리스 노트에 사용 중단으로 표시된 API의 사용 중단 일정이 언급되어 있는지, 그리고 Python 버전 지원 변경 사항도 언급되어 있는지 다시 한번 확인하세요.</p></li>\n<li><p>릴리스 노트 인덱스에 새 릴리스 노트로 연결되는 링크가 있는지 다시 한번 확인하세요. 이 링크는 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>docs/releases/index.txt``에 있습니다.</p></li>\n<li><p>If this is a <a class=\"reference internal\" href=\"/ko/6.1/internals/release-process/#term-Feature-release\"><span class=\"xref std std-term\">feature release</span></a>, ensure translations from Transifex\nhave been integrated.</p>\n<p>In addition to having a configured Transifex account, ensure that the <a class=\"reference external\" href=\"https://developers.transifex.com/docs/cli\">tx\nCLI</a> is available in your\n<code class=\"docutils literal notranslate\"><span class=\"pre\">PATH</span></code>. You can then fetch all translations since a given date by running:</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<span class=\"w\"> </span>-v<span class=\"w\"> </span><span class=\"m\">1</span><span class=\"w\"> </span>--since<span class=\"o\">=</span>&lt;some<span class=\"w\"> </span>date&gt;\n</code></pre></div>\n<p><a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>–since``에 사용할 적절한 값을 정하려면, <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>Updated translations from Transifex``와 비슷한 문구의 가장 최근 커밋 날짜를 확인한 후 그보다 며칠 이전 날짜를 사용하세요.</p>\n<p>이 명령은 실행하는 데 다소 시간이 걸립니다. 실행이 완료되면 출력 내용을 주의 깊게 확인하여 발생할 수 있는 오류나 경고가 있는지 살펴보세요. 오류나 경고가 있다면, 각각의 사례에 맞게 디버깅하고 해결해야 합니다.</p>\n<p>최근에 가져온 번역은 일부 수동으로 조정해야 합니다. 먼저, <code class=\"docutils literal notranslate\"><span class=\"pre\">PO-Revision-Date</span></code> 값은 <code class=\"docutils literal notranslate\"><span class=\"pre\">POT-Creation-Date``보다</span> <span class=\"pre\">이후</span> <span class=\"pre\">시점이</span> <span class=\"pre\">되도록</span> <span class=\"pre\">수동으로</span> <span class=\"pre\">조정해야</span> <span class=\"pre\">합니다.</span> <span class=\"pre\">다음과</span> <span class=\"pre\">유사한</span> <span class=\"pre\">명령을</span> <span class=\"pre\">사용하여</span> <span class=\"pre\">모든</span> <span class=\"pre\">``.po</span></code> 파일을 일괄 업데이트할 수 있습니다(관련 안정 브랜치와 diff를 비교하세요).</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>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<p>병합되면 변경 사항을 <code class=\"docutils literal notranslate\"><span class=\"pre\">main</span></code> 브랜치(<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/cb27e5b9c0703fb0edd70b2138e3e53a78c9551d\">example commit</a>)에 반영하세요.</p>\n</li>\n<li><p>다음과 같이 :ref:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>Update the django-admin manual page &lt;django-admin-manpage&gt;`을 참고해 django-admin 매뉴얼 페이지를 업데이트하세요.</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>그런 다음 변경된 매뉴얼 페이지를 커밋합니다.</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 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>릴리스를 공지하는 블로그 게시물을 작성하세요. 게시물은 언제든지 관리자에서 작성한 다음 비활성 상태로 표시할 수 있습니다. 다음은 몇 가지 예시입니다: <a href=\"#id12\"><span class=\"problematic\" id=\"id13\">`example security release announcement`__</span></a>, <a href=\"#id12\"><span class=\"problematic\" id=\"id14\">`example regular release announcement`__</span></a>, <a href=\"#id12\"><span class=\"problematic\" id=\"id15\">`example pre-release announcement`__</span></a>.</p></li>\n</ol>\n<section id=\"a-few-days-before-a-feature-freeze\">\n<h4>기능 동결 며칠 전<a class=\"heading-anchor\" href=\"#a-few-days-before-a-feature-freeze\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>alpha 릴리스를 준비하기 위해 djangoproject 서버에 <code class=\"docutils literal notranslate\"><span class=\"pre\">/home/www/www/media/releases/A.B</span></code> 디렉토리를 생성해야 합니다.</p>\n<p>기능 동결에 앞서, 다음 기능 릴리스를 준비하기 위해 <code class=\"docutils literal notranslate\"><span class=\"pre\">main</span></code> 브랜치를 대상으로 하는 브랜치를 생성해야 합니다. 이 브랜치는 동결 며칠 전에 검토 및 승인을 받아야 하며, 안정 브랜치가 생성된 이후 병합될 수 있도록 해야 합니다. 이 브랜치에서는 다음 항목을 처리해야 합니다.</p>\n<ol class=\"arabic simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">django/__init__.py``의</span> <span class=\"pre\">``VERSION</span></code> 튜플을 다음 예정된 릴리스 버전으로 올리도록 업데이트하세요(<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/96700c7b378c592f0b1732302c22af2fd2c87fc6\">example commit</a>).</p></li>\n<li><p>다음 기능 릴리스의 스텁 릴리스 노트를 작성하세요. 이전 기능 릴리스의 스텁을 사용하거나, 현재 버전의 내용을 복사한 다음 제목만 남기고 나머지 대부분을 삭제하면 됩니다(<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/9b5ad4056ccf9ff7ea548f72d28eb66c1b4f84cc\">example commit</a>).</p></li>\n<li><p>두 번의 릴리스 전 문서에 있는 <code class=\"docutils literal notranslate\"><span class=\"pre\">..</span> <span class=\"pre\">versionadded::</span></code> 및 <code class=\"docutils literal notranslate\"><span class=\"pre\">..</span> <span class=\"pre\">versionchanged::</span></code> 지시문과 그보다 더 오래된 지시문도 제거하세요. 예를 들어 Django 5.1에서는 4.2에 대한 노트가 삭제됩니다(<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/9edb7833b89e811eefd94974fb987f4605b0c0d7\">example commit</a>).</p></li>\n<li><p>사용 중단 주기가 끝난 기능은 해당 문서와 <code class=\"docutils literal notranslate\"><span class=\"pre\">..</span> <span class=\"pre\">deprecated::</span></code> 지시문을 포함해 제거하세요. 각 제거 작업은 명확성을 위해 별도의 커밋으로 수행하세요. 커밋 메시지에는 가능하다면 사용 중단이 시작된 원본 티켓을 참조할 수 있도록 <code class=\"docutils literal notranslate\"><span class=\"pre\">Refs</span> <span class=\"pre\">#XXXXX</span> <span class=\"pre\">--</span></code> 접두사를 추가하세요. 이 변경 사항이 릴리스 노트의 제거된 기능 섹션에 기록되도록 하세요(<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/f2d9c76aa7096ef3eed675b9eb824858f9dd81e5\">example commit</a>).</p></li>\n<li><p>Advance the deprecation warnings (<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/0c0bda7f79a2de89a55cfcc8e60467d6588f406f\">example commit</a>).</p></li>\n<li><p><a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>django.contrib.auth.hashers.PBKDF2PasswordHasher``의 기본 PBKDF2 반복 횟수를 약 20% 증가시키세요(적절히 반올림한 값으로). 테스트를 실행하고, 실패하는 해셔 테스트 3개를 새로운 값에 맞게 업데이트하세요. 이 변경 사항이 릴리스 노트에 기록되도록 하세요(<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>기능 동결 작업<a class=\"heading-anchor\" href=\"#feature-freeze-tasks\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<ol class=\"arabic\">\n<li><p>릴리스 노트의 빈 섹션을 제거하세요(<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/9e6e58bad237a80ddd5e3ab8b834cecdaad8455e\">example commit</a>).</p></li>\n<li><p>로컬에서 릴리스 노트를 빌드한 후 읽어 보세요. 필요한 경우 흐름을 개선하거나 문법을 수정하세요(<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/435bdab93889dae01e71c79598edab10627cc1f9\">example commit</a>).</p></li>\n<li><p><a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>main``에서 새 안정 브랜치를 생성하세요. <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>upstream``을 최신 상태로 가져와 업데이트하세요. 예를 들어 Django 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>fetch<span class=\"w\"> </span>upstream\n$<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>동시에 안정 릴리스 브랜치의 <code class=\"docutils literal notranslate\"><span class=\"pre\">docs/conf.py``에서</span> <span class=\"pre\">``django_next_version</span></code> 변수가 새로운 개발 버전을 가리키도록 설정하세요. 예를 들어 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>stable/5.2.x``를 생성할 때, 새 안정 브랜치에서 <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>django_next_version``을 <a href=\"#id5\"><span class=\"problematic\" id=\"id6\">``</span></a>’6.0’<a href=\"#id7\"><span class=\"problematic\" id=\"id8\">``</span></a>으로 설정합니다(<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/1eb62e5b622ef7fd6e0123d8bbf6662d893d5d08\">example commit</a>).</p>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">djangoproject.com``의</span> <span class=\"pre\">`admin`__에</span> <span class=\"pre\">다음</span> <span class=\"pre\">버전을</span> <span class=\"pre\">위한</span> <span class=\"pre\">``Release</span></code> 항목을 생성하세요. 각 마일스톤(alpha, beta, rc, final)마다 추가하고, <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">*</span></a>is active*는 unreleased로 표시되도록 비워 두세요. 합의된 일정에 따라 목표 날짜를 설정하고, 해당되는 경우 LTS 플래그도 설정하세요. <code class=\"docutils literal notranslate\"><span class=\"pre\">X.Y</span></code> 로드맵 페이지는 <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>/download/X.Y/roadmap/<a href=\"#id5\"><span class=\"problematic\" id=\"id6\">``</span></a>에서 확인할 수 있습니다.</p>\n<p>예를 들어 <code class=\"docutils literal notranslate\"><span class=\"pre\">stable/5.2.x``를</span> <span class=\"pre\">생성할</span> <span class=\"pre\">때는</span> <span class=\"pre\">``6.0a1</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">6.0b1</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">6.0rc1</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">6.0</span></code> 각각에 <code class=\"docutils literal notranslate\"><span class=\"pre\">Release</span></code> 항목을 추가하세요. 그러면 <code class=\"docutils literal notranslate\"><span class=\"pre\">6.0</span></code> 로드맵은 <a class=\"reference external\" href=\"https://www.djangoproject.com/download/6.0/roadmap\">https://www.djangoproject.com/download/6.0/roadmap</a>/에서 확인할 수 있습니다.</p>\n</li>\n<li><p>Add document release page in the admin`__로 이동하여  새롭게 생성된 ``Release` 객체에 대한 영어용 <code class=\"docutils literal notranslate\"><span class=\"pre\">DocumentRelease</span></code> 객체를 생성하세요. 기본값으로 설정하지 마세요.</p>\n</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 used\nin Read the Docs (“A.B.x”), update the Read the Docs config for the version\nto point to the slug <code class=\"docutils literal notranslate\"><span class=\"pre\">A.B.x</span></code> and set it as active. <a class=\"reference external\" href=\"https://github.com/readthedocs/readthedocs.org/issues/12483\">See more details</a>.</p></li>\n<li><p><a class=\"reference external\" href=\"https://github.com/pypa/trove-classifiers/pulls?q=is%3Apr+django+trove+classifier\">Create a PR on PyPI proposing the new Trove classifier</a>.\nFor example <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>Update the current branch under active development and add pre-release\nbranch in the <a class=\"reference external\" href=\"https://code.djangoproject.com/#Djangoreleaseprocess\">Django release process</a> on Trac.</p></li>\n<li><p>djangoproject.com의 <code class=\"docutils literal notranslate\"><span class=\"pre\">docs/fixtures/doc_releases.json</span></code> JSON fixture를 업데이트하여, 프로덕션 DB에 접근할 수 없는 사용자도 최신 상태의 문서 사이트를 실행할 수 있도록 하세요(<a class=\"reference external\" href=\"https://github.com/django/djangoproject.com/pull/1446\">example PR</a>). 이는 최종 릴리스 이후에 병합됩니다.</p></li>\n</ol>\n</section>\n<section id=\"actually-rolling-the-release\">\n<h2>실제 릴리스 진행<a class=\"heading-anchor\" href=\"#actually-rolling-the-release\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>이제 재미있는 부분입니다. 실제로 릴리스를 배포하는 단계입니다! <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">**</span></a>여러 릴리스**를 진행하는 경우, 릴리스마다 이 단계를 반복하세요.</p>\n<ol class=\"arabic\">\n<li><p>릴리스를 진행하려는 버전에 대해 <a href=\"#id12\"><span class=\"problematic\" id=\"id16\">`Jenkins`__</span></a> 상태가 정상(녹색)인지 확인하세요. Jenkins 상태가 정상이 될 때까지는 릴리스를 진행하지 않는 것이 좋으며, 최신 정상 빌드에 릴리스하려는 변경 사항이 포함되어 있는지도 확인하세요.</p>\n</li>\n<li><p>이번 릴리스의 릴리스 노트를 정리하세요. 이 변경 사항은 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>main``에 적용한 후, 해당 버전의 릴리스 노트가 있는 모든 브랜치에 백포트하세요.</p>\n<ol class=\"arabic simple\">\n<li><p>기능 릴리스의 경우, 릴리스 노트 상단의 <code class=\"docutils literal notranslate\"><span class=\"pre\">UNDER</span> <span class=\"pre\">DEVELOPMENT</span></code> 헤더를 제거하고 <code class=\"docutils literal notranslate\"><span class=\"pre\">Expected</span></code> 접두사를 제거한 다음 필요한 경우 릴리스 날짜를 업데이트하세요(<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/1994a2643881a9e3f9fa8d3e0794c1a9933a1831\">example commit</a>).</p></li>\n<li><p>패치 릴리스의 경우, 모든 릴리스에서 <code class=\"docutils literal notranslate\"><span class=\"pre\">Expected</span></code> 접두사를 제거하고 필요한 경우 릴리스 날짜를 업데이트하세요(<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/34a503162fe222033a1cd3249bccad014fcd1d20\">example commit</a>).</p></li>\n</ol>\n</li>\n<li><p>Regenerate a fresh, dedicated virtual environment for the release tools\nusing a cooldown:</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<span class=\"w\"> </span>--uploaded-prior-to<span class=\"o\">=</span>P7D\n</code></pre></div>\n</li>\n<li><p>A release always begins from a release branch, so you should make sure\nyou’re on an up-to-date stable branch. For example:</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>보안 릴리스인 경우, <code class=\"docutils literal notranslate\"><span class=\"pre\">django-security``에서</span> <span class=\"pre\">적절한</span> <span class=\"pre\">패치를</span> <span class=\"pre\">병합하세요.</span> <span class=\"pre\">각</span> <span class=\"pre\">패치가</span> <span class=\"pre\">머지</span> <span class=\"pre\">커밋이</span> <span class=\"pre\">아닌</span> <span class=\"pre\">릴리스</span> <span class=\"pre\">브랜치의</span> <span class=\"pre\">일반</span> <span class=\"pre\">커밋이</span> <span class=\"pre\">되도록</span> <span class=\"pre\">필요에</span> <span class=\"pre\">따라</span> <span class=\"pre\">리베이스하세요.</span> <span class=\"pre\">``--ff-only</span></code> 플래그를 사용하여 병합하세요. 예를 들어:</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>(<code class=\"docutils literal notranslate\"><span class=\"pre\">security/4.1.x``가</span> <span class=\"pre\">``django-security</span></code> 저장소에서 4.1 시리즈의 다음 릴리스에 필요한 보안 패치를 포함하는 브랜치라고 가정합니다.)</p>\n<p>git이 <code class=\"docutils literal notranslate\"><span class=\"pre\">--ff-only``로</span> <span class=\"pre\">병합을</span> <span class=\"pre\">거부하면</span> <span class=\"pre\">보안</span> <span class=\"pre\">패치</span> <span class=\"pre\">브랜치로</span> <span class=\"pre\">전환한</span> <span class=\"pre\">뒤</span> <span class=\"pre\">병합하려는</span> <span class=\"pre\">브랜치를</span> <span class=\"pre\">기준으로</span> <span class=\"pre\">리베이스한</span> <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>), 다시 돌아와 병합하세요. 각 보안 수정의 커밋 메시지에는 해당 커밋이 보안 수정임을 명시하고 이후 공지가 있을 것임을 안내하세요(<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/bf39978a53f117ca02e9a0c78b76664a41a54745\">example security commit</a>).</p>\n</li>\n<li><p>릴리스 시 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>django/__init__.py``의 버전 번호를 업데이트하세요. <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>VERSION``에 대한 자세한 내용은 아래 notes on setting the VERSION tuple`_참조하세요(:commit:`example commit &lt;2719a7f8c161233f45d34b624a9df9392c86cc1b&gt;).</p>\n<ol class=\"arabic simple\">\n<li><p>사전 릴리스 패키지인 경우, <code class=\"docutils literal notranslate\"><span class=\"pre\">pyproject.toml``의</span> <span class=\"pre\">&quot;Development</span> <span class=\"pre\">Status&quot;</span> <span class=\"pre\">trove</span> <span class=\"pre\">분류자도</span> <span class=\"pre\">이에</span> <span class=\"pre\">맞게</span> <span class=\"pre\">수정하세요.</span> <span class=\"pre\">``rc</span></code> 사전 릴리스에서는 trove 분류자를 변경하지 않아야 합니다(<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/759921c8e9ad151932fc913ab429fef0a6112ef8\">example commit for alpha release</a>, <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>그 외의 경우, 분류자가 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>Development Status :: 5 - Production/Stable``로 설정되어 있는지 확인하세요.</p></li>\n</ol>\n</li>\n</ol>\n<section id=\"building-the-artifacts\">\n<h3>아티팩트 빌드하기<a class=\"heading-anchor\" href=\"#building-the-artifacts\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"admonition-optionally-use-helper-scripts admonition\">\n<p class=\"admonition-title\">필요에 따라 헬퍼 스크립트 사용하기</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">scripts</span></code> 폴더의 헬퍼 스크립트를 사용하면 아래 단계를 일부 간소화할 수 있습니다.</p>\n<ul class=\"simple\">\n<li><p>릴리스 스크립트 실행 예시:</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>릴리스 검증(아티팩트 업로드 후)</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><a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>git tag``를 사용해 릴리스를 태그하세요. 예를 들어:</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><a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>git tag –verify &lt;tag&gt;``를 실행해 작업 결과를 확인할 수 있습니다.</p>\n</li>\n<li><p><a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>git clean -dfx``를 실행하여 작업 트리가 완전히 깨끗한 상태인지 확인하세요.</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.</p></li>\n<li><p>릴리스 패키지 해시를 생성하세요:</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>해시와 릴리스 정보를 담은 체크섬 파일 <code class=\"docutils literal notranslate\"><span class=\"pre\">Django-&lt;&lt;VERSION&gt;&gt;.checksum.txt``를</span> <span class=\"pre\">생성하세요.</span> <span class=\"pre\">아래</span> <span class=\"pre\">템플릿을</span> <span class=\"pre\">사용해</span> <span class=\"pre\">올바른</span> <span class=\"pre\">버전,</span> <span class=\"pre\">날짜,</span> <span class=\"pre\">GPG</span> <span class=\"pre\">키</span> <span class=\"pre\">ID(``gpg</span> <span class=\"pre\">--list-keys</span> <span class=\"pre\">--keyid-format</span> <span class=\"pre\">LONG</span></code>), 릴리스 매니저의 GitHub 사용자명, 릴리스 URL, 체크섬을 입력하세요:</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>체크섬 파일에 서명하세요(<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>). 이 명령을 실행하면 서명된 문서 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>Django-&lt;version&gt;.checksum.txt.asc``가 생성되며, <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>gpg –verify Django-&lt;version&gt;.checksum.txt.asc``로 이를 검증할 수 있습니다.</p></li>\n</ol>\n</section>\n</section>\n<section id=\"making-the-release-s-available-to-the-public\">\n<h2>릴리스 공개하기<a class=\"heading-anchor\" href=\"#making-the-release-s-available-to-the-public\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>이제 릴리스를 공개할 준비가 되었습니다. 아래 단계를 따르세요.</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>버전</dt><dd><p>tarball(<code class=\"docutils literal notranslate\"><span class=\"pre\">django-&lt;version&gt;.tar.gz</span></code>)에 정의된 버전 번호와 일치해야 합니다. 예: “5.2”, “4.1.1”, “4.2rc1”</p>\n</dd>\n<dt>Is active</dt><dd><p>릴리스가 완전히 공개될 때까지는(마지막 단계) False로 설정하세요.</p>\n</dd>\n<dt>LTS</dt><dd><p>릴리스가 <abbr title=\"Long Term Support\">LTS</abbr> 브랜치에 속하는 경우 활성화하세요.</p>\n</dd>\n<dt>날짜</dt><dd><p>릴리스 날짜를 오늘로 설정하세요. <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>is_active``가 활성화되기 전까지 이 릴리스는 공개되지 않습니다.</p>\n</dd>\n<dt>아티팩트</dt><dd><p>앞서 생성한 tarball(<code class=\"docutils literal notranslate\"><span class=\"pre\">django-&lt;version&gt;.tar.gz</span></code>), wheel(<code class=\"docutils literal notranslate\"><span class=\"pre\">django-&lt;version&gt;-py3-none-any.whl</span></code>), 체크섬(<code class=\"docutils literal notranslate\"><span class=\"pre\">django-&lt;version&gt;.checksum.txt.asc</span></code>) 파일을 업로드하세요.</p>\n</dd>\n</dl>\n</li>\n<li><p><a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>pip``를 사용해 릴리스 패키지가 올바르게 설치되는지 테스트하세요. 다음은 한 가지 간단한 방법입니다(바이너리 사용 가능 여부, 설치 정상 여부, 마이그레이션 및 개발 서버가 정상적으로 시작되는지 확인하고 기본적인 실수도 잡아낼 수 있습니다): <a class=\"reference external\" href=\"https://code.djangoproject.com/wiki/ReleaseTestNewVersion\">https://code.djangoproject.com/wiki/ReleaseTestNewVersion</a></p></li>\n<li><p>Jenkins에서 <a href=\"#id12\"><span class=\"problematic\" id=\"id17\">`confirm-release`__</span></a> 빌드를 실행해 체크섬 파일을 검증하세요(예: <a class=\"reference external\" href=\"https://media.djangoproject.com/pgp/Django-4.2rc1.checksum\">https://media.djangoproject.com/pgp/Django-4.2rc1.checksum</a>.txt의 경우 <code class=\"docutils literal notranslate\"><span class=\"pre\">4.2rc1</span></code> 사용).</p>\n</li>\n<li><p>Generate a new token for this release on PyPI, and store it in <code class=\"docutils literal notranslate\"><span class=\"pre\">.pypirc</span></code>\nas shown above.</p></li>\n<li><p>릴리스 패키지를 PyPI에 업로드하세요:</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>On PyPI, revoke the token you just created.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">djangoproject.com</span></code> 관리자에서 새로 생성한 <code class=\"docutils literal notranslate\"><span class=\"pre\">Release``를</span> <span class=\"pre\">업데이트하고</span> <span class=\"pre\">``is_active</span></code> 플래그를 활성화하세요.</p></li>\n<li><p>작업 내용과 새 태그를 푸시하세요:</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>릴리스 발표 블로그 글을 게시하세요.</p></li>\n<li><p>새 버전 릴리스(예:. 4.1, 4.2)의 경우, <code class=\"docutils literal notranslate\"><span class=\"pre\">docs.djangoproject.com</span></code> 데이터베이스의 해당 <code class=\"docutils literal notranslate\"><span class=\"pre\">DocumentRelease</span></code> 객체에서 <code class=\"docutils literal notranslate\"><span class=\"pre\">is_default</span></code> 플래그를 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>True``로 설정해 문서의 기본 안정 버전을 업데이트하세요(이렇게 하면 다른 항목은 자동으로 <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>False``로 전환됩니다). 이 작업은 사이트 관리자 페이지에서 할 수 있습니다.</p>\n<p>이전 릴리스 항목이 있는 각 언어에 대해 새 <code class=\"docutils literal notranslate\"><span class=\"pre\">DocumentRelease</span></code> 객체를 생성하세요. 이어서 django-docs-translations repository`__의 현재 안정 브랜치에서 ``manage_translations.py robots_txt` 명령을 실행해 생성된 결과를 복사하여 djangoproject.com의 <a href=\"#id12\"><span class=\"problematic\" id=\"id18\">`robots.docs.txt`__</span></a> 파일을 업데이트하세요. 예를 들어 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><a class=\"reference internal\" href=\"/ko/6.1/internals/mailing-lists/#django-announce-mailing-list\"><span class=\"std std-ref\">django-announce</span></a> 메일링 리스트와 Django Forum에 릴리스 공지를 게시하세요. 공지에는 블로그 글의 링크를 포함해야 합니다.</p></li>\n<li><p>If this is a security release, publish the CVE metadata. (The\n<a class=\"reference internal\" href=\"#checklist-generator\"><span class=\"std std-ref\">checklist app</span></a> generates JSON for this.):</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>cve<span class=\"w\"> </span>publish<span class=\"w\"> </span>&lt;cve-number&gt;<span class=\"w\"> </span>--cve-json-file<span class=\"w\"> </span>&lt;path-to-file&gt;\n</code></pre></div>\n</li>\n<li><p>If this is a security release, send a separate email to\n<code class=\"docutils literal notranslate\"><span class=\"pre\">oss-security&#64;lists.openwall.com</span></code>. Provide “Django” plus the CVE IDs in\nthe subject line. The message body should include the vulnerability details,\nfor example, the announcement blog post text. Include a link to the\nannouncement blog post.</p></li>\n</ol>\n</section>\n<section id=\"post-release\">\n<h2>릴리스 이후 작업<a class=\"heading-anchor\" href=\"#post-release\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>거의 다 완료되었습니다! 이제 남은 일은 다음과 같습니다.</p>\n<ol class=\"arabic\">\n<li><p>사전 릴리스가 아닌 경우, <code class=\"docutils literal notranslate\"><span class=\"pre\">django/__init__.py``의</span> <span class=\"pre\">``VERSION</span></code> 튜플을 다시 업데이트하여 다음 예정 릴리스 버전으로 증가시키세요. 예를 들어 4.1.1을 릴리스한 후에는 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>VERSION``을 <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>VERSION = (4, 1, 2, ‘alpha’, 0)``로 업데이트합니다. (<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/a4d19953d46247ee1992b3427fe652e941524272\">example commit</a>).</p></li>\n<li><p>alpha 릴리스인 경우:</p>\n<ol class=\"arabic\">\n<li><p><a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>Trac’s versions list &lt;<a class=\"reference external\" href=\"https://code.djangoproject.com/admin/ticket/versions\">https://code.djangoproject.com/admin/ticket/versions</a>&gt;`__에 기능 릴리스 버전을 추가하세요.</p></li>\n<li><p>새로 생성된 안정 브랜치에서 보안 브랜치를 새로 생성하세요. <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>upstream``을 가져와 최신 상태로 업데이트하세요. 예를 들어 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>fetch<span class=\"w\"> </span>upstream\n$<span class=\"w\"> </span>git<span class=\"w\"> </span>checkout<span class=\"w\"> </span>-b<span class=\"w\"> </span>security/5.2.x<span class=\"w\"> </span>upstream/stable/5.2.x\n$<span class=\"w\"> </span>git<span class=\"w\"> </span>push<span class=\"w\"> </span>origin<span class=\"w\"> </span>-u<span class=\"w\"> </span>security/5.2.x:security/5.2.x\n</code></pre></div>\n</li>\n</ol>\n</li>\n<li><p>final 릴리스인 경우:</p>\n<ol class=\"arabic simple\">\n<li><p>code.djangoproject.com의 <code class=\"docutils literal notranslate\"><span class=\"pre\">trac.ini</span></code> 파일에서 <code class=\"docutils literal notranslate\"><span class=\"pre\">default_version</span></code> 설정을 업데이트하세요(<a class=\"reference external\" href=\"https://github.com/django/code.djangoproject.com/pull/268\">example PR</a>).</p></li>\n<li><p>Update the current stable branch and remove the pre-release branch in the\n<a class=\"reference external\" href=\"https://code.djangoproject.com/#Djangoreleaseprocess\">Django release process</a> on Trac.</p></li>\n<li><p>djangoproject.com의 다운로드 페이지를 업데이트하세요(<a class=\"reference external\" href=\"https://github.com/django/djangoproject.com/pull/1444\">example PR</a>).</p></li>\n<li><p>이 최종 릴리스가 배포될 때 메인스트림 지원 종료(EOM) 및 지원 종료(EOL)가 예정된 이전 버전을 처리하세요.</p>\n<ol class=\"arabic simple\">\n<li><p>Ensure that the EOL versions are mentioned in the blog post. See\n<a class=\"reference external\" href=\"https://www.djangoproject.com/weblog/2025/apr/02/django-52-released/\">example announcement</a>.</p></li>\n<li><p>EOL 안정 브랜치에 태그를 생성하고 해당 안정 브랜치를 삭제하세요.``scripts/archive_eol_stable_branches.py`` 헬퍼 스크립트를 확인하고 사용하세요.</p></li>\n</ol>\n</li>\n</ol>\n</li>\n<li><p>보안 릴리스인 경우, 해결된 문제의 세부 내용을 :doc:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>/releases/security`에 업데이트하세요.</p></li>\n<li><p>사전 릴리스인 경우, 번역 카탈로그를 업데이트하세요:</p>\n<ol class=\"arabic\">\n<li><p>최근에 릴리스된 안정 브랜치에서 새 브랜치를 만드세요:</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/A.B.x\n$<span class=\"w\"> </span>git<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>릴리스 전용 가상 환경이 활성화되어 있는지 확인하고 다음을 실행하세요.</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>django\nprocessing<span class=\"w\"> </span>locale<span class=\"w\"> </span>en\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\nprocessing<span class=\"w\"> </span>locale<span class=\"w\"> </span>en\n</code></pre></div>\n</li>\n<li><p>해당 안정 브랜치를 대상으로 pull request를 생성하고 승인되면 병합하세요.</p></li>\n<li><p>업데이트된 소스 번역을 <code class=\"docutils literal notranslate\"><span class=\"pre\">main</span></code> 브랜치에 반영하세요(<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\">alpha</span></code> pre-release, coordinate with the maintainer of\n<a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/asgiref/\">asgiref</a> to determine when to raise the minimum version before the\nfinal release. For the backport, add an upper bound on the next major\nversion (example commits:\n<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/df35cf578f99522dd1ba864d513be95d47bab7a5\">main</a>,\n<a class=\"extlink-commit reference external\" href=\"https://github.com/django/django/commit/e5d2664908164d51d2daa46e375da8b6a93def03\">backport</a>).</p></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>VERSION 튜플 설정 시 참고 사항<a class=\"heading-anchor\" href=\"#notes-on-setting-the-version-tuple\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django의 버전 정보는 <code class=\"docutils literal notranslate\"><span class=\"pre\">django/__init__.py``의</span> <span class=\"pre\">``VERSION</span></code> 튜플로 관리됩니다. 이 튜플은 다섯 개의 요소로 구성되며, 각 요소는 다음과 같습니다:</p>\n<ol class=\"arabic simple\">\n<li><p>메이저 버전</p></li>\n<li><p>마이너 버전</p></li>\n<li><p>마이크로 버전</p></li>\n<li><p>상태: “alpha”, “beta”, “rc”, “final” 중 하나</p></li>\n<li><p>시리즈 번호: alpha/beta/RC 패키지가 순차적으로 릴리스될 때 사용됩니다(예: “beta 1”, “beta 2” 등).</p></li>\n</ol>\n<p>최종 릴리스의 경우 상태는 항상 “final”이며 시리즈 번호는 항상 0입니다. “alpha” 상태에서 시리즈 번호가 0이면 “pre-alpha”로 표시됩니다.</p>\n<p>예시:</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":"개요","anchor":"overview","children":[]},{"title":"사전 요구 사항","anchor":"prerequisites","children":[]},{"title":"사전 릴리스 작업","anchor":"pre-release-tasks","children":[{"title":"보안 릴리스 10일 전(또는 그 이상)","anchor":"or-more-days-before-a-security-release","children":[]},{"title":"보안 릴리스 일주일 전","anchor":"a-week-before-a-security-release","children":[]},{"title":"릴리스 며칠 전","anchor":"a-few-days-before-any-release","children":[{"title":"기능 동결 며칠 전","anchor":"a-few-days-before-a-feature-freeze","children":[]}]}]},{"title":"기능 동결 작업","anchor":"feature-freeze-tasks","children":[]},{"title":"실제 릴리스 진행","anchor":"actually-rolling-the-release","children":[{"title":"아티팩트 빌드하기","anchor":"building-the-artifacts","children":[]}]},{"title":"릴리스 공개하기","anchor":"making-the-release-s-available-to-the-public","children":[]},{"title":"릴리스 이후 작업","anchor":"post-release","children":[]},{"title":"VERSION 튜플 설정 시 참고 사항","anchor":"notes-on-setting-the-version-tuple","children":[]}],"breadcrumbs":[{"docname":"internals/index","title":"Django 내부 구조","url":"/ko/6.1/internals/"}],"prev":{"docname":"internals/git","title":"Django 소스 코드 저장소","url":"/ko/6.1/internals/git/"},"next":null,"formats":{"html":"/ko/6.1/internals/howto-release-django/","markdown":"/ko/6.1/internals/howto-release-django.md","json":"/ko/6.1/internals/howto-release-django.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/internals/howto-release-django.txt","official":"https://docs.djangoproject.com/ko/6.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"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}