{"title":"Django’s release process","version":"1.8","locale":"en","docname":"internals/release-process","url":"/en/1.8/internals/release-process/","canonical":"https://djangodocs.dev/en/1.8/internals/release-process/","summary":"Official releases Link to this heading # Since version 1.0, Django’s release numbering works as follows: Versions are numbered in the form A.B or A.B.C . A.B is the…","html":"<h1>Django’s release process<a class=\"heading-anchor\" href=\"#django-s-release-process\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<section id=\"official-releases\">\n<span id=\"id1\"></span><h2>Official releases<a class=\"heading-anchor\" href=\"#official-releases\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Since version 1.0, Django’s release numbering works as follows:</p>\n<ul class=\"simple\">\n<li><p>Versions are numbered in the form <code class=\"docutils literal notranslate\"><span class=\"pre\">A.B</span></code> or <code class=\"docutils literal notranslate\"><span class=\"pre\">A.B.C</span></code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">A.B</span></code> is the <em>major version</em> number. Each version will be mostly backwards\ncompatible with the previous release. Exceptions to this rule will be listed\nin the release notes. When <code class=\"docutils literal notranslate\"><span class=\"pre\">B</span> <span class=\"pre\">==</span> <span class=\"pre\">9</span></code>, the next major release will be\n<code class=\"docutils literal notranslate\"><span class=\"pre\">A+1.0</span></code>. For example, Django 2.0 will follow Django 1.9. There won’t be\nanything special about “dot zero” releases.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">C</span></code> is the <em>minor version</em> number, which is incremented for bug and\nsecurity fixes. A new minor release will be 100% backwards-compatible with\nthe previous minor release. The only exception is when a security or data loss\nissue can’t be fixed without breaking backwards-compatibility. If this\nhappens, the release notes will provide detailed upgrade instructions.</p></li>\n<li><p>Before a new major release, we’ll make alpha, beta, and release candidate\nreleases. These are of the form <code class=\"docutils literal notranslate\"><span class=\"pre\">A.B</span> <span class=\"pre\">alpha/beta/rc</span> <span class=\"pre\">N</span></code>, which means the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">Nth</span></code> alpha/beta/release candidate of version <code class=\"docutils literal notranslate\"><span class=\"pre\">A.B</span></code>.</p></li>\n</ul>\n<p>In git, each Django release will have a tag indicating its version number,\nsigned with the Django release key. Additionally, each release series has its\nown branch, called <code class=\"docutils literal notranslate\"><span class=\"pre\">stable/A.B.x</span></code>, and bugfix/security releases will be\nissued from those branches.</p>\n<p>For more information about how the Django project issues new releases for\nsecurity purposes, please see <a class=\"reference internal\" href=\"/en/1.8/internals/security/\"><span class=\"doc\">our security policies</span></a>.</p>\n<dl class=\"glossary\">\n<dt id=\"term-Major-release\">Major release<a class=\"heading-anchor\" href=\"#term-Major-release\"><span class=\"visually-hidden\">Link to this term</span><span aria-hidden=\"true\">#</span></a></dt><dd><p>Major releases (A.B, A.B+1, etc.) will happen roughly every nine months –\nsee <a class=\"reference internal\" href=\"#id2\">release process</a>, below for details. These releases will contain new\nfeatures, improvements to existing features, and such.</p>\n<p id=\"internal-release-deprecation-policy\">A major release may deprecate certain features from previous releases. If a\nfeature is deprecated in version <code class=\"docutils literal notranslate\"><span class=\"pre\">A.B</span></code>, it will continue to work in versions\n<code class=\"docutils literal notranslate\"><span class=\"pre\">A.B</span></code> and  <code class=\"docutils literal notranslate\"><span class=\"pre\">A.B+1</span></code> but raise warnings. It will be removed in version\n<code class=\"docutils literal notranslate\"><span class=\"pre\">A.B+2</span></code>.</p>\n<p>So, for example, if we decided to start the deprecation of a function in\nDjango 1.7:</p>\n<ul class=\"simple\">\n<li><p>Django 1.7 will contain a backwards-compatible replica of the function which\nwill raise a <code class=\"docutils literal notranslate\"><span class=\"pre\">RemovedInDjango19Warning</span></code>. This warning is silent by\ndefault; you can turn on display of these warnings with the <code class=\"docutils literal notranslate\"><span class=\"pre\">-Wd</span></code> option\nof Python.</p></li>\n<li><p>Django 1.8 will still contain the backwards-compatible replica. This\nwarning becomes <em>loud</em> by default, and will likely be quite annoying.</p></li>\n<li><p>Django 1.9 will remove the feature outright.</p></li>\n</ul>\n</dd>\n<dt id=\"term-Minor-release\">Minor release<a class=\"heading-anchor\" href=\"#term-Minor-release\"><span class=\"visually-hidden\">Link to this term</span><span aria-hidden=\"true\">#</span></a></dt><dd><p>Minor releases (A.B.C, etc.) will be issued as needed, often to fix security\nissues.</p>\n<p>These releases will be 100% compatible with the associated major release,\nunless this is impossible for security reasons or to prevent data loss.\nSo the answer to “should I upgrade to the latest minor release?” will always\nbe “yes.”</p>\n</dd>\n</dl>\n</section>\n<section id=\"supported-versions\">\n<span id=\"backwards-compatibility-policy\"></span><h2>Supported versions<a class=\"heading-anchor\" href=\"#supported-versions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>At any moment in time, Django’s developer team will support a set of releases to\nvarying levels. See <a class=\"reference external\" href=\"https://www.djangoproject.com/download/#supported-versions\">the supported versions section</a> of the download\npage for the current state of support for each version.</p>\n<ul>\n<li><p>The current development master will get new features and bug fixes\nrequiring major refactoring.</p></li>\n<li><p>Patches applied to the master branch must also be applied to the last major\nrelease, to be released as the next minor release, when they fix critical\nproblems:</p>\n<ul class=\"simple\">\n<li><p>Security issues.</p></li>\n<li><p>Data loss bugs.</p></li>\n<li><p>Crashing bugs.</p></li>\n<li><p>Major functionality bugs in newly-introduced features.</p></li>\n</ul>\n<p>The rule of thumb is that fixes will be backported to the last major release\nfor bugs that would have prevented a release in the first place (release\nblockers).</p>\n</li>\n<li><p>Security fixes and data loss bugs will be applied to the current master, the\nlast two major releases, and the current <a class=\"reference internal\" href=\"#lts-releases\"><span class=\"std std-ref\">LTS release</span></a>.</p></li>\n<li><p>Documentation fixes generally will be more freely backported to the last\nrelease branch. That’s because it’s highly advantageous to have the docs for\nthe last release be up-to-date and correct, and the risk of introducing\nregressions is much less of a concern.</p></li>\n</ul>\n<p>As a concrete example, consider a moment in time halfway between the release of\nDjango 1.7 and 1.8. At this point in time:</p>\n<ul class=\"simple\">\n<li><p>Features will be added to development master, to be released as Django 1.8.</p></li>\n<li><p>Critical bug fixes will be applied to the <code class=\"docutils literal notranslate\"><span class=\"pre\">stable/1.7.x</span></code> branch, and\nreleased as 1.7.1, 1.7.2, etc.</p></li>\n<li><p>Security fixes and bug fixes for data loss issues will be applied to\n<code class=\"docutils literal notranslate\"><span class=\"pre\">master</span></code> and to the <code class=\"docutils literal notranslate\"><span class=\"pre\">stable/1.7.x</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">stable/1.6.x</span></code>, and\n<code class=\"docutils literal notranslate\"><span class=\"pre\">stable/1.4.x</span></code> (LTS) branches. They will trigger the release of <code class=\"docutils literal notranslate\"><span class=\"pre\">1.7.1</span></code>,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">1.6.1</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">1.4.1</span></code>, etc.</p></li>\n<li><p>Documentation fixes will be applied to master, and, if easily backported, to\nthe <code class=\"docutils literal notranslate\"><span class=\"pre\">1.7.x</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">1.6.x</span></code> branches.</p></li>\n</ul>\n</section>\n<section id=\"long-term-support-lts-releases\">\n<span id=\"lts-releases\"></span><h2>Long-term support (LTS) releases<a class=\"heading-anchor\" href=\"#long-term-support-lts-releases\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Additionally, the Django team will occasionally designate certain releases\nto be “Long-term support” (LTS) releases. LTS releases will get security and\ndata loss fixes applied for a guaranteed period of time, typically 3+ years,\nregardless of the pace of releases afterwards.</p>\n<p>See <a class=\"reference external\" href=\"https://www.djangoproject.com/download/\">the download page</a> for the releases that have been designated for\nlong-term support.</p>\n</section>\n<section id=\"release-process\">\n<span id=\"id2\"></span><h2>Release process<a class=\"heading-anchor\" href=\"#release-process\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django uses a time-based release schedule, with major (i.e. 1.8, 1.9, 2.0,\netc.) releases every nine months, or more, depending on features.</p>\n<p>After each release, and after a suitable cooling-off period of a few weeks,\ncore developers will examine the landscape and announce a timeline for the\nnext release. Most releases will be scheduled in the 6-9 month range, but if\nwe have bigger features to develop we might schedule a longer period to\nallow for more ambitious work.</p>\n<section id=\"release-cycle\">\n<h3>Release cycle<a class=\"heading-anchor\" href=\"#release-cycle\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Each release cycle will be split into three periods, each lasting roughly\none-third of the cycle:</p>\n<section id=\"phase-one-feature-proposal\">\n<h4>Phase one: feature proposal<a class=\"heading-anchor\" href=\"#phase-one-feature-proposal\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>The first phase of the release process will be devoted to figuring out what\nfeatures to include in the next version. This should include a good deal of\npreliminary work on those features – working code trumps grand design.</p>\n<p>At the end of part one, the core developers will propose a feature list for the\nupcoming release. This will be broken into:</p>\n<ul class=\"simple\">\n<li><p>“Must-have”: critical features that will delay the release if not finished</p></li>\n<li><p>“Maybe” features: that will be pushed to the next release if not finished</p></li>\n<li><p>“Not going to happen”: features explicitly deferred to a later release.</p></li>\n</ul>\n<p>Anything that hasn’t got at least some work done by the end of the first third\nisn’t eligible for the next release; a design alone isn’t sufficient.</p>\n</section>\n<section id=\"phase-two-development\">\n<h4>Phase two: development<a class=\"heading-anchor\" href=\"#phase-two-development\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>The second third of the release schedule is the “heads-down” working period.\nUsing the roadmap produced at the end of phase one, we’ll all work very hard to\nget everything on it done.</p>\n<p>Longer release schedules will likely spend more than a third of the time in this\nphase.</p>\n<p>At the end of phase two, any unfinished “maybe” features will be postponed until\nthe next release. Though it shouldn’t happen, any “must-have” features will\nextend phase two, and thus postpone the final release.</p>\n<p>Phase two will culminate with an alpha release. At this point, the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">stable/A.B.x</span></code> branch will be forked from <code class=\"docutils literal notranslate\"><span class=\"pre\">master</span></code>.</p>\n</section>\n<section id=\"phase-three-bugfixes\">\n<h4>Phase three: bugfixes<a class=\"heading-anchor\" href=\"#phase-three-bugfixes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>The last third of a release cycle is spent fixing bugs – no new features will\nbe accepted during this time. We’ll try to release a beta release after one\nmonth and a release candidate after two months.</p>\n<p>The release candidate marks the string freeze, and it happens at least two\nweeks before the final release. After this point, new translatable strings\nmust not be added.</p>\n<p>During this phase, committers will be more and more conservative with\nbackports, to avoid introducing regressions. After the release candidate, only\nrelease blockers and documentation fixes should be backported.</p>\n<p>In parallel to this phase, <code class=\"docutils literal notranslate\"><span class=\"pre\">master</span></code> can receive new features, to be released\nin the <code class=\"docutils literal notranslate\"><span class=\"pre\">A.B+1</span></code> cycle.</p>\n</section>\n</section>\n<section id=\"bug-fix-releases\">\n<h3>Bug-fix releases<a class=\"heading-anchor\" href=\"#bug-fix-releases\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>After a major release (e.g. A.B), the previous release will go into bugfix\nmode.</p>\n<p>The branch for the previous major release (e.g. <code class=\"docutils literal notranslate\"><span class=\"pre\">stable/A.B-1.x</span></code>) will include\nbugfixes. Critical bugs fixed on master must <em>also</em> be fixed on the bugfix\nbranch; this means that commits need to cleanly separate bug fixes from feature\nadditions. The developer who commits a fix to master will be responsible for\nalso applying the fix to the current bugfix branch.</p>\n</section>\n</section>","rootId":"django-s-release-process","toc":[{"title":"Official releases","anchor":"official-releases","children":[]},{"title":"Supported versions","anchor":"supported-versions","children":[]},{"title":"Long-term support (LTS) releases","anchor":"long-term-support-lts-releases","children":[]},{"title":"Release process","anchor":"release-process","children":[{"title":"Release cycle","anchor":"release-cycle","children":[{"title":"Phase one: feature proposal","anchor":"phase-one-feature-proposal","children":[]},{"title":"Phase two: development","anchor":"phase-two-development","children":[]},{"title":"Phase three: bugfixes","anchor":"phase-three-bugfixes","children":[]}]},{"title":"Bug-fix releases","anchor":"bug-fix-releases","children":[]}]}],"breadcrumbs":[{"docname":"internals/index","title":"Django internals","url":"/en/1.8/internals/"}],"prev":{"docname":"internals/security","title":"Django’s security policies","url":"/en/1.8/internals/security/"},"next":{"docname":"internals/deprecation","title":"Django Deprecation Timeline","url":"/en/1.8/internals/deprecation/"},"formats":{"html":"/en/1.8/internals/release-process/","markdown":"/en/1.8/internals/release-process.md","json":"/en/1.8/internals/release-process.json"},"source":"https://github.com/django/django/blob/stable/1.8.x/docs/internals/release-process.txt","official":"https://docs.djangoproject.com/en/1.8/internals/release-process/","inVersions":["dev","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","1.8"],"inLocales":["en"]}