This document covers how we handle creating a release. Let's look at it from an example:
The Community Governance Committee will select a release manager from one of the Committers by submitting a Pull Request that adds a "Release" tag to that Committer's "Area" in Committers.md.
A note on naming: please prepend the
v
for consistency. Tags arev0.7.0
and branches arev0.7.x
. We follow Semantic Versioning.
The initial announcement of the upcoming release will be a PR by the release
manager to the master
branch with the commit to bump the VERSION
file to next pre-release, e.g. v0.7.x
, and the commit to update
the CHANGELOG "Unreleased" section to v0.7.0
(and change
the previous to v0.6.0
).
After this is merged, a release branch named v0.7.x
is created from the last
commit in master
before the version changed to v0.7.x
. The VERSION file in
this commit should currently have v0.6.x
in it, and the first commit to the
release branch is to change it to v0.6.0-rc1
.
As release candidates are created, the suffix is incremented, e.g. v0.6.0-rc2
.
It is from this branch that pre-release packages are created.
When the release is finalized, the branch is once again bumped to the final
version number without the suffix, e.g. v0.6.0
.
Hotfix releases are made from this branch, following a similar process, but with
the patch version incremented to v0.6.1
.
All normal development continues to happen on the master
branch. As PRs are
opened against master
, if the author believes the PR also belongs in v0.6.x
,
they will note this in the PR (this should be done with the milestone). After
approval, the PR will be merged into master
as we do normally (with bors r+
).
For PRs that should also land in the release, the release manager will craft a
second PR with the same changes rebased onto the v0.6.x
branch, and will open
a PR targeting the release branch. This PR will go through the same review
process, and explicitly requires the original author to approve it. After
approval, the PR will be merged to the release branch, again with bors r+
.
The above is driven by a desire to keep developers' workflow as uninterrupted as
possible. That is, we do not want to require developers to know which branch to
target, they always target master
. This responsibility is, instead, on the
release manager. However, if the author feels up to the task, they are free to
share this responsibility.
Furthermore, the number of these PRs should be few, as major feature work should
be merged to master
before the release branch is crafted. These PRs should be
reserved for critical fixes and release-specific changes.
The Unreleased section of the changelog will be moved upward, and in its place a new section will be added, in the following format, based on Keep a Changelog:
[v0.4.0] - YYYY-MM-DD
---------------------
...
Entries from Unreleased section.
...
[Unreleased]: https://github.com/openenclave/openenclave/compare/v0.4.0...HEAD
[v0.4.0]: https://github.com/openenclave/openenclave/compare/v0.1.0...v0.4.0
The v0.4.0
comparison URL will be added at the bottom of the file, after the
URL for the Unreleased section, and the Unreleased comparison URL will be
updated to end with v0.4.0...HEAD
.
Release notes will be curated from the new v0.4.0
section of our changelog. In
the same way that the changelog is intended to be a less verbose version of the
Git history, the release notes are intended to be a more concise version of the
changelog. While the changelog is in bullet point format, the release manager
will read these and write a few concise paragraphs describing the nature of the
release. These notes should be suitable for a blog post.
See the Governance Model documentation for the necessary steps to approve the release with the community.
After the following has happened:
- The
VERSION
file has been bumped. - The changelog has been updated.
- The release branch has been published.
- All outstanding PRs for the release have been merged.
- Packages have been generated for the release.
- The packages have been sufficiently tested.
- The desired release notes have been written.
- The release has been approved by the community.
The release manager will draft a GitHub
Release. When published,
this will create a Git tag, which should be named v0.4.0
pointing at the head
of the v0.4.x
branch. That is, the left field will be filled with v0.4.0
,
and the right field will select v0.4.x
(note that it defaults to master
and
must be changed).
The release notes will be added to the description field (which supports Markdown), and the packages will be uploaded as binaries.
Until version v1.0.0
, the checkbox "This is a pre-release" will be checked.
The release manager will confirm that the packages' commit hash matches the head of the release branch, at which the tag will point. No other changes will be made without re-packaging and re-testing.
The release manager will then click "Publish release" on GitHub to publish the release, and coordinate uploading the packages to the correct package repositories.
We will not be GPG signing our pre-releases. This may change for
v1.0.0
.
Once published, the release manager will coordinate the announcement of the release on various channels (such as a blog post, which can reuse the release notes, and any social media we currently use).
See the Governance Model documentation for our intended servicing model.