=================================
How To Release LLVM To The Public
=================================

Introduction
============

This document contains information about successfully releasing LLVM ---
including sub-projects: e.g., ``clang`` and ``compiler-rt`` --- to the public.
It is the Release Manager's responsibility to ensure that a high quality build
of LLVM is released.

If you're looking for the document on how to test the release candidates and
create the binary packages, please refer to the :doc:`ReleaseProcess` instead.

.. _timeline:

Release Timeline
================

LLVM is released on a time based schedule --- with major releases roughly
every 6 months.  In between major releases there may be dot releases.
The release manager will determine if and when to make a dot release based
on feedback from the community.  Typically, dot releases should be made if
there are large number of bug-fixes in the stable branch or a critical bug
has been discovered that affects a large number of users.

Unless otherwise stated, dot releases will follow the same procedure as
major releases.

The release process is roughly as follows:

* Set code freeze and branch creation date for 6 months after last code freeze
  date.  Announce release schedule to the LLVM community and update the website.

* Create release branch and begin release process.

* Send out release candidate sources for first round of testing.  Testing lasts
  7-10 days.  During the first round of testing, any regressions found should be
  fixed.  Patches are merged from mainline into the release branch.  Also, all
  features need to be completed during this time.  Any features not completed at
  the end of the first round of testing will be removed or disabled for the
  release.

* Generate and send out the second release candidate sources.  Only *critical*
  bugs found during this testing phase will be fixed.  Any bugs introduced by
  merged patches will be fixed.  If so a third round of testing is needed.

* The release notes are updated.

* Finally, release!

* Announce bug fix release schedule to the LLVM community and update the website.

* Tag bug fix -rc1 after 4 weeks have passed.

* Tag bug fix -rc2 4 weeks after -rc1.

* Tag additional -rc candidates, if needed, to fix critical issues in
  previous -rc releases.

* Tag final release.

Release Process
===============

.. contents::
   :local:

Release Administrative Tasks
----------------------------

This section describes a few administrative tasks that need to be done for the
release process to begin.  Specifically, it involves:

* Updating version numbers,

* Creating the release branch, and

* Tagging release candidates for the release team to begin testing.

Create Release Branch
^^^^^^^^^^^^^^^^^^^^^

Branch the Git trunk using the following procedure:

#. Remind developers that the release branching is imminent and to refrain from
   committing patches that might break the build.  E.g., new features, large
   patches for works in progress, an overhaul of the type system, an exciting
   new TableGen feature, etc.

#. Verify that the current git trunk is in decent shape by
   examining nightly tester and buildbot results.

#. Bump the version in trunk to N.0.0git and tag the commit with llvmorg-N-init.
   If ``X`` is the version to be released, then ``N`` is ``X + 1``.

::

  $ git tag -a llvmorg-N-init

#. Clear the release notes in trunk.

#. Create the release branch from the last known good revision from before the
   version bump.  The branch's name is release/X.x where ``X`` is the major version
   number and ``x`` is just the letter ``x``.

#. All tags and branches need to be created in both the llvm/llvm-project and
   llvm/llvm-test-suite repos.

Update LLVM Version
^^^^^^^^^^^^^^^^^^^

After creating the LLVM release branch, update the release branches'
``CMakeLists.txt`` versions from '``X.0.0git``' to '``X.0.0``'.

In addition, the version numbers of all the Bugzilla components must be updated
for the next release.

Tagging the LLVM Release Candidates
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Tag release candidates:

::

  $ git tag -a llvmorg-X.Y.Z-rcN

The Release Manager must supply pre-packaged source tarballs for users.  This can
be done with the export.sh script in utils/release.

Tarballs, release binaries,  or any other release artifacts must be uploaded to
GitHub.  This can be done using the github-upload-release.py script in utils/release.

::

  $ github-upload-release.py upload --token <github-token> --release X.Y.Z-rcN --files <release_files>

::

  $ ./export.sh -release X.Y.Z -rc $RC

This will generate source tarballs for each LLVM project being validated, which
can be uploaded to github for further testing.

Build The Binary Distribution
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Creating the binary distribution requires following the instructions
:doc:`here <ReleaseProcess>`.

That process will perform both Release+Asserts and Release builds but only
pack the Release build for upload. You should use the Release+Asserts sysroot,
normally under ``final/Phase3/Release+Asserts/llvmCore-3.8.1-RCn.install/``,
for test-suite and run-time benchmarks, to make sure nothing serious has
passed through the net. For compile-time benchmarks, use the Release version.

