forked from OSchip/llvm-project
442 lines
17 KiB
ReStructuredText
442 lines
17 KiB
ReStructuredText
=================================
|
|
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.
|
|
|
|
Annual Release Schedule
|
|
-----------------------
|
|
|
|
Here is the annual release schedule for LLVM. This is meant to be a
|
|
guide, and release managers are not required to follow this exactly.
|
|
Releases should be tagged on Tuesdays.
|
|
|
|
=============================== =========================
|
|
Release Approx. Date
|
|
=============================== =========================
|
|
*release branch: even releases* *4th Tue in January*
|
|
*release branch: odd releases* *4th Tue in July*
|
|
X.0.0-rc1 3 days after branch.
|
|
X.0.0-rc2 2 weeks after branch.
|
|
X.0.0-rc3 4 weeks after branch
|
|
**X.0.0-final** **6 weeks after branch**
|
|
**X.0.1** **8 weeks after branch**
|
|
**X.0.2** **10 weeks after branch**
|
|
**X.0.3** **12 weeks after branch**
|
|
**X.0.4** **14 weeks after branch**
|
|
**X.0.5** **16 weeks after branch**
|
|
**X.0.6 (if necessary)** **18 weeks after branch**
|
|
=============================== =========================
|
|
|
|
Release Process Summary
|
|
-----------------------
|
|
|
|
* Announce release schedule to the LLVM community and update the website. Do
|
|
this at least 3 weeks before the -rc1 release.
|
|
|
|
* Create release branch and begin release process.
|
|
|
|
* Send out release candidate sources for first round of testing. Testing lasts
|
|
6 weeks. 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.
|
|
|
|
* Do bug-fix releases every two weeks until X.0.5 or X.0.6 (if necessary).
|
|
|
|
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 post on the `Discourse forums (Project
|
|
Infrastructure - Release Testers). <https://discourse.llvm.org/c/infrastructure/release-testers/66>`_
|
|
|
|
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.
|
|
|
|
#. After you push the changes to the www-releases repo, someone with admin
|
|
access must login to prereleases-origin.llvm.org and manually pull the new
|
|
changes into /data/www-releases/. This is where the website is served from.
|
|
|
|
#. 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
|
|
^^^^^^^^^^^^^^^^^^^^
|
|
|
|
Create a new post in the `Announce Category <https://discourse.llvm.org/c/announce>`_
|
|
once all the release tasks are complete. For X.0.0 releases, make sure to include a
|
|
link to the release notes in the post. For X.0.1+ releases, generate a changelog
|
|
using this command and add it to the post.
|
|
|
|
::
|
|
|
|
$ git log --format="[%h %s](https://github.com/llvm/llvm-project/commit/%H)" llvmorg-X.0.N-1..llvmorg-X.0.N
|
|
|
|
Once the release has been announced add a link to the announcement on the llvm
|
|
homepage (from the llvm-www repo) in the "Release Emails" section.
|