The minimum required version of the tools you'll need are :doc:`here <GettingStarted>`

Release Qualification Criteria
------------------------------

There are no official release qualification criteria.  It is up to the
the release manager to determine when a release is ready.  The release manager
should pay attention to the results of community testing, the number of outstanding
bugs, and then number of regressions when determining whether or not to make a
release.

The community values time based releases, so releases should not be delayed for
too long unless there are critical issues remaining.  In most cases, the only
kind of bugs that are critical enough to block a release would be a major regression
from a previous release.

Official Testing
----------------

A few developers in the community have dedicated time to validate the release
candidates and volunteered to be the official release testers for each
architecture.

These will be the ones testing, generating and uploading the official binaries
to the server, and will be the minimum tests *necessary* for the release to
proceed.

This will obviously not cover all OSs and distributions, so additional community
validation is important. However, if community input is not reached before the
release is out, all bugs reported will have to go on the next stable release.

The official release managers are:

* Major releases (X.0): Hans Wennborg
* Stable releases (X.n): Tom Stellard

The official release testers are volunteered from the community and have
consistently validated and released binaries for their targets/OSs. To contact
them, you should email the ``release-testers@lists.llvm.org`` mailing list.

The official testers list is in the file ``RELEASE_TESTERS.TXT``, in the ``LLVM``
repository.

Community Testing
-----------------

Once all testing has been completed and appropriate bugs filed, the release
candidate tarballs are put on the website and the LLVM community is notified.

We ask that all LLVM developers test the release in any the following ways:

#. Download ``llvm-X.Y``, ``llvm-test-X.Y``, and the appropriate ``clang``
   binary.  Build LLVM.  Run ``make check`` and the full LLVM test suite (``make
   TEST=nightly report``).

#. Download ``llvm-X.Y``, ``llvm-test-X.Y``, and the ``clang`` sources.  Compile
   everything.  Run ``make check`` and the full LLVM test suite (``make
   TEST=nightly report``).

#. Download ``llvm-X.Y``, ``llvm-test-X.Y``, and the appropriate ``clang``
   binary. Build whole programs with it (ex. Chromium, Firefox, Apache) for
   your platform.

#. Download ``llvm-X.Y``, ``llvm-test-X.Y``, and the appropriate ``clang``
   binary. Build *your* programs with it and check for conformance and
   performance regressions.

#. Run the :doc:`release process <ReleaseProcess>`, if your platform is
   *different* than that which is officially supported, and report back errors
   only if they were not reported by the official release tester for that
   architecture.

We also ask that the OS distribution release managers test their packages with
the first candidate of every release, and report any *new* errors in Bugzilla.
If the bug can be reproduced with an unpatched upstream version of the release
candidate (as opposed to the distribution's own build), the priority should be
release blocker.

During the first round of testing, all regressions must be fixed before the
second release candidate is tagged.

In the subsequent stages, the testing is only to ensure that bug
fixes previously merged in have not created new major problems. *This is not
the time to solve additional and unrelated bugs!* If no patches are merged in,
the release is determined to be ready and the release manager may move onto the
next stage.

Reporting Regressions
---------------------

Every regression that is found during the tests (as per the criteria above),
should be filled in a bug in Bugzilla with the priority *release blocker* and
blocking a specific release.

To help manage all the bugs reported and which ones are blockers or not, a new
"[meta]" bug should be created and all regressions *blocking* that Meta. Once
all blockers are done, the Meta can be closed.

If a bug can't be reproduced, or stops being a blocker, it should be removed
from the Meta and its priority decreased to *normal*. Debugging can continue,
but on trunk.

Backport Requests
-----------------

Instructions for requesting a backport to a stable branch can be found :doc:`here <GitHub>`.

Triaging Bug Reports for Releases
---------------------------------

This section describes how to triage bug reports:

#. Search for bugs with a Release Milestone that have not been added to the
   "Release Status" github project:

   https://github.com/llvm/llvm-project/issues?q=is%3Aissue+milestone%3A%22LLVM+14.0.5+Release%22+no%3Aproject+

   Replace 14.0.5 in this query with the version from the Release Milestone being
   targeted.

   Add these bugs to the "Release Status" project.

#. Navigate to the `Release Status project <https://github.com/orgs/llvm/projects/3>`_
   to see the list of bugs that are being considered for the release.

#. Review each bug and first check if it has been fixed in main.  If it has, update
   its status to "Needs Pull Request", and create a pull request for the fix
   using the /cherry-pick or /branch comments if this has not been done already.

#. If a bug has been fixed and has a pull request created for backporting it,
   then update its status to "Needs Review" and notify a knowledgeable reviewer.
   Usually you will want to notify the person who approved the patch in Phabricator,
   but you may use your best judgement on who a good reviewer would be.  Once
   you have identified the reviewer(s), assign the issue to them and mention
   them (i.e @username) in a comment and ask them if the patch is safe to backport.
   You should also review the bug yourself to ensure that it meets the requirements
   for committing to the release branch.

#. Once a bug has been reviewed, add the release:reviewed label and update the
   issue's status to "Needs Merge".  Check the pull request associated with the
   issue.  If all the tests pass, then the pull request can be merged.  If not,
   then add a comment on the issue asking someone to take a look at the failures.

#. Once the pull request has been merged push it to the official release branch:

   ::

      git checkout release/XX.x
      git pull --ff-only https://github.com/llvm/llvm-project-release-prs release/XX.x
      git push https://github.com/llvm/llvm-project release/XX.x:release/XX.x

   Then add a comment to the issue stating that the fix has been merged along with
   the git hashes from the release branch.  Add the release:merged label to the issue
   and close it.


Release Patch Rules
-------------------

Below are the rules regarding patching the release branch:

#. Patches applied to the release branch may only be applied by the release
   manager, the official release testers or the code owners with approval from
   the release manager.

#. Release managers are encouraged, but not required, to get approval from code
   owners before approving patches.  If there is no code owner or the code owner
   is unreachable then release managers can ask approval from patch reviewers or
   other developers active in that area.

#. *Before RC1* Patches should be limited to bug fixes, important optimization
   improvements, or completion of features that were started before the branch
   was created.  As with all phases, release managers and code owners can reject
   patches that are deemed too invasive.

#. *Before RC2* Patches should be limited to bug fixes or backend specific
   improvements that are determined to be very safe.

#. *Before RC3/Final Major Release* Patches should be limited to critical
   bugs or regressions.

#. *Bug fix releases* Patches should be limited to bug fixes or very safe
   and critical performance improvements.  Patches must maintain both API and
   ABI compatibility with the previous major release.


Merging Patches
^^^^^^^^^^^^^^^

Use the ``git cherry-pick -x`` command to merge patches to the release branch:

#. ``git cherry-pick -x abcdef0``

#. Run regression tests.

Release Final Tasks
-------------------

The final stages of the release process involves tagging the "final" release
branch, updating documentation that refers to the release, and updating the
demo page.

Update Documentation
^^^^^^^^^^^^^^^^^^^^

Review the documentation in the release branch and ensure that it is up
to date.  The "Release Notes" must be updated to reflect new features, bug
fixes, new known issues, and changes in the list of supported platforms.
The "Getting Started Guide" should be updated to reflect the new release
version number tag available from Subversion and changes in basic system
requirements.

.. _tag:

Tag the LLVM Final Release
^^^^^^^^^^^^^^^^^^^^^^^^^^

Tag the final release sources:

::

  $ git tag -a llvmorg-X.Y.Z
  $ git push https://github.com/llvm/llvm-project.git llvmorg-X.Y.Z

Update the LLVM Website
^^^^^^^^^^^^^^^^^^^^^^^

The website must be updated before the release announcement is sent out.  Here
is what to do:

#. Check out the ``www-releases`` module from GitHub.

#. Create a new sub-directory ``X.Y.Z`` in the releases directory.

#. Copy and commit the ``llvm/docs`` and ``LICENSE.txt`` files into this new
   directory.

#. Update the ``releases/download.html`` file with links to the release
   binaries on GitHub.

#. Update the ``releases/index.html`` with the new release and link to release
   documentation.

#. Finally checkout the llvm-www repo and update the main page
   (``index.html`` and sidebar) to point to the new release and release
   announcement.

Announce the Release
^^^^^^^^^^^^^^^^^^^^

Send an email to the list announcing the release, pointing people to all the
relevant documentation, download pages and bugs fixed.